Skip to content

Commit d56faca

Browse files
authored
Merge pull request #4208 from wweiwei-li/fix
Reduce duplicated DescribeTargetGroups calls
2 parents 435dbf7 + 4d52a7b commit d56faca

File tree

3 files changed

+46
-35
lines changed

3 files changed

+46
-35
lines changed

pkg/deploy/elbv2/frontend_nlb_target_synthesizer.go

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,12 @@ import (
1616
"sigs.k8s.io/controller-runtime/pkg/client"
1717
)
1818

19-
func NewFrontendNlbTargetSynthesizer(k8sClient client.Client, trackingProvider tracking.Provider, taggingManager TaggingManager, frontendNlbTargetsManager FrontendNlbTargetsManager, logger logr.Logger, featureGates config.FeatureGates, stack core.Stack, frontendNlbTargetGroupDesiredState *core.FrontendNlbTargetGroupDesiredState) *frontendNlbTargetSynthesizer {
19+
type TargetGroupsResult struct {
20+
TargetGroups []TargetGroupWithTags
21+
Err error
22+
}
23+
24+
func NewFrontendNlbTargetSynthesizer(k8sClient client.Client, trackingProvider tracking.Provider, taggingManager TaggingManager, frontendNlbTargetsManager FrontendNlbTargetsManager, logger logr.Logger, featureGates config.FeatureGates, stack core.Stack, frontendNlbTargetGroupDesiredState *core.FrontendNlbTargetGroupDesiredState, findSDKTargetGroups func() TargetGroupsResult) *frontendNlbTargetSynthesizer {
2025
return &frontendNlbTargetSynthesizer{
2126
k8sClient: k8sClient,
2227
trackingProvider: trackingProvider,
@@ -26,6 +31,7 @@ func NewFrontendNlbTargetSynthesizer(k8sClient client.Client, trackingProvider t
2631
logger: logger,
2732
stack: stack,
2833
frontendNlbTargetGroupDesiredState: frontendNlbTargetGroupDesiredState,
34+
findSDKTargetGroups: findSDKTargetGroups,
2935
}
3036
}
3137

@@ -38,16 +44,18 @@ type frontendNlbTargetSynthesizer struct {
3844
logger logr.Logger
3945
stack core.Stack
4046
frontendNlbTargetGroupDesiredState *core.FrontendNlbTargetGroupDesiredState
47+
findSDKTargetGroups func() TargetGroupsResult
4148
}
4249

4350
// Synthesize processes AWS target groups and deregisters ALB targets based on the desired state.
4451
func (s *frontendNlbTargetSynthesizer) Synthesize(ctx context.Context) error {
4552
var resTGs []*elbv2model.TargetGroup
4653
s.stack.ListResources(&resTGs)
47-
sdkTGs, err := s.findSDKTargetGroups(ctx)
48-
if err != nil {
49-
return err
54+
res := s.findSDKTargetGroups()
55+
if res.Err != nil {
56+
return res.Err
5057
}
58+
sdkTGs := res.TargetGroups
5159
_, _, unmatchedSDKTGs, err := matchResAndSDKTargetGroups(resTGs, sdkTGs,
5260
s.trackingProvider.ResourceIDTagKey(), s.featureGates)
5361
if err != nil {
@@ -158,9 +166,3 @@ func filterALBTargetGroups(targetGroups []*elbv2model.TargetGroup) []*elbv2model
158166
}
159167
return filteredTargetGroups
160168
}
161-
162-
func (s *frontendNlbTargetSynthesizer) findSDKTargetGroups(ctx context.Context) ([]TargetGroupWithTags, error) {
163-
stackTags := s.trackingProvider.StackTags(s.stack)
164-
return s.taggingManager.ListTargetGroups(ctx,
165-
tracking.TagsAsTagFilter(stackTags))
166-
}

pkg/deploy/elbv2/target_group_synthesizer.go

Lines changed: 17 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,17 @@ import (
1616

1717
// NewTargetGroupSynthesizer constructs targetGroupSynthesizer
1818
func NewTargetGroupSynthesizer(elbv2Client services.ELBV2, trackingProvider tracking.Provider, taggingManager TaggingManager,
19-
tgManager TargetGroupManager, logger logr.Logger, featureGates config.FeatureGates, stack core.Stack) *targetGroupSynthesizer {
19+
tgManager TargetGroupManager, logger logr.Logger, featureGates config.FeatureGates, stack core.Stack, findSDKTargetGroups func() TargetGroupsResult) *targetGroupSynthesizer {
2020
return &targetGroupSynthesizer{
21-
elbv2Client: elbv2Client,
22-
trackingProvider: trackingProvider,
23-
taggingManager: taggingManager,
24-
tgManager: tgManager,
25-
featureGates: featureGates,
26-
logger: logger,
27-
stack: stack,
28-
unmatchedSDKTGs: nil,
21+
elbv2Client: elbv2Client,
22+
trackingProvider: trackingProvider,
23+
taggingManager: taggingManager,
24+
tgManager: tgManager,
25+
featureGates: featureGates,
26+
logger: logger,
27+
stack: stack,
28+
unmatchedSDKTGs: nil,
29+
findSDKTargetGroups: findSDKTargetGroups,
2930
}
3031
}
3132

@@ -38,17 +39,19 @@ type targetGroupSynthesizer struct {
3839
featureGates config.FeatureGates
3940
logger logr.Logger
4041

41-
stack core.Stack
42-
unmatchedSDKTGs []TargetGroupWithTags
42+
stack core.Stack
43+
unmatchedSDKTGs []TargetGroupWithTags
44+
findSDKTargetGroups func() TargetGroupsResult
4345
}
4446

4547
func (s *targetGroupSynthesizer) Synthesize(ctx context.Context) error {
4648
var resTGs []*elbv2model.TargetGroup
4749
s.stack.ListResources(&resTGs)
48-
sdkTGs, err := s.findSDKTargetGroups(ctx)
49-
if err != nil {
50-
return err
50+
res := s.findSDKTargetGroups()
51+
if res.Err != nil {
52+
return res.Err
5153
}
54+
sdkTGs := res.TargetGroups
5255
matchedResAndSDKTGs, unmatchedResTGs, unmatchedSDKTGs, err := matchResAndSDKTargetGroups(resTGs, sdkTGs,
5356
s.trackingProvider.ResourceIDTagKey(), s.featureGates)
5457
if err != nil {
@@ -85,15 +88,6 @@ func (s *targetGroupSynthesizer) PostSynthesize(ctx context.Context) error {
8588
return nil
8689
}
8790

88-
// findSDKTargetGroups will find all AWS TargetGroups created for stack.
89-
func (s *targetGroupSynthesizer) findSDKTargetGroups(ctx context.Context) ([]TargetGroupWithTags, error) {
90-
stackTags := s.trackingProvider.StackTags(s.stack)
91-
stackTagsLegacy := s.trackingProvider.StackTagsLegacy(s.stack)
92-
return s.taggingManager.ListTargetGroups(ctx,
93-
tracking.TagsAsTagFilter(stackTags),
94-
tracking.TagsAsTagFilter(stackTagsLegacy))
95-
}
96-
9791
type resAndSDKTargetGroupPair struct {
9892
resTG *elbv2model.TargetGroup
9993
sdkTG TargetGroupWithTags

pkg/deploy/stack_deployer.go

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package deploy
33
import (
44
"context"
55
"fmt"
6+
"sync"
67

78
"github.com/go-logr/logr"
89
"sigs.k8s.io/aws-load-balancer-controller/pkg/aws/services"
@@ -24,6 +25,8 @@ const (
2425
ingressController = "ingress"
2526
)
2627

28+
// Using elbv2.TargetGroupsResult instead of defining our own
29+
2730
// StackDeployer will deploy a resource stack into AWS and K8S.
2831
type StackDeployer interface {
2932
// Deploy a resource stack.
@@ -105,12 +108,24 @@ func (d *defaultStackDeployer) Deploy(ctx context.Context, stack core.Stack, met
105108
ec2.NewSecurityGroupSynthesizer(d.cloud.EC2(), d.trackingProvider, d.ec2TaggingManager, d.ec2SGManager, d.vpcID, d.logger, stack),
106109
}
107110

111+
// Create a cached function that will only execute once to fetch target groups
112+
// This is to avoid duplicate ListTargetGroups API call
113+
findSDKTargetGroups := sync.OnceValue(func() elbv2.TargetGroupsResult {
114+
stackTags := d.trackingProvider.StackTags(stack)
115+
stackTagsLegacy := d.trackingProvider.StackTagsLegacy(stack)
116+
tgs, err := d.elbv2TaggingManager.ListTargetGroups(ctx,
117+
tracking.TagsAsTagFilter(stackTags),
118+
tracking.TagsAsTagFilter(stackTagsLegacy))
119+
return elbv2.TargetGroupsResult{TargetGroups: tgs, Err: err}
120+
})
121+
108122
if controllerName == ingressController {
109-
synthesizers = append(synthesizers, elbv2.NewFrontendNlbTargetSynthesizer(d.k8sClient, d.trackingProvider, d.elbv2TaggingManager, d.elbv2FrontendNlbTargetsManager, d.logger, d.featureGates, stack, frontendNlbTargetGroupDesiredState))
123+
synthesizers = append(synthesizers, elbv2.NewFrontendNlbTargetSynthesizer(
124+
d.k8sClient, d.trackingProvider, d.elbv2TaggingManager, d.elbv2FrontendNlbTargetsManager, d.logger, d.featureGates, stack, frontendNlbTargetGroupDesiredState, findSDKTargetGroups))
110125
}
111126

112127
synthesizers = append(synthesizers,
113-
elbv2.NewTargetGroupSynthesizer(d.cloud.ELBV2(), d.trackingProvider, d.elbv2TaggingManager, d.elbv2TGManager, d.logger, d.featureGates, stack),
128+
elbv2.NewTargetGroupSynthesizer(d.cloud.ELBV2(), d.trackingProvider, d.elbv2TaggingManager, d.elbv2TGManager, d.logger, d.featureGates, stack, findSDKTargetGroups),
114129
elbv2.NewLoadBalancerSynthesizer(d.cloud.ELBV2(), d.trackingProvider, d.elbv2TaggingManager, d.elbv2LBManager, d.logger, d.featureGates, d.controllerConfig, stack),
115130
elbv2.NewListenerSynthesizer(d.cloud.ELBV2(), d.elbv2TaggingManager, d.elbv2LSManager, d.logger, stack),
116131
elbv2.NewListenerRuleSynthesizer(d.cloud.ELBV2(), d.elbv2TaggingManager, d.elbv2LRManager, d.logger, d.featureGates, stack),

0 commit comments

Comments
 (0)