From 2fa57fc41bc371bae5cb3a26c0e5af57890dabd3 Mon Sep 17 00:00:00 2001 From: KGSN Date: Fri, 14 Jan 2022 16:34:35 +0800 Subject: [PATCH] feat: cos bucket - support maz bucket read --- tencentcloud/resource_tc_cos_bucket.go | 19 +++++++++++++------ tencentcloud/service_tencentcloud_cos.go | 24 ++++++++++++++++++++++++ website/docs/r/cos_bucket.html.markdown | 2 +- 3 files changed, 38 insertions(+), 7 deletions(-) diff --git a/tencentcloud/resource_tc_cos_bucket.go b/tencentcloud/resource_tc_cos_bucket.go index f3dbef97a5..76996cbc14 100644 --- a/tencentcloud/resource_tc_cos_bucket.go +++ b/tencentcloud/resource_tc_cos_bucket.go @@ -240,7 +240,6 @@ import ( "github.com/tencentyun/cos-go-sdk-v5" "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/awserr" "github.com/aws/aws-sdk-go/service/s3" "github.com/hashicorp/terraform-plugin-sdk/helper/hashcode" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" @@ -648,7 +647,7 @@ func resourceTencentCloudCosBucket() *schema.Resource { Type: schema.TypeBool, Optional: true, ForceNew: true, - Description: "Indicates whether to create a bucket of multi available zone.", + Description: "Indicates whether to create a bucket of multi available zone. NOTE: If set to true, the versioning must enable.", }, //computed "cos_bucket_url": { @@ -672,14 +671,18 @@ func resourceTencentCloudCosBucketCreate(d *schema.ResourceData, meta interface{ acl := d.Get("acl").(string) role, roleOk := d.GetOk("replica_role") rule, ruleOk := d.GetOk("replica_rules") - versioning, versioningOk := d.GetOk("versioning_enable") + versioning := d.Get("versioning_enable").(bool) + isMAZ := d.Get("multi_az").(bool) - if v := versioning.(bool); !versioningOk || !v { + if !versioning { if roleOk || role.(string) != "" { return fmt.Errorf("cannot configure role unless versioning enable") } else if ruleOk || len(rule.([]interface{})) > 0 { return fmt.Errorf("cannot configure replica rule unless versioning enable") } + if isMAZ { + return fmt.Errorf("cannot create MAZ bucket unless versioning enable") + } } cosService := CosService{client: meta.(*TencentCloudClient).apiV3Conn} @@ -716,9 +719,9 @@ func resourceTencentCloudCosBucketRead(d *schema.ResourceData, meta interface{}) bucket := d.Id() cosService := CosService{client: meta.(*TencentCloudClient).apiV3Conn} - err := cosService.HeadBucket(ctx, bucket) + code, header, err := cosService.TencentcloudHeadBucket(ctx, bucket) if err != nil { - if awsError, ok := err.(awserr.RequestFailure); ok && awsError.StatusCode() == 404 { + if code == 404 { log.Printf("[WARN]%s bucket (%s) not found, error code (404)", logId, bucket) d.SetId("") return nil @@ -727,6 +730,10 @@ 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) + } + cosBucketUrl := fmt.Sprintf("%s.cos.%s.myqcloud.com", d.Id(), meta.(*TencentCloudClient).apiV3Conn.Region) _ = d.Set("cos_bucket_url", cosBucketUrl) // set bucket in the import case diff --git a/tencentcloud/service_tencentcloud_cos.go b/tencentcloud/service_tencentcloud_cos.go index 6a3bcf020c..4d0a6344eb 100644 --- a/tencentcloud/service_tencentcloud_cos.go +++ b/tencentcloud/service_tencentcloud_cos.go @@ -6,6 +6,7 @@ import ( "encoding/xml" "fmt" "log" + "net/http" "github.com/tencentyun/cos-go-sdk-v5" @@ -224,6 +225,29 @@ func (me *CosService) HeadBucket(ctx context.Context, bucket string) (errRet err return nil } +func (me *CosService) TencentcloudHeadBucket(ctx context.Context, bucket string) (code int, header http.Header, errRet error) { + logId := getLogId(ctx) + + response, err := me.client.UseTencentCosClient(bucket).Bucket.Head(ctx) + + if response != nil { + code = response.StatusCode + header = response.Header + } + + if err != nil { + log.Printf("[CRITAL]%s api[%s] fail, reason[%s]\n", + logId, "HeadBucket", err.Error()) + errRet = err + return + } + + log.Printf("[DEBUG]%s api[%s] success\n", + logId, "HeadBucket") + + return +} + func (me *CosService) DeleteBucket(ctx context.Context, bucket string) (errRet error) { logId := getLogId(ctx) diff --git a/website/docs/r/cos_bucket.html.markdown b/website/docs/r/cos_bucket.html.markdown index 448b64748a..9b382ee778 100644 --- a/website/docs/r/cos_bucket.html.markdown +++ b/website/docs/r/cos_bucket.html.markdown @@ -242,7 +242,7 @@ The following arguments are supported: * `log_enable` - (Optional) Indicate the access log of this bucket to be saved or not. Default is `false`. If set `true`, the access log will be saved with `log_target_bucket`. To enable log, the full access of log service must be granted. [Full Access Role Policy](https://intl.cloud.tencent.com/document/product/436/16920). * `log_prefix` - (Optional) The prefix log name which saves the access log of this bucket per 5 minutes. Eg. `MyLogPrefix/`. The log access file format is `log_target_bucket`/`log_prefix`{YYYY}/{MM}/{DD}/{time}_{random}_{index}.gz. Only valid when `log_enable` is `true`. * `log_target_bucket` - (Optional) The target bucket name which saves the access log of this bucket per 5 minutes. The log access file format is `log_target_bucket`/`log_prefix`{YYYY}/{MM}/{DD}/{time}_{random}_{index}.gz. Only valid when `log_enable` is `true`. User must have full access on this bucket. -* `multi_az` - (Optional, ForceNew) Indicates whether to create a bucket of multi available zone. +* `multi_az` - (Optional, ForceNew) Indicates whether to create a bucket of multi available zone. NOTE: If set to true, the versioning must enable. * `origin_domain_rules` - (Optional) Bucket Origin Domain settings. * `origin_pull_rules` - (Optional) Bucket Origin-Pull settings. * `replica_role` - (Optional) Request initiator identifier, format: `qcs::cam::uin/:uin/`. NOTE: only `versioning_enable` is true can configure this argument.