@@ -31,16 +31,22 @@ import (
3131 "sigs.k8s.io/controller-runtime/pkg/reconcile"
3232
3333 agaapi "sigs.k8s.io/aws-load-balancer-controller/apis/aga/v1beta1"
34+ "sigs.k8s.io/aws-load-balancer-controller/pkg/aga"
3435 "sigs.k8s.io/aws-load-balancer-controller/pkg/config"
36+ "sigs.k8s.io/aws-load-balancer-controller/pkg/deploy"
37+ "sigs.k8s.io/aws-load-balancer-controller/pkg/deploy/tracking"
3538 ctrlerrors "sigs.k8s.io/aws-load-balancer-controller/pkg/error"
3639 "sigs.k8s.io/aws-load-balancer-controller/pkg/k8s"
3740 lbcmetrics "sigs.k8s.io/aws-load-balancer-controller/pkg/metrics/lbc"
3841 metricsutil "sigs.k8s.io/aws-load-balancer-controller/pkg/metrics/util"
42+ agamodel "sigs.k8s.io/aws-load-balancer-controller/pkg/model/aga"
43+ "sigs.k8s.io/aws-load-balancer-controller/pkg/model/core"
3944 "sigs.k8s.io/aws-load-balancer-controller/pkg/runtime"
4045)
4146
4247const (
4348 controllerName = "globalAccelerator"
49+ agaTagPrefix = "aga.k8s.aws"
4450
4551 // the groupVersion of used GlobalAccelerator resource.
4652 agaResourcesGroupVersion = "aga.k8s.aws/v1beta1"
@@ -49,23 +55,45 @@ const (
4955 // Metric stage constants
5056 MetricStageFetchGlobalAccelerator = "fetch_globalAccelerator"
5157 MetricStageAddFinalizers = "add_finalizers"
58+ MetricStageBuildModel = "build_model"
5259 MetricStageReconcileGlobalAccelerator = "reconcile_globalaccelerator"
5360
5461 // Metric error constants
5562 MetricErrorAddFinalizers = "add_finalizers_error"
5663 MetricErrorRemoveFinalizers = "remove_finalizers_error"
64+ MetricErrorBuildModel = "build_model_error"
5765 MetricErrorReconcileGlobalAccelerator = "reconcile_globalaccelerator_error"
5866)
5967
6068// NewGlobalAcceleratorReconciler constructs new globalAcceleratorReconciler
61- func NewGlobalAcceleratorReconciler (k8sClient client.Client , eventRecorder record.EventRecorder , finalizerManager k8s.FinalizerManager ,
62- config config.ControllerConfig , logger logr.Logger , metricsCollector lbcmetrics.MetricCollector , reconcileCounters * metricsutil.ReconcileCounters ) * globalAcceleratorReconciler {
69+ func NewGlobalAcceleratorReconciler (k8sClient client.Client , eventRecorder record.EventRecorder , finalizerManager k8s.FinalizerManager , config config.ControllerConfig , logger logr.Logger , metricsCollector lbcmetrics.MetricCollector , reconcileCounters * metricsutil.ReconcileCounters ) * globalAcceleratorReconciler {
70+
71+ // Create tracking provider
72+ trackingProvider := tracking .NewDefaultProvider (agaTagPrefix , config .ClusterName )
73+
74+ // Create model builder
75+ agaModelBuilder := aga .NewDefaultModelBuilder (
76+ k8sClient ,
77+ eventRecorder ,
78+ trackingProvider ,
79+ config .FeatureGates ,
80+ config .ClusterName ,
81+ config .DefaultTags ,
82+ config .ExternalManagedTags ,
83+ logger .WithName ("aga-model-builder" ),
84+ metricsCollector ,
85+ )
86+
87+ // Create stack marshaller
88+ stackMarshaller := deploy .NewDefaultStackMarshaller ()
6389
6490 return & globalAcceleratorReconciler {
6591 k8sClient : k8sClient ,
6692 eventRecorder : eventRecorder ,
6793 finalizerManager : finalizerManager ,
6894 logger : logger ,
95+ modelBuilder : agaModelBuilder ,
96+ stackMarshaller : stackMarshaller ,
6997 metricsCollector : metricsCollector ,
7098 reconcileTracker : reconcileCounters .IncrementAGA ,
7199
@@ -78,6 +106,8 @@ type globalAcceleratorReconciler struct {
78106 k8sClient client.Client
79107 eventRecorder record.EventRecorder
80108 finalizerManager k8s.FinalizerManager
109+ modelBuilder aga.ModelBuilder
110+ stackMarshaller deploy.StackMarshaller
81111 logger logr.Logger
82112 metricsCollector lbcmetrics.MetricCollector
83113 reconcileTracker func (namespaceName types.NamespacedName )
@@ -157,10 +187,42 @@ func (r *globalAcceleratorReconciler) cleanupGlobalAccelerator(ctx context.Conte
157187 return nil
158188}
159189
190+ func (r * globalAcceleratorReconciler ) buildModel (ctx context.Context , ga * agaapi.GlobalAccelerator ) (core.Stack , * agamodel.Accelerator , error ) {
191+ stack , accelerator , err := r .modelBuilder .Build (ctx , ga )
192+ if err != nil {
193+ r .eventRecorder .Event (ga , corev1 .EventTypeWarning , k8s .GlobalAcceleratorEventReasonFailedBuildModel , fmt .Sprintf ("Failed build model due to %v" , err ))
194+ return nil , nil , err
195+ }
196+ stackJSON , err := r .stackMarshaller .Marshal (stack )
197+ if err != nil {
198+ r .eventRecorder .Event (ga , corev1 .EventTypeWarning , k8s .GlobalAcceleratorEventReasonFailedBuildModel , fmt .Sprintf ("Failed build model due to %v" , err ))
199+ return nil , nil , err
200+ }
201+ r .logger .Info ("successfully built model" , "model" , stackJSON )
202+ return stack , accelerator , nil
203+ }
204+
160205func (r * globalAcceleratorReconciler ) reconcileGlobalAcceleratorResources (ctx context.Context , ga * agaapi.GlobalAccelerator ) error {
161- // TODO: Implement the actual AWS Global Accelerator resource management
162- // This is a placeholder implementation
163206 r .logger .Info ("Reconciling GlobalAccelerator resources" , "name" , ga .Name , "namespace" , ga .Namespace )
207+ var stack core.Stack
208+ var accelerator * agamodel.Accelerator
209+ var err error
210+ buildModelFn := func () {
211+ stack , accelerator , err = r .buildModel (ctx , ga )
212+ }
213+ r .metricsCollector .ObserveControllerReconcileLatency (controllerName , MetricStageBuildModel , buildModelFn )
214+ if err != nil {
215+ return ctrlerrors .NewErrorWithMetrics (controllerName , MetricErrorBuildModel , err , r .metricsCollector )
216+ }
217+
218+ // Log the built model for debugging
219+ r .logger .Info ("Built model successfully" , "accelerator" , accelerator .ID (), "stackID" , stack .StackID ())
220+
221+ // TODO: Implement the deploy phase
222+ // This would include:
223+ // 1. Deploy the stack to create/update AWS Global Accelerator resources
224+ // 2. Update the GlobalAccelerator status with the created resources
225+ // 3. Handle any deployment errors and update status accordingly
164226
165227 return nil
166228}
0 commit comments