Skip to content

Commit b6294da

Browse files
committed
refactor to make target group name -> arn mapper be a common utility
1 parent 53d4f9b commit b6294da

File tree

6 files changed

+88
-55
lines changed

6 files changed

+88
-55
lines changed

controllers/ingress/group_controller.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"fmt"
66
awsmetrics "sigs.k8s.io/aws-load-balancer-controller/pkg/metrics/aws"
7+
"sigs.k8s.io/aws-load-balancer-controller/pkg/shared_utils"
78

89
"sigs.k8s.io/controller-runtime/pkg/reconcile"
910

@@ -53,7 +54,7 @@ func NewGroupReconciler(cloud services.Cloud, k8sClient client.Client, eventReco
5354
networkingManager networkingpkg.NetworkingManager, networkingSGReconciler networkingpkg.SecurityGroupReconciler, subnetsResolver networkingpkg.SubnetsResolver,
5455
elbv2TaggingManager elbv2deploy.TaggingManager, controllerConfig config.ControllerConfig, backendSGProvider networkingpkg.BackendSGProvider,
5556
sgResolver networkingpkg.SecurityGroupResolver, logger logr.Logger, metricsCollector lbcmetrics.MetricCollector, reconcileCounters *metricsutil.ReconcileCounters,
56-
targetGroupCollector awsmetrics.TargetGroupCollector) *groupReconciler {
57+
targetGroupCollector awsmetrics.TargetGroupCollector, targetGroupNameToArnMapper shared_utils.TargetGroupARNMapper) *groupReconciler {
5758

5859
annotationParser := annotations.NewSuffixAnnotationParser(annotations.AnnotationPrefixIngress)
5960
authConfigBuilder := ingress.NewDefaultAuthConfigBuilder(annotationParser)
@@ -66,7 +67,7 @@ func NewGroupReconciler(cloud services.Cloud, k8sClient client.Client, eventReco
6667
authConfigBuilder, enhancedBackendBuilder, trackingProvider, elbv2TaggingManager, controllerConfig.FeatureGates,
6768
cloud.VpcID(), controllerConfig.ClusterName, controllerConfig.DefaultTags, controllerConfig.ExternalManagedTags,
6869
controllerConfig.DefaultSSLPolicy, controllerConfig.DefaultTargetType, controllerConfig.DefaultLoadBalancerScheme, backendSGProvider, sgResolver,
69-
controllerConfig.EnableBackendSecurityGroup, controllerConfig.EnableManageBackendSecurityGroupRules, controllerConfig.DisableRestrictedSGRules, controllerConfig.IngressConfig.AllowedCertificateAuthorityARNs, controllerConfig.FeatureGates.Enabled(config.EnableIPTargetType), logger, metricsCollector)
70+
controllerConfig.EnableBackendSecurityGroup, controllerConfig.EnableManageBackendSecurityGroupRules, controllerConfig.DisableRestrictedSGRules, controllerConfig.IngressConfig.AllowedCertificateAuthorityARNs, controllerConfig.FeatureGates.Enabled(config.EnableIPTargetType), targetGroupNameToArnMapper, logger, metricsCollector)
7071
stackMarshaller := deploy.NewDefaultStackMarshaller()
7172
stackDeployer := deploy.NewDefaultStackDeployer(cloud, k8sClient, networkingManager, networkingSGManager, networkingSGReconciler, elbv2TaggingManager,
7273
controllerConfig, ingressTagPrefix, logger, metricsCollector, controllerName, controllerConfig.FeatureGates.Enabled(config.EnhancedDefaultBehavior), targetGroupCollector)

main.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"fmt"
2222
"k8s.io/apimachinery/pkg/util/sets"
2323
"os"
24+
"sigs.k8s.io/aws-load-balancer-controller/pkg/shared_utils"
2425

