Skip to content

Commit

Permalink
add emptying of the s3 bucket before deletion
Browse files Browse the repository at this point in the history
  • Loading branch information
Ivan Vlasic committed Jul 12, 2021
1 parent c81a76c commit 437c3a7
Showing 1 changed file with 64 additions and 27 deletions.
91 changes: 64 additions & 27 deletions internal/aws/aws.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@ import (
)

type AWS struct {
config aws.Config
config aws.Config
s3Client *s3.Client
}

func New() (*AWS, error) {
Expand All @@ -28,7 +29,8 @@ func New() (*AWS, error) {
}

return &AWS{
config: config,
config: config,
s3Client: s3.NewFromConfig(config),
}, nil
}

Expand All @@ -37,44 +39,96 @@ func (a *AWS) DefaultRegion() string {
}

func (a *AWS) CreateS3Bucket(name, region string) error {
client := s3.NewFromConfig(a.config)

cbi := &s3.CreateBucketInput{
Bucket: aws.String(name),
CreateBucketConfiguration: &types.CreateBucketConfiguration{
LocationConstraint: types.BucketLocationConstraint(region),
},
}

_, err := client.CreateBucket(context.TODO(), cbi)
_, err := a.s3Client.CreateBucket(context.TODO(), cbi)
if err != nil {
return fmt.Errorf("could not create bucket %s in %s - %v", name, region, err)
}
return nil
}

func (a *AWS) PutObjectToS3Bucket(bucket, key string, object io.Reader) error {
poi := &s3.PutObjectInput{
Bucket: aws.String(bucket),
Key: aws.String(key),
Body: object,
}

_, err := a.s3Client.PutObject(context.TODO(), poi)
if err != nil {
return fmt.Errorf("could not put key %s in bucket %s - %v", bucket, key, err)
}
return nil
}

func (a *AWS) DeleteObjectFromS3Bucket(bucket, key string) error {
doi := &s3.DeleteObjectInput{
Bucket: aws.String(bucket),
Key: aws.String(key),
}

_, err := a.s3Client.DeleteObject(context.TODO(), doi)
if err != nil {
return fmt.Errorf("could not delete key %s in bucket %s - %v", bucket, key, err)
}
return nil
}

func (a *AWS) EmptyS3Bucket(name string) error {
loi := &s3.ListObjectsV2Input{
Bucket: aws.String(name),
}

for {
out, err := a.s3Client.ListObjectsV2(context.TODO(), loi)
if err != nil {
return fmt.Errorf("emptying bucket failed - %v", err)
}

for _, object := range out.Contents {
if err := a.DeleteObjectFromS3Bucket(name, *object.Key); err != nil {
return fmt.Errorf("emptying bucket failed - %v", err)
}
}

if out.IsTruncated {
loi.ContinuationToken = out.ContinuationToken
} else {
break
}
}
return nil
}

func (a *AWS) DeleteS3Bucket(name string) error {
client := s3.NewFromConfig(a.config)
// all objects must be deleted before bucket can be deleted
if err := a.EmptyS3Bucket(name); err != nil {
return fmt.Errorf("could not delete bucket %s - %v", name, err)
}

dbi := &s3.DeleteBucketInput{
Bucket: aws.String(name),
}

_, err := client.DeleteBucket(context.TODO(), dbi)
_, err := a.s3Client.DeleteBucket(context.TODO(), dbi)
if err != nil {
return fmt.Errorf("could not delete bucket %s - %v", name, err)
}
return nil
}

func (a *AWS) S3BucketExists(name string) (bool, error) {
client := s3.NewFromConfig(a.config)

hbi := &s3.HeadBucketInput{
Bucket: aws.String(name),
}

_, err := client.HeadBucket(context.TODO(), hbi)
_, err := a.s3Client.HeadBucket(context.TODO(), hbi)
if err != nil {
var oe smithy.APIError
if errors.As(err, &oe) {
Expand All @@ -94,20 +148,3 @@ func (a *AWS) S3BucketExists(name string) (bool, error) {
}
return true, nil
}

// TODO: check what type of object in arguments is most convenient
func (a *AWS) PutObjectToS3Bucket(bucket, key string, object io.Reader) error {
client := s3.NewFromConfig(a.config)

poi := &s3.PutObjectInput{
Bucket: aws.String(bucket),
Key: aws.String(key),
Body: object,
}

_, err := client.PutObject(context.TODO(), poi)
if err != nil {
return fmt.Errorf("could not put key %s in bucket %s - %v", bucket, key, err)
}
return nil
}

0 comments on commit 437c3a7

Please sign in to comment.