Skip to content

Commit 6cdcabe

Browse files
authored
fix(cos): [127780471] tencentcloud_cos_bucket support chdfs_ofs (#3546)
* add * add * add * add
1 parent e9e825c commit 6cdcabe

File tree

4 files changed

+147
-84
lines changed

4 files changed

+147
-84
lines changed

.changelog/3546.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
resource/tencentcloud_cos_bucket: support `chdfs_ofs`
3+
```

tencentcloud/services/cos/resource_tc_cos_bucket.go

Lines changed: 108 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -579,6 +579,13 @@ func ResourceTencentCloudCosBucket() *schema.Resource {
579579
ForceNew: true,
580580
Description: "Indicates whether to create a bucket of multi available zone.",
581581
},
582+
"chdfs_ofs": {
583+
Type: schema.TypeBool,
584+
Optional: true,
585+
ForceNew: true,
586+
Computed: true,
587+
Description: "Indicates whether to create a bucket of metadata acceleration. For more information, please refer to `https://www.tencentcloud.com/document/product/436/43305`.",
588+
},
582589
"enable_intelligent_tiering": {
583590
Type: schema.TypeBool,
584591
Optional: true,
@@ -683,10 +690,17 @@ func resourceTencentCloudCosBucketRead(d *schema.ResourceData, meta interface{})
683690
}
684691
}
685692

686-
if header != nil && len(header["X-Cos-Bucket-Az-Type"]) > 0 && header["X-Cos-Bucket-Az-Type"][0] == "MAZ" {
687-
_ = d.Set("multi_az", true)
693+
if header != nil {
694+
if len(header["X-Cos-Bucket-Az-Type"]) > 0 && header["X-Cos-Bucket-Az-Type"][0] == "MAZ" {
695+
_ = d.Set("multi_az", true)
696+
}
697+
698+
if len(header["X-Cos-Bucket-Arch"]) > 0 && header["X-Cos-Bucket-Arch"][0] == "OFS" {
699+
_ = d.Set("chdfs_ofs", true)
700+
}
688701
}
689702

703+
ofs := d.Get("chdfs_ofs").(bool)
690704
cosDomain := meta.(tccommon.ProviderMeta).GetAPIV3Conn().CosDomain
691705
var cosBucketUrl string
692706
if cdcId == "" && cosDomain == "" {
@@ -705,116 +719,118 @@ func resourceTencentCloudCosBucketRead(d *schema.ResourceData, meta interface{})
705719
_ = d.Set("bucket", d.Id())
706720
}
707721

708-
// acl
709-
aclResult, err := cosService.GetBucketACL(ctx, bucket, cdcId)
722+
if !ofs {
723+
// acl
724+
aclResult, err := cosService.GetBucketACL(ctx, bucket, cdcId)
710725

711-
if err != nil {
712-
return err
713-
}
726+
if err != nil {
727+
return err
728+
}
714729

715-
aclBody, err := xml.Marshal(aclResult)
716-
if err != nil {
717-
return err
718-
}
730+
aclBody, err := xml.Marshal(aclResult)
731+
if err != nil {
732+
return err
733+
}
719734

720-
_ = d.Set("acl_body", string(aclBody))
735+
_ = d.Set("acl_body", string(aclBody))
721736

722-
acl := GetBucketPublicACL(aclResult)
737+
acl := GetBucketPublicACL(aclResult)
723738

724-
_ = d.Set("acl", acl)
739+
_ = d.Set("acl", acl)
725740

726-
// read the cors
727-
corsRules, err := cosService.GetBucketCors(ctx, bucket, cdcId)
728-
if err != nil {
729-
return err
730-
}
731-
if err = d.Set("cors_rules", corsRules); err != nil {
732-
return fmt.Errorf("setting cors_rules error: %v", err)
733-
}
741+
if cdcId == "" && cosDomain == "" {
742+
originPullRules, err := cosService.GetBucketPullOrigin(ctx, bucket)
743+
if err != nil {
744+
return err
745+
}
734746

735-
if cdcId == "" && cosDomain == "" {
736-
originPullRules, err := cosService.GetBucketPullOrigin(ctx, bucket)
747+
if err = d.Set("origin_pull_rules", originPullRules); err != nil {
748+
return fmt.Errorf("setting origin_pull_rules error: %v", err)
749+
}
750+
751+
originDomainRules, err := cosService.GetBucketOriginDomain(ctx, bucket)
752+
if err != nil {
753+
return err
754+
}
755+
756+
if err = d.Set("origin_domain_rules", originDomainRules); err != nil {
757+
return fmt.Errorf("setting origin_domain_rules error: %v", err)
758+
}
759+
760+
replicaResult, err := cosService.GetBucketReplication(ctx, bucket, cdcId)
761+
if err != nil {
762+
return err
763+
}
764+
765+
if replicaResult != nil {
766+
err := setBucketReplication(d, *replicaResult)
767+
if err != nil {
768+
return err
769+
}
770+
}
771+
}
772+
773+
// read the website
774+
website, err := cosService.GetBucketWebsite(ctx, bucket, cdcId)
737775
if err != nil {
738776
return err
739777
}
740-
741-
if err = d.Set("origin_pull_rules", originPullRules); err != nil {
742-
return fmt.Errorf("setting origin_pull_rules error: %v", err)
778+
if len(website) > 0 && cosDomain == "" {
779+
// {bucket}.cos-website.{region}.myqcloud.com
780+
endPointUrl := fmt.Sprintf("%s.cos-website.%s.myqcloud.com", d.Id(), meta.(tccommon.ProviderMeta).GetAPIV3Conn().Region)
781+
website[0]["endpoint"] = endPointUrl
782+
}
783+
if err = d.Set("website", website); err != nil {
784+
return fmt.Errorf("setting website error: %v", err)
743785
}
744786

745-
originDomainRules, err := cosService.GetBucketOriginDomain(ctx, bucket)
787+
// read the encryption algorithm
788+
encryption, kmsId, err := cosService.GetBucketEncryption(ctx, bucket, cdcId)
746789
if err != nil {
747790
return err
748791
}
749-
750-
if err = d.Set("origin_domain_rules", originDomainRules); err != nil {
751-
return fmt.Errorf("setting origin_domain_rules error: %v", err)
792+
if err = d.Set("encryption_algorithm", encryption); err != nil {
793+
return fmt.Errorf("setting encryption error: %v", err)
794+
}
795+
if err = d.Set("kms_id", kmsId); err != nil {
796+
return fmt.Errorf("setting kms_id error: %v", err)
752797
}
753798

754-
replicaResult, err := cosService.GetBucketReplication(ctx, bucket, cdcId)
799+
// read the versioning
800+
versioning, err := cosService.GetBucketVersioning(ctx, bucket, cdcId)
755801
if err != nil {
756802
return err
757803
}
758-
759-
if replicaResult != nil {
760-
err := setBucketReplication(d, *replicaResult)
761-
if err != nil {
762-
return err
763-
}
804+
if err = d.Set("versioning_enable", versioning); err != nil {
805+
return fmt.Errorf("setting versioning_enable error: %v", err)
764806
}
765-
}
766-
767-
// read the lifecycle
768-
lifecycleRules, err := cosService.GetBucketLifecycle(ctx, bucket, cdcId)
769-
if err != nil {
770-
return err
771-
}
772-
if err = d.Set("lifecycle_rules", lifecycleRules); err != nil {
773-
return fmt.Errorf("setting lifecycle_rules error: %v", err)
774-
}
775-
776-
// read the website
777-
website, err := cosService.GetBucketWebsite(ctx, bucket, cdcId)
778-
if err != nil {
779-
return err
780-
}
781-
if len(website) > 0 && cosDomain == "" {
782-
// {bucket}.cos-website.{region}.myqcloud.com
783-
endPointUrl := fmt.Sprintf("%s.cos-website.%s.myqcloud.com", d.Id(), meta.(tccommon.ProviderMeta).GetAPIV3Conn().Region)
784-
website[0]["endpoint"] = endPointUrl
785-
}
786-
if err = d.Set("website", website); err != nil {
787-
return fmt.Errorf("setting website error: %v", err)
788-
}
789807

790-
// read the encryption algorithm
791-
encryption, kmsId, err := cosService.GetBucketEncryption(ctx, bucket, cdcId)
792-
if err != nil {
793-
return err
794-
}
795-
if err = d.Set("encryption_algorithm", encryption); err != nil {
796-
return fmt.Errorf("setting encryption error: %v", err)
797-
}
798-
if err = d.Set("kms_id", kmsId); err != nil {
799-
return fmt.Errorf("setting kms_id error: %v", err)
808+
// read the acceleration
809+
acceleration, err := cosService.GetBucketAccleration(ctx, bucket, cdcId)
810+
if err != nil {
811+
return err
812+
}
813+
if err = d.Set("acceleration_enable", acceleration); err != nil {
814+
return fmt.Errorf("setting acceleration_enable error: %v", err)
815+
}
800816
}
801817

802-
// read the versioning
803-
versioning, err := cosService.GetBucketVersioning(ctx, bucket, cdcId)
818+
// read the cors
819+
corsRules, err := cosService.GetBucketCors(ctx, bucket, cdcId)
804820
if err != nil {
805821
return err
806822
}
807-
if err = d.Set("versioning_enable", versioning); err != nil {
808-
return fmt.Errorf("setting versioning_enable error: %v", err)
823+
if err = d.Set("cors_rules", corsRules); err != nil {
824+
return fmt.Errorf("setting cors_rules error: %v", err)
809825
}
810826

811-
// read the acceleration
812-
acceleration, err := cosService.GetBucketAccleration(ctx, bucket, cdcId)
827+
// read the lifecycle
828+
lifecycleRules, err := cosService.GetBucketLifecycle(ctx, bucket, cdcId)
813829
if err != nil {
814830
return err
815831
}
816-
if err = d.Set("acceleration_enable", acceleration); err != nil {
817-
return fmt.Errorf("setting acceleration_enable error: %v", err)
832+
if err = d.Set("lifecycle_rules", lifecycleRules); err != nil {
833+
return fmt.Errorf("setting lifecycle_rules error: %v", err)
818834
}
819835

820836
//read the log
@@ -1067,7 +1083,7 @@ func resourceTencentCloudCosBucketDelete(d *schema.ResourceData, meta interface{
10671083
}
10681084

10691085
// wait for bucket 404, means deleted
1070-
err = resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError {
1086+
err = resource.Retry(tccommon.ReadRetryTimeout*10, func() *resource.RetryError {
10711087
code, _, e := cosService.TencentcloudHeadBucket(ctx, bucket, cdcId)
10721088
if e != nil {
10731089
if code == 404 {
@@ -1829,6 +1845,7 @@ func getBucketPutOptions(d *schema.ResourceData) (useCosService bool, options *c
18291845
}
18301846
grants, hasGrantHeaders := d.GetOk("grant_headers")
18311847
maz, hasMAZ := d.GetOk("multi_az")
1848+
ofs, hasOFS := d.GetOk("chdfs_ofs")
18321849

18331850
if !hasGrantHeaders && !hasMAZ {
18341851
return false, opt
@@ -1853,11 +1870,18 @@ func getBucketPutOptions(d *schema.ResourceData) (useCosService bool, options *c
18531870
}
18541871
}
18551872

1873+
configOpt := cos.CreateBucketConfiguration{}
18561874
if hasMAZ {
18571875
if maz.(bool) {
1858-
opt.CreateBucketConfiguration = &cos.CreateBucketConfiguration{
1859-
BucketAZConfig: "MAZ",
1860-
}
1876+
configOpt.BucketAZConfig = "MAZ"
1877+
opt.CreateBucketConfiguration = &configOpt
1878+
}
1879+
}
1880+
1881+
if hasOFS {
1882+
if ofs.(bool) {
1883+
configOpt.BucketArchConfig = "OFS"
1884+
opt.CreateBucketConfiguration = &configOpt
18611885
}
18621886
}
18631887

tencentcloud/services/cos/resource_tc_cos_bucket.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ Provides a COS resource to create a COS bucket and set its attributes.
22

33
~> **NOTE:** The following capabilities do not support cdc scenarios: `multi_az`, `website`, and bucket replication `replica_role`.
44

5+
~> **NOTE:** If `chdfs_ofs` is `true`, cannot set `acl_body`, `acl`, `origin_pull_rules`, `origin_domain_rules`, `website`, `encryption_algorithm`, `kms_id`, `versioning_enable`, `acceleration_enable` at the same time. For more information, please refer to `https://www.tencentcloud.com/document/product/436/43305`.
6+
57
Example Usage
68

79
Private Bucket
@@ -431,6 +433,21 @@ resource "tencentcloud_cos_bucket" "bucket_with_replication" {
431433
}
432434
```
433435

436+
Using OFS
437+
438+
```hcl
439+
data "tencentcloud_user_info" "info" {}
440+
441+
locals {
442+
app_id = data.tencentcloud_user_info.info.app_id
443+
}
444+
445+
resource "tencentcloud_cos_bucket" "example" {
446+
bucket = "private-ofs-bucket-${local.app_id}"
447+
acl = "private"
448+
chdfs_ofs = true
449+
}
450+
```
434451
Import
435452

436453
COS bucket can be imported, e.g.

website/docs/r/cos_bucket.html.markdown

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ Provides a COS resource to create a COS bucket and set its attributes.
1313

1414
~> **NOTE:** The following capabilities do not support cdc scenarios: `multi_az`, `website`, and bucket replication `replica_role`.
1515

16+
~> **NOTE:** If `chdfs_ofs` is `true`, cannot set `acl_body`, `acl`, `origin_pull_rules`, `origin_domain_rules`, `website`, `encryption_algorithm`, `kms_id`, `versioning_enable`, `acceleration_enable` at the same time. For more information, please refer to `https://www.tencentcloud.com/document/product/436/43305`.
17+
1618
## Example Usage
1719

1820
### Private Bucket
@@ -442,6 +444,22 @@ resource "tencentcloud_cos_bucket" "bucket_with_replication" {
442444
}
443445
```
444446

447+
### Using OFS
448+
449+
```hcl
450+
data "tencentcloud_user_info" "info" {}
451+
452+
locals {
453+
app_id = data.tencentcloud_user_info.info.app_id
454+
}
455+
456+
resource "tencentcloud_cos_bucket" "example" {
457+
bucket = "private-ofs-bucket-${local.app_id}"
458+
acl = "private"
459+
chdfs_ofs = true
460+
}
461+
```
462+
445463
## Argument Reference
446464

447465
The following arguments are supported:
@@ -451,6 +469,7 @@ The following arguments are supported:
451469
* `acl_body` - (Optional, String) ACL XML body for multiple grant info. NOTE: this argument will overwrite `acl`. Check https://intl.cloud.tencent.com/document/product/436/7737 for more detail.
452470
* `acl` - (Optional, String) The canned ACL to apply. Valid values: private, public-read, and public-read-write. Defaults to private.
453471
* `cdc_id` - (Optional, String, ForceNew) CDC cluster ID.
472+
* `chdfs_ofs` - (Optional, Bool, ForceNew) Indicates whether to create a bucket of metadata acceleration. For more information, please refer to `https://www.tencentcloud.com/document/product/436/43305`.
454473
* `cors_rules` - (Optional, List) A rule of Cross-Origin Resource Sharing (documented below).
455474
* `enable_intelligent_tiering` - (Optional, Bool) Enable intelligent tiering. NOTE: When intelligent tiering configuration is enabled, it cannot be turned off or modified.
456475
* `encryption_algorithm` - (Optional, String) The server-side encryption algorithm to use. Valid values are `AES256`, `KMS` and `SM4`.

0 commit comments

Comments
 (0)