Skip to content

Commit 39da713

Browse files
committed
OCPBUGS-53116: Migrate AWS Destroy to sdk v2
** The bug wanted to clean up resources in the MX-CENTRAL-1 region. Starting with the instances here. The EC2 client is migrated to version 2 of the sdk. This client is used to destroy instances. ** created a EC2 client in the base uninstaller for aws. ** Created a wrapper for error handling. Migrated all ec2 code to the error handling suggested online. ** Migrated all EC2 code to sdk v2 ** Note: The security groups were having issues because of the new way that AWS serializes and deserializes data. More information can be found here: aws/aws-sdk-go-v2#2559 (comment)
1 parent 6667244 commit 39da713

File tree

2 files changed

+382
-314
lines changed

2 files changed

+382
-314
lines changed

pkg/destroy/aws/aws.go

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import (
66
"strings"
77
"time"
88

9+
configv2 "github.com/aws/aws-sdk-go-v2/config"
10+
ec2v2 "github.com/aws/aws-sdk-go-v2/service/ec2"
911
"github.com/aws/aws-sdk-go/aws"
1012
"github.com/aws/aws-sdk-go/aws/arn"
1113
"github.com/aws/aws-sdk-go/aws/awserr"
@@ -65,6 +67,8 @@ type ClusterUninstaller struct {
6567
// new session will be created based on the usual credential
6668
// configuration (AWS_PROFILE, AWS_ACCESS_KEY_ID, etc.).
6769
Session *session.Session
70+
71+
EC2Client *ec2v2.Client
6872
}
6973

7074
// New returns an AWS destroyer from ClusterMetadata.
@@ -82,6 +86,20 @@ func New(logger logrus.FieldLogger, metadata *types.ClusterMetadata) (providers.
8286
return nil, err
8387
}
8488

89+
cfg, err := configv2.LoadDefaultConfig(context.TODO(), configv2.WithRegion(region))
90+
if err != nil {
91+
return nil, fmt.Errorf("failed loading default config: %w", err)
92+
}
93+
ec2Client := ec2v2.NewFromConfig(cfg, func(options *ec2v2.Options) {
94+
options.Region = region
95+
96+
for _, endpoint := range metadata.AWS.ServiceEndpoints {
97+
if strings.EqualFold(endpoint.Name, "ec2") {
98+
options.BaseEndpoint = aws.String(endpoint.URL)
99+
}
100+
}
101+
})
102+
85103
return &ClusterUninstaller{
86104
Filters: filters,
87105
Region: region,
@@ -90,6 +108,7 @@ func New(logger logrus.FieldLogger, metadata *types.ClusterMetadata) (providers.
90108
ClusterDomain: metadata.AWS.ClusterDomain,
91109
Session: session,
92110
HostedZoneRole: metadata.AWS.HostedZoneRole,
111+
EC2Client: ec2Client,
93112
}, nil
94113
}
95114

@@ -184,7 +203,7 @@ func (o *ClusterUninstaller) RunWithContext(ctx context.Context) ([]string, erro
184203
// Terminate EC2 instances. The instances need to be terminated first so that we can ensure that there is nothing
185204
// running on the cluster creating new resources while we are attempting to delete resources, which could leak
186205
// the new resources.
187-
err = DeleteEC2Instances(ctx, o.Logger, awsSession, o.Filters, resourcesToDelete, deleted, tracker)
206+
err = o.DeleteEC2Instances(ctx, awsSession, resourcesToDelete, deleted, tracker)
188207
if err != nil {
189208
return resourcesToDelete.UnsortedList(), err
190209
}
@@ -193,7 +212,7 @@ func (o *ClusterUninstaller) RunWithContext(ctx context.Context) ([]string, erro
193212
err = wait.PollImmediateUntil(
194213
time.Second*10,
195214
func() (done bool, err error) {
196-
newlyDeleted, loopError := DeleteResources(ctx, o.Logger, awsSession, resourcesToDelete.UnsortedList(), tracker)
215+
newlyDeleted, loopError := o.DeleteResources(ctx, awsSession, resourcesToDelete.UnsortedList(), tracker)
197216
// Delete from the resources-to-delete set so that the current state of the resources to delete can be
198217
// returned if the context is completed.
199218
resourcesToDelete = resourcesToDelete.Difference(newlyDeleted)
@@ -386,16 +405,16 @@ func findResourcesByTag(
386405
// resources - the resources to be deleted.
387406
//
388407
// The first return is the ARNs of the resources that were successfully deleted.
389-
func DeleteResources(ctx context.Context, logger logrus.FieldLogger, awsSession *session.Session, resources []string, tracker *ErrorTracker) (sets.Set[string], error) {
408+
func (o *ClusterUninstaller) DeleteResources(ctx context.Context, awsSession *session.Session, resources []string, tracker *ErrorTracker) (sets.Set[string], error) {
390409
deleted := sets.New[string]()
391410
for _, arnString := range resources {
392-
l := logger.WithField("arn", arnString)
411+
l := o.Logger.WithField("arn", arnString)
393412
parsedARN, err := arn.Parse(arnString)
394413
if err != nil {
395414
l.WithError(err).Debug("could not parse ARN")
396415
continue
397416
}
398-
if err := deleteARN(ctx, awsSession, parsedARN, logger); err != nil {
417+
if err := o.deleteARN(ctx, awsSession, parsedARN, o.Logger); err != nil {
399418
tracker.suppressWarning(arnString, err, l)
400419
if err := ctx.Err(); err != nil {
401420
return deleted, err
@@ -517,10 +536,10 @@ func findPublicRoute53(ctx context.Context, client *route53.Route53, dnsName str
517536
return "", nil
518537
}
519538

520-
func deleteARN(ctx context.Context, session *session.Session, arn arn.ARN, logger logrus.FieldLogger) error {
539+
func (o *ClusterUninstaller) deleteARN(ctx context.Context, session *session.Session, arn arn.ARN, logger logrus.FieldLogger) error {
521540
switch arn.Service {
522541
case "ec2":
523-
return deleteEC2(ctx, session, arn, logger)
542+
return o.deleteEC2(ctx, session, arn, logger)
524543
case "elasticloadbalancing":
525544
return deleteElasticLoadBalancing(ctx, session, arn, logger)
526545
case "iam":

0 commit comments

Comments
 (0)