Skip to content

Commit 9d17c12

Browse files
committed
capi/aws: empty bucket before deletion.
Just in case the bootstrap ignition data is still there, so we don't fail with ``` level=fatal msg=error destroying bootstrap resources failed during post-destroy hook: failed to delete ignition bucket openshift-bootstrap-data-ci-op-p0xpf4g6-2d061-rkj72: BucketNotEmpty: The bucket you tried to delete is not empty ```
1 parent 45c1876 commit 9d17c12

File tree

1 file changed

+35
-4
lines changed
  • pkg/infrastructure/aws/clusterapi

1 file changed

+35
-4
lines changed

pkg/infrastructure/aws/clusterapi/aws.go

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"github.com/aws/aws-sdk-go/service/ec2"
1414
"github.com/aws/aws-sdk-go/service/elbv2"
1515
"github.com/aws/aws-sdk-go/service/s3"
16+
"github.com/aws/aws-sdk-go/service/s3/s3manager"
1617
"github.com/sirupsen/logrus"
1718
"k8s.io/apimachinery/pkg/util/wait"
1819
"k8s.io/utils/ptr"
@@ -337,14 +338,44 @@ func (p *Provider) PostDestroy(ctx context.Context, in clusterapi.PostDestroyerI
337338
// removeS3Bucket deletes an s3 bucket given its name.
338339
func removeS3Bucket(ctx context.Context, session *session.Session, bucketName string) error {
339340
client := s3.New(session)
340-
_, err := client.DeleteBucketWithContext(ctx, &s3.DeleteBucketInput{Bucket: aws.String(bucketName)})
341-
if err != nil {
342-
var awsErr awserr.Error
343-
if errors.As(err, &awsErr) && awsErr.Code() == s3.ErrCodeNoSuchBucket {
341+
342+
iter := s3manager.NewDeleteListIterator(client, &s3.ListObjectsInput{
343+
Bucket: aws.String(bucketName),
344+
})
345+
err := s3manager.NewBatchDeleteWithClient(client).Delete(ctx, iter)
346+
if err != nil && !isBucketNotFound(err) {
347+
return err
348+
}
349+
logrus.Debugf("bucket %q emptied", bucketName)
350+
351+
if _, err := client.DeleteBucketWithContext(ctx, &s3.DeleteBucketInput{Bucket: aws.String(bucketName)}); err != nil {
352+
if isBucketNotFound(err) {
344353
logrus.Debugf("bucket %q already deleted", bucketName)
345354
return nil
346355
}
347356
return err
348357
}
349358
return nil
350359
}
360+
361+
func isBucketNotFound(err interface{}) bool {
362+
switch s3Err := err.(type) {
363+
case awserr.Error:
364+
if s3Err.Code() == s3.ErrCodeNoSuchBucket {
365+
return true
366+
}
367+
origErr := s3Err.OrigErr()
368+
if origErr != nil {
369+
return isBucketNotFound(origErr)
370+
}
371+
case s3manager.Error:
372+
if s3Err.OrigErr != nil {
373+
return isBucketNotFound(s3Err.OrigErr)
374+
}
375+
case s3manager.Errors:
376+
if len(s3Err) == 1 {
377+
return isBucketNotFound(s3Err[0])
378+
}
379+
}
380+
return false
381+
}

0 commit comments

Comments
 (0)