Skip to content

Commit 172bcb8

Browse files
authored
feat: cos bucket - support maz bucket read (#854)
1 parent 3b95340 commit 172bcb8

File tree

3 files changed

+38
-7
lines changed

3 files changed

+38
-7
lines changed

tencentcloud/resource_tc_cos_bucket.go

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,6 @@ import (
245245
"github.com/tencentyun/cos-go-sdk-v5"
246246

247247
"github.com/aws/aws-sdk-go/aws"
248-
"github.com/aws/aws-sdk-go/aws/awserr"
249248
"github.com/aws/aws-sdk-go/service/s3"
250249
"github.com/hashicorp/terraform-plugin-sdk/helper/hashcode"
251250
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
@@ -712,7 +711,7 @@ func resourceTencentCloudCosBucket() *schema.Resource {
712711
Type: schema.TypeBool,
713712
Optional: true,
714713
ForceNew: true,
715-
Description: "Indicates whether to create a bucket of multi available zone.",
714+
Description: "Indicates whether to create a bucket of multi available zone. NOTE: If set to true, the versioning must enable.",
716715
},
717716
//computed
718717
"cos_bucket_url": {
@@ -736,14 +735,18 @@ func resourceTencentCloudCosBucketCreate(d *schema.ResourceData, meta interface{
736735
acl := d.Get("acl").(string)
737736
role, roleOk := d.GetOk("replica_role")
738737
rule, ruleOk := d.GetOk("replica_rules")
739-
versioning, versioningOk := d.GetOk("versioning_enable")
738+
versioning := d.Get("versioning_enable").(bool)
739+
isMAZ := d.Get("multi_az").(bool)
740740

741-
if v := versioning.(bool); !versioningOk || !v {
741+
if !versioning {
742742
if roleOk || role.(string) != "" {
743743
return fmt.Errorf("cannot configure role unless versioning enable")
744744
} else if ruleOk || len(rule.([]interface{})) > 0 {
745745
return fmt.Errorf("cannot configure replica rule unless versioning enable")
746746
}
747+
if isMAZ {
748+
return fmt.Errorf("cannot create MAZ bucket unless versioning enable")
749+
}
747750
}
748751

749752
cosService := CosService{client: meta.(*TencentCloudClient).apiV3Conn}
@@ -780,9 +783,9 @@ func resourceTencentCloudCosBucketRead(d *schema.ResourceData, meta interface{})
780783
bucket := d.Id()
781784
cosService := CosService{client: meta.(*TencentCloudClient).apiV3Conn}
782785

783-
err := cosService.HeadBucket(ctx, bucket)
786+
code, header, err := cosService.TencentcloudHeadBucket(ctx, bucket)
784787
if err != nil {
785-
if awsError, ok := err.(awserr.RequestFailure); ok && awsError.StatusCode() == 404 {
788+
if code == 404 {
786789
log.Printf("[WARN]%s bucket (%s) not found, error code (404)", logId, bucket)
787790
d.SetId("")
788791
return nil
@@ -791,6 +794,10 @@ func resourceTencentCloudCosBucketRead(d *schema.ResourceData, meta interface{})
791794
}
792795
}
793796

797+
if header != nil && len(header["X-Cos-Bucket-Az-Type"]) > 0 && header["X-Cos-Bucket-Az-Type"][0] == "MAZ" {
798+
_ = d.Set("multi_az", true)
799+
}
800+
794801
cosBucketUrl := fmt.Sprintf("%s.cos.%s.myqcloud.com", d.Id(), meta.(*TencentCloudClient).apiV3Conn.Region)
795802
_ = d.Set("cos_bucket_url", cosBucketUrl)
796803
// set bucket in the import case

tencentcloud/service_tencentcloud_cos.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"encoding/xml"
77
"fmt"
88
"log"
9+
"net/http"
910

1011
"github.com/tencentyun/cos-go-sdk-v5"
1112

@@ -226,6 +227,29 @@ func (me *CosService) HeadBucket(ctx context.Context, bucket string) (errRet err
226227
return nil
227228
}
228229

230+
func (me *CosService) TencentcloudHeadBucket(ctx context.Context, bucket string) (code int, header http.Header, errRet error) {
231+
logId := getLogId(ctx)
232+
233+
response, err := me.client.UseTencentCosClient(bucket).Bucket.Head(ctx)
234+
235+
if response != nil {
236+
code = response.StatusCode
237+
header = response.Header
238+
}
239+
240+
if err != nil {
241+
log.Printf("[CRITAL]%s api[%s] fail, reason[%s]\n",
242+
logId, "HeadBucket", err.Error())
243+
errRet = err
244+
return
245+
}
246+
247+
log.Printf("[DEBUG]%s api[%s] success\n",
248+
logId, "HeadBucket")
249+
250+
return
251+
}
252+
229253
func (me *CosService) DeleteBucket(ctx context.Context, bucket string) (errRet error) {
230254
logId := getLogId(ctx)
231255

website/docs/r/cos_bucket.html.markdown

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ The following arguments are supported:
245245
* `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).
246246
* `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`.
247247
* `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.
248-
* `multi_az` - (Optional, ForceNew) Indicates whether to create a bucket of multi available zone.
248+
* `multi_az` - (Optional, ForceNew) Indicates whether to create a bucket of multi available zone. NOTE: If set to true, the versioning must enable.
249249
* `origin_domain_rules` - (Optional) Bucket Origin Domain settings.
250250
* `origin_pull_rules` - (Optional) Bucket Origin-Pull settings.
251251
* `replica_role` - (Optional) Request initiator identifier, format: `qcs::cam::uin/<owneruin>:uin/<subuin>`. NOTE: only `versioning_enable` is true can configure this argument.

0 commit comments

Comments
 (0)