@@ -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+
442567func resourceTencentCloudCosBucketAclUpdate (ctx context.Context , client * s3.S3 , d * schema.ResourceData ) error {
443568 logId := getLogId (ctx )
444569
0 commit comments