Skip to content

Commit 7b8080f

Browse files
Migrate ELB garbage collection to AWS SDK v2
Migrates the garbage collection logic for Classic Load Balancers (ELB) from the AWS SDK v1 to v2. Signed-off-by: Danil-Grigorev <[email protected]>
1 parent 625058d commit 7b8080f

File tree

7 files changed

+197
-60
lines changed

7 files changed

+197
-60
lines changed

pkg/cloud/scope/clients.go

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"context"
2121

2222
ec2v2 "github.com/aws/aws-sdk-go-v2/service/ec2"
23+
elasticloadbalancing "github.com/aws/aws-sdk-go-v2/service/elasticloadbalancing"
2324
elasticloadbalancingv2 "github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2"
2425
resourcegroupstaggingapiv2 "github.com/aws/aws-sdk-go-v2/service/resourcegroupstaggingapi"
2526
"github.com/aws/aws-sdk-go-v2/service/s3"
@@ -86,6 +87,13 @@ type EC2API interface {
8687
ec2v2.DescribeSecurityGroupsAPIClient
8788
}
8889

90+
// ELBAPI is a compatibility layer for the v2 elasticloadbalancing.Client interface.
91+
type ELBAPI interface {
92+
DeleteLoadBalancer(ctx context.Context, params *elasticloadbalancing.DeleteLoadBalancerInput, optFns ...func(*elasticloadbalancing.Options)) (*elasticloadbalancing.DeleteLoadBalancerOutput, error)
93+
DescribeLoadBalancers(ctx context.Context, params *elasticloadbalancing.DescribeLoadBalancersInput, optFns ...func(*elasticloadbalancing.Options)) (*elasticloadbalancing.DescribeLoadBalancersOutput, error)
94+
DescribeTags(ctx context.Context, params *elasticloadbalancing.DescribeTagsInput, optFns ...func(*elasticloadbalancing.Options)) (*elasticloadbalancing.DescribeTagsOutput, error)
95+
}
96+
8997
// NewASGClient creates a new ASG API client for a given session.
9098
func NewASGClient(scopeUser cloud.ScopeUsage, session cloud.Session, logger logger.Wrapper, target runtime.Object) autoscalingiface.AutoScalingAPI {
9199
asgClient := autoscaling.New(session.Session(), aws.NewConfig().WithLogLevel(awslogs.GetAWSLogLevel(logger.GetLogger())).WithLogger(awslogs.NewWrapLogr(logger.GetLogger())))
@@ -274,7 +282,7 @@ func NewEC2ClientV2(scopeUser cloud.ScopeUsage, session cloud.Session, logger lo
274282
}
275283

276284
// NewELBV2ClientV2 creates a new ELBV2 API client for a given session using AWS SDK v2.
277-
func NewELBV2ClientV2(scopeUser cloud.ScopeUsage, session cloud.Session, logger logger.Wrapper, target runtime.Object) *elasticloadbalancingv2.Client {
285+
func NewELBV2ClientV2(scopeUser cloud.ScopeUsage, session cloud.Session, logger logger.Wrapper, target runtime.Object) ELBV2API {
278286
cfg := session.SessionV2()
279287
elbOpts := []func(*elasticloadbalancingv2.Options){
280288
func(o *elasticloadbalancingv2.Options) {
@@ -286,6 +294,19 @@ func NewELBV2ClientV2(scopeUser cloud.ScopeUsage, session cloud.Session, logger
286294
return elasticloadbalancingv2.NewFromConfig(cfg, elbOpts...)
287295
}
288296

297+
// NewELBClientV2 creates a new ELB API client for a given session using AWS SDK v2.
298+
func NewELBClientV2(scopeUser cloud.ScopeUsage, session cloud.Session, logger logger.Wrapper, target runtime.Object) ELBAPI {
299+
cfg := session.SessionV2()
300+
elbOpts := []func(*elasticloadbalancing.Options){
301+
func(o *elasticloadbalancing.Options) {
302+
o.Logger = logger.GetAWSLogger()
303+
o.ClientLogMode = awslogs.GetAWSLogLevelV2(logger.GetLogger())
304+
},
305+
elasticloadbalancing.WithAPIOptions(awsmetricsv2.WithMiddlewares(scopeUser.ControllerName(), target), awsmetricsv2.WithCAPAUserAgentMiddleware()),
306+
}
307+
return elasticloadbalancing.NewFromConfig(cfg, elbOpts...)
308+
}
309+
289310
func recordAWSPermissionsIssue(target runtime.Object) func(r *request.Request) {
290311
return func(r *request.Request) {
291312
if awsErr, ok := r.Error.(awserr.Error); ok {

pkg/cloud/services/gc/cleanup_test.go

Lines changed: 38 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@ import (
2222

2323
v2ec2 "github.com/aws/aws-sdk-go-v2/service/ec2"
2424
v2elbv2 "github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2"
25+
v2elb "github.com/aws/aws-sdk-go-v2/service/elasticloadbalancing"
2526
rgapiv2 "github.com/aws/aws-sdk-go-v2/service/resourcegroupstaggingapi"
2627
rgapit "github.com/aws/aws-sdk-go-v2/service/resourcegroupstaggingapi/types"
2728
"github.com/aws/aws-sdk-go/aws"
2829
"github.com/aws/aws-sdk-go/aws/request"
29-
"github.com/aws/aws-sdk-go/service/elb"
3030
"github.com/golang/mock/gomock"
3131
. "github.com/onsi/gomega"
3232
corev1 "k8s.io/api/core/v1"
@@ -39,7 +39,6 @@ import (
3939
ekscontrolplanev1 "sigs.k8s.io/cluster-api-provider-aws/v2/controlplane/eks/api/v1beta2"
4040
"sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud"
4141
"sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud/scope"
42-
"sigs.k8s.io/cluster-api-provider-aws/v2/test/mocks"
4342
mocksv2 "sigs.k8s.io/cluster-api-provider-aws/v2/test/mocks/v2"
4443
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
4544
)
@@ -48,7 +47,7 @@ func TestReconcileDelete(t *testing.T) {
4847
testCases := []struct {
4948
name string
5049
clusterScope cloud.ClusterScoper
51-
elbMocks func(m *mocks.MockELBAPIMockRecorder)
50+
elbMocks func(m *mocksv2.MockELBAPIMockRecorder)
5251
elbv2Mocks func(m *mocksv2.MockELBV2APIMockRecorder)
5352
rgAPIMocks func(m *mocksv2.MockResourceGroupsTaggingAPIAPIMockRecorder)
5453
ec2Mocks func(m *mocksv2.MockEC2APIMockRecorder)
@@ -58,7 +57,7 @@ func TestReconcileDelete(t *testing.T) {
5857
name: "eks with cluster opt-out",
5958
clusterScope: createManageScope(t, "false", ""),
6059
rgAPIMocks: func(m *mocksv2.MockResourceGroupsTaggingAPIAPIMockRecorder) {},
61-
elbMocks: func(m *mocks.MockELBAPIMockRecorder) {},
60+
elbMocks: func(m *mocksv2.MockELBAPIMockRecorder) {},
6261
elbv2Mocks: func(m *mocksv2.MockELBV2APIMockRecorder) {},
6362
ec2Mocks: func(m *mocksv2.MockEC2APIMockRecorder) {},
6463
expectErr: false,
@@ -80,7 +79,7 @@ func TestReconcileDelete(t *testing.T) {
8079
}, nil
8180
})
8281
},
83-
elbMocks: func(m *mocks.MockELBAPIMockRecorder) {},
82+
elbMocks: func(m *mocksv2.MockELBAPIMockRecorder) {},
8483
elbv2Mocks: func(m *mocksv2.MockELBV2APIMockRecorder) {},
8584
ec2Mocks: func(m *mocksv2.MockEC2APIMockRecorder) {},
8685
expectErr: false,
@@ -102,7 +101,7 @@ func TestReconcileDelete(t *testing.T) {
102101
}, nil
103102
})
104103
},
105-
elbMocks: func(m *mocks.MockELBAPIMockRecorder) {},
104+
elbMocks: func(m *mocksv2.MockELBAPIMockRecorder) {},
106105
elbv2Mocks: func(m *mocksv2.MockELBV2APIMockRecorder) {},
107106
ec2Mocks: func(m *mocksv2.MockEC2APIMockRecorder) {},
108107
expectErr: false,
@@ -124,7 +123,7 @@ func TestReconcileDelete(t *testing.T) {
124123
}, nil
125124
})
126125
},
127-
elbMocks: func(m *mocks.MockELBAPIMockRecorder) {},
126+
elbMocks: func(m *mocksv2.MockELBAPIMockRecorder) {},
128127
elbv2Mocks: func(m *mocksv2.MockELBV2APIMockRecorder) {},
129128
ec2Mocks: func(m *mocksv2.MockEC2APIMockRecorder) {},
130129
expectErr: false,
@@ -156,7 +155,7 @@ func TestReconcileDelete(t *testing.T) {
156155
}, nil
157156
})
158157
},
159-
elbMocks: func(m *mocks.MockELBAPIMockRecorder) {},
158+
elbMocks: func(m *mocksv2.MockELBAPIMockRecorder) {},
160159
elbv2Mocks: func(m *mocksv2.MockELBV2APIMockRecorder) {},
161160
ec2Mocks: func(m *mocksv2.MockEC2APIMockRecorder) {},
162161
expectErr: false,
@@ -188,7 +187,7 @@ func TestReconcileDelete(t *testing.T) {
188187
}, nil
189188
})
190189
},
191-
elbMocks: func(m *mocks.MockELBAPIMockRecorder) {},
190+
elbMocks: func(m *mocksv2.MockELBAPIMockRecorder) {},
192191
elbv2Mocks: func(m *mocksv2.MockELBV2APIMockRecorder) {},
193192
ec2Mocks: func(m *mocksv2.MockEC2APIMockRecorder) {},
194193
expectErr: false,
@@ -224,10 +223,10 @@ func TestReconcileDelete(t *testing.T) {
224223
}, nil
225224
})
226225
},
227-
elbMocks: func(m *mocks.MockELBAPIMockRecorder) {
228-
m.DeleteLoadBalancerWithContext(gomock.Any(), &elb.DeleteLoadBalancerInput{
226+
elbMocks: func(m *mocksv2.MockELBAPIMockRecorder) {
227+
m.DeleteLoadBalancer(gomock.Any(), &v2elb.DeleteLoadBalancerInput{
229228
LoadBalancerName: aws.String("aec24434cd2ce4630bd14a955413ee37"),
230-
}).Return(&elb.DeleteLoadBalancerOutput{}, nil)
229+
}).Return(&v2elb.DeleteLoadBalancerOutput{}, nil)
231230
},
232231
elbv2Mocks: func(m *mocksv2.MockELBV2APIMockRecorder) {},
233232
ec2Mocks: func(m *mocksv2.MockEC2APIMockRecorder) {},
@@ -264,10 +263,10 @@ func TestReconcileDelete(t *testing.T) {
264263
}, nil
265264
})
266265
},
267-
elbMocks: func(m *mocks.MockELBAPIMockRecorder) {
268-
m.DeleteLoadBalancerWithContext(gomock.Any(), &elb.DeleteLoadBalancerInput{
266+
elbMocks: func(m *mocksv2.MockELBAPIMockRecorder) {
267+
m.DeleteLoadBalancer(gomock.Any(), &v2elb.DeleteLoadBalancerInput{
269268
LoadBalancerName: aws.String("aec24434cd2ce4630bd14a955413ee37"),
270-
}).Return(&elb.DeleteLoadBalancerOutput{}, nil)
269+
}).Return(&v2elb.DeleteLoadBalancerOutput{}, nil)
271270
},
272271
elbv2Mocks: func(m *mocksv2.MockELBV2APIMockRecorder) {},
273272
ec2Mocks: func(m *mocksv2.MockEC2APIMockRecorder) {},
@@ -304,7 +303,7 @@ func TestReconcileDelete(t *testing.T) {
304303
}, nil
305304
})
306305
},
307-
elbMocks: func(m *mocks.MockELBAPIMockRecorder) {},
306+
elbMocks: func(m *mocksv2.MockELBAPIMockRecorder) {},
308307
elbv2Mocks: func(m *mocksv2.MockELBV2APIMockRecorder) {
309308
m.DeleteLoadBalancer(gomock.Any(), &v2elbv2.DeleteLoadBalancerInput{
310309
LoadBalancerArn: aws.String("arn:aws:elasticloadbalancing:eu-west-2:1234567890:loadbalancer/net/aec24434cd2ce4630bd14a955413ee37"),
@@ -344,7 +343,7 @@ func TestReconcileDelete(t *testing.T) {
344343
}, nil
345344
})
346345
},
347-
elbMocks: func(m *mocks.MockELBAPIMockRecorder) {},
346+
elbMocks: func(m *mocksv2.MockELBAPIMockRecorder) {},
348347
elbv2Mocks: func(m *mocksv2.MockELBV2APIMockRecorder) {
349348
m.DeleteLoadBalancer(gomock.Any(), &v2elbv2.DeleteLoadBalancerInput{
350349
LoadBalancerArn: aws.String("arn:aws:elasticloadbalancing:eu-west-2:1234567890:loadbalancer/net/aec24434cd2ce4630bd14a955413ee37"),
@@ -384,7 +383,7 @@ func TestReconcileDelete(t *testing.T) {
384383
}, nil
385384
})
386385
},
387-
elbMocks: func(m *mocks.MockELBAPIMockRecorder) {},
386+
elbMocks: func(m *mocksv2.MockELBAPIMockRecorder) {},
388387
elbv2Mocks: func(m *mocksv2.MockELBV2APIMockRecorder) {
389388
m.DeleteLoadBalancer(gomock.Any(), &v2elbv2.DeleteLoadBalancerInput{
390389
LoadBalancerArn: aws.String("arn:aws:elasticloadbalancing:eu-west-2:1234567890:loadbalancer/app/aec24434cd2ce4630bd14a955413ee37"),
@@ -424,7 +423,7 @@ func TestReconcileDelete(t *testing.T) {
424423
}, nil
425424
})
426425
},
427-
elbMocks: func(m *mocks.MockELBAPIMockRecorder) {},
426+
elbMocks: func(m *mocksv2.MockELBAPIMockRecorder) {},
428427
elbv2Mocks: func(m *mocksv2.MockELBV2APIMockRecorder) {
429428
m.DeleteLoadBalancer(gomock.Any(), &v2elbv2.DeleteLoadBalancerInput{
430429
LoadBalancerArn: aws.String("arn:aws:elasticloadbalancing:eu-west-2:1234567890:loadbalancer/app/aec24434cd2ce4630bd14a955413ee37"),
@@ -490,20 +489,20 @@ func TestReconcileDelete(t *testing.T) {
490489
}, nil
491490
})
492491
},
493-
elbMocks: func(m *mocks.MockELBAPIMockRecorder) {
494-
m.DeleteLoadBalancerWithContext(gomock.Any(), &elb.DeleteLoadBalancerInput{
492+
elbMocks: func(m *mocksv2.MockELBAPIMockRecorder) {
493+
m.DeleteLoadBalancer(gomock.Any(), &v2elb.DeleteLoadBalancerInput{
495494
LoadBalancerName: aws.String("aec24434cd2ce4630bd14a955413ee37"),
496-
}).Return(&elb.DeleteLoadBalancerOutput{}, nil)
495+
}).Return(&v2elb.DeleteLoadBalancerOutput{}, nil)
497496
},
498497
elbv2Mocks: func(m *mocksv2.MockELBV2APIMockRecorder) {
499498
m.DeleteTargetGroup(gomock.Any(), &v2elbv2.DeleteTargetGroupInput{
500499
TargetGroupArn: aws.String("arn:aws:elasticloadbalancing:eu-west-2:1234567890:targetgroup/k8s-default-podinfo-2c868b281a/e979fe9bd6825433"),
501-
})
500+
}).Return(&v2elbv2.DeleteTargetGroupOutput{}, nil)
502501
},
503502
ec2Mocks: func(m *mocksv2.MockEC2APIMockRecorder) {
504503
m.DeleteSecurityGroup(gomock.Any(), &v2ec2.DeleteSecurityGroupInput{
505504
GroupId: aws.String("sg-123456"),
506-
})
505+
}).Return(&v2ec2.DeleteSecurityGroupOutput{}, nil)
507506
},
508507
expectErr: false,
509508
},
@@ -542,7 +541,7 @@ func TestReconcileDelete(t *testing.T) {
542541
}, nil
543542
})
544543
},
545-
elbMocks: func(m *mocks.MockELBAPIMockRecorder) {},
544+
elbMocks: func(m *mocksv2.MockELBAPIMockRecorder) {},
546545
elbv2Mocks: func(m *mocksv2.MockELBV2APIMockRecorder) {},
547546
ec2Mocks: func(m *mocksv2.MockEC2APIMockRecorder) {},
548547
expectErr: false,
@@ -582,7 +581,7 @@ func TestReconcileDelete(t *testing.T) {
582581
}, nil
583582
})
584583
},
585-
elbMocks: func(m *mocks.MockELBAPIMockRecorder) {},
584+
elbMocks: func(m *mocksv2.MockELBAPIMockRecorder) {},
586585
elbv2Mocks: func(m *mocksv2.MockELBV2APIMockRecorder) {},
587586
ec2Mocks: func(m *mocksv2.MockEC2APIMockRecorder) {},
588587
expectErr: false,
@@ -644,20 +643,20 @@ func TestReconcileDelete(t *testing.T) {
644643
}, nil
645644
})
646645
},
647-
elbMocks: func(m *mocks.MockELBAPIMockRecorder) {
648-
m.DeleteLoadBalancerWithContext(gomock.Any(), &elb.DeleteLoadBalancerInput{
646+
elbMocks: func(m *mocksv2.MockELBAPIMockRecorder) {
647+
m.DeleteLoadBalancer(gomock.Any(), &v2elb.DeleteLoadBalancerInput{
649648
LoadBalancerName: aws.String("aec24434cd2ce4630bd14a955413ee37"),
650-
}).Return(&elb.DeleteLoadBalancerOutput{}, nil)
649+
}).Return(&v2elb.DeleteLoadBalancerOutput{}, nil)
651650
},
652651
elbv2Mocks: func(m *mocksv2.MockELBV2APIMockRecorder) {
653652
m.DeleteTargetGroup(gomock.Any(), &v2elbv2.DeleteTargetGroupInput{
654653
TargetGroupArn: aws.String("arn:aws:elasticloadbalancing:eu-west-2:1234567890:targetgroup/k8s-default-podinfo-2c868b281a/e979fe9bd6825433"),
655-
})
654+
}).Return(&v2elbv2.DeleteTargetGroupOutput{}, nil)
656655
},
657656
ec2Mocks: func(m *mocksv2.MockEC2APIMockRecorder) {
658657
m.DeleteSecurityGroup(gomock.Any(), &v2ec2.DeleteSecurityGroupInput{
659658
GroupId: aws.String("sg-123456"),
660-
})
659+
}).Return(&v2ec2.DeleteSecurityGroupOutput{}, nil)
661660
},
662661
expectErr: false,
663662
},
@@ -718,15 +717,15 @@ func TestReconcileDelete(t *testing.T) {
718717
}, nil
719718
})
720719
},
721-
elbMocks: func(m *mocks.MockELBAPIMockRecorder) {
722-
m.DeleteLoadBalancerWithContext(gomock.Any(), &elb.DeleteLoadBalancerInput{
720+
elbMocks: func(m *mocksv2.MockELBAPIMockRecorder) {
721+
m.DeleteLoadBalancer(gomock.Any(), &v2elb.DeleteLoadBalancerInput{
723722
LoadBalancerName: aws.String("aec24434cd2ce4630bd14a955413ee37"),
724-
}).Return(&elb.DeleteLoadBalancerOutput{}, nil)
723+
}).Return(&v2elb.DeleteLoadBalancerOutput{}, nil)
725724
},
726725
elbv2Mocks: func(m *mocksv2.MockELBV2APIMockRecorder) {
727726
m.DeleteTargetGroup(gomock.Any(), &v2elbv2.DeleteTargetGroupInput{
728727
TargetGroupArn: aws.String("arn:aws:elasticloadbalancing:eu-west-2:1234567890:targetgroup/k8s-default-podinfo-2c868b281a/e979fe9bd6825433"),
729-
})
728+
}).Return(&v2elbv2.DeleteTargetGroupOutput{}, nil)
730729
},
731730
ec2Mocks: func(m *mocksv2.MockEC2APIMockRecorder) {},
732731
expectErr: false,
@@ -788,10 +787,10 @@ func TestReconcileDelete(t *testing.T) {
788787
}, nil
789788
})
790789
},
791-
elbMocks: func(m *mocks.MockELBAPIMockRecorder) {
792-
m.DeleteLoadBalancerWithContext(gomock.Any(), &elb.DeleteLoadBalancerInput{
790+
elbMocks: func(m *mocksv2.MockELBAPIMockRecorder) {
791+
m.DeleteLoadBalancer(gomock.Any(), &v2elb.DeleteLoadBalancerInput{
793792
LoadBalancerName: aws.String("aec24434cd2ce4630bd14a955413ee37"),
794-
}).Return(&elb.DeleteLoadBalancerOutput{}, nil)
793+
}).Return(&v2elb.DeleteLoadBalancerOutput{}, nil)
795794
},
796795
elbv2Mocks: func(m *mocksv2.MockELBV2APIMockRecorder) {},
797796
ec2Mocks: func(m *mocksv2.MockEC2APIMockRecorder) {},
@@ -806,7 +805,7 @@ func TestReconcileDelete(t *testing.T) {
806805
defer mockCtrl.Finish()
807806

808807
rgapiMock := mocksv2.NewMockResourceGroupsTaggingAPIAPI(mockCtrl)
809-
elbapiMock := mocks.NewMockELBAPI(mockCtrl)
808+
elbapiMock := mocksv2.NewMockELBAPI(mockCtrl)
810809
elbv2Mock := mocksv2.NewMockELBV2API(mockCtrl)
811810
ec2Mock := mocksv2.NewMockEC2API(mockCtrl)
812811

pkg/cloud/services/gc/loadbalancer.go

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,11 @@ import (
2121
"fmt"
2222
"strings"
2323

24-
"github.com/aws/aws-sdk-go/aws"
25-
"github.com/aws/aws-sdk-go/service/elb"
26-
24+
"github.com/aws/aws-sdk-go-v2/aws"
25+
"github.com/aws/aws-sdk-go-v2/service/elasticloadbalancing"
2726
elbv2 "github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2"
2827

2928
infrav1 "sigs.k8s.io/cluster-api-provider-aws/v2/api/v1beta2"
30-
"sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud/converters"
3129
"sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud/convertersv2"
3230
)
3331

@@ -82,7 +80,8 @@ func (s *Service) deleteTargetGroups(ctx context.Context, resources []*AWSResour
8280
}
8381

8482
func (s *Service) isELBResourceToDelete(resource *AWSResource, resourceName string) bool {
85-
if !s.isMatchingResource(resource, elb.ServiceName, resourceName) {
83+
// Need to update this to use the v2 service name if it's different
84+
if !s.isMatchingResource(resource, "elasticloadbalancing", resourceName) {
8685
return false
8786
}
8887

@@ -108,12 +107,12 @@ func (s *Service) deleteLoadBalancerV2(ctx context.Context, lbARN string) error
108107
}
109108

110109
func (s *Service) deleteLoadBalancer(ctx context.Context, name string) error {
111-
input := elb.DeleteLoadBalancerInput{
110+
input := elasticloadbalancing.DeleteLoadBalancerInput{
112111
LoadBalancerName: aws.String(name),
113112
}
114113

115114
s.scope.Debug("Deleting classic load balancer", "name", name)
116-
if _, err := s.elbClient.DeleteLoadBalancerWithContext(ctx, &input); err != nil {
115+
if _, err := s.elbClient.DeleteLoadBalancer(ctx, &input); err != nil {
117116
return fmt.Errorf("deleting classic load balancer: %w", err)
118117
}
119118

@@ -136,14 +135,17 @@ func (s *Service) deleteTargetGroup(ctx context.Context, targetGroupARN string)
136135
// describeLoadBalancers gets all elastic LBs.
137136
func (s *Service) describeLoadBalancers(ctx context.Context) ([]string, error) {
138137
var names []string
139-
err := s.elbClient.DescribeLoadBalancersPagesWithContext(ctx, &elb.DescribeLoadBalancersInput{}, func(r *elb.DescribeLoadBalancersOutput, last bool) bool {
140-
for _, lb := range r.LoadBalancerDescriptions {
138+
// AWS SDK v2 does not have PagesWithContext, need to use paginator
139+
paginator := elasticloadbalancing.NewDescribeLoadBalancersPaginator(s.elbClient, &elasticloadbalancing.DescribeLoadBalancersInput{})
140+
141+
for paginator.HasMorePages() {
142+
output, err := paginator.NextPage(ctx)
143+
if err != nil {
144+
return nil, fmt.Errorf("describe load balancer error: %w", err)
145+
}
146+
for _, lb := range output.LoadBalancerDescriptions {
141147
names = append(names, *lb.LoadBalancerName)
142148
}
143-
return true
144-
})
145-
if err != nil {
146-
return nil, fmt.Errorf("describe load balancer error: %w", err)
147149
}
148150

149151
return names, nil
@@ -218,7 +220,8 @@ func (s *Service) filterProviderOwnedLB(ctx context.Context, names []string) ([]
218220
var resources []*AWSResource
219221
lbChunks := chunkResources(names)
220222
for _, chunk := range lbChunks {
221-
output, err := s.elbClient.DescribeTagsWithContext(ctx, &elb.DescribeTagsInput{LoadBalancerNames: aws.StringSlice(chunk)})
223+
// AWS SDK v2 does not have DescribeTagsWithContext
224+
output, err := s.elbClient.DescribeTags(ctx, &elasticloadbalancing.DescribeTagsInput{LoadBalancerNames: chunk})
222225
if err != nil {
223226
return nil, fmt.Errorf("describe tags of loadbalancers: %w", err)
224227
}
@@ -227,8 +230,10 @@ func (s *Service) filterProviderOwnedLB(ctx context.Context, names []string) ([]
227230
for _, tag := range tagDesc.Tags {
228231
serviceTag := infrav1.ClusterAWSCloudProviderTagKey(s.scope.KubernetesClusterName())
229232
if *tag.Key == serviceTag && *tag.Value == string(infrav1.ResourceLifecycleOwned) {
233+
// Need to update composeFakeArn and composeAWSResource if they are not compatible with v2 types
230234
arn := composeFakeArn(elbService, elbResourcePrefix+*tagDesc.LoadBalancerName)
231-
resource, err := composeAWSResource(arn, converters.ELBTagsToMap(tagDesc.Tags))
235+
// Need to update converter to use v2 types
236+
resource, err := composeAWSResource(arn, convertersv2.ELBTagsToMap(tagDesc.Tags))
232237
if err != nil {
233238
return nil, fmt.Errorf("error compose aws elb resource %s: %w", arn, err)
234239
}

0 commit comments

Comments
 (0)