Skip to content

Commit

Permalink
fixups
Browse files Browse the repository at this point in the history
  • Loading branch information
dzbarsky committed Sep 10, 2024
1 parent 1252657 commit da39e7e
Show file tree
Hide file tree
Showing 6 changed files with 93 additions and 147 deletions.
1 change: 0 additions & 1 deletion .bazelrc
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
build --define=GO_VERSION=go1.23
common --enable_bzlmod
common --experimental_output_paths=strip

2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
module aws-in-a-box

go 1.22
go 1.21

require (
github.com/aws/aws-sdk-go-v2 v1.30.5
Expand Down
20 changes: 0 additions & 20 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,41 +1,23 @@
github.com/aws/aws-sdk-go-v2 v1.25.3 h1:xYiLpZTQs1mzvz5PaI6uR0Wh57ippuEthxS4iK5v0n0=
github.com/aws/aws-sdk-go-v2 v1.25.3/go.mod h1:35hUlJVYd+M++iLI3ALmVwMOyRYMmRqUXpTtRGW+K9I=
github.com/aws/aws-sdk-go-v2 v1.30.5 h1:mWSRTwQAb0aLE17dSzztCVJWI9+cRMgqebndjwDyK0g=
github.com/aws/aws-sdk-go-v2 v1.30.5/go.mod h1:CT+ZPWXbYrci8chcARI3OmI/qgd+f6WtuLOoaIA8PR0=
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.1 h1:gTK2uhtAPtFcdRRJilZPx8uJLL2J85xK11nKtWL0wfU=
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.1/go.mod h1:sxpLb+nZk7tIfCWChfd+h4QwHNUR57d8hA1cleTkjJo=
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.4 h1:70PVAiL15/aBMh5LThwgXdSQorVr91L127ttckI9QQU=
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.4/go.mod h1:/MQxMqci8tlqDH+pjmoLu1i0tbWCUP1hhyMRuFxpQCw=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.3 h1:ifbIbHZyGl1alsAhPIYsHOg5MuApgqOvVeI8wIugXfs=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.3/go.mod h1:oQZXg3c6SNeY6OZrDY+xHcF4VGIEoNotX2B4PrDeoJI=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17 h1:pI7Bzt0BJtYA0N/JEC6B8fJ4RBrEMi1LBrkMdFYNSnQ=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17/go.mod h1:Dh5zzJYMtxfIjYW+/evjQ8uj2OyR/ve2KROHGHlSFqE=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.3 h1:Qvodo9gHG9F3E8SfYOspPeBt0bjSbsevK8WhRAUHcoY=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.3/go.mod h1:vCKrdLXtybdf/uQd/YfVR2r5pcbNuEYKzMQpcxmeSJw=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17 h1:Mqr/V5gvrhA2gvgnF42Zh5iMiQNcOYthFYwCyrnuWlc=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17/go.mod h1:aLJpZlCmjE+V+KtN1q1uyZkfnUWpQGpbsn89XPKyzfU=
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.3 h1:mDnFOE2sVkyphMWtTH+stv0eW3k0OTx94K63xpxHty4=
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.3/go.mod h1:V8MuRVcCRt5h1S+Fwu8KbC7l/gBGo3yBAyUbJM2IJOk=
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.17 h1:Roo69qTpfu8OlJ2Tb7pAYVuF0CpuUMB0IYWwYP/4DZM=
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.17/go.mod h1:NcWPxQzGM1USQggaTVwz6VpqMZPX1CvDJLDh6jnOCa4=
github.com/aws/aws-sdk-go-v2/service/dynamodb v1.30.4 h1:VdtD2r5ZzeX/PvaCUSUsiwu6K0SAhNzgJ50Wu/0KwhM=
github.com/aws/aws-sdk-go-v2/service/dynamodb v1.30.4/go.mod h1:HOZYCpIko/NOS693uPQINLs7drzMjRtIN1+XRL8IkfA=
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.1 h1:EyBZibRTVAs6ECHZOw5/wlylS9OcTzwyjeQMudmREjE=
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.1/go.mod h1:JKpmtYhhPs7D97NL/ltqz7yCkERFW5dOlHyVl66ZYF8=
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 h1:KypMCbLPPHEmf9DgMGw51jMj77VfGPAN2Kv4cfhlfgI=
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4/go.mod h1:Vz1JQXliGcQktFTN/LN6uGppAIRoLBR2bMvIMP0gOjc=
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.5 h1:mbWNpfRUTT6bnacmvOTKXZjR/HycibdWzNpfbrbLDIs=
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.5/go.mod h1:FCOPWGjsshkkICJIn9hq9xr6dLKtyaWpuUojiN3W1/8=
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.19 h1:FLMkfEiRjhgeDTCjjLoc3URo/TBkgeQbocA78lfkzSI=
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.19/go.mod h1:Vx+GucNSsdhaxs3aZIKfSUjKVGsxN25nX2SRcdhuw08=
github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.9.4 h1:ikwIKlf0+HbyOhTLo/BRT5z5c8FsjPLPgd75zcRonek=
github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.9.4/go.mod h1:Egp7w6xf3EzlnfkfnMbDtHtts8H21B9QrCvc+3NNT24=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.5 h1:K/NXvIftOlX+oGgWGIa3jDyYLDNsdVhsjHmsBH2GLAQ=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.5/go.mod h1:cl9HGLV66EnCmMNzq4sYOti+/xo8w34CsgzVtm2GgsY=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19 h1:rfprUlsdzgl7ZL2KlXiUAoJnI/VxfHCvDFr2QDFj6u4=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19/go.mod h1:SCWkEdRq8/7EK60NcvvQ6NXKuTcchAD4ROAsC37VEZE=
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.3 h1:4t+QEX7BsXz98W8W1lNvMAG+NX8qHz2CjLBxQKku40g=
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.3/go.mod h1:oFcjjUq5Hm09N9rpxTdeMeLeQcxS7mIkBkL8qUKng+A=
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.17 h1:u+EfGmksnJc/x5tq3A+OD7LrMbSSR/5TrKLvkdy/fhY=
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.17/go.mod h1:VaMx6302JHax2vHJWgRo+5n9zvbacs3bLU/23DNQrTY=
github.com/aws/aws-sdk-go-v2/service/kinesis v1.27.2 h1:71gafPkX0RyJJqq921QJ+JvVmXIByfYONsy2XIN/+zk=
Expand All @@ -46,8 +28,6 @@ github.com/aws/aws-sdk-go-v2/service/s3 v1.61.2 h1:Kp6PWAlXwP1UvIflkIP6MFZYBNDCa
github.com/aws/aws-sdk-go-v2/service/s3 v1.61.2/go.mod h1:5FmD/Dqq57gP+XwaUnd5WFPipAuzrf0HmupX27Gvjvc=
github.com/aws/aws-sdk-go-v2/service/sqs v1.31.2 h1:A9ihuyTKpS8Z1ou/D4ETfOEFMyokA6JjRsgXWTiHvCk=
github.com/aws/aws-sdk-go-v2/service/sqs v1.31.2/go.mod h1:J3XhTE+VsY1jDsdDY+ACFAppZj/gpvygzC5JE0bTLbQ=
github.com/aws/smithy-go v1.20.1 h1:4SZlSlMr36UEqC7XOyRVb27XMeZubNcBNN+9IgEPIQw=
github.com/aws/smithy-go v1.20.1/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E=
github.com/aws/smithy-go v1.20.4 h1:2HK1zBdPgRbjFOHlfeQZfpC4r72MOb9bZkiFwggKO+4=
github.com/aws/smithy-go v1.20.4/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg=
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
Expand Down
46 changes: 30 additions & 16 deletions services/s3/errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,33 +2,47 @@ package s3

import "aws-in-a-box/awserrors"

func NotFound() *awserrors.Error {
// See https://docs.aws.amazon.com/AmazonS3/latest/API/API_Error.html
func err(code int, errorType string, message string) *awserrors.Error {
return &awserrors.Error{
Code: 404,
Code: code,
Body: awserrors.ErrorBody{
Type: "NotFound",
Type: errorType,
Message: message,
LegacyMessage: message,
},
}
}

func NoSuchBucket(bucket string) *awserrors.Error {
func NotFound() *awserrors.Error {
return &awserrors.Error{
Code: 404,
Body: awserrors.ErrorBody{
Type: "NoSuchBucket",
Message: "The specified bucket does not exist",
LegacyMessage: "The specified bucket does not exist",
Type: "NotFound",
},
}
}

func VersionConflict(key string) *awserrors.Error {
return &awserrors.Error{
Code: 409,
Body: awserrors.ErrorBody{
Type: "VersionConflict",
Message: "An object already exists with this key. Conditional PutObject failed",
LegacyMessage: "An object already exists with this key. Conditional PutObject failed",
},
}
func InvalidPart() *awserrors.Error {
return err(400, "InvalidPart", "One or more of the specified parts could not be found. The part might not have been uploaded, or the specified entity tag might not have matched the part's entity tag.")
}

func NoSuchBucket(bucket string) *awserrors.Error {
return err(404, "NoSuchBucket", "The specified bucket does not exist.")
}

func NoSuchUpload() *awserrors.Error {
return err(404, "NoSuchUpload", "The specified multipart upload does not exist. The upload ID might be invalid, or the multipart upload might have been aborted or completed.")
}

func BucketNotEmpty(bucket string) *awserrors.Error {
return err(409, "BucketNotEmpty", "The bucket you tried to delete is not empty.")
}

func BucketAlreadyExists() *awserrors.Error {
return err(409, "BucketAlreadyExists", "The requested bucket name is not available. The bucket namespace is shared by all users of the system. Please select a different name and try again.")
}

func PreconditionFailed() *awserrors.Error {
return err(412, "PreconditionFailed", "At least one of the preconditions you specified did not hold.")
}
146 changes: 50 additions & 96 deletions services/s3/itest/s3_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -821,11 +821,11 @@ func TestPutObjectIfNoneMatch(t *testing.T) {
})

if expectedErr == nil {
t.Fatal(expectedErr)
t.Fatal("expected error")
}
}

func TestPutObjectWithoutIfNoneMatchDoeNotFail(t *testing.T) {
func TestPutObjectWithoutIfNoneMatchDoesNotFail(t *testing.T) {
ctx := context.Background()
client, srv := makeClientServerPair()
defer srv.Shutdown(ctx)
Expand All @@ -840,14 +840,14 @@ func TestPutObjectWithoutIfNoneMatchDoeNotFail(t *testing.T) {
t.Fatal(err)
}

_, err2 := client.PutObject(ctx, &s3.PutObjectInput{
_, err = client.PutObject(ctx, &s3.PutObjectInput{
Bucket: &bucket,
Key: &key,
Body: strings.NewReader("world"),
})

// Expect both puts to succeed since IfNoneMatch is not included
if err2 != nil {
if err != nil {
t.Fatal(err)
}
}
Expand All @@ -861,107 +861,61 @@ func TestMultipartUploadWithIfNoneMatch(t *testing.T) {
key := "test-key"
kmsContext := "foo=bar"

// Create a multipart upload for test-key and upload some parts to it
upload1, uploadErr1 := client.CreateMultipartUpload(ctx, &s3.CreateMultipartUploadInput{
Bucket: &bucket,
Key: &key,
ServerSideEncryption: types.ServerSideEncryptionAwsKms,
SSEKMSKeyId: &kmsKey,
SSEKMSEncryptionContext: &kmsContext,
Tagging: aws.String("foo=bar"),
})
if uploadErr1 != nil {
t.Fatal(uploadErr1)
}
uploadId1 := upload1.UploadId

var parts []types.CompletedPart
for i, s := range []string{"hello", " world"} {
output, err := client.UploadPart(ctx, &s3.UploadPartInput{
PartNumber: aws.Int32(int32(i)),
Bucket: &bucket,
Key: &key,
UploadId: uploadId1,
Body: strings.NewReader(s),
// Create two multipart uploads for test-key and upload some parts to it.
// First one should succeed, second one should fail.
for i := 0; i < 2; i++ {
upload, err := client.CreateMultipartUpload(ctx, &s3.CreateMultipartUploadInput{
Bucket: &bucket,
Key: &key,
ServerSideEncryption: types.ServerSideEncryptionAwsKms,
SSEKMSKeyId: &kmsKey,
SSEKMSEncryptionContext: &kmsContext,
Tagging: aws.String("foo=bar"),
})
if output.ServerSideEncryption != types.ServerSideEncryptionAwsKms {
t.Fatal("missing SSE header")
}
if *output.SSEKMSKeyId != kmsKey {
t.Fatal("missing KMS key header: ", *output.SSEKMSKeyId)
}
if err != nil {
t.Fatal(err)
}
parts = append(parts, types.CompletedPart{
ETag: output.ETag,
PartNumber: aws.Int32(int32(i)),
})
}

// Create a second multipart upload for test-key and upload some parts to it
upload2, uploadErr2 := client.CreateMultipartUpload(ctx, &s3.CreateMultipartUploadInput{
Bucket: &bucket,
Key: &key,
ServerSideEncryption: types.ServerSideEncryptionAwsKms,
SSEKMSKeyId: &kmsKey,
SSEKMSEncryptionContext: &kmsContext,
Tagging: aws.String("foo=bar"),
})
if uploadErr2 != nil {
t.Fatal(uploadErr2)
}
uploadId2 := upload2.UploadId
var parts []types.CompletedPart
for i, s := range []string{"hello", " world"} {
output, err := client.UploadPart(ctx, &s3.UploadPartInput{
PartNumber: aws.Int32(int32(i)),
Bucket: &bucket,
Key: &key,
UploadId: upload.UploadId,
Body: strings.NewReader(s),
})
if output.ServerSideEncryption != types.ServerSideEncryptionAwsKms {
t.Fatal("missing SSE header")
}
if *output.SSEKMSKeyId != kmsKey {
t.Fatal("missing KMS key header: ", *output.SSEKMSKeyId)
}
if err != nil {
t.Fatal(err)
}
parts = append(parts, types.CompletedPart{
ETag: output.ETag,
PartNumber: aws.Int32(int32(i)),
})
}

var parts2 []types.CompletedPart
for i, s := range []string{"hello", " world"} {
output, err := client.UploadPart(ctx, &s3.UploadPartInput{
PartNumber: aws.Int32(int32(i)),
Bucket: &bucket,
Key: &key,
UploadId: uploadId2,
Body: strings.NewReader(s),
_, err = client.CompleteMultipartUpload(ctx, &s3.CompleteMultipartUploadInput{
Bucket: &bucket,
Key: &key,
UploadId: upload.UploadId,
MultipartUpload: &types.CompletedMultipartUpload{
Parts: parts,
},
IfNoneMatch: aws.String("*"),
})
if output.ServerSideEncryption != types.ServerSideEncryptionAwsKms {
t.Fatal("missing SSE header")
}
if *output.SSEKMSKeyId != kmsKey {
t.Fatal("missing KMS key header: ", *output.SSEKMSKeyId)
}
if err != nil {

if i == 0 && err != nil {
t.Fatal(err)
}
parts2 = append(parts, types.CompletedPart{
ETag: output.ETag,
PartNumber: aws.Int32(int32(i)),
})
}

// Complete the multipart upload for the first upload
_, completeErr1 := client.CompleteMultipartUpload(ctx, &s3.CompleteMultipartUploadInput{
Bucket: &bucket,
Key: &key,
UploadId: uploadId1,
MultipartUpload: &types.CompletedMultipartUpload{
Parts: parts,
},
})

if completeErr1 != nil {
t.Fatal(completeErr1)
}

// Expect the second upload to fail completing since an object already exists with that key
_, completeErr2 := client.CompleteMultipartUpload(ctx, &s3.CompleteMultipartUploadInput{
Bucket: &bucket,
Key: &key,
UploadId: uploadId1,
MultipartUpload: &types.CompletedMultipartUpload{
Parts: parts2,
},
})

if completeErr2 == nil {
t.Fatal(completeErr2)
if i == 1 && err == nil {
t.Fatal("Should fail")
}
}
}
Loading

0 comments on commit da39e7e

Please sign in to comment.