@@ -132,6 +132,17 @@ func resourceTencentCloudCosBucket() *schema.Resource {
132
132
}),
133
133
Description : "The canned ACL to apply. Available values include private, public-read, and public-read-write. Defaults to private." ,
134
134
},
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
+ },
135
146
"cors_rules" : {
136
147
Type : schema .TypeList ,
137
148
Optional : true ,
@@ -344,13 +355,32 @@ func resourceTencentCloudCosBucketRead(d *schema.ResourceData, meta interface{})
344
355
return fmt .Errorf ("setting website error: %v" , err )
345
356
}
346
357
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
+
347
376
// read the tags
348
377
tags , err := cosService .GetBucketTags (ctx , bucket )
349
378
if err != nil {
350
379
return fmt .Errorf ("get tags failed: %v" , err )
351
380
}
352
-
353
- _ = d .Set ("tags" , tags )
381
+ if len (tags ) > 0 {
382
+ _ = d .Set ("tags" , tags )
383
+ }
354
384
355
385
return nil
356
386
}
@@ -365,6 +395,11 @@ func resourceTencentCloudCosBucketUpdate(d *schema.ResourceData, meta interface{
365
395
366
396
d .Partial (true )
367
397
398
+ err := resourceTencentCloudCosBucketEncryptionUpdate (ctx , client , d )
399
+ if err != nil {
400
+ return err
401
+ }
402
+
368
403
if d .HasChange ("acl" ) {
369
404
err := resourceTencentCloudCosBucketAclUpdate (ctx , client , d )
370
405
if err != nil {
@@ -397,6 +432,22 @@ func resourceTencentCloudCosBucketUpdate(d *schema.ResourceData, meta interface{
397
432
d .SetPartial ("website" )
398
433
}
399
434
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
+
400
451
if d .HasChange ("tags" ) {
401
452
bucket := d .Id ()
402
453
@@ -439,6 +490,80 @@ func resourceTencentCloudCosBucketDelete(d *schema.ResourceData, meta interface{
439
490
return nil
440
491
}
441
492
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
+
442
567
func resourceTencentCloudCosBucketAclUpdate (ctx context.Context , client * s3.S3 , d * schema.ResourceData ) error {
443
568
logId := getLogId (ctx )
444
569
0 commit comments