2526
elbv2gw "sigs.k8s.io/aws-load-balancer-controller/apis/gateway/v1beta1"
2627
"sigs.k8s.io/aws-load-balancer-controller/controllers/gateway"
@@ -110,6 +111,7 @@ type gatewayControllerConfig struct {
110111
serviceReferenceCounter referencecounter.ServiceReferenceCounter
111112
networkingManager networking.NetworkingManager
112113
targetGroupCollector awsmetrics.TargetGroupCollector
114+
targetGroupARNMapper shared_utils.TargetGroupARNMapper
113115
}
114116

115117
func main() {
@@ -187,6 +189,8 @@ func main() {
187189

188190
networkingManager := networking.NewDefaultNetworkingManager(mgr.GetClient(), podENIResolver, nodeENIResolver, sgManager, sgReconciler, cloud.VpcID(), controllerCFG.ClusterName, controllerCFG.ServiceTargetENISGTags, ctrl.Log, controllerCFG.DisableRestrictedSGRules)
189191

192+
tgArnMapper := shared_utils.NewTargetGroupNameToArnMapper(cloud.ELBV2())
193+
190194
tgbResManager := targetgroupbinding.NewDefaultResourceManager(mgr.GetClient(), cloud.ELBV2(),
191195
podInfoRepo, networkingManager, vpcInfoProvider, multiClusterManager, lbcMetricsCollector,
192196
cloud.VpcID(), controllerCFG.FeatureGates.Enabled(config.EndpointsFailOpen), controllerCFG.EnableEndpointSlices,
@@ -198,7 +202,7 @@ func main() {
198202
ingGroupReconciler := ingress.NewGroupReconciler(cloud, mgr.GetClient(), mgr.GetEventRecorderFor("ingress"),
199203
finalizerManager, sgManager, networkingManager, sgReconciler, subnetResolver, elbv2TaggingManager,
200204
controllerCFG, backendSGProvider, sgResolver, ctrl.Log.WithName("controllers").WithName("ingress"), lbcMetricsCollector, reconcileCounters,
201-
targetGroupCollector)
205+
targetGroupCollector, tgArnMapper)
202206
svcReconciler := service.NewServiceReconciler(cloud, mgr.GetClient(), mgr.GetEventRecorderFor("service"),
203207
finalizerManager, networkingManager, sgManager, sgReconciler, subnetResolver, vpcInfoProvider, elbv2TaggingManager,
204208
controllerCFG, backendSGProvider, sgResolver, ctrl.Log.WithName("controllers").WithName("service"), lbcMetricsCollector, reconcileCounters,
@@ -268,6 +272,7 @@ func main() {
268272
networkingManager: networkingManager,
269273
serviceReferenceCounter: serviceReferenceCounter,
270274
targetGroupCollector: targetGroupCollector,
275+
targetGroupARNMapper: tgArnMapper,
271276
}
272277

273278
enabledControllers := sets.Set[string]{}
@@ -473,6 +478,7 @@ func setupGatewayController(ctx context.Context, mgr ctrl.Manager, cfg *gatewayC
473478
cfg.metricsCollector,
474479
cfg.reconcileCounters,
475480
cfg.targetGroupCollector,
481+
cfg.targetGroupARNMapper,
476482
)
477483
case gateway_constants.ALBGatewayController:
478484
reconciler = gateway.NewALBGatewayReconciler(
@@ -495,6 +501,7 @@ func setupGatewayController(ctx context.Context, mgr ctrl.Manager, cfg *gatewayC
495501
cfg.metricsCollector,
496502
cfg.reconcileCounters,
497503
cfg.targetGroupCollector,
504+
cfg.targetGroupARNMapper,
498505
)
499506
default:
500507
return fmt.Errorf("unknown controller type: %s", controllerType)

pkg/ingress/model_build_actions.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ func (t *defaultModelBuildTask) buildForwardAction(ctx context.Context, ing Clas
107107
if tgt.TargetGroupARN != nil {
108108
tgARN = core.LiteralStringToken(*tgt.TargetGroupARN)
109109
} else if tgt.TargetGroupName != nil {
110-
targetGroupARN, err := t.targetGroupNameToArnMapper.getArnByName(ctx, *tgt.TargetGroupName)
110+
targetGroupARN, err := t.targetGroupNameToArnMapper.GetArnByName(ctx, *tgt.TargetGroupName)
111111
if err != nil {
112112
return elbv2model.Action{}, fmt.Errorf("searching TargetGroup with name %s: %w", *tgt.TargetGroupName, err)
113113
}

pkg/ingress/model_build_actions_test.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@ import (
1515
"sigs.k8s.io/aws-load-balancer-controller/pkg/aws/services"
1616
"sigs.k8s.io/aws-load-balancer-controller/pkg/model/core"
1717
elbv2model "sigs.k8s.io/aws-load-balancer-controller/pkg/model/elbv2"
18+
"sigs.k8s.io/aws-load-balancer-controller/pkg/shared_utils"
1819
testclient "sigs.k8s.io/controller-runtime/pkg/client/fake"
1920
"testing"
21+
"time"
2022
)
2123

2224
func Test_defaultModelBuildTask_buildAuthenticateOIDCAction(t *testing.T) {
@@ -435,11 +437,11 @@ func Test_defaultModelBuildTask_buildForwardActionWithTargetGroupName(t *testing
435437
}
436438
task := &defaultModelBuildTask{
437439
elbv2Client: elbv2Client,
438-
targetGroupNameToArnMapper: newTargetGroupNameToArnMapper(elbv2Client, defaultTargetGroupNameToARNCacheTTL),
440+
targetGroupNameToArnMapper: shared_utils.NewTargetGroupNameToArnMapper(elbv2Client),
439441
}
440442

441443
for targetGroupName, cachedArn := range tt.args.cache {
442-
task.targetGroupNameToArnMapper.cache.Set(targetGroupName, cachedArn, defaultTargetGroupNameToARNCacheTTL)
444+
task.targetGroupNameToArnMapper.GetCache().Set(targetGroupName, cachedArn, 10*time.Minute)
443445
}
444446

445447
got, err := task.buildForwardAction(context.Background(), tt.args.ingress, Action{
@@ -448,9 +450,9 @@ func Test_defaultModelBuildTask_buildForwardActionWithTargetGroupName(t *testing
448450
})
449451
assert.Equal(t, tt.want, got)
450452
assert.Equal(t, tt.wantErr, err)
451-
assert.Equal(t, len(tt.wantCache), task.targetGroupNameToArnMapper.cache.Len())
453+
assert.Equal(t, len(tt.wantCache), task.targetGroupNameToArnMapper.GetCache().Len())
452454
for targetGroupName, expectedArn := range tt.wantCache {
453-
rawCacheItem, exists := task.targetGroupNameToArnMapper.cache.Get(targetGroupName)
455+
rawCacheItem, exists := task.targetGroupNameToArnMapper.GetCache().Get(targetGroupName)
454456
assert.True(t, exists)
455457
cachedArn := rawCacheItem.(string)
456458
assert.Equal(t, expectedArn, cachedArn)

pkg/ingress/model_builder.go

Lines changed: 7 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ package ingress
22

33
import (
44
"context"
5-
elbv2sdk "github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2"
65
wafv2sdk "github.com/aws/aws-sdk-go-v2/service/wafv2"
76
wafv2types "github.com/aws/aws-sdk-go-v2/service/wafv2/types"
87
"k8s.io/apimachinery/pkg/util/cache"
98
"reflect"
9+
"sigs.k8s.io/aws-load-balancer-controller/pkg/shared_utils"
1010
"strconv"
1111
"sync"
1212
"time"
@@ -39,9 +39,8 @@ import (
3939
)
4040

4141
const (
42-
controllerName = "ingress"
43-
defaultTargetGroupNameToARNCacheTTL = 20 * time.Minute
44-
defaultWebACLNameToARNCacheTTL = 60 * time.Minute
42+
controllerName = "ingress"
43+
defaultWebACLNameToARNCacheTTL = 60 * time.Minute
4544
)
4645

4746
// ModelBuilder is responsible for build mode stack for a IngressGroup.
@@ -58,7 +57,7 @@ func NewDefaultModelBuilder(k8sClient client.Client, eventRecorder record.EventR
5857
trackingProvider tracking.Provider, elbv2TaggingManager elbv2deploy.TaggingManager, featureGates config.FeatureGates,
5958
vpcID string, clusterName string, defaultTags map[string]string, externalManagedTags []string, defaultSSLPolicy string, defaultTargetType string, defaultLoadBalancerScheme string,
6059
backendSGProvider networkingpkg.BackendSGProvider, sgResolver networkingpkg.SecurityGroupResolver,
61-
enableBackendSG bool, defaultEnableManageBackendSGRules bool, disableRestrictedSGRules bool, allowedCAARNs []string, enableIPTargetType bool, logger logr.Logger, metricsCollector lbcmetrics.MetricCollector) *defaultModelBuilder {
60+
enableBackendSG bool, defaultEnableManageBackendSGRules bool, disableRestrictedSGRules bool, allowedCAARNs []string, enableIPTargetType bool, targetGroupNameToArnMapper shared_utils.TargetGroupARNMapper, logger logr.Logger, metricsCollector lbcmetrics.MetricCollector) *defaultModelBuilder {
6261
certDiscovery := certs.NewACMCertDiscovery(acmClient, allowedCAARNs, logger)
6362
ruleOptimizer := NewDefaultRuleOptimizer(logger)
6463
return &defaultModelBuilder{
@@ -88,7 +87,7 @@ func NewDefaultModelBuilder(k8sClient client.Client, eventRecorder record.EventR
8887
enableManageBackendSGRules: defaultEnableManageBackendSGRules,
8988
disableRestrictedSGRules: disableRestrictedSGRules,
9089
enableIPTargetType: enableIPTargetType,
91-
targetGroupNameToArnMapper: newTargetGroupNameToArnMapper(elbv2Client, defaultTargetGroupNameToARNCacheTTL),
90+
targetGroupNameToArnMapper: targetGroupNameToArnMapper,
9291
webACLNameToArnMapper: newWebACLNameToArnMapper(wafv2Client, defaultWebACLNameToARNCacheTTL),
9392
logger: logger,
9493
metricsCollector: metricsCollector,
@@ -128,7 +127,7 @@ type defaultModelBuilder struct {
128127
enableManageBackendSGRules bool
129128
disableRestrictedSGRules bool
130129
enableIPTargetType bool
131-
targetGroupNameToArnMapper *targetGroupNameToArnMapper
130+
targetGroupNameToArnMapper shared_utils.TargetGroupARNMapper
132131
webACLNameToArnMapper *webACLNameToArnMapper
133132

134133
logger logr.Logger
@@ -255,7 +254,7 @@ type defaultModelBuildTask struct {
255254
secretKeys []types.NamespacedName
256255
frontendNlb *elbv2model.LoadBalancer
257256
frontendNlbTargetGroupDesiredState *core.FrontendNlbTargetGroupDesiredState
258-
targetGroupNameToArnMapper *targetGroupNameToArnMapper
257+
targetGroupNameToArnMapper shared_utils.TargetGroupARNMapper
259258
webACLNameToArnMapper *webACLNameToArnMapper
260259

261260
metricsCollector lbcmetrics.MetricCollector
@@ -566,45 +565,6 @@ func newWebACLNameToArnMapper(wafv2Client services.WAFv2, ttl time.Duration) *we
566565
}
567566
}
568567

569-
type targetGroupNameToArnMapper struct {
570-
elbv2Client services.ELBV2
571-
cache *cache.Expiring
572-
cacheTTL time.Duration
573-
cacheMutex sync.RWMutex
574-
}
575-
576-
func newTargetGroupNameToArnMapper(elbv2Client services.ELBV2, ttl time.Duration) *targetGroupNameToArnMapper {
577-
return &targetGroupNameToArnMapper{
578-
elbv2Client: elbv2Client,
579-
cache: cache.NewExpiring(),
580-
cacheTTL: ttl,
581-
}
582-
}
583-
584-
// getArnByName returns the ARN of an AWS target group identified by its name
585-
func (t *targetGroupNameToArnMapper) getArnByName(ctx context.Context, targetGroupName string) (string, error) {
586-
t.cacheMutex.Lock()
587-
defer t.cacheMutex.Unlock()
588-
589-
if rawCacheItem, exists := t.cache.Get(targetGroupName); exists {
590-
return rawCacheItem.(string), nil
591-
}
592-
req := &elbv2sdk.DescribeTargetGroupsInput{
593-
Names: []string{targetGroupName},
594-
}
595-
596-
targetGroups, err := t.elbv2Client.DescribeTargetGroupsAsList(ctx, req)
597-
if err != nil {
598-
return "", err
599-
}
600-
if len(targetGroups) != 1 {
601-
return "", errors.Errorf("expecting a single targetGroup with query [%s] but got %v", targetGroupName, len(targetGroups))
602-
}
603-
arn := *targetGroups[0].TargetGroupArn
604-
t.cache.Set(targetGroupName, arn, t.cacheTTL)
605-
return arn, nil
606-
}
607-
608568
func (w *webACLNameToArnMapper) getArnByName(ctx context.Context, webACLName string) (string, error) {
609569
w.cacheMutex.Lock()
610570
defer w.cacheMutex.Unlock()
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package shared_utils
2+
3+
import (
4+
"context"
5+
elbv2sdk "github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2"
6+
"github.com/pkg/errors"
7+
"k8s.io/apimachinery/pkg/util/cache"
8+
"sigs.k8s.io/aws-load-balancer-controller/pkg/aws/services"
9+
"sync"
10+
"time"
11+
)
12+
13+
const (
14+
defaultTargetGroupNameToARNCacheTTL = 20 * time.Minute
15+
)
16+
17+
type TargetGroupARNMapper interface {
18+
GetArnByName(ctx context.Context, targetGroupName string) (string, error)
19+
GetCache() *cache.Expiring
20+
}
21+
22+
type targetGroupNameToArnMapper struct {
23+
elbv2Client services.ELBV2
24+
cache *cache.Expiring
25+
cacheTTL time.Duration
26+
cacheMutex sync.RWMutex
27+
}
28+
29+
func (t *targetGroupNameToArnMapper) GetCache() *cache.Expiring {
30+
return t.cache
31+
}
32+
33+
func NewTargetGroupNameToArnMapper(elbv2Client services.ELBV2) TargetGroupARNMapper {
34+
return &targetGroupNameToArnMapper{
35+
elbv2Client: elbv2Client,
36+
cache: cache.NewExpiring(),
37+
cacheTTL: defaultTargetGroupNameToARNCacheTTL,
38+
}
39+
}
40+
41+
// GetArnByName returns the ARN of an AWS target group identified by its name
42+
func (t *targetGroupNameToArnMapper) GetArnByName(ctx context.Context, targetGroupName string) (string, error) {
43+
t.cacheMutex.Lock()
44+
defer t.cacheMutex.Unlock()
45+
46+
if rawCacheItem, exists := t.cache.Get(targetGroupName); exists {
47+
return rawCacheItem.(string), nil
48+
}
49+
req := &elbv2sdk.DescribeTargetGroupsInput{
50+
Names: []string{targetGroupName},
51+
}
52+
53+
targetGroups, err := t.elbv2Client.DescribeTargetGroupsAsList(ctx, req)
54+
if err != nil {
55+
return "", err
56+
}
57+
if len(targetGroups) != 1 {
58+
return "", errors.Errorf("expecting a single targetGroup with query [%s] but got %v", targetGroupName, len(targetGroups))
59+
}
60+
arn := *targetGroups[0].TargetGroupArn
61+
t.cache.Set(targetGroupName, arn, t.cacheTTL)
62+
return arn, nil
63+
}

0 commit comments

Comments
 (0)