2020-07-12 00:11:29 +08:00
|
|
|
package basic
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
2021-10-14 12:27:58 +08:00
|
|
|
"io"
|
|
|
|
"os"
|
|
|
|
"strings"
|
|
|
|
"testing"
|
|
|
|
|
2020-07-12 00:11:29 +08:00
|
|
|
"github.com/aws/aws-sdk-go/aws"
|
|
|
|
"github.com/aws/aws-sdk-go/aws/awserr"
|
|
|
|
"github.com/aws/aws-sdk-go/aws/session"
|
|
|
|
"github.com/aws/aws-sdk-go/service/s3"
|
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
|
|
svc *s3.S3
|
|
|
|
)
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
// Initialize a session in us-west-2 that the SDK will use to load
|
|
|
|
// credentials from the shared credentials file ~/.aws/credentials.
|
|
|
|
sess, err := session.NewSession(&aws.Config{
|
|
|
|
Region: aws.String("us-west-2"),
|
|
|
|
Endpoint: aws.String("localhost:8333"),
|
|
|
|
DisableSSL: aws.Bool(true),
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
exitErrorf("create session, %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Create S3 service client
|
|
|
|
svc = s3.New(sess)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestCreateBucket(t *testing.T) {
|
|
|
|
|
|
|
|
input := &s3.CreateBucketInput{
|
|
|
|
Bucket: aws.String("theBucket"),
|
|
|
|
}
|
|
|
|
|
|
|
|
result, err := svc.CreateBucket(input)
|
|
|
|
if err != nil {
|
|
|
|
if aerr, ok := err.(awserr.Error); ok {
|
|
|
|
switch aerr.Code() {
|
|
|
|
case s3.ErrCodeBucketAlreadyExists:
|
|
|
|
fmt.Println(s3.ErrCodeBucketAlreadyExists, aerr.Error())
|
|
|
|
case s3.ErrCodeBucketAlreadyOwnedByYou:
|
|
|
|
fmt.Println(s3.ErrCodeBucketAlreadyOwnedByYou, aerr.Error())
|
|
|
|
default:
|
|
|
|
fmt.Println(aerr.Error())
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// Print the error, cast err to awserr.Error to get the Code and
|
|
|
|
// Message from an error.
|
|
|
|
fmt.Println(err.Error())
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
fmt.Println(result)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2020-08-20 03:07:43 +08:00
|
|
|
func TestPutObject(t *testing.T) {
|
2020-07-12 00:11:29 +08:00
|
|
|
|
|
|
|
input := &s3.PutObjectInput{
|
|
|
|
ACL: aws.String("authenticated-read"),
|
|
|
|
Body: aws.ReadSeekCloser(strings.NewReader("filetoupload")),
|
|
|
|
Bucket: aws.String("theBucket"),
|
|
|
|
Key: aws.String("exampleobject"),
|
|
|
|
}
|
|
|
|
|
|
|
|
result, err := svc.PutObject(input)
|
|
|
|
if err != nil {
|
|
|
|
if aerr, ok := err.(awserr.Error); ok {
|
|
|
|
switch aerr.Code() {
|
|
|
|
default:
|
|
|
|
fmt.Println(aerr.Error())
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// Print the error, cast err to awserr.Error to get the Code and
|
|
|
|
// Message from an error.
|
|
|
|
fmt.Println(err.Error())
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
fmt.Println(result)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2020-08-20 03:07:43 +08:00
|
|
|
func TestListBucket(t *testing.T) {
|
2020-07-12 00:11:29 +08:00
|
|
|
|
|
|
|
result, err := svc.ListBuckets(nil)
|
|
|
|
if err != nil {
|
|
|
|
exitErrorf("Unable to list buckets, %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
fmt.Println("Buckets:")
|
|
|
|
|
|
|
|
for _, b := range result.Buckets {
|
|
|
|
fmt.Printf("* %s created on %s\n",
|
|
|
|
aws.StringValue(b.Name), aws.TimeValue(b.CreationDate))
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2020-08-20 03:07:43 +08:00
|
|
|
func TestListObjectV2(t *testing.T) {
|
|
|
|
|
|
|
|
listObj, err := svc.ListObjectsV2(&s3.ListObjectsV2Input{
|
2021-10-14 12:27:58 +08:00
|
|
|
Bucket: aws.String(Bucket),
|
|
|
|
Prefix: aws.String("foo"),
|
2020-08-20 03:07:43 +08:00
|
|
|
Delimiter: aws.String("/"),
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
exitErrorf("Unable to list objects, %v", err)
|
|
|
|
}
|
|
|
|
for _, content := range listObj.Contents {
|
|
|
|
fmt.Println(aws.StringValue(content.Key))
|
|
|
|
}
|
|
|
|
fmt.Printf("list: %s\n", listObj)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2020-07-12 00:11:29 +08:00
|
|
|
func exitErrorf(msg string, args ...interface{}) {
|
|
|
|
fmt.Fprintf(os.Stderr, msg+"\n", args...)
|
|
|
|
os.Exit(1)
|
|
|
|
}
|
2020-07-25 15:52:31 +08:00
|
|
|
|
|
|
|
const (
|
|
|
|
Bucket = "theBucket"
|
|
|
|
object = "foo/bar"
|
|
|
|
Data = "<data>"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestObjectOp(t *testing.T) {
|
|
|
|
_, err := svc.CreateBucket(&s3.CreateBucketInput{
|
|
|
|
Bucket: aws.String(Bucket),
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
exitErrorf("Unable to create bucket, %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
_, err = svc.PutObject(&s3.PutObjectInput{
|
|
|
|
Bucket: aws.String(Bucket),
|
|
|
|
Key: aws.String(object),
|
|
|
|
Body: strings.NewReader(Data),
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
exitErrorf("Unable to put object, %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
dest := fmt.Sprintf("%s_bak", object)
|
|
|
|
copyObj, err := svc.CopyObject(&s3.CopyObjectInput{
|
|
|
|
Bucket: aws.String(Bucket),
|
|
|
|
CopySource: aws.String(fmt.Sprintf("%s/%s", Bucket, object)),
|
|
|
|
Key: aws.String(dest),
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
exitErrorf("Unable to copy object, %v", err)
|
|
|
|
}
|
|
|
|
t.Log("copy object result -> ", copyObj.CopyObjectResult)
|
|
|
|
|
|
|
|
getObj, err := svc.GetObject(&s3.GetObjectInput{
|
|
|
|
Bucket: aws.String(Bucket),
|
|
|
|
Key: aws.String(dest),
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
exitErrorf("Unable to get copy object, %v", err)
|
|
|
|
}
|
|
|
|
|
2021-10-14 12:27:58 +08:00
|
|
|
data, err := io.ReadAll(getObj.Body)
|
2020-07-25 15:52:31 +08:00
|
|
|
if err != nil {
|
|
|
|
exitErrorf("Unable to read object data, %v", err)
|
|
|
|
}
|
|
|
|
if string(data) != Data {
|
|
|
|
t.Error("object data -> ", string(data))
|
|
|
|
}
|
|
|
|
|
|
|
|
listObj, err := svc.ListObjectsV2(&s3.ListObjectsV2Input{
|
|
|
|
Bucket: aws.String(Bucket),
|
|
|
|
Prefix: aws.String("foo/"),
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
exitErrorf("Unable to list objects, %v", err)
|
|
|
|
}
|
|
|
|
count := 0
|
|
|
|
for _, content := range listObj.Contents {
|
|
|
|
key := aws.StringValue(content.Key)
|
|
|
|
if key == dest {
|
|
|
|
count++
|
|
|
|
} else if key == object {
|
|
|
|
count++
|
|
|
|
}
|
|
|
|
if count == 2 {
|
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if count != 2 {
|
|
|
|
exitErrorf("Unable to find two objects, %v", listObj.Contents)
|
|
|
|
}
|
|
|
|
|
|
|
|
_, err = svc.DeleteObject(&s3.DeleteObjectInput{
|
|
|
|
Bucket: aws.String(Bucket),
|
|
|
|
Key: aws.String(object),
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
exitErrorf("Unable to delete source object, %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
_, err = svc.DeleteObject(&s3.DeleteObjectInput{
|
|
|
|
Bucket: aws.String(Bucket),
|
|
|
|
Key: aws.String(dest),
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
exitErrorf("Unable to delete object, %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
_, err = svc.DeleteBucket(&s3.DeleteBucketInput{
|
|
|
|
Bucket: aws.String(Bucket),
|
|
|
|
})
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
exitErrorf("Unable to delete bucket, %v", err)
|
|
|
|
}
|
|
|
|
}
|