Skip to content

Commit f6aa7ef

Browse files
authored
Merge pull request #4309 from zac-nixon/main
[gw api] Fix overwrite of route status
2 parents f4f5387 + e7d61c5 commit f6aa7ef

16 files changed

+215
-103
lines changed

apis/elbv2/v1beta1/ingressclassparams_types.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ type IngressClassParamsSpec struct {
192192
}
193193

194194
// +kubebuilder:object:root=true
195-
// +kubebuilder:resource:scope=Cluster
195+
// +kubebuilder:resource:scope=Cluster,singular=ingressclassparam
196196
// +kubebuilder:storageversion
197197
// +kubebuilder:printcolumn:name="GROUP-NAME",type="string",JSONPath=".spec.group.name",description="The Ingress Group name"
198198
// +kubebuilder:printcolumn:name="SCHEME",type="string",JSONPath=".spec.scheme",description="The AWS Load Balancer scheme"

controllers/gateway/gateway_controller.go

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,13 @@ const (
5151
var _ Reconciler = &gatewayReconciler{}
5252

5353
// NewNLBGatewayReconciler constructs a gateway reconciler to handle specifically for NLB gateways
54-
func NewNLBGatewayReconciler(routeLoader routeutils.Loader, referenceCounter referencecounter.ServiceReferenceCounter, cloud services.Cloud, k8sClient client.Client, eventRecorder record.EventRecorder, controllerConfig config.ControllerConfig, finalizerManager k8s.FinalizerManager, networkingManager networking.NetworkingManager, networkingSGReconciler networking.SecurityGroupReconciler, networkingSGManager networking.SecurityGroupManager, elbv2TaggingManager elbv2deploy.TaggingManager, subnetResolver networking.SubnetsResolver, vpcInfoProvider networking.VPCInfoProvider, backendSGProvider networking.BackendSGProvider, sgResolver networking.SecurityGroupResolver, logger logr.Logger, metricsCollector lbcmetrics.MetricCollector, reconcileCounters *metricsutil.ReconcileCounters, routeReconciler routeutils.RouteReconciler) Reconciler {
55-
return newGatewayReconciler(constants.NLBGatewayController, elbv2model.LoadBalancerTypeNetwork, controllerConfig.NLBGatewayMaxConcurrentReconciles, constants.NLBGatewayTagPrefix, shared_constants.NLBGatewayFinalizer, routeLoader, referenceCounter, routeutils.L4RouteFilter, cloud, k8sClient, eventRecorder, controllerConfig, finalizerManager, networkingSGReconciler, networkingManager, networkingSGManager, elbv2TaggingManager, subnetResolver, vpcInfoProvider, backendSGProvider, sgResolver, nlbAddons, logger, metricsCollector, reconcileCounters.IncrementNLBGateway, routeReconciler)
54+
func NewNLBGatewayReconciler(routeLoader routeutils.Loader, referenceCounter referencecounter.ServiceReferenceCounter, cloud services.Cloud, k8sClient client.Client, eventRecorder record.EventRecorder, controllerConfig config.ControllerConfig, finalizerManager k8s.FinalizerManager, networkingManager networking.NetworkingManager, networkingSGReconciler networking.SecurityGroupReconciler, networkingSGManager networking.SecurityGroupManager, elbv2TaggingManager elbv2deploy.TaggingManager, subnetResolver networking.SubnetsResolver, vpcInfoProvider networking.VPCInfoProvider, backendSGProvider networking.BackendSGProvider, sgResolver networking.SecurityGroupResolver, logger logr.Logger, metricsCollector lbcmetrics.MetricCollector, reconcileCounters *metricsutil.ReconcileCounters) Reconciler {
55+
return newGatewayReconciler(constants.NLBGatewayController, elbv2model.LoadBalancerTypeNetwork, controllerConfig.NLBGatewayMaxConcurrentReconciles, constants.NLBGatewayTagPrefix, shared_constants.NLBGatewayFinalizer, routeLoader, referenceCounter, routeutils.L4RouteFilter, cloud, k8sClient, eventRecorder, controllerConfig, finalizerManager, networkingSGReconciler, networkingManager, networkingSGManager, elbv2TaggingManager, subnetResolver, vpcInfoProvider, backendSGProvider, sgResolver, nlbAddons, logger, metricsCollector, reconcileCounters.IncrementNLBGateway)
5656
}
5757

5858
// NewALBGatewayReconciler constructs a gateway reconciler to handle specifically for ALB gateways
59-
func NewALBGatewayReconciler(routeLoader routeutils.Loader, cloud services.Cloud, k8sClient client.Client, referenceCounter referencecounter.ServiceReferenceCounter, eventRecorder record.EventRecorder, controllerConfig config.ControllerConfig, finalizerManager k8s.FinalizerManager, networkingManager networking.NetworkingManager, networkingSGReconciler networking.SecurityGroupReconciler, networkingSGManager networking.SecurityGroupManager, elbv2TaggingManager elbv2deploy.TaggingManager, subnetResolver networking.SubnetsResolver, vpcInfoProvider networking.VPCInfoProvider, backendSGProvider networking.BackendSGProvider, sgResolver networking.SecurityGroupResolver, logger logr.Logger, metricsCollector lbcmetrics.MetricCollector, reconcileCounters *metricsutil.ReconcileCounters, routeReconciler routeutils.RouteReconciler) Reconciler {
60-
return newGatewayReconciler(constants.ALBGatewayController, elbv2model.LoadBalancerTypeApplication, controllerConfig.ALBGatewayMaxConcurrentReconciles, constants.ALBGatewayTagPrefix, shared_constants.ALBGatewayFinalizer, routeLoader, referenceCounter, routeutils.L7RouteFilter, cloud, k8sClient, eventRecorder, controllerConfig, finalizerManager, networkingSGReconciler, networkingManager, networkingSGManager, elbv2TaggingManager, subnetResolver, vpcInfoProvider, backendSGProvider, sgResolver, albAddons, logger, metricsCollector, reconcileCounters.IncrementALBGateway, routeReconciler)
59+
func NewALBGatewayReconciler(routeLoader routeutils.Loader, cloud services.Cloud, k8sClient client.Client, referenceCounter referencecounter.ServiceReferenceCounter, eventRecorder record.EventRecorder, controllerConfig config.ControllerConfig, finalizerManager k8s.FinalizerManager, networkingManager networking.NetworkingManager, networkingSGReconciler networking.SecurityGroupReconciler, networkingSGManager networking.SecurityGroupManager, elbv2TaggingManager elbv2deploy.TaggingManager, subnetResolver networking.SubnetsResolver, vpcInfoProvider networking.VPCInfoProvider, backendSGProvider networking.BackendSGProvider, sgResolver networking.SecurityGroupResolver, logger logr.Logger, metricsCollector lbcmetrics.MetricCollector, reconcileCounters *metricsutil.ReconcileCounters) Reconciler {
60+
return newGatewayReconciler(constants.ALBGatewayController, elbv2model.LoadBalancerTypeApplication, controllerConfig.ALBGatewayMaxConcurrentReconciles, constants.ALBGatewayTagPrefix, shared_constants.ALBGatewayFinalizer, routeLoader, referenceCounter, routeutils.L7RouteFilter, cloud, k8sClient, eventRecorder, controllerConfig, finalizerManager, networkingSGReconciler, networkingManager, networkingSGManager, elbv2TaggingManager, subnetResolver, vpcInfoProvider, backendSGProvider, sgResolver, albAddons, logger, metricsCollector, reconcileCounters.IncrementALBGateway)
6161
}
6262

6363
// newGatewayReconciler constructs a reconciler that responds to gateway object changes
@@ -68,7 +68,7 @@ func newGatewayReconciler(controllerName string, lbType elbv2model.LoadBalancerT
6868
networkingManager networking.NetworkingManager, networkingSGManager networking.SecurityGroupManager, elbv2TaggingManager elbv2deploy.TaggingManager,
6969
subnetResolver networking.SubnetsResolver, vpcInfoProvider networking.VPCInfoProvider, backendSGProvider networking.BackendSGProvider,
7070
sgResolver networking.SecurityGroupResolver, supportedAddons []addon.Addon, logger logr.Logger, metricsCollector lbcmetrics.MetricCollector,
71-
reconcileTracker func(namespaceName types.NamespacedName), routeReconciler routeutils.RouteReconciler) Reconciler {
71+
reconcileTracker func(namespaceName types.NamespacedName)) Reconciler {
7272

7373
trackingProvider := tracking.NewDefaultProvider(gatewayTagPrefix, controllerConfig.ClusterName)
7474
modelBuilder := gatewaymodel.NewModelBuilder(subnetResolver, vpcInfoProvider, cloud.VpcID(), lbType, trackingProvider, elbv2TaggingManager, controllerConfig, cloud.EC2(), cloud.ELBV2(), cloud.ACM(), controllerConfig.FeatureGates, controllerConfig.ClusterName, controllerConfig.DefaultTags, sets.New(controllerConfig.ExternalManagedTags...), controllerConfig.DefaultSSLPolicy, controllerConfig.DefaultTargetType, controllerConfig.DefaultLoadBalancerScheme, backendSGProvider, sgResolver, controllerConfig.EnableBackendSecurityGroup, controllerConfig.DisableRestrictedSGRules, controllerConfig.IngressConfig.AllowedCertificateAuthorityARNs, supportedAddons, logger)
@@ -96,7 +96,6 @@ func newGatewayReconciler(controllerName string, lbType elbv2model.LoadBalancerT
9696
metricsCollector: metricsCollector,
9797
reconcileTracker: reconcileTracker,
9898
cfgResolver: cfgResolver,
99-
routeReconciler: routeReconciler,
10099
serviceReferenceCounter: serviceReferenceCounter,
101100
gatewayConditionUpdater: prepareGatewayConditionUpdate,
102101
}
@@ -123,8 +122,7 @@ type gatewayReconciler struct {
123122
serviceReferenceCounter referencecounter.ServiceReferenceCounter
124123
gatewayConditionUpdater func(gw *gwv1.Gateway, targetConditionType string, newStatus metav1.ConditionStatus, reason string, message string) bool
125124

126-
cfgResolver gatewayConfigResolver
127-
routeReconciler routeutils.RouteReconciler
125+
cfgResolver gatewayConfigResolver
128126
}
129127

130128
//+kubebuilder:rbac:groups=gateway.networking.k8s.io,resources=referencegrants,verbs=get;list;watch;patch
@@ -211,7 +209,7 @@ func (r *gatewayReconciler) reconcileHelper(ctx context.Context, req reconcile.R
211209
return err
212210
}
213211

214-
allRoutes, err := r.gatewayLoader.LoadRoutesForGateway(ctx, *gw, r.routeFilter, r.routeReconciler)
212+
allRoutes, err := r.gatewayLoader.LoadRoutesForGateway(ctx, *gw, r.routeFilter)
215213

216214
if err != nil {
217215
var loaderErr routeutils.LoaderError

helm/aws-load-balancer-controller/crds/crds.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ spec:
1010
kind: IngressClassParams
1111
listKind: IngressClassParamsList
1212
plural: ingressclassparams
13-
singular: ingressclassparams
13+
singular: ingressclassparam
1414
scope: Cluster
1515
versions:
1616
- additionalPrinterColumns:

main.go

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,6 @@ type gatewayControllerConfig struct {
103103
sgResolver networking.SecurityGroupResolver
104104
metricsCollector lbcmetrics.MetricCollector
105105
reconcileCounters *metricsutil.ReconcileCounters
106-
routeReconciler routeutils.RouteReconciler
107106
serviceReferenceCounter referencecounter.ServiceReferenceCounter
108107
networkingManager networking.NetworkingManager
109108
}
@@ -243,15 +242,14 @@ func main() {
243242
sgResolver: sgResolver,
244243
metricsCollector: lbcMetricsCollector,
245244
reconcileCounters: reconcileCounters,
246-
routeReconciler: routeReconciler,
247245
networkingManager: networkingManager,
248246
serviceReferenceCounter: serviceReferenceCounter,
249247
}
250248

251249
enabledControllers := sets.Set[string]{}
252250

253251
routeLoaderCreator := sync.OnceValue(func() routeutils.Loader {
254-
return routeutils.NewLoader(mgr.GetClient(), mgr.GetLogger().WithName("gateway-route-loader"))
252+
return routeutils.NewLoader(mgr.GetClient(), routeReconciler, mgr.GetLogger().WithName("gateway-route-loader"))
255253
})
256254

257255
// Setup NLB Gateway controller if enabled
@@ -450,7 +448,6 @@ func setupGatewayController(ctx context.Context, mgr ctrl.Manager, cfg *gatewayC
450448
logger,
451449
cfg.metricsCollector,
452450
cfg.reconcileCounters,
453-
cfg.routeReconciler,
454451
)
455452
case gateway_constants.ALBGatewayController:
456453
reconciler = gateway.NewALBGatewayReconciler(
@@ -472,7 +469,6 @@ func setupGatewayController(ctx context.Context, mgr ctrl.Manager, cfg *gatewayC
472469
logger,
473470
cfg.metricsCollector,
474471
cfg.reconcileCounters,
475-
cfg.routeReconciler,
476472
)
477473
default:
478474
return fmt.Errorf("unknown controller type: %s", controllerType)

pkg/gateway/routeutils/listener_attachment_helper.go

Lines changed: 13 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import (
1414
// listenerAttachmentHelper is an internal utility interface that can be used to determine if a listener will allow
1515
// a route to attach to it.
1616
type listenerAttachmentHelper interface {
17-
listenerAllowsAttachment(ctx context.Context, gw gwv1.Gateway, listener gwv1.Listener, route preLoadRouteDescriptor, deferredRouteReconciler RouteReconciler, hostnamesFromHttpRoutes map[types.NamespacedName][]gwv1.Hostname, hostnamesFromGrpcRoutes map[types.NamespacedName][]gwv1.Hostname) (bool, error)
17+
listenerAllowsAttachment(ctx context.Context, gw gwv1.Gateway, listener gwv1.Listener, route preLoadRouteDescriptor, hostnamesFromHttpRoutes map[types.NamespacedName][]gwv1.Hostname, hostnamesFromGrpcRoutes map[types.NamespacedName][]gwv1.Hostname) (bool, *RouteData, error)
1818
}
1919

2020
var _ listenerAttachmentHelper = &listenerAttachmentHelperImpl{}
@@ -34,40 +34,33 @@ func newListenerAttachmentHelper(k8sClient client.Client, logger logr.Logger) li
3434

3535
// listenerAllowsAttachment utility method to determine if a listener will allow a route to connect using
3636
// Gateway API rules to determine compatibility between lister and route.
37-
func (attachmentHelper *listenerAttachmentHelperImpl) listenerAllowsAttachment(ctx context.Context, gw gwv1.Gateway, listener gwv1.Listener, route preLoadRouteDescriptor, deferredRouteReconciler RouteReconciler, hostnamesFromHttpRoutes map[types.NamespacedName][]gwv1.Hostname, hostnamesFromGrpcRoutes map[types.NamespacedName][]gwv1.Hostname) (bool, error) {
37+
func (attachmentHelper *listenerAttachmentHelperImpl) listenerAllowsAttachment(ctx context.Context, gw gwv1.Gateway, listener gwv1.Listener, route preLoadRouteDescriptor, hostnamesFromHttpRoutes map[types.NamespacedName][]gwv1.Hostname, hostnamesFromGrpcRoutes map[types.NamespacedName][]gwv1.Hostname) (bool, *RouteData, error) {
3838
// check namespace
3939
namespaceOK, err := attachmentHelper.namespaceCheck(ctx, gw, listener, route)
4040
if err != nil {
41-
return false, err
41+
return false, nil, err
4242
}
4343
if !namespaceOK {
44-
deferredRouteReconciler.Enqueue(
45-
GenerateRouteData(false, true, string(gwv1.RouteReasonNotAllowedByListeners), RouteStatusInfoRejectedMessageNamespaceNotMatch, route.GetRouteNamespacedName(), route.GetRouteKind(), route.GetRouteGeneration(), gw),
46-
)
47-
48-
return false, nil
44+
rd := GenerateRouteData(false, true, string(gwv1.RouteReasonNotAllowedByListeners), RouteStatusInfoRejectedMessageNamespaceNotMatch, route.GetRouteNamespacedName(), route.GetRouteKind(), route.GetRouteGeneration(), gw)
45+
return false, &rd, nil
4946
}
5047

5148
// check kind
5249
kindOK := attachmentHelper.kindCheck(listener, route)
5350
if !kindOK {
54-
deferredRouteReconciler.Enqueue(
55-
GenerateRouteData(false, true, string(gwv1.RouteReasonNotAllowedByListeners), RouteStatusInfoRejectedMessageKindNotMatch, route.GetRouteNamespacedName(), route.GetRouteKind(), route.GetRouteGeneration(), gw),
56-
)
57-
return false, nil
51+
rd := GenerateRouteData(false, true, string(gwv1.RouteReasonNotAllowedByListeners), RouteStatusInfoRejectedMessageKindNotMatch, route.GetRouteNamespacedName(), route.GetRouteKind(), route.GetRouteGeneration(), gw)
52+
return false, &rd, nil
5853
}
5954

6055
// check hostname
6156
if (route.GetRouteKind() == HTTPRouteKind || route.GetRouteKind() == GRPCRouteKind || route.GetRouteKind() == TLSRouteKind) && route.GetHostnames() != nil {
6257
hostnameOK, err := attachmentHelper.hostnameCheck(listener, route)
6358
if err != nil {
64-
return false, err
59+
return false, nil, err
6560
}
6661
if !hostnameOK {
67-
deferredRouteReconciler.Enqueue(
68-
GenerateRouteData(false, true, string(gwv1.RouteReasonNoMatchingListenerHostname), RouteStatusInfoRejectedMessageNoMatchingHostname, route.GetRouteNamespacedName(), route.GetRouteKind(), route.GetRouteGeneration(), gw),
69-
)
70-
return false, nil
62+
rd := GenerateRouteData(false, true, string(gwv1.RouteReasonNoMatchingListenerHostname), RouteStatusInfoRejectedMessageNoMatchingHostname, route.GetRouteNamespacedName(), route.GetRouteKind(), route.GetRouteGeneration(), gw)
63+
return false, &rd, nil
7164
}
7265
}
7366

@@ -76,14 +69,12 @@ func (attachmentHelper *listenerAttachmentHelperImpl) listenerAllowsAttachment(c
7669
hostnameUniquenessOK, conflictRoute := attachmentHelper.crossServingHostnameUniquenessCheck(route, hostnamesFromHttpRoutes, hostnamesFromGrpcRoutes)
7770
if !hostnameUniquenessOK {
7871
message := fmt.Sprintf("HTTPRoute and GRPCRoute have overlap hostname, attachment is rejected. Conflict route: %s", conflictRoute)
79-
deferredRouteReconciler.Enqueue(
80-
GenerateRouteData(false, true, string(gwv1.RouteReasonNotAllowedByListeners), message, route.GetRouteNamespacedName(), route.GetRouteKind(), route.GetRouteGeneration(), gw),
81-
)
82-
return false, nil
72+
rd := GenerateRouteData(false, true, string(gwv1.RouteReasonNotAllowedByListeners), message, route.GetRouteNamespacedName(), route.GetRouteKind(), route.GetRouteGeneration(), gw)
73+
return false, &rd, nil
8374
}
8475
}
8576

86-
return true, nil
77+
return true, nil, nil
8778
}
8879

8980
// namespaceCheck namespace check implements the Gateway API spec for namespace matching between listener

pkg/gateway/routeutils/listener_attachment_helper_test.go

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,19 @@ func (mnss *mockNamespaceSelector) getNamespacesFromSelector(_ context.Context,
2222
}
2323

2424
func Test_listenerAllowsAttachment(t *testing.T) {
25+
26+
type expectedRouteStatus struct {
27+
reason string
28+
message string
29+
}
30+
2531
testCases := []struct {
26-
name string
27-
gwNamespace string
28-
routeNamespace string
29-
listenerProtocol gwv1.ProtocolType
30-
expected bool
32+
name string
33+
gwNamespace string
34+
routeNamespace string
35+
listenerProtocol gwv1.ProtocolType
36+
expectedStatusUpdate *expectedRouteStatus
37+
expected bool
3138
}{
3239
{
3340
name: "namespace and kind are ok",
@@ -41,12 +48,20 @@ func Test_listenerAllowsAttachment(t *testing.T) {
4148
gwNamespace: "ns1",
4249
routeNamespace: "ns2",
4350
listenerProtocol: gwv1.HTTPProtocolType,
51+
expectedStatusUpdate: &expectedRouteStatus{
52+
reason: string(gwv1.RouteReasonNotAllowedByListeners),
53+
message: RouteStatusInfoRejectedMessageNamespaceNotMatch,
54+
},
4455
},
4556
{
4657
name: "kind is not ok",
4758
gwNamespace: "ns1",
4859
routeNamespace: "ns1",
4960
listenerProtocol: gwv1.TLSProtocolType,
61+
expectedStatusUpdate: &expectedRouteStatus{
62+
reason: string(gwv1.RouteReasonNotAllowedByListeners),
63+
message: RouteStatusInfoRejectedMessageKindNotMatch,
64+
},
5065
},
5166
}
5267

@@ -72,12 +87,22 @@ func Test_listenerAllowsAttachment(t *testing.T) {
7287
}
7388
hostnameFromHttpRoute := map[types.NamespacedName][]gwv1.Hostname{}
7489
hostnameFromGrpcRoute := map[types.NamespacedName][]gwv1.Hostname{}
75-
mockReconciler := NewMockRouteReconciler()
76-
result, err := attachmentHelper.listenerAllowsAttachment(context.Background(), gw, gwv1.Listener{
90+
result, statusUpdate, err := attachmentHelper.listenerAllowsAttachment(context.Background(), gw, gwv1.Listener{
7791
Protocol: tc.listenerProtocol,
78-
}, route, mockReconciler, hostnameFromHttpRoute, hostnameFromGrpcRoute)
92+
}, route, hostnameFromHttpRoute, hostnameFromGrpcRoute)
7993
assert.NoError(t, err)
8094
assert.Equal(t, tc.expected, result)
95+
if tc.expectedStatusUpdate == nil {
96+
assert.Nil(t, statusUpdate)
97+
} else {
98+
assert.NotNil(t, statusUpdate)
99+
assert.Equal(t, gw.Name, statusUpdate.ParentRefGateway.Name)
100+
assert.Equal(t, gw.Namespace, statusUpdate.ParentRefGateway.Namespace)
101+
assert.Equal(t, route.GetRouteNamespacedName().Name, statusUpdate.RouteMetadata.RouteName)
102+
assert.Equal(t, route.GetRouteNamespacedName().Namespace, statusUpdate.RouteMetadata.RouteNamespace)
103+
assert.Equal(t, tc.expectedStatusUpdate.message, statusUpdate.RouteStatusInfo.Message)
104+
assert.Equal(t, tc.expectedStatusUpdate.reason, statusUpdate.RouteStatusInfo.Reason)
105+
}
81106
})
82107
}
83108
}

0 commit comments

Comments
 (0)