@@ -3,6 +3,8 @@ package gateway
33import (
44 "context"
55 "fmt"
6+ "time"
7+
68 elbv2types "github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2/types"
79 "github.com/go-logr/logr"
810 "github.com/pkg/errors"
@@ -22,6 +24,7 @@ import (
2224 "sigs.k8s.io/aws-load-balancer-controller/pkg/deploy/tracking"
2325 ctrlerrors "sigs.k8s.io/aws-load-balancer-controller/pkg/error"
2426 "sigs.k8s.io/aws-load-balancer-controller/pkg/gateway/constants"
27+ gateway_constants "sigs.k8s.io/aws-load-balancer-controller/pkg/gateway/constants"
2528 gatewaymodel "sigs.k8s.io/aws-load-balancer-controller/pkg/gateway/model"
2629 "sigs.k8s.io/aws-load-balancer-controller/pkg/gateway/referencecounter"
2730 "sigs.k8s.io/aws-load-balancer-controller/pkg/gateway/routeutils"
@@ -43,7 +46,6 @@ import (
4346 gwv1 "sigs.k8s.io/gateway-api/apis/v1"
4447 gwalpha2 "sigs.k8s.io/gateway-api/apis/v1alpha2"
4548 gwbeta1 "sigs.k8s.io/gateway-api/apis/v1beta1"
46- "time"
4749)
4850
4951const (
@@ -206,25 +208,35 @@ func (r *gatewayReconciler) reconcileHelper(ctx context.Context, req reconcile.R
206208 mergedLbConfig , err := r .cfgResolver .getLoadBalancerConfigForGateway (ctx , r .k8sClient , r .finalizerManager , gw , gwClass )
207209
208210 if err != nil {
209- statusErr := r .updateGatewayStatusFailure (ctx , gw , gwv1 .GatewayReasonInvalid , err .Error ())
211+ statusErr := r .updateGatewayStatusFailure (ctx , gw , gwv1 .GatewayReasonInvalid , err .Error (), nil )
210212 if statusErr != nil {
211213 r .logger .Error (statusErr , "Unable to update gateway status on failure to retrieve attached config" )
212214 }
213215 return err
214216 }
215217
216- allRoutes , err := r .gatewayLoader .LoadRoutesForGateway (ctx , * gw , r .routeFilter )
218+ loaderResults , err := r .gatewayLoader .LoadRoutesForGateway (ctx , * gw , r .routeFilter , r . controllerName )
217219
218- if err != nil {
220+ if err != nil || loaderResults . ValidationResults . HasErrors {
219221 var loaderErr routeutils.LoaderError
220- if errors .As (err , & loaderErr ) {
221- statusErr := r .updateGatewayStatusFailure (ctx , gw , loaderErr .GetGatewayReason (), loaderErr .GetGatewayMessage ())
222+ if errors .As (err , & loaderErr ) || loaderResults .ValidationResults .HasErrors {
223+ var gatewayReason gwv1.GatewayConditionReason
224+ var gatewayMessage string
225+ if loaderErr == nil && loaderResults .ValidationResults .HasErrors {
226+ gatewayReason = gwv1 .GatewayReasonAccepted
227+ gatewayMessage = gateway_constants .GatewayAcceptedFalseMessage
228+ } else {
229+ gatewayReason = loaderErr .GetGatewayReason ()
230+ gatewayMessage = loaderErr .GetGatewayMessage ()
231+ }
232+ statusErr := r .updateGatewayStatusFailure (ctx , gw , gatewayReason , gatewayMessage , loaderResults )
222233 if statusErr != nil {
223234 r .logger .Error (statusErr , "Unable to update gateway status on failure to build routes" )
224235 }
225236 }
226237 return err
227238 }
239+ allRoutes := loaderResults .Routes
228240
229241 // To handle Addons, we need to build the set that has been previously enabled. This is stored within the Gateway annotations.
230242 allAddOns := getStoredAddonConfig (gw , r .logger )
@@ -241,7 +253,6 @@ func (r *gatewayReconciler) reconcileHelper(ctx context.Context, req reconcile.R
241253 if err != nil {
242254 return err
243255 }
244-
245256 r .logger .V (1 ).Info ("Got this addon config" , "current" , currentAddOns , "new addon" , newAddOnConfig )
246257
247258 // To accurately track the set of enabled addons, we need to figure out if any addons were added / removed during this run.
@@ -267,7 +278,7 @@ func (r *gatewayReconciler) reconcileHelper(ctx context.Context, req reconcile.R
267278 return nil
268279 }
269280 r .serviceReferenceCounter .UpdateRelations (getServicesFromRoutes (allRoutes ), k8s .NamespacedName (gw ), false )
270- err = r .reconcileUpdate (ctx , gw , gwClass , stack , lb , backendSGRequired , secrets )
281+ err = r .reconcileUpdate (ctx , gw , gwClass , stack , lb , backendSGRequired , secrets , loaderResults . AttachedRoutesMap )
271282 if err != nil {
272283 r .logger .Error (err , "Failed to process gateway update" , "gw" , k8s .NamespacedName (gw ))
273284 return err
@@ -309,7 +320,7 @@ func (r *gatewayReconciler) reconcileDelete(ctx context.Context, gw *gwv1.Gatewa
309320}
310321
311322func (r * gatewayReconciler ) reconcileUpdate (ctx context.Context , gw * gwv1.Gateway , gwClass * gwv1.GatewayClass , stack core.Stack ,
312- lb * elbv2model.LoadBalancer , backendSGRequired bool , secrets []types.NamespacedName ) error {
323+ lb * elbv2model.LoadBalancer , backendSGRequired bool , secrets []types.NamespacedName , attachedRoutesMap map [gwv1. SectionName ] int32 ) error {
313324 // add gateway finalizer
314325 if err := r .finalizerManager .AddFinalizers (ctx , gw , r .finalizer ); err != nil {
315326 r .eventRecorder .Event (gw , corev1 .EventTypeWarning , k8s .GatewayEventReasonFailedAddFinalizer , fmt .Sprintf ("Failed add gateway finalizer due to %v" , err ))
@@ -327,7 +338,7 @@ func (r *gatewayReconciler) reconcileUpdate(ctx context.Context, gw *gwv1.Gatewa
327338 }
328339 }
329340
330- if err = r .updateGatewayStatusSuccess (ctx , lb .Status , gw ); err != nil {
341+ if err = r .updateGatewayStatusSuccess (ctx , lb .Status , gw , attachedRoutesMap ); err != nil {
331342 r .eventRecorder .Event (gw , corev1 .EventTypeWarning , k8s .GatewayEventReasonFailedUpdateStatus , fmt .Sprintf ("Failed update status due to %v" , err ))
332343 return err
333344 }
@@ -366,7 +377,7 @@ func (r *gatewayReconciler) buildModel(ctx context.Context, gw *gwv1.Gateway, cf
366377 return stack , lb , newAddOnConfig , backendSGRequired , secrets , nil
367378}
368379
369- func (r * gatewayReconciler ) updateGatewayStatusSuccess (ctx context.Context , lbStatus * elbv2model.LoadBalancerStatus , gw * gwv1.Gateway ) error {
380+ func (r * gatewayReconciler ) updateGatewayStatusSuccess (ctx context.Context , lbStatus * elbv2model.LoadBalancerStatus , gw * gwv1.Gateway , attachedRoutesMap map [gwv1. SectionName ] int32 ) error {
370381 // LB Status should always be set, if it's not, we need to prevent NPE
371382 if lbStatus == nil {
372383 r .logger .Info ("Unable to update Gateway Status due to null LB status" )
@@ -395,6 +406,13 @@ func (r *gatewayReconciler) updateGatewayStatusSuccess(ctx context.Context, lbSt
395406 needPatch = true
396407 }
397408
409+ // update listeners status
410+ ListenerStatuses := buildListenerStatus (r .controllerName , * gw , attachedRoutesMap , nil )
411+ if ! isListenerStatusIdentical (gw .Status .Listeners , ListenerStatuses ) {
412+ gw .Status .Listeners = ListenerStatuses
413+ needPatch = true
414+ }
415+
398416 if needPatch {
399417 if err := r .k8sClient .Status ().Patch (ctx , gw , client .MergeFrom (gwOld )); err != nil {
400418 return errors .Wrapf (err , "failed to update gw status: %v" , k8s .NamespacedName (gw ))
@@ -408,11 +426,22 @@ func (r *gatewayReconciler) updateGatewayStatusSuccess(ctx context.Context, lbSt
408426 return nil
409427}
410428
411- func (r * gatewayReconciler ) updateGatewayStatusFailure (ctx context.Context , gw * gwv1.Gateway , reason gwv1.GatewayConditionReason , errMessage string ) error {
429+ func (r * gatewayReconciler ) updateGatewayStatusFailure (ctx context.Context , gw * gwv1.Gateway , reason gwv1.GatewayConditionReason , errMessage string , loadResults * routeutils. LoaderResult ) error {
412430 gwOld := gw .DeepCopy ()
413431
414432 needPatch := r .gatewayConditionUpdater (gw , string (gwv1 .GatewayConditionAccepted ), metav1 .ConditionFalse , string (reason ), errMessage )
415433
434+ // update listener status
435+ if loadResults != nil {
436+ listenerValidationResults := loadResults .ValidationResults
437+ attachedRoutesMap := loadResults .AttachedRoutesMap
438+ ListenerStatuses := buildListenerStatus (r .controllerName , * gw , attachedRoutesMap , & listenerValidationResults )
439+ if ! isListenerStatusIdentical (gw .Status .Listeners , ListenerStatuses ) {
440+ gw .Status .Listeners = ListenerStatuses
441+ needPatch = true
442+ }
443+ }
444+
416445 if needPatch {
417446 if err := r .k8sClient .Status ().Patch (ctx , gw , client .MergeFrom (gwOld )); err != nil {
418447 return errors .Wrapf (err , "failed to update gw status: %v" , k8s .NamespacedName (gw ))
0 commit comments