Skip to content

Commit adc451e

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 3f61dec commit adc451e

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
@@ -21,13 +21,13 @@ import (
2121

2222
"github.com/aws/aws-sdk-go-v2/service/autoscaling"
2323
ec2v2 "github.com/aws/aws-sdk-go-v2/service/ec2"
24+
elasticloadbalancing "github.com/aws/aws-sdk-go-v2/service/elasticloadbalancing"
2425
elasticloadbalancingv2 "github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2"
2526
resourcegroupstaggingapiv2 "github.com/aws/aws-sdk-go-v2/service/resourcegroupstaggingapi"
2627
"github.com/aws/aws-sdk-go-v2/service/s3"
2728
"github.com/aws/aws-sdk-go/aws"
2829
"github.com/aws/aws-sdk-go/aws/awserr"
2930
"github.com/aws/aws-sdk-go/aws/request"
30-
"github.com/aws/aws-sdk-go/service/autoscaling/autoscalingiface"
3131
"github.com/aws/aws-sdk-go/service/ec2"
3232
"github.com/aws/aws-sdk-go/service/ec2/ec2iface"
3333
"github.com/aws/aws-sdk-go/service/eks"
@@ -86,6 +86,13 @@ type EC2API interface {
8686
ec2v2.DescribeSecurityGroupsAPIClient
8787
}
8888

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

284291
// NewELBV2ClientV2 creates a new ELBV2 API client for a given session using AWS SDK v2.
285-
func NewELBV2ClientV2(scopeUser cloud.ScopeUsage, session cloud.Session, logger logger.Wrapper, target runtime.Object) *elasticloadbalancingv2.Client {
292+
func NewELBV2ClientV2(scopeUser cloud.ScopeUsage, session cloud.Session, logger logger.Wrapper, target runtime.Object) ELBV2API {
286293
cfg := session.SessionV2()
287294
elbOpts := []func(*elasticloadbalancingv2.Options){
288295
func(o *elasticloadbalancingv2.Options) {
@@ -294,6 +301,19 @@ func NewELBV2ClientV2(scopeUser cloud.ScopeUsage, session cloud.Session, logger
294301
return elasticloadbalancingv2.NewFromConfig(cfg, elbOpts...)
295302
}
296303

304+
// NewELBClientV2 creates a new ELB API client for a given session using AWS SDK v2.
305+
func NewELBClientV2(scopeUser cloud.ScopeUsage, session cloud.Session, logger logger.Wrapper, target runtime.Object) ELBAPI {
306+
cfg := session.SessionV2()
307+
elbOpts := []func(*elasticloadbalancing.Options){
308+
func(o *elasticloadbalancing.Options) {
309+
o.Logger = logger.GetAWSLogger()
310+
o.ClientLogMode = awslogs.GetAWSLogLevelV2(logger.GetLogger())
311+
},
312+
elasticloadbalancing.WithAPIOptions(awsmetricsv2.WithMiddlewares(scopeUser.ControllerName(), target), awsmetricsv2.WithCAPAUserAgentMiddleware()),
313+
}
314+
return elasticloadbalancing.NewFromConfig(cfg, elbOpts...)
315+
}
316+
297317
func recordAWSPermissionsIssue(target runtime.Object) func(r *request.Request) {
298318
return func(r *request.Request) {
299319
if awsErr, ok := r.Error.(awserr.Error); ok {
@@ -314,8 +334,7 @@ func getUserAgentHandler() request.NamedHandler {
314334

315335
// AWSClients contains all the aws clients used by the scopes.
316336
type AWSClients struct {
317-
ASG autoscalingiface.AutoScalingAPI
318-
EC2V2 *ec2v2.Client
337+
ASG autoscaling.Client
319338
EC2 ec2iface.EC2API
320339
ELB elbiface.ELBAPI
321340
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)