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
19 changes: 13 additions & 6 deletions tencentcloud/resource_tc_cos_bucket.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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": {
Expand All @@ -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}
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand Down
24 changes: 24 additions & 0 deletions tencentcloud/service_tencentcloud_cos.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"encoding/xml"
"fmt"
"log"
"net/http"

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

Expand Down Expand Up @@ -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)

Expand Down
2 changes: 1 addition & 1 deletion website/docs/r/cos_bucket.html.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -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/<owneruin>:uin/<subuin>`. NOTE: only `versioning_enable` is true can configure this argument.
Expand Down