Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .changelog/3546.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:enhancement
resource/tencentcloud_cos_bucket: support `chdfs_ofs`
```
Original file line number Diff line number Diff line change
Expand Up @@ -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}),
},
Expand Down Expand Up @@ -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}),
},
Expand Down Expand Up @@ -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}),
},
Expand Down
192 changes: 108 additions & 84 deletions tencentcloud/services/cos/resource_tc_cos_bucket.go
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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 == "" {
Expand All @@ -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
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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
Expand All @@ -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
}
}

Expand Down
17 changes: 17 additions & 0 deletions tencentcloud/services/cos/resource_tc_cos_bucket.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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.
Expand Down
19 changes: 19 additions & 0 deletions website/docs/r/cos_bucket.html.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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:
Expand All @@ -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`.
Expand Down
Loading