Skip to content

Commit f7dfd05

Browse files
authored
Merge pull request #448 from oliverpei/master
cos bucket support encryption and versioning
2 parents 62509de + e14514a commit f7dfd05

8 files changed

+206
-15
lines changed

CHANGELOG.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
## 1.37.0 (Unreleased)
1+
## 1.36.1 (Unreleased)
22

33
ENHANCEMENTS:
44

5-
* Resource: `tencentcloud_kubernetes_cluster` add new argument `labels`.
6-
* Resource: `tencentcloud_kubernetes_as_scaling_group` add new argument `labels`.
5+
* Resource: `tencentcloud_kubernetes_cluster` add new argument `labels`.
6+
* Resource: `tencentcloud_kubernetes_as_scaling_group` add new argument `labels`.
7+
* Resource: `tencentcloud_cos_bucket` add new arguments `encryption_algorithm` and `versioning_enable`.
78

89
## 1.36.0 (June 08, 2020)
910

tencentcloud/resource_tc_cos_bucket.go

Lines changed: 127 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,17 @@ func resourceTencentCloudCosBucket() *schema.Resource {
132132
}),
133133
Description: "The canned ACL to apply. Available values include private, public-read, and public-read-write. Defaults to private.",
134134
},
135+
"encryption_algorithm": {
136+
Type: schema.TypeString,
137+
Optional: true,
138+
Description: "The server-side encryption algorithm to use. Valid value is `AES256`.",
139+
},
140+
"versioning_enable": {
141+
Type: schema.TypeBool,
142+
Optional: true,
143+
Default: false,
144+
Description: "Enable bucket versioning.",
145+
},
135146
"cors_rules": {
136147
Type: schema.TypeList,
137148
Optional: true,
@@ -344,13 +355,32 @@ func resourceTencentCloudCosBucketRead(d *schema.ResourceData, meta interface{})
344355
return fmt.Errorf("setting website error: %v", err)
345356
}
346357

358+
// read the encryption algorithm
359+
encryption, err := cosService.GetBucketEncryption(ctx, bucket)
360+
if err != nil {
361+
return err
362+
}
363+
if err = d.Set("encryption_algorithm", encryption); err != nil {
364+
return fmt.Errorf("setting encryption error: %v", err)
365+
}
366+
367+
// read the versioning
368+
versioning, err := cosService.GetBucketVersioning(ctx, bucket)
369+
if err != nil {
370+
return err
371+
}
372+
if err = d.Set("versioning_enable", versioning); err != nil {
373+
return fmt.Errorf("setting versioning_enable error: %v", err)
374+
}
375+
347376
// read the tags
348377
tags, err := cosService.GetBucketTags(ctx, bucket)
349378
if err != nil {
350379
return fmt.Errorf("get tags failed: %v", err)
351380
}
352-
353-
_ = d.Set("tags", tags)
381+
if len(tags) > 0 {
382+
_ = d.Set("tags", tags)
383+
}
354384

355385
return nil
356386
}
@@ -365,6 +395,11 @@ func resourceTencentCloudCosBucketUpdate(d *schema.ResourceData, meta interface{
365395

366396
d.Partial(true)
367397

398+
err := resourceTencentCloudCosBucketEncryptionUpdate(ctx, client, d)
399+
if err != nil {
400+
return err
401+
}
402+
368403
if d.HasChange("acl") {
369404
err := resourceTencentCloudCosBucketAclUpdate(ctx, client, d)
370405
if err != nil {
@@ -397,6 +432,22 @@ func resourceTencentCloudCosBucketUpdate(d *schema.ResourceData, meta interface{
397432
d.SetPartial("website")
398433
}
399434

435+
if d.HasChange("encryption_algorithm") {
436+
err := resourceTencentCloudCosBucketEncryptionUpdate(ctx, client, d)
437+
if err != nil {
438+
return err
439+
}
440+
d.SetPartial("encryption_algorithm")
441+
}
442+
443+
if d.HasChange("versioning_enable") {
444+
err := resourceTencentCloudCosBucketVersioningUpdate(ctx, client, d)
445+
if err != nil {
446+
return err
447+
}
448+
d.SetPartial("versioning_enable")
449+
}
450+
400451
if d.HasChange("tags") {
401452
bucket := d.Id()
402453

@@ -439,6 +490,80 @@ func resourceTencentCloudCosBucketDelete(d *schema.ResourceData, meta interface{
439490
return nil
440491
}
441492

493+
func resourceTencentCloudCosBucketEncryptionUpdate(ctx context.Context, client *s3.S3, d *schema.ResourceData) error {
494+
logId := getLogId(ctx)
495+
496+
bucket := d.Get("bucket").(string)
497+
encryption := d.Get("encryption_algorithm").(string)
498+
if encryption == "" {
499+
request := s3.DeleteBucketEncryptionInput{
500+
Bucket: aws.String(bucket),
501+
}
502+
response, err := client.DeleteBucketEncryption(&request)
503+
if err != nil {
504+
log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n",
505+
logId, "delete bucket encryption", request.String(), err.Error())
506+
return fmt.Errorf("cos delete bucket error: %s, bucket: %s", err.Error(), bucket)
507+
}
508+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n",
509+
logId, "delete bucket encryption", request.String(), response.String())
510+
511+
return nil
512+
}
513+
514+
request := s3.PutBucketEncryptionInput{
515+
Bucket: aws.String(bucket),
516+
}
517+
request.ServerSideEncryptionConfiguration = &s3.ServerSideEncryptionConfiguration{}
518+
rules := make([]*s3.ServerSideEncryptionRule, 0)
519+
defaultRule := &s3.ServerSideEncryptionByDefault{
520+
SSEAlgorithm: aws.String(encryption),
521+
}
522+
rule := &s3.ServerSideEncryptionRule{
523+
ApplyServerSideEncryptionByDefault: defaultRule,
524+
}
525+
rules = append(rules, rule)
526+
request.ServerSideEncryptionConfiguration.Rules = rules
527+
528+
response, err := client.PutBucketEncryption(&request)
529+
if err != nil {
530+
log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n",
531+
logId, "put bucket encryption", request.String(), err.Error())
532+
return fmt.Errorf("cos put bucket encryption error: %s, bucket: %s", err.Error(), bucket)
533+
}
534+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n",
535+
logId, "put bucket encryption", request.String(), response.String())
536+
537+
return nil
538+
}
539+
540+
func resourceTencentCloudCosBucketVersioningUpdate(ctx context.Context, client *s3.S3, d *schema.ResourceData) error {
541+
logId := getLogId(ctx)
542+
543+
bucket := d.Get("bucket").(string)
544+
versioning := d.Get("versioning_enable").(bool)
545+
status := "Suspended"
546+
if versioning {
547+
status = "Enabled"
548+
}
549+
request := s3.PutBucketVersioningInput{
550+
Bucket: aws.String(bucket),
551+
VersioningConfiguration: &s3.VersioningConfiguration{
552+
Status: aws.String(status),
553+
},
554+
}
555+
response, err := client.PutBucketVersioning(&request)
556+
if err != nil {
557+
log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n",
558+
logId, "put bucket encryption", request.String(), err.Error())
559+
return fmt.Errorf("cos put bucket encryption error: %s, bucket: %s", err.Error(), bucket)
560+
}
561+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n",
562+
logId, "put bucket encryption", request.String(), response.String())
563+
564+
return nil
565+
}
566+
442567
func resourceTencentCloudCosBucketAclUpdate(ctx context.Context, client *s3.S3, d *schema.ResourceData) error {
443568
logId := getLogId(ctx)
444569

tencentcloud/resource_tc_cos_bucket_test.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ func TestAccTencentCloudCosBucket_basic(t *testing.T) {
8080
Config: testAccCosBucket_basicUpdate(appid),
8181
Check: resource.ComposeAggregateTestCheckFunc(
8282
testAccCheckCosBucketExists("tencentcloud_cos_bucket.bucket_basic"),
83+
resource.TestCheckResourceAttr("tencentcloud_cos_bucket.bucket_basic", "encryption_algorithm", "AES256"),
84+
resource.TestCheckResourceAttr("tencentcloud_cos_bucket.bucket_basic", "versioning_enable", "true"),
8385
),
8486
},
8587
{
@@ -314,8 +316,10 @@ resource "tencentcloud_cos_bucket" "bucket_basic" {
314316
func testAccCosBucket_basicUpdate(appid string) string {
315317
return fmt.Sprintf(`
316318
resource "tencentcloud_cos_bucket" "bucket_basic" {
317-
bucket = "tf-bucket-basic-%s"
318-
acl = "private"
319+
bucket = "tf-bucket-basic-%s"
320+
acl = "private"
321+
encryption_algorithm = "AES256"
322+
versioning_enable = true
319323
}
320324
`, appid)
321325
}

tencentcloud/resource_tc_scf_function.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,8 +132,8 @@ func resourceTencentCloudScfFunction() *schema.Resource {
132132
Type: schema.TypeInt,
133133
Optional: true,
134134
Default: 3,
135-
ValidateFunc: validateIntegerInRange(1, 300),
136-
Description: "Timeout of the SCF function, unit is second. Default `3`. Available value is 1-300.",
135+
ValidateFunc: validateIntegerInRange(1, 900),
136+
Description: "Timeout of the SCF function, unit is second. Default `3`. Available value is 1-900.",
137137
},
138138
"environment": {
139139
Type: schema.TypeMap,

tencentcloud/resource_tc_ssl_certificate.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ func resourceTencentCloudSslCertificateRead(d *schema.ResourceData, m interface{
230230
return err
231231
}
232232
_ = d.Set("project_id", projectId)
233-
_ = d.Set("cert", certificate.Cert)
233+
_ = d.Set("cert", strings.TrimRight(*certificate.Cert, "\n"))
234234
_ = d.Set("product_zh_name", certificate.ProductZhName)
235235
_ = d.Set("domain", certificate.Domain)
236236
_ = d.Set("status", certificate.Status)

tencentcloud/service_tencentcloud_cos.go

Lines changed: 63 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -358,12 +358,12 @@ func (me *CosService) GetBucketWebsite(ctx context.Context, bucket string) (webs
358358
response, err := me.client.UseCosClient().GetBucketWebsite(&request)
359359
if err != nil {
360360
awsError, ok := err.(awserr.Error)
361-
if !ok || awsError.Code() != "NoSuchWebsiteConfiguration" {
362-
log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n",
363-
logId, "get bucket website", request.String(), err.Error())
364-
errRet = fmt.Errorf("cos get bucket website error: %s, bucket: %s", err.Error(), bucket)
361+
if ok && awsError.Code() == "NoSuchWebsiteConfiguration" {
365362
return
366363
}
364+
log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n",
365+
logId, "get bucket website", request.String(), err.Error())
366+
errRet = fmt.Errorf("cos get bucket website error: %s, bucket: %s", err.Error(), bucket)
367367
return
368368
}
369369

@@ -385,6 +385,65 @@ func (me *CosService) GetBucketWebsite(ctx context.Context, bucket string) (webs
385385
return
386386
}
387387

388+
func (me *CosService) GetBucketEncryption(ctx context.Context, bucket string) (encryption string, errRet error) {
389+
logId := getLogId(ctx)
390+
391+
request := s3.GetBucketEncryptionInput{
392+
Bucket: aws.String(bucket),
393+
}
394+
ratelimit.Check("GetBucketEncryption")
395+
response, err := me.client.UseCosClient().GetBucketEncryption(&request)
396+
if err != nil {
397+
awsError, ok := err.(awserr.Error)
398+
if ok && awsError.Code() == "NoSuchEncryptionConfiguration" {
399+
return
400+
}
401+
log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n",
402+
logId, "get bucket encryption", request.String(), err.Error())
403+
errRet = fmt.Errorf("cos get bucket encryption error: %s, bucket: %s", err.Error(), bucket)
404+
return
405+
}
406+
407+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n",
408+
logId, "get bucket encryption", request.String(), response.String())
409+
410+
if len(response.ServerSideEncryptionConfiguration.Rules) > 0 {
411+
encryption = *response.ServerSideEncryptionConfiguration.Rules[0].ApplyServerSideEncryptionByDefault.SSEAlgorithm
412+
}
413+
return
414+
}
415+
416+
func (me *CosService) GetBucketVersioning(ctx context.Context, bucket string) (versioningEnable bool, errRet error) {
417+
logId := getLogId(ctx)
418+
419+
request := s3.GetBucketVersioningInput{
420+
Bucket: aws.String(bucket),
421+
}
422+
ratelimit.Check("GetBucketVersioning")
423+
response, err := me.client.UseCosClient().GetBucketVersioning(&request)
424+
if err != nil {
425+
awsError, ok := err.(awserr.Error)
426+
if ok && awsError.Code() == "NoSuchVersioningConfiguration" {
427+
return
428+
}
429+
log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n",
430+
logId, "get bucket versioning", request.String(), err.Error())
431+
errRet = fmt.Errorf("cos get bucket versioning error: %s, bucket: %s", err.Error(), bucket)
432+
return
433+
}
434+
435+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n",
436+
logId, "get bucket versioning", request.String(), response.String())
437+
438+
if response.Status == nil || *response.Status == "Suspended" {
439+
versioningEnable = false
440+
} else if *response.Status == "Enabled" {
441+
versioningEnable = true
442+
}
443+
444+
return
445+
}
446+
388447
func (me *CosService) ListBuckets(ctx context.Context) (buckets []*s3.Bucket, errRet error) {
389448
logId := getLogId(ctx)
390449

website/docs/r/cos_bucket.html.markdown

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,10 @@ The following arguments are supported:
8080
* `bucket` - (Required, ForceNew) The name of a bucket to be created. Bucket format should be [custom name]-[appid], for example `mycos-1258798060`.
8181
* `acl` - (Optional) The canned ACL to apply. Available values include private, public-read, and public-read-write. Defaults to private.
8282
* `cors_rules` - (Optional) A rule of Cross-Origin Resource Sharing (documented below).
83+
* `encryption_algorithm` - (Optional) The server-side encryption algorithm to use. Valid value is `AES256`.
8384
* `lifecycle_rules` - (Optional) A configuration of object lifecycle management (documented below).
8485
* `tags` - (Optional) The tags of a bucket.
86+
* `versioning_enable` - (Optional) Enable bucket versioning.
8587
* `website` - (Optional) A website object(documented below).
8688

8789
The `cors_rules` object supports the following:

website/docs/r/scf_function.html.markdown

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ The following arguments are supported:
4444
* `role` - (Optional) Role of the SCF function.
4545
* `subnet_id` - (Optional) Subnet id of the SCF function.
4646
* `tags` - (Optional) Tags of the SCF function.
47-
* `timeout` - (Optional) Timeout of the SCF function, unit is second. Default `3`. Available value is 1-300.
47+
* `timeout` - (Optional) Timeout of the SCF function, unit is second. Default `3`. Available value is 1-900.
4848
* `triggers` - (Optional) Trigger list of the SCF function, note that if you modify the trigger list, all existing triggers will be deleted, and then create triggers in the new list. Each element contains the following attributes:
4949
* `vpc_id` - (Optional) VPC id of the SCF function.
5050
* `zip_file` - (Optional) Zip file of the SCF function, conflict with `cos_bucket_name`, `cos_object_name`, `cos_bucket_region`.

0 commit comments

Comments
 (0)