Skip to content

Commit 56299f2

Browse files
authored
Merge pull request #4160 from shraddhabang/gwapilisteners
[feat: gw api] Add common listener config for gateway api
2 parents cb59a3e + c13eb72 commit 56299f2

File tree

11 files changed

+1102
-108
lines changed

11 files changed

+1102
-108
lines changed

controllers/gateway/gateway_controller.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ func (r *gatewayReconciler) reconcileHelper(ctx context.Context, req reconcile.R
205205
return r.reconcileUpdate(ctx, gw, stack, lb, backendSGRequired)
206206
}
207207

208-
func (r *gatewayReconciler) reconcileDelete(ctx context.Context, gw *gwv1.Gateway, routes map[int][]routeutils.RouteDescriptor) error {
208+
func (r *gatewayReconciler) reconcileDelete(ctx context.Context, gw *gwv1.Gateway, routes map[int32][]routeutils.RouteDescriptor) error {
209209
for _, routeList := range routes {
210210
if len(routeList) != 0 {
211211
// TODO - Better error messaging (e.g. tell user the routes that are still attached)
@@ -259,7 +259,7 @@ func (r *gatewayReconciler) deployModel(ctx context.Context, gw *gwv1.Gateway, s
259259
return nil
260260
}
261261

262-
func (r *gatewayReconciler) buildModel(ctx context.Context, gw *gwv1.Gateway, gwClass *gwv1.GatewayClass, listenerToRoute map[int][]routeutils.RouteDescriptor) (core.Stack, *elbv2model.LoadBalancer, bool, error) {
262+
func (r *gatewayReconciler) buildModel(ctx context.Context, gw *gwv1.Gateway, gwClass *gwv1.GatewayClass, listenerToRoute map[int32][]routeutils.RouteDescriptor) (core.Stack, *elbv2model.LoadBalancer, bool, error) {
263263
stack, lb, backendSGRequired, err := r.modelBuilder.Build(ctx, gw, &elbv2gw.LoadBalancerConfiguration{}, listenerToRoute)
264264
if err != nil {
265265
r.eventRecorder.Event(gw, corev1.EventTypeWarning, k8s.ServiceEventReasonFailedBuildModel, fmt.Sprintf("Failed build model due to %v", err))

pkg/deploy/elbv2/listener_synthesizer.go

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,22 @@ func (s *listenerSynthesizer) Synthesize(ctx context.Context) error {
3737
if err != nil {
3838
return err
3939
}
40-
40+
// This never happens for Ingress and Service controller as their managed LBs have
41+
// atleast one default listener unlike Gateway controller's managed LBs
42+
if len(resLSsByLBARN) == 0 {
43+
var resLBs []*elbv2model.LoadBalancer
44+
s.stack.ListResources(&resLBs)
45+
for _, resLB := range resLBs {
46+
lbARN, err := resLB.LoadBalancerARN().Resolve(ctx)
47+
if err != nil {
48+
return err
49+
}
50+
if err := s.synthesizeListenersOnLB(ctx, lbARN, nil); err != nil {
51+
return err
52+
}
53+
}
54+
return nil
55+
}
4156
for lbARN, resLSs := range resLSsByLBARN {
4257
if err := s.synthesizeListenersOnLB(ctx, lbARN, resLSs); err != nil {
4358
return err

pkg/gateway/model/base_model_builder.go

Lines changed: 51 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@ import (
66
"github.com/pkg/errors"
77
"k8s.io/apimachinery/pkg/util/sets"
88
elbv2gw "sigs.k8s.io/aws-load-balancer-controller/apis/gateway/v1beta1"
9+
"sigs.k8s.io/aws-load-balancer-controller/pkg/annotations"
910
"sigs.k8s.io/aws-load-balancer-controller/pkg/aws/services"
1011
"sigs.k8s.io/aws-load-balancer-controller/pkg/config"
1112
elbv2deploy "sigs.k8s.io/aws-load-balancer-controller/pkg/deploy/elbv2"
1213
"sigs.k8s.io/aws-load-balancer-controller/pkg/deploy/tracking"
1314
"sigs.k8s.io/aws-load-balancer-controller/pkg/gateway/routeutils"
1415
"sigs.k8s.io/aws-load-balancer-controller/pkg/k8s"
16+
lbcmetrics "sigs.k8s.io/aws-load-balancer-controller/pkg/metrics/lbc"
1517
"sigs.k8s.io/aws-load-balancer-controller/pkg/model/core"
1618
elbv2model "sigs.k8s.io/aws-load-balancer-controller/pkg/model/elbv2"
1719
"sigs.k8s.io/aws-load-balancer-controller/pkg/networking"
@@ -23,7 +25,7 @@ import (
2325
// Builder builds the model stack for a Gateway resource.
2426
type Builder interface {
2527
// Build model stack for a gateway
26-
Build(ctx context.Context, gw *gwv1.Gateway, lbConf *elbv2gw.LoadBalancerConfiguration, routes map[int][]routeutils.RouteDescriptor) (core.Stack, *elbv2model.LoadBalancer, bool, error)
28+
Build(ctx context.Context, gw *gwv1.Gateway, lbConf *elbv2gw.LoadBalancerConfiguration, routes map[int32][]routeutils.RouteDescriptor) (core.Stack, *elbv2model.LoadBalancer, bool, error)
2729
}
2830

2931
// NewModelBuilder construct a new baseModelBuilder
@@ -38,14 +40,28 @@ func NewModelBuilder(subnetsResolver networking.SubnetsResolver,
3840
subnetBuilder := newSubnetModelBuilder(loadBalancerType, trackingProvider, subnetsResolver, elbv2TaggingManager)
3941
sgBuilder := newSecurityGroupBuilder(gwTagHelper, clusterName, enableBackendSG, sgResolver, backendSGProvider, logger)
4042
lbBuilder := newLoadBalancerBuilder(loadBalancerType, gwTagHelper, clusterName)
41-
tgBuilder := newTargetGroupBuilder(clusterName, vpcID, gwTagHelper, loadBalancerType, disableRestrictedSGRules, defaultTargetType)
4243

4344
return &baseModelBuilder{
44-
subnetBuilder: subnetBuilder,
45-
securityGroupBuilder: sgBuilder,
46-
lbBuilder: lbBuilder,
47-
tgBuilder: tgBuilder,
48-
logger: logger,
45+
clusterName: clusterName,
46+
vpcID: vpcID,
47+
subnetsResolver: subnetsResolver,
48+
backendSGProvider: backendSGProvider,
49+
sgResolver: sgResolver,
50+
vpcInfoProvider: vpcInfoProvider,
51+
elbv2TaggingManager: elbv2TaggingManager,
52+
featureGates: featureGates,
53+
ec2Client: ec2Client,
54+
subnetBuilder: subnetBuilder,
55+
securityGroupBuilder: sgBuilder,
56+
loadBalancerType: loadBalancerType,
57+
lbBuilder: lbBuilder,
58+
gwTagHelper: gwTagHelper,
59+
logger: logger,
60+
defaultTargetType: defaultTargetType,
61+
externalManagedTags: externalManagedTags,
62+
defaultSSLPolicy: defaultSSLPolicy,
63+
defaultTags: defaultTags,
64+
disableRestrictedSGRules: disableRestrictedSGRules,
4965

5066
defaultLoadBalancerScheme: elbv2model.LoadBalancerScheme(defaultLoadBalancerScheme),
5167
defaultIPType: elbv2model.IPAddressTypeIPV4,
@@ -55,19 +71,41 @@ func NewModelBuilder(subnetsResolver networking.SubnetsResolver,
5571
var _ Builder = &baseModelBuilder{}
5672

5773
type baseModelBuilder struct {
58-
lbBuilder loadBalancerBuilder
59-
logger logr.Logger
74+
clusterName string
75+
vpcID string
76+
loadBalancerType elbv2model.LoadBalancerType
77+
annotationParser annotations.Parser
78+
subnetsResolver networking.SubnetsResolver
79+
vpcInfoProvider networking.VPCInfoProvider
80+
backendSGProvider networking.BackendSGProvider
81+
sgResolver networking.SecurityGroupResolver
82+
elbv2TaggingManager elbv2deploy.TaggingManager
83+
featureGates config.FeatureGates
84+
enableIPTargetType bool
85+
enableManageBackendSGRules bool
86+
defaultTags map[string]string
87+
externalManagedTags sets.Set[string]
88+
defaultSSLPolicy string
89+
defaultTargetType string
90+
disableRestrictedSGRules bool
91+
ec2Client services.EC2
92+
metricsCollector lbcmetrics.MetricCollector
93+
lbBuilder loadBalancerBuilder
94+
gwTagHelper tagHelper
95+
listenerBuilder listenerBuilder
96+
logger logr.Logger
6097

6198
subnetBuilder subnetModelBuilder
6299
securityGroupBuilder securityGroupBuilder
63-
tgBuilder targetGroupBuilder
64100

65101
defaultLoadBalancerScheme elbv2model.LoadBalancerScheme
66102
defaultIPType elbv2model.IPAddressType
67103
}
68104

69-
func (baseBuilder *baseModelBuilder) Build(ctx context.Context, gw *gwv1.Gateway, lbConf *elbv2gw.LoadBalancerConfiguration, routes map[int][]routeutils.RouteDescriptor) (core.Stack, *elbv2model.LoadBalancer, bool, error) {
105+
func (baseBuilder *baseModelBuilder) Build(ctx context.Context, gw *gwv1.Gateway, lbConf *elbv2gw.LoadBalancerConfiguration, routes map[int32][]routeutils.RouteDescriptor) (core.Stack, *elbv2model.LoadBalancer, bool, error) {
70106
stack := core.NewDefaultStack(core.StackID(k8s.NamespacedName(gw)))
107+
tgBuilder := newTargetGroupBuilder(baseBuilder.clusterName, baseBuilder.vpcID, baseBuilder.gwTagHelper, baseBuilder.loadBalancerType, baseBuilder.disableRestrictedSGRules, baseBuilder.defaultTargetType)
108+
listenerBuilder := newListenerBuilder(baseBuilder.loadBalancerType, tgBuilder, baseBuilder.gwTagHelper, baseBuilder.clusterName, baseBuilder.defaultSSLPolicy, baseBuilder.logger)
71109
if gw.DeletionTimestamp != nil && !gw.DeletionTimestamp.IsZero() {
72110
if baseBuilder.isDeleteProtected(lbConf) {
73111
return nil, nil, false, errors.Errorf("Unable to delete gateway %+v because deletion protection is enabled.", k8s.NamespacedName(gw))
@@ -113,29 +151,8 @@ func (baseBuilder *baseModelBuilder) Build(ctx context.Context, gw *gwv1.Gateway
113151

114152
lb := elbv2model.NewLoadBalancer(stack, resourceIDLoadBalancer, spec)
115153

116-
baseBuilder.logger.Info("Got this route details", "routes", routes)
117-
/* Target Groups */
118-
// TODO - Figure out how to map this back to a listener?
119-
tgByResID := make(map[string]buildTargetGroupOutput)
120-
for _, descriptors := range routes {
121-
for _, descriptor := range descriptors {
122-
for _, rule := range descriptor.GetAttachedRules() {
123-
for _, backend := range rule.GetBackends() {
124-
// TODO -- Figure out what to do with the return value (it's also inserted into the tgByResID map)
125-
// TODO -- I'm not in love with this API.
126-
_, tgErr := baseBuilder.tgBuilder.buildTargetGroup(&tgByResID, gw, lbConf, lb.Spec.IPAddressType, descriptor, backend, securityGroups.backendSecurityGroupToken)
127-
if tgErr != nil {
128-
return nil, nil, false, err
129-
}
130-
}
131-
}
132-
}
133-
}
134-
135-
for tgResID, tgOut := range tgByResID {
136-
tg := elbv2model.NewTargetGroup(stack, tgResID, tgOut.targetGroupSpec)
137-
tgOut.bindingSpec.Template.Spec.TargetGroupARN = tg.TargetGroupARN()
138-
elbv2model.NewTargetGroupBindingResource(stack, tg.ID(), tgOut.bindingSpec)
154+
if err := listenerBuilder.buildListeners(stack, lb, securityGroups, gw, routes, lbConf); err != nil {
155+
return nil, nil, false, err
139156
}
140157

141158
return stack, lb, securityGroups.backendSecurityGroupAllocated, nil

0 commit comments

Comments
 (0)