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