github.com/aavshr/aws-sdk-go@v1.41.3/awstesting/integration/s3integ/shared.go (about) 1 //go:build integration 2 // +build integration 3 4 package s3integ 5 6 import ( 7 "fmt" 8 9 "github.com/aavshr/aws-sdk-go/awstesting/integration" 10 "github.com/aavshr/aws-sdk-go/service/s3" 11 "github.com/aavshr/aws-sdk-go/service/s3/s3iface" 12 "github.com/aavshr/aws-sdk-go/service/s3control" 13 "github.com/aavshr/aws-sdk-go/service/s3control/s3controliface" 14 ) 15 16 // BucketPrefix is the root prefix of integration test buckets. 17 const BucketPrefix = "aws-sdk-go-integration" 18 19 // GenerateBucketName returns a unique bucket name. 20 func GenerateBucketName() string { 21 return fmt.Sprintf("%s-%s", 22 BucketPrefix, integration.UniqueID()) 23 } 24 25 // SetupBucket returns a test bucket created for the integration tests. 26 func SetupBucket(svc s3iface.S3API, bucketName string) (err error) { 27 28 fmt.Println("Setup: Creating test bucket,", bucketName) 29 _, err = svc.CreateBucket(&s3.CreateBucketInput{Bucket: &bucketName}) 30 if err != nil { 31 return fmt.Errorf("failed to create bucket %s, %v", bucketName, err) 32 } 33 34 fmt.Println("Setup: Waiting for bucket to exist,", bucketName) 35 err = svc.WaitUntilBucketExists(&s3.HeadBucketInput{Bucket: &bucketName}) 36 if err != nil { 37 return fmt.Errorf("failed waiting for bucket %s to be created, %v", 38 bucketName, err) 39 } 40 41 return nil 42 } 43 44 // CleanupBucket deletes the contents of a S3 bucket, before deleting the bucket 45 // it self. 46 func CleanupBucket(svc s3iface.S3API, bucketName string) error { 47 errs := []error{} 48 49 fmt.Println("TearDown: Deleting objects from test bucket,", bucketName) 50 err := svc.ListObjectsPages( 51 &s3.ListObjectsInput{Bucket: &bucketName}, 52 func(page *s3.ListObjectsOutput, lastPage bool) bool { 53 for _, o := range page.Contents { 54 _, err := svc.DeleteObject(&s3.DeleteObjectInput{ 55 Bucket: &bucketName, 56 Key: o.Key, 57 }) 58 if err != nil { 59 errs = append(errs, err) 60 } 61 } 62 return true 63 }, 64 ) 65 if err != nil { 66 return fmt.Errorf("failed to list objects, %s, %v", bucketName, err) 67 } 68 69 fmt.Println("TearDown: Deleting partial uploads from test bucket,", bucketName) 70 err = svc.ListMultipartUploadsPages( 71 &s3.ListMultipartUploadsInput{Bucket: &bucketName}, 72 func(page *s3.ListMultipartUploadsOutput, lastPage bool) bool { 73 for _, u := range page.Uploads { 74 svc.AbortMultipartUpload(&s3.AbortMultipartUploadInput{ 75 Bucket: &bucketName, 76 Key: u.Key, 77 UploadId: u.UploadId, 78 }) 79 } 80 return true 81 }, 82 ) 83 if err != nil { 84 return fmt.Errorf("failed to list multipart objects, %s, %v", bucketName, err) 85 } 86 87 if len(errs) != 0 { 88 return fmt.Errorf("failed to delete objects, %s", errs) 89 } 90 91 fmt.Println("TearDown: Deleting test bucket,", bucketName) 92 if _, err = svc.DeleteBucket(&s3.DeleteBucketInput{Bucket: &bucketName}); err != nil { 93 return fmt.Errorf("failed to delete test bucket, %s", bucketName) 94 } 95 96 return nil 97 } 98 99 // SetupAccessPoint returns an access point for the given bucket for testing 100 func SetupAccessPoint(svc s3controliface.S3ControlAPI, account, bucket, accessPoint string) error { 101 fmt.Printf("Setup: creating access point %q for bucket %q\n", accessPoint, bucket) 102 _, err := svc.CreateAccessPoint(&s3control.CreateAccessPointInput{ 103 AccountId: &account, 104 Bucket: &bucket, 105 Name: &accessPoint, 106 }) 107 if err != nil { 108 return fmt.Errorf("failed to create access point: %v", err) 109 } 110 return nil 111 } 112 113 // CleanupAccessPoint deletes the given access point 114 func CleanupAccessPoint(svc s3controliface.S3ControlAPI, account, accessPoint string) error { 115 fmt.Printf("TearDown: Deleting access point %q\n", accessPoint) 116 _, err := svc.DeleteAccessPoint(&s3control.DeleteAccessPointInput{ 117 AccountId: &account, 118 Name: &accessPoint, 119 }) 120 if err != nil { 121 return fmt.Errorf("failed to delete access point: %v", err) 122 } 123 return nil 124 }