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