diff --git a/aws/s3/s3.go b/aws/s3/s3.go index 9a0cdab..e7a3c49 100644 --- a/aws/s3/s3.go +++ b/aws/s3/s3.go @@ -562,3 +562,28 @@ func (s *S3) Copy(bucket, key, source string) error { return err } + +// CreateBucket creates a bucket. +func (s *S3) CreateBucket(bucket string) error { + config := types.CreateBucketConfiguration{ + LocationConstraint: types.BucketLocationConstraint(s.client.Options().Region), + } + + input := s3.CreateBucketInput{ + Bucket: aws.String(bucket), + CreateBucketConfiguration: &config, + } + _, err := s.client.CreateBucket(context.TODO(), &input) + + return err +} + +// DeleteBucket deletes a bucket. +func (s *S3) DeleteBucket(bucket string) error { + input := s3.DeleteBucketInput{ + Bucket: aws.String(bucket), + } + _, err := s.client.DeleteBucket(context.TODO(), &input) + + return err +} diff --git a/aws/s3/s3_integration_test.go b/aws/s3/s3_integration_test.go index 6780961..5ee9da3 100644 --- a/aws/s3/s3_integration_test.go +++ b/aws/s3/s3_integration_test.go @@ -55,7 +55,6 @@ func setup() { "--create-bucket-configuration", fmt.Sprintf( "{\"LocationConstraint\": \"%v\"}", testRegion), ).Run(); err != nil { - panic(err) } } @@ -97,6 +96,17 @@ func awsCmdPopulateBucket() { } } +func awsCmdBucketExists(bucket string) bool { + if err := exec.Command( + "aws", "s3api", + "head-bucket", + "--bucket", bucket, + ).Run(); err != nil { + return false + } + return true +} + func awsCmdExists(key string) bool { if err := exec.Command( "aws", "s3api", @@ -712,3 +722,43 @@ func TestS3Copy(t *testing.T) { // new object exists assert.True(t, awsCmdExists(testNewKey)) } + +func TestS3CreateBucket(t *testing.T) { + // ARRANGE + setAwsEnv() + client, err := New() + require.Nil(t, err, fmt.Sprintf("Error creating s3 client: %v", err)) + + bucket := "new-bucket" + require.False(t, awsCmdBucketExists(bucket), "error arranging test, bucket already exists") + + // ACTION + err = client.CreateBucket(bucket) + t.Cleanup(func() { + if err := client.DeleteBucket(bucket); err != nil { + t.Fatalf("Failed to delete bucket during cleanup: %v", err) + } + }) + + // ASSERT + assert.Nil(t, err) + assert.True(t, awsCmdBucketExists(bucket)) +} + +func TestS3DeleteBucket(t *testing.T) { + // ARRANGE + setAwsEnv() + client, err := New() + require.Nil(t, err, fmt.Sprintf("Error creating s3 client: %v", err)) + + bucket := "bucket-to-delete" + require.Nil(t, client.CreateBucket(bucket), "error arranging test, couldn't create bucket to delete") + require.True(t, awsCmdBucketExists(bucket), "error arranging test, doesn't exist") + + // ACTION + err = client.DeleteBucket(bucket) + + // ASSERT + assert.Nil(t, err) + assert.False(t, awsCmdBucketExists(bucket)) +}