Skip to content

Commit ab17c37

Browse files
committed
feat(object): sse-c: draft + test
1 parent 4b9ba52 commit ab17c37

File tree

2 files changed

+78
-0
lines changed

2 files changed

+78
-0
lines changed

internal/services/object/object.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ package object
33
import (
44
"bytes"
55
"context"
6+
"crypto/md5"
67
"encoding/base64"
8+
"encoding/hex"
79
"fmt"
810
"os"
911
"strings"
@@ -71,6 +73,12 @@ func ResourceObject() *schema.Resource {
7173
Optional: true,
7274
Description: "File hash to trigger upload",
7375
},
76+
"sse_customer_key": {
77+
Type: schema.TypeString,
78+
Optional: true,
79+
Description: "Customer key used for server-side encryption (SSE-C)",
80+
Sensitive: true,
81+
},
7482
"storage_class": {
7583
Type: schema.TypeString,
7684
Optional: true,
@@ -141,6 +149,7 @@ func resourceObjectCreate(ctx context.Context, d *schema.ResourceData, m interfa
141149
Metadata: types.ExpandMapStringStringPtr(d.Get("metadata")),
142150
}
143151

152+
// Object content
144153
if filePath, hasFile := d.GetOk("file"); hasFile {
145154
file, err := os.Open(filePath.(string))
146155
if err != nil {
@@ -162,6 +171,15 @@ func resourceObjectCreate(ctx context.Context, d *schema.ResourceData, m interfa
162171
req.Body = bytes.NewReader([]byte{})
163172
}
164173

174+
// Server-side encryption
175+
if customerKey := d.Get("sse_customer_key").(string); customerKey != "" {
176+
//TODO: encode the following fields to base64 before adding them to the request ?
177+
req.SSECustomerAlgorithm = scw.StringPtr("AES256")
178+
req.SSECustomerKey = &customerKey
179+
hash := md5.Sum([]byte(customerKey))
180+
req.SSECustomerKeyMD5 = scw.StringPtr(hex.EncodeToString(hash[:]))
181+
}
182+
165183
_, err = s3Client.PutObjectWithContext(ctx, req)
166184
if err != nil {
167185
return diag.FromErr(err)

internal/services/object/object_test.go

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -684,6 +684,66 @@ func TestAccObject_ByContentBase64(t *testing.T) {
684684
})
685685
}
686686

687+
func TestAccObject_SSECustomer(t *testing.T) {
688+
tt := acctest.NewTestTools(t)
689+
defer tt.Cleanup()
690+
bucketName := sdkacctest.RandomWithPrefix("test-acc-scaleway-object-sse-customer")
691+
692+
fileContentStep1 := "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
693+
fileContentStep2 := "This is a different content"
694+
695+
resource.ParallelTest(t, resource.TestCase{
696+
PreCheck: func() { acctest.PreCheck(t) },
697+
ProviderFactories: tt.ProviderFactories,
698+
CheckDestroy: resource.ComposeTestCheckFunc(
699+
objectchecks.IsObjectDestroyed(tt),
700+
objectchecks.IsBucketDestroyed(tt),
701+
),
702+
Steps: []resource.TestStep{
703+
{
704+
Config: fmt.Sprintf(`
705+
resource "scaleway_object_bucket" "base-01" {
706+
name = "%s"
707+
region = "%s"
708+
}
709+
710+
resource scaleway_object "sse-c-encrypted" {
711+
bucket = scaleway_object_bucket.base-01.id
712+
key = "test-sse-c-encrypted"
713+
content = "%s"
714+
sse_customer_key = "mY5up3r4w3s0meK3y"
715+
}
716+
`, bucketName, objectTestsMainRegion, fileContentStep1),
717+
Check: resource.ComposeTestCheckFunc(
718+
objectchecks.CheckBucketExists(tt, "scaleway_object_bucket.base-01", true),
719+
testAccCheckObjectExists(tt, "scaleway_object.sse-c-encrypted"),
720+
resource.TestCheckResourceAttr("scaleway_object.sse-c-encrypted", "content", fileContentStep1),
721+
),
722+
},
723+
{
724+
Config: fmt.Sprintf(`
725+
resource "scaleway_object_bucket" "base-01" {
726+
name = "%s"
727+
region = "%s"
728+
}
729+
730+
resource scaleway_object "sse-c-encrypted" {
731+
bucket = scaleway_object_bucket.base-01.id
732+
key = "test-by-content"
733+
content = "%s"
734+
sse_customer_key = "mY5up3r4w3s0meK3y"
735+
}
736+
`, bucketName, objectTestsMainRegion, fileContentStep2),
737+
Check: resource.ComposeTestCheckFunc(
738+
objectchecks.CheckBucketExists(tt, "scaleway_object_bucket.base-01", true),
739+
testAccCheckObjectExists(tt, "scaleway_object.sse-c-encrypted"),
740+
resource.TestCheckResourceAttr("scaleway_object.sse-c-encrypted", "content", fileContentStep2),
741+
),
742+
},
743+
},
744+
})
745+
}
746+
687747
func TestAccObject_WithBucketName(t *testing.T) {
688748
if !*acctest.UpdateCassettes {
689749
t.Skip("Skipping ObjectStorage test as this kind of resource can't be deleted before 24h")

0 commit comments

Comments
 (0)