diff --git a/.changelog/3546.txt b/.changelog/3546.txt new file mode 100644 index 0000000000..34654860ef --- /dev/null +++ b/.changelog/3546.txt @@ -0,0 +1,3 @@ +```release-note:enhancement +resource/tencentcloud_cos_bucket: support `chdfs_ofs` +``` diff --git a/tencentcloud/services/cls/resource_tc_cls_cloud_product_log_task_extension.go b/tencentcloud/services/cls/resource_tc_cls_cloud_product_log_task_extension.go index 25e28e6005..097f48e741 100644 --- a/tencentcloud/services/cls/resource_tc_cls_cloud_product_log_task_extension.go +++ b/tencentcloud/services/cls/resource_tc_cls_cloud_product_log_task_extension.go @@ -29,15 +29,15 @@ func resourceTencentCloudClsCloudProductLogTaskReadPreRequest0(ctx context.Conte logType := idSplit[2] req.Filters = []*clsv20201016.Filter{ - &clsv20201016.Filter{ + { Key: common.StringPtr("instanceId"), Values: common.StringPtrs([]string{instanceId}), }, - &clsv20201016.Filter{ + { Key: common.StringPtr("assumerName"), Values: common.StringPtrs([]string{assumerName}), }, - &clsv20201016.Filter{ + { Key: common.StringPtr("logType"), Values: common.StringPtrs([]string{logType}), }, @@ -87,7 +87,7 @@ func resourceTencentCloudClsCloudProductLogTaskReadPreHandleResponse0(ctx contex logsetRequest := clsv20201016.NewDescribeLogsetsRequest() logsetResponse := clsv20201016.NewDescribeLogsetsResponse() logsetRequest.Filters = []*clsv20201016.Filter{ - &clsv20201016.Filter{ + { Key: common.StringPtr("logsetId"), Values: common.StringPtrs([]string{logsetId}), }, @@ -128,7 +128,7 @@ func resourceTencentCloudClsCloudProductLogTaskReadPreHandleResponse0(ctx contex topicRequest := clsv20201016.NewDescribeTopicsRequest() topicResponse := clsv20201016.NewDescribeTopicsResponse() topicRequest.Filters = []*clsv20201016.Filter{ - &clsv20201016.Filter{ + { Key: common.StringPtr("topicId"), Values: common.StringPtrs([]string{topicId}), }, diff --git a/tencentcloud/services/cos/resource_tc_cos_bucket.go b/tencentcloud/services/cos/resource_tc_cos_bucket.go index 611457208c..1a2644b6d3 100644 --- a/tencentcloud/services/cos/resource_tc_cos_bucket.go +++ b/tencentcloud/services/cos/resource_tc_cos_bucket.go @@ -579,6 +579,13 @@ func ResourceTencentCloudCosBucket() *schema.Resource { ForceNew: true, Description: "Indicates whether to create a bucket of multi available zone.", }, + "chdfs_ofs": { + Type: schema.TypeBool, + Optional: true, + ForceNew: true, + Computed: true, + Description: "Indicates whether to create a bucket of metadata acceleration. For more information, please refer to `https://www.tencentcloud.com/document/product/436/43305`.", + }, "enable_intelligent_tiering": { Type: schema.TypeBool, Optional: true, @@ -683,10 +690,17 @@ func resourceTencentCloudCosBucketRead(d *schema.ResourceData, meta interface{}) } } - if header != nil && len(header["X-Cos-Bucket-Az-Type"]) > 0 && header["X-Cos-Bucket-Az-Type"][0] == "MAZ" { - _ = d.Set("multi_az", true) + if header != nil { + if len(header["X-Cos-Bucket-Az-Type"]) > 0 && header["X-Cos-Bucket-Az-Type"][0] == "MAZ" { + _ = d.Set("multi_az", true) + } + + if len(header["X-Cos-Bucket-Arch"]) > 0 && header["X-Cos-Bucket-Arch"][0] == "OFS" { + _ = d.Set("chdfs_ofs", true) + } } + ofs := d.Get("chdfs_ofs").(bool) cosDomain := meta.(tccommon.ProviderMeta).GetAPIV3Conn().CosDomain var cosBucketUrl string if cdcId == "" && cosDomain == "" { @@ -705,116 +719,118 @@ func resourceTencentCloudCosBucketRead(d *schema.ResourceData, meta interface{}) _ = d.Set("bucket", d.Id()) } - // acl - aclResult, err := cosService.GetBucketACL(ctx, bucket, cdcId) + if !ofs { + // acl + aclResult, err := cosService.GetBucketACL(ctx, bucket, cdcId) - if err != nil { - return err - } + if err != nil { + return err + } - aclBody, err := xml.Marshal(aclResult) - if err != nil { - return err - } + aclBody, err := xml.Marshal(aclResult) + if err != nil { + return err + } - _ = d.Set("acl_body", string(aclBody)) + _ = d.Set("acl_body", string(aclBody)) - acl := GetBucketPublicACL(aclResult) + acl := GetBucketPublicACL(aclResult) - _ = d.Set("acl", acl) + _ = d.Set("acl", acl) - // read the cors - corsRules, err := cosService.GetBucketCors(ctx, bucket, cdcId) - if err != nil { - return err - } - if err = d.Set("cors_rules", corsRules); err != nil { - return fmt.Errorf("setting cors_rules error: %v", err) - } + if cdcId == "" && cosDomain == "" { + originPullRules, err := cosService.GetBucketPullOrigin(ctx, bucket) + if err != nil { + return err + } - if cdcId == "" && cosDomain == "" { - originPullRules, err := cosService.GetBucketPullOrigin(ctx, bucket) + if err = d.Set("origin_pull_rules", originPullRules); err != nil { + return fmt.Errorf("setting origin_pull_rules error: %v", err) + } + + originDomainRules, err := cosService.GetBucketOriginDomain(ctx, bucket) + if err != nil { + return err + } + + if err = d.Set("origin_domain_rules", originDomainRules); err != nil { + return fmt.Errorf("setting origin_domain_rules error: %v", err) + } + + replicaResult, err := cosService.GetBucketReplication(ctx, bucket, cdcId) + if err != nil { + return err + } + + if replicaResult != nil { + err := setBucketReplication(d, *replicaResult) + if err != nil { + return err + } + } + } + + // read the website + website, err := cosService.GetBucketWebsite(ctx, bucket, cdcId) if err != nil { return err } - - if err = d.Set("origin_pull_rules", originPullRules); err != nil { - return fmt.Errorf("setting origin_pull_rules error: %v", err) + if len(website) > 0 && cosDomain == "" { + // {bucket}.cos-website.{region}.myqcloud.com + endPointUrl := fmt.Sprintf("%s.cos-website.%s.myqcloud.com", d.Id(), meta.(tccommon.ProviderMeta).GetAPIV3Conn().Region) + website[0]["endpoint"] = endPointUrl + } + if err = d.Set("website", website); err != nil { + return fmt.Errorf("setting website error: %v", err) } - originDomainRules, err := cosService.GetBucketOriginDomain(ctx, bucket) + // read the encryption algorithm + encryption, kmsId, err := cosService.GetBucketEncryption(ctx, bucket, cdcId) if err != nil { return err } - - if err = d.Set("origin_domain_rules", originDomainRules); err != nil { - return fmt.Errorf("setting origin_domain_rules error: %v", err) + if err = d.Set("encryption_algorithm", encryption); err != nil { + return fmt.Errorf("setting encryption error: %v", err) + } + if err = d.Set("kms_id", kmsId); err != nil { + return fmt.Errorf("setting kms_id error: %v", err) } - replicaResult, err := cosService.GetBucketReplication(ctx, bucket, cdcId) + // read the versioning + versioning, err := cosService.GetBucketVersioning(ctx, bucket, cdcId) if err != nil { return err } - - if replicaResult != nil { - err := setBucketReplication(d, *replicaResult) - if err != nil { - return err - } + if err = d.Set("versioning_enable", versioning); err != nil { + return fmt.Errorf("setting versioning_enable error: %v", err) } - } - - // read the lifecycle - lifecycleRules, err := cosService.GetBucketLifecycle(ctx, bucket, cdcId) - if err != nil { - return err - } - if err = d.Set("lifecycle_rules", lifecycleRules); err != nil { - return fmt.Errorf("setting lifecycle_rules error: %v", err) - } - - // read the website - website, err := cosService.GetBucketWebsite(ctx, bucket, cdcId) - if err != nil { - return err - } - if len(website) > 0 && cosDomain == "" { - // {bucket}.cos-website.{region}.myqcloud.com - endPointUrl := fmt.Sprintf("%s.cos-website.%s.myqcloud.com", d.Id(), meta.(tccommon.ProviderMeta).GetAPIV3Conn().Region) - website[0]["endpoint"] = endPointUrl - } - if err = d.Set("website", website); err != nil { - return fmt.Errorf("setting website error: %v", err) - } - // read the encryption algorithm - encryption, kmsId, err := cosService.GetBucketEncryption(ctx, bucket, cdcId) - if err != nil { - return err - } - if err = d.Set("encryption_algorithm", encryption); err != nil { - return fmt.Errorf("setting encryption error: %v", err) - } - if err = d.Set("kms_id", kmsId); err != nil { - return fmt.Errorf("setting kms_id error: %v", err) + // read the acceleration + acceleration, err := cosService.GetBucketAccleration(ctx, bucket, cdcId) + if err != nil { + return err + } + if err = d.Set("acceleration_enable", acceleration); err != nil { + return fmt.Errorf("setting acceleration_enable error: %v", err) + } } - // read the versioning - versioning, err := cosService.GetBucketVersioning(ctx, bucket, cdcId) + // read the cors + corsRules, err := cosService.GetBucketCors(ctx, bucket, cdcId) if err != nil { return err } - if err = d.Set("versioning_enable", versioning); err != nil { - return fmt.Errorf("setting versioning_enable error: %v", err) + if err = d.Set("cors_rules", corsRules); err != nil { + return fmt.Errorf("setting cors_rules error: %v", err) } - // read the acceleration - acceleration, err := cosService.GetBucketAccleration(ctx, bucket, cdcId) + // read the lifecycle + lifecycleRules, err := cosService.GetBucketLifecycle(ctx, bucket, cdcId) if err != nil { return err } - if err = d.Set("acceleration_enable", acceleration); err != nil { - return fmt.Errorf("setting acceleration_enable error: %v", err) + if err = d.Set("lifecycle_rules", lifecycleRules); err != nil { + return fmt.Errorf("setting lifecycle_rules error: %v", err) } //read the log @@ -1067,7 +1083,7 @@ func resourceTencentCloudCosBucketDelete(d *schema.ResourceData, meta interface{ } // wait for bucket 404, means deleted - err = resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError { + err = resource.Retry(tccommon.ReadRetryTimeout*10, func() *resource.RetryError { code, _, e := cosService.TencentcloudHeadBucket(ctx, bucket, cdcId) if e != nil { if code == 404 { @@ -1829,6 +1845,7 @@ func getBucketPutOptions(d *schema.ResourceData) (useCosService bool, options *c } grants, hasGrantHeaders := d.GetOk("grant_headers") maz, hasMAZ := d.GetOk("multi_az") + ofs, hasOFS := d.GetOk("chdfs_ofs") if !hasGrantHeaders && !hasMAZ { return false, opt @@ -1853,11 +1870,18 @@ func getBucketPutOptions(d *schema.ResourceData) (useCosService bool, options *c } } + configOpt := cos.CreateBucketConfiguration{} if hasMAZ { if maz.(bool) { - opt.CreateBucketConfiguration = &cos.CreateBucketConfiguration{ - BucketAZConfig: "MAZ", - } + configOpt.BucketAZConfig = "MAZ" + opt.CreateBucketConfiguration = &configOpt + } + } + + if hasOFS { + if ofs.(bool) { + configOpt.BucketArchConfig = "OFS" + opt.CreateBucketConfiguration = &configOpt } } diff --git a/tencentcloud/services/cos/resource_tc_cos_bucket.md b/tencentcloud/services/cos/resource_tc_cos_bucket.md index 74d59689d4..498105cdf3 100644 --- a/tencentcloud/services/cos/resource_tc_cos_bucket.md +++ b/tencentcloud/services/cos/resource_tc_cos_bucket.md @@ -2,6 +2,8 @@ Provides a COS resource to create a COS bucket and set its attributes. ~> **NOTE:** The following capabilities do not support cdc scenarios: `multi_az`, `website`, and bucket replication `replica_role`. +~> **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`. + Example Usage Private Bucket @@ -431,6 +433,21 @@ resource "tencentcloud_cos_bucket" "bucket_with_replication" { } ``` +Using OFS + +```hcl +data "tencentcloud_user_info" "info" {} + +locals { + app_id = data.tencentcloud_user_info.info.app_id +} + +resource "tencentcloud_cos_bucket" "example" { + bucket = "private-ofs-bucket-${local.app_id}" + acl = "private" + chdfs_ofs = true +} +``` Import COS bucket can be imported, e.g. diff --git a/website/docs/r/cos_bucket.html.markdown b/website/docs/r/cos_bucket.html.markdown index 80b0c2c50b..537bfbbdfa 100644 --- a/website/docs/r/cos_bucket.html.markdown +++ b/website/docs/r/cos_bucket.html.markdown @@ -13,6 +13,8 @@ Provides a COS resource to create a COS bucket and set its attributes. ~> **NOTE:** The following capabilities do not support cdc scenarios: `multi_az`, `website`, and bucket replication `replica_role`. +~> **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`. + ## Example Usage ### Private Bucket @@ -442,6 +444,22 @@ resource "tencentcloud_cos_bucket" "bucket_with_replication" { } ``` +### Using OFS + +```hcl +data "tencentcloud_user_info" "info" {} + +locals { + app_id = data.tencentcloud_user_info.info.app_id +} + +resource "tencentcloud_cos_bucket" "example" { + bucket = "private-ofs-bucket-${local.app_id}" + acl = "private" + chdfs_ofs = true +} +``` + ## Argument Reference The following arguments are supported: @@ -451,6 +469,7 @@ The following arguments are supported: * `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. * `acl` - (Optional, String) The canned ACL to apply. Valid values: private, public-read, and public-read-write. Defaults to private. * `cdc_id` - (Optional, String, ForceNew) CDC cluster ID. +* `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`. * `cors_rules` - (Optional, List) A rule of Cross-Origin Resource Sharing (documented below). * `enable_intelligent_tiering` - (Optional, Bool) Enable intelligent tiering. NOTE: When intelligent tiering configuration is enabled, it cannot be turned off or modified. * `encryption_algorithm` - (Optional, String) The server-side encryption algorithm to use. Valid values are `AES256`, `KMS` and `SM4`.