Skip to content

Commit ee452aa

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 1611cd6 commit ee452aa

File tree

7 files changed

+198
-63
lines changed

7 files changed

+198
-63
lines changed

pkg/cloud/scope/clients.go

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,13 @@ import (
2222
"github.com/aws/aws-sdk-go-v2/service/autoscaling"
2323
ec2v2 "github.com/aws/aws-sdk-go-v2/service/ec2"
2424
"github.com/aws/aws-sdk-go-v2/service/eks"
25+
elasticloadbalancing "github.com/aws/aws-sdk-go-v2/service/elasticloadbalancing"
2526
elasticloadbalancingv2 "github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2"
2627
resourcegroupstaggingapiv2 "github.com/aws/aws-sdk-go-v2/service/resourcegroupstaggingapi"
2728
"github.com/aws/aws-sdk-go-v2/service/s3"
2829
"github.com/aws/aws-sdk-go/aws"
2930
"github.com/aws/aws-sdk-go/aws/awserr"
3031
"github.com/aws/aws-sdk-go/aws/request"
31-
"github.com/aws/aws-sdk-go/service/autoscaling/autoscalingiface"
3232
"github.com/aws/aws-sdk-go/service/ec2"
3333
"github.com/aws/aws-sdk-go/service/ec2/ec2iface"
3434
"github.com/aws/aws-sdk-go/service/elb"
@@ -85,6 +85,13 @@ type EC2API interface {
8585
ec2v2.DescribeSecurityGroupsAPIClient
8686
}
8787

88+
// ELBAPI is a compatibility layer for the v2 elasticloadbalancing.Client interface.
89+
type ELBAPI interface {
90+
DeleteLoadBalancer(ctx context.Context, params *elasticloadbalancing.DeleteLoadBalancerInput, optFns ...func(*elasticloadbalancing.Options)) (*elasticloadbalancing.DeleteLoadBalancerOutput, error)
91+
DescribeLoadBalancers(ctx context.Context, params *elasticloadbalancing.DescribeLoadBalancersInput, optFns ...func(*elasticloadbalancing.Options)) (*elasticloadbalancing.DescribeLoadBalancersOutput, error)
92+
DescribeTags(ctx context.Context, params *elasticloadbalancing.DescribeTagsInput, optFns ...func(*elasticloadbalancing.Options)) (*elasticloadbalancing.DescribeTagsOutput, error)
93+
}
94+
8895
// NewASGClient creates a new ASG API client for a given session.
8996
func NewASGClient(scopeUser cloud.ScopeUsage, session cloud.Session, logger logger.Wrapper, target runtime.Object) *autoscaling.Client {
9097
cfg := session.SessionV2()
@@ -289,7 +296,7 @@ func NewEC2ClientV2(scopeUser cloud.ScopeUsage, session cloud.Session, logger lo
289296
}
290297

291298
// NewELBV2ClientV2 creates a new ELBV2 API client for a given session using AWS SDK v2.
292-
func NewELBV2ClientV2(scopeUser cloud.ScopeUsage, session cloud.Session, logger logger.Wrapper, target runtime.Object) *elasticloadbalancingv2.Client {
299+
func NewELBV2ClientV2(scopeUser cloud.ScopeUsage, session cloud.Session, logger logger.Wrapper, target runtime.Object) ELBV2API {
293300
cfg := session.SessionV2()
294301
elbOpts := []func(*elasticloadbalancingv2.Options){
295302
func(o *elasticloadbalancingv2.Options) {
@@ -301,6 +308,19 @@ func NewELBV2ClientV2(scopeUser cloud.ScopeUsage, session cloud.Session, logger
301308
return elasticloadbalancingv2.NewFromConfig(cfg, elbOpts...)
302309
}
303310

311+
// NewELBClientV2 creates a new ELB API client for a given session using AWS SDK v2.
312+
func NewELBClientV2(scopeUser cloud.ScopeUsage, session cloud.Session, logger logger.Wrapper, target runtime.Object) ELBAPI {
313+
cfg := session.SessionV2()
314+
elbOpts := []func(*elasticloadbalancing.Options){
315+
func(o *elasticloadbalancing.Options) {
316+
o.Logger = logger.GetAWSLogger()
317+
o.ClientLogMode = awslogs.GetAWSLogLevelV2(logger.GetLogger())
318+
},
319+
elasticloadbalancing.WithAPIOptions(awsmetricsv2.WithMiddlewares(scopeUser.ControllerName(), target), awsmetricsv2.WithCAPAUserAgentMiddleware()),
320+
}
321+
return elasticloadbalancing.NewFromConfig(cfg, elbOpts...)
322+
}
323+
304324
func recordAWSPermissionsIssue(target runtime.Object) func(r *request.Request) {
305325
return func(r *request.Request) {
306326
if awsErr, ok := r.Error.(awserr.Error); ok {
@@ -321,8 +341,7 @@ func getUserAgentHandler() request.NamedHandler {
321341

322342
// AWSClients contains all the aws clients used by the scopes.
323343
type AWSClients struct {
324-
ASG autoscalingiface.AutoScalingAPI
325-
EC2V2 *ec2v2.Client
344+
ASG autoscaling.Client
326345
EC2 ec2iface.EC2API
327346
ELB elbiface.ELBAPI
328347
SecretsManager secretsmanageriface.SecretsManagerAPI

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

0 commit comments

Comments
 (0)