diff --git a/tencentcloud/connectivity/client.go b/tencentcloud/connectivity/client.go index 962651a1b7..19287b038b 100644 --- a/tencentcloud/connectivity/client.go +++ b/tencentcloud/connectivity/client.go @@ -252,15 +252,21 @@ func (me *TencentCloudClient) NewClientIntlProfile(timeout int) *intlProfile.Cli } // UseCosClient returns cos client for service -func (me *TencentCloudClient) UseCosClient() *s3.S3 { - if me.cosConn != nil { - return me.cosConn - } +func (me *TencentCloudClient) UseCosClient(cdcId string) *s3.S3 { + //if me.cosConn != nil { + // return me.cosConn + //} resolver := func(service, region string, optFns ...func(*endpoints.Options)) (endpoints.ResolvedEndpoint, error) { if service == endpoints.S3ServiceID { + var endpointUrl string + if cdcId == "" { + endpointUrl = fmt.Sprintf("https://cos.%s.myqcloud.com", region) + } else { + endpointUrl = fmt.Sprintf("https://%s.cos-cdc.%s.myqcloud.com", cdcId, region) + } return endpoints.ResolvedEndpoint{ - URL: fmt.Sprintf("https://cos.%s.myqcloud.com", region), + URL: endpointUrl, SigningRegion: region, }, nil } @@ -278,8 +284,13 @@ func (me *TencentCloudClient) UseCosClient() *s3.S3 { } // UseTencentCosClient tencent cloud own client for service instead of aws -func (me *TencentCloudClient) UseTencentCosClient(bucket string) *cos.Client { - u, _ := url.Parse(fmt.Sprintf("https://%s.cos.%s.myqcloud.com", bucket, me.Region)) +func (me *TencentCloudClient) UseTencentCosClient(bucket string, cdcId string) *cos.Client { + var u *url.URL + if cdcId == "" { + u, _ = url.Parse(fmt.Sprintf("https://%s.cos.%s.myqcloud.com", bucket, me.Region)) + } else { + u, _ = url.Parse(fmt.Sprintf("https://%s.%s.cos-cdc.%s.myqcloud.com", bucket, cdcId, me.Region)) + } if me.tencentCosConn != nil && me.tencentCosConn.BaseURL.BucketURL == u { return me.tencentCosConn diff --git a/tencentcloud/provider.go b/tencentcloud/provider.go index 9e8e818c2e..fb23f84127 100644 --- a/tencentcloud/provider.go +++ b/tencentcloud/provider.go @@ -1266,10 +1266,6 @@ func Provider() *schema.Provider { "tencentcloud_mysql_ro_start_replication": cdb.ResourceTencentCloudMysqlRoStartReplication(), "tencentcloud_mysql_ro_stop_replication": cdb.ResourceTencentCloudMysqlRoStopReplication(), "tencentcloud_mysql_switch_proxy": cdb.ResourceTencentCloudMysqlSwitchProxy(), - "tencentcloud_cos_bucket": cos.ResourceTencentCloudCosBucket(), - "tencentcloud_cos_bucket_object": cos.ResourceTencentCloudCosBucketObject(), - "tencentcloud_cos_bucket_referer": cos.ResourceTencentCloudCosBucketReferer(), - "tencentcloud_cos_bucket_version": cos.ResourceTencentCloudCosBucketVersion(), "tencentcloud_cfs_file_system": cfs.ResourceTencentCloudCfsFileSystem(), "tencentcloud_cfs_access_group": cfs.ResourceTencentCloudCfsAccessGroup(), "tencentcloud_cfs_access_rule": cfs.ResourceTencentCloudCfsAccessRule(), @@ -1591,6 +1587,10 @@ func Provider() *schema.Provider { "tencentcloud_tdmq_send_rocketmq_message": trocket.ResourceTencentCloudTdmqSendRocketmqMessage(), "tencentcloud_tdmq_professional_cluster": tpulsar.ResourceTencentCloudTdmqProfessionalCluster(), "tencentcloud_tdmq_subscription": tpulsar.ResourceTencentCloudTdmqSubscription(), + "tencentcloud_cos_bucket": cos.ResourceTencentCloudCosBucket(), + "tencentcloud_cos_bucket_object": cos.ResourceTencentCloudCosBucketObject(), + "tencentcloud_cos_bucket_referer": cos.ResourceTencentCloudCosBucketReferer(), + "tencentcloud_cos_bucket_version": cos.ResourceTencentCloudCosBucketVersion(), "tencentcloud_cos_bucket_policy": cos.ResourceTencentCloudCosBucketPolicy(), "tencentcloud_cos_bucket_domain_certificate_attachment": cos.ResourceTencentCloudCosBucketDomainCertificateAttachment(), "tencentcloud_cos_bucket_inventory": cos.ResourceTencentCloudCosBucketInventory(), diff --git a/tencentcloud/services/cos/data_source_tc_cos_batchs.go b/tencentcloud/services/cos/data_source_tc_cos_batchs.go index 49fc5399cf..74ac276d19 100644 --- a/tencentcloud/services/cos/data_source_tc_cos_batchs.go +++ b/tencentcloud/services/cos/data_source_tc_cos_batchs.go @@ -33,6 +33,7 @@ func DataSourceTencentCloudCosBatchs() *schema.Resource { Optional: true, Description: "The task status information you need to query. If you do not specify a task status, COS returns the status of all tasks that have been executed, including those that are in progress. If you specify a task status, COS returns the task in the specified state. Optional task states include: Active, Cancelled, Cancelling, Complete, Completing, Failed, Failing, New, Paused, Pausing, Preparing, Ready, Suspended.", }, + // computed "jobs": { Type: schema.TypeList, Computed: true, @@ -113,19 +114,20 @@ func DataSourceTencentCloudCosBatchs() *schema.Resource { func dataSourceTencentCloudCosBatchsRead(d *schema.ResourceData, meta interface{}) error { defer tccommon.LogElapsed("data_source.tencentcloud_cos_batchs.read")() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + ) + uin := d.Get("uin").(string) appid := d.Get("appid").(int) jobs := make([]map[string]interface{}, 0) - opt := &cos.BatchListJobsOptions{} if v, ok := d.GetOk("job_statuses"); ok { opt.JobStatuses = v.(string) } - headers := &cos.BatchRequestHeaders{ - XCosAppid: appid, - } + + headers := &cos.BatchRequestHeaders{XCosAppid: appid} ids := make([]string, 0) for { req, _ := json.Marshal(opt) @@ -135,6 +137,7 @@ func dataSourceTencentCloudCosBatchsRead(d *schema.ResourceData, meta interface{ if err != nil { return err } + for _, item := range result.Jobs.Members { jobItem := make(map[string]interface{}) jobItem["creation_time"] = item.CreationTime @@ -149,10 +152,12 @@ func dataSourceTencentCloudCosBatchsRead(d *schema.ResourceData, meta interface{ "number_of_tasks_succeeded": item.ProgressSummary.NumberOfTasksSucceeded, "total_number_of_tasks": item.ProgressSummary.TotalNumberOfTasks, } + jobItem["progress_summary"] = []interface{}{progressSummary} ids = append(ids, item.JobId) jobs = append(jobs, jobItem) } + if result.NextToken != "" { opt.NextToken = result.NextToken } else { diff --git a/tencentcloud/services/cos/data_source_tc_cos_bucket_inventorys.go b/tencentcloud/services/cos/data_source_tc_cos_bucket_inventorys.go index 95bf911afd..b97d65fa9d 100644 --- a/tencentcloud/services/cos/data_source_tc_cos_bucket_inventorys.go +++ b/tencentcloud/services/cos/data_source_tc_cos_bucket_inventorys.go @@ -6,10 +6,8 @@ import ( "log" "strconv" - tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" - + tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common" "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper" ) @@ -23,6 +21,12 @@ func DataSourceTencentCloudCosBucketInventorys() *schema.Resource { Required: true, Description: "Bucket.", }, + "cdc_id": { + Type: schema.TypeString, + Optional: true, + Description: "CDC cluster ID.", + }, + // computed "inventorys": { Type: schema.TypeList, Computed: true, @@ -78,8 +82,8 @@ func DataSourceTencentCloudCosBucketInventorys() *schema.Resource { }, }, "optional_fields": { - Type: schema.TypeList, - Optional: true, + Type: schema.TypeList, + Optional: true, Description: "Analysis items to include in the inventory result .", Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ @@ -166,14 +170,18 @@ func DataSourceTencentCloudCosBucketInventorys() *schema.Resource { func dataSourceTencentCloudCosBucketInventorysRead(d *schema.ResourceData, meta interface{}) error { defer tccommon.LogElapsed("data_source.tencentcloud_cos_bucket_inventorys.read")() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + ) + bucket := d.Get("bucket").(string) + cdcId := d.Get("cdc_id").(string) inventoryConfigurations := make([]map[string]interface{}, 0) token := "" ids := make([]string, 0) for { - result, response, err := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseTencentCosClient(bucket).Bucket.ListInventoryConfigurations(ctx, token) + result, response, err := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseTencentCosClient(bucket, cdcId).Bucket.ListInventoryConfigurations(ctx, token) responseBody, _ := json.Marshal(response.Body) log.Printf("[DEBUG]%s api[ListInventoryConfigurations] success, response body [%s]\n", logId, responseBody) if err != nil { @@ -194,13 +202,17 @@ func dataSourceTencentCloudCosBucketInventorysRead(d *schema.ResourceData, meta if item.Filter.Period.StartTime != 0 { periodMap["start_time"] = strconv.FormatInt(item.Filter.Period.StartTime, 10) } + if item.Filter.Period.EndTime != 0 { periodMap["end_time"] = strconv.FormatInt(item.Filter.Period.EndTime, 10) } + filterMap["period"] = []interface{}{periodMap} } + itemMap["filter"] = []interface{}{filterMap} } + if item.OptionalFields != nil { optionalFieldsMap := make(map[string]interface{}) fields := make([]string, 0) @@ -208,6 +220,7 @@ func dataSourceTencentCloudCosBucketInventorysRead(d *schema.ResourceData, meta fields = append(fields, item.OptionalFields.BucketInventoryFields...) optionalFieldsMap["fields"] = fields } + itemMap["optional_fields"] = []interface{}{optionalFieldsMap} } @@ -225,16 +238,17 @@ func dataSourceTencentCloudCosBucketInventorysRead(d *schema.ResourceData, meta destinationMap["format"] = item.Destination.Format if item.Destination.Encryption != nil && item.Destination.Encryption.SSECOS != "" { encryptionMap := make(map[string]interface{}) - encryptionMap["sse_cos"] = item.Destination.Encryption.SSECOS destinationMap["encryption"] = []interface{}{encryptionMap} - } + itemMap["destination"] = []interface{}{destinationMap} } + ids = append(ids, item.ID) inventoryConfigurations = append(inventoryConfigurations, itemMap) } + if result.NextContinuationToken != "" { token = result.NextContinuationToken } else { diff --git a/tencentcloud/services/cos/data_source_tc_cos_bucket_multipart_uploads.go b/tencentcloud/services/cos/data_source_tc_cos_bucket_multipart_uploads.go index 3b103bd2ec..7a7d5759a6 100644 --- a/tencentcloud/services/cos/data_source_tc_cos_bucket_multipart_uploads.go +++ b/tencentcloud/services/cos/data_source_tc_cos_bucket_multipart_uploads.go @@ -38,6 +38,12 @@ func DataSourceTencentCloudCosBucketMultipartUploads() *schema.Resource { Optional: true, Description: "The returned Object key must be prefixed with Prefix. Note that when using the prefix query, the returned key still contains Prefix.", }, + "cdc_id": { + Type: schema.TypeString, + Optional: true, + Description: "CDC cluster ID.", + }, + // computed "uploads": { Type: schema.TypeList, Computed: true, @@ -117,27 +123,35 @@ func DataSourceTencentCloudCosBucketMultipartUploads() *schema.Resource { func dataSourceTencentCloudCosBucketMultipartUploadsRead(d *schema.ResourceData, meta interface{}) error { defer tccommon.LogElapsed("data_source.tencentcloud_cos_bucket_multipart_uploads.read")() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + ) + bucket := d.Get("bucket").(string) + cdcId := d.Get("cdc_id").(string) multipartUploads := make([]map[string]interface{}, 0) opt := &cos.ListMultipartUploadsOptions{} if v, ok := d.GetOk("delimiter"); ok { opt.Delimiter = v.(string) } + if v, ok := d.GetOk("encoding_type"); ok { opt.EncodingType = v.(string) } + if v, ok := d.GetOk("prefix"); ok { opt.Prefix = v.(string) } + ids := make([]string, 0) for { - result, response, err := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseTencentCosClient(bucket).Bucket.ListMultipartUploads(ctx, opt) + result, response, err := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseTencentCosClient(bucket, cdcId).Bucket.ListMultipartUploads(ctx, opt) responseBody, _ := json.Marshal(response.Body) if err != nil { return err } + log.Printf("[DEBUG]%s api[ListMultipartUploads] success, response body [%s]\n", logId, responseBody) for _, item := range result.Uploads { itemMap := make(map[string]interface{}) @@ -150,18 +164,23 @@ func dataSourceTencentCloudCosBucketMultipartUploadsRead(d *schema.ResourceData, "display_name": item.Owner.DisplayName, "id": item.Owner.ID, } + itemMap["owner"] = []map[string]interface{}{owner} } + if item.Initiator != nil { initiator := map[string]interface{}{ "display_name": item.Initiator.DisplayName, "id": item.Initiator.ID, } + itemMap["initiator"] = []map[string]interface{}{initiator} } + ids = append(ids, item.UploadID) multipartUploads = append(multipartUploads, itemMap) } + if result.IsTruncated { opt.KeyMarker = result.KeyMarker opt.UploadIDMarker = result.UploadIDMarker diff --git a/tencentcloud/services/cos/data_source_tc_cos_bucket_object.go b/tencentcloud/services/cos/data_source_tc_cos_bucket_object.go index 57b3c121be..e6d888eda8 100644 --- a/tencentcloud/services/cos/data_source_tc_cos_bucket_object.go +++ b/tencentcloud/services/cos/data_source_tc_cos_bucket_object.go @@ -28,11 +28,17 @@ func DataSourceTencentCloudCosBucketObject() *schema.Resource { Required: true, Description: "The full path to the object inside the bucket.", }, + "cdc_id": { + Type: schema.TypeString, + Optional: true, + Description: "CDC cluster ID.", + }, "result_output_file": { Type: schema.TypeString, Optional: true, Description: "Used to save results.", }, + // computed "cache_control": { Type: schema.TypeString, Computed: true, @@ -75,18 +81,20 @@ func DataSourceTencentCloudCosBucketObject() *schema.Resource { func dataSourceTencentCloudCosBucketObjectsRead(d *schema.ResourceData, meta interface{}) error { defer tccommon.LogElapsed("data_source.tencentcloud_cos_bucket_object.read")() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + cosService = CosService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + ) bucket := d.Get("bucket").(string) key := d.Get("key").(string) + cdcId := d.Get("cdc_id").(string) outputMap := make(map[string]string) outputMap["bucket"] = bucket outputMap["key"] = key - cosService := CosService{ - client: meta.(tccommon.ProviderMeta).GetAPIV3Conn(), - } - info, err := cosService.HeadObject(ctx, bucket, key) + + info, err := cosService.HeadObject(ctx, bucket, key, cdcId) if err != nil { return err } @@ -94,19 +102,26 @@ func dataSourceTencentCloudCosBucketObjectsRead(d *schema.ResourceData, meta int ids := []string{bucket, key} d.SetId(helper.DataResourceIdsHash(ids)) _ = d.Set("cache_control", info.CacheControl) + outputMap["cache_control"] = getStringValue(info.CacheControl) _ = d.Set("content_disposition", info.ContentDisposition) + outputMap["content_disposition"] = getStringValue(info.ContentDisposition) _ = d.Set("content_encoding", info.ContentEncoding) + outputMap["content_encoding"] = getStringValue(info.ContentEncoding) _ = d.Set("content_type", info.ContentType) + outputMap["content_type"] = getStringValue(info.ContentType) etag := getStringValue(info.ETag) _ = d.Set("etag", strings.Trim(etag, `"`)) + outputMap["etag"] = strings.Trim(etag, `"`) _ = d.Set("last_modified", info.LastModified.Format(time.RFC1123)) + outputMap["last_modified"] = info.LastModified.Format(time.RFC1123) _ = d.Set("storage_class", s3.StorageClassStandard) + outputMap["storage_class"] = s3.StorageClassStandard if info.StorageClass != nil { _ = d.Set("storage_class", info.StorageClass) @@ -127,5 +142,6 @@ func getStringValue(p *string) string { if p == nil { return "" } + return *p } diff --git a/tencentcloud/services/cos/data_source_tc_cos_buckets.go b/tencentcloud/services/cos/data_source_tc_cos_buckets.go index a2e8035df0..db999eaa7e 100644 --- a/tencentcloud/services/cos/data_source_tc_cos_buckets.go +++ b/tencentcloud/services/cos/data_source_tc_cos_buckets.go @@ -29,12 +29,16 @@ func DataSourceTencentCloudCosBuckets() *schema.Resource { Optional: true, Description: "Tags to filter bucket.", }, + "cdc_id": { + Type: schema.TypeString, + Optional: true, + Description: "CDC cluster ID.", + }, "result_output_file": { Type: schema.TypeString, Optional: true, Description: "Used to save results.", }, - // computed "bucket_list": { Type: schema.TypeList, @@ -341,12 +345,14 @@ func DataSourceTencentCloudCosBuckets() *schema.Resource { func dataSourceTencentCloudCosBucketsRead(d *schema.ResourceData, meta interface{}) error { defer tccommon.LogElapsed("data_source.tencentcloud_cos_buckets.read")() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) - - cosService := CosService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + cosService = CosService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + ) - buckets, err := cosService.ListBuckets(ctx) + cdcId := d.Get("cdc_id").(string) + buckets, err := cosService.ListBuckets(ctx, cdcId) if err != nil { return err } @@ -355,14 +361,13 @@ func dataSourceTencentCloudCosBucketsRead(d *schema.ResourceData, meta interface tags := helper.GetTags(d, "tags") bucketList := make([]map[string]interface{}, 0, len(buckets)) - for _, v := range buckets { bucket := make(map[string]interface{}) if prefix != "" && !strings.HasPrefix(*v.Name, prefix) { continue } - respTags, err := cosService.GetBucketTags(ctx, *v.Name) + respTags, err := cosService.GetBucketTags(ctx, *v.Name, cdcId) if err != nil { return err } @@ -381,44 +386,41 @@ func dataSourceTencentCloudCosBucketsRead(d *schema.ResourceData, meta interface } bucket["bucket"] = *v.Name - - corsRules, err := cosService.GetBucketCors(ctx, *v.Name) + corsRules, err := cosService.GetBucketCors(ctx, *v.Name, cdcId) if err != nil { return err } - bucket["cors_rules"] = corsRules - lifecycleRules, err := cosService.GetDataSourceBucketLifecycle(ctx, *v.Name) + bucket["cors_rules"] = corsRules + lifecycleRules, err := cosService.GetDataSourceBucketLifecycle(ctx, *v.Name, cdcId) if err != nil { return err } - bucket["lifecycle_rules"] = lifecycleRules - website, err := cosService.GetBucketWebsite(ctx, *v.Name) + bucket["lifecycle_rules"] = lifecycleRules + website, err := cosService.GetBucketWebsite(ctx, *v.Name, cdcId) if err != nil { return err } - bucket["website"] = website - originRules, err := cosService.GetBucketPullOrigin(ctx, *v.Name) + bucket["website"] = website + originRules, err := cosService.GetBucketPullOrigin(ctx, *v.Name, cdcId) if err != nil { return err } - bucket["origin_pull_rules"] = originRules - domainRules, err := cosService.GetBucketOriginDomain(ctx, *v.Name) + bucket["origin_pull_rules"] = originRules + domainRules, err := cosService.GetBucketOriginDomain(ctx, *v.Name, cdcId) if err == nil { bucket["origin_domain_rules"] = domainRules } - aclBody, err := cosService.GetBucketACL(ctx, *v.Name) - + aclBody, err := cosService.GetBucketACL(ctx, *v.Name, cdcId) if err != nil { return err } aclXML, err := xml.Marshal(aclBody) - if err != nil { log.Printf("WARN: acl body marshal failed: %s", err.Error()) } else { diff --git a/tencentcloud/services/cos/resource_tc_cos_batch.go b/tencentcloud/services/cos/resource_tc_cos_batch.go index 426ddb2f70..afe8de135a 100644 --- a/tencentcloud/services/cos/resource_tc_cos_batch.go +++ b/tencentcloud/services/cos/resource_tc_cos_batch.go @@ -20,14 +20,13 @@ import ( func ResourceTencentCloudCosBatch() *schema.Resource { return &schema.Resource{ - Read: resourceTencentCloudCosBatchRead, Create: resourceTencentCloudCosBatchCreate, + Read: resourceTencentCloudCosBatchRead, Update: resourceTencentCloudCosBatchUpdate, Delete: resourceTencentCloudCosBatchDelete, Importer: &schema.ResourceImporter{ State: schema.ImportStatePassthrough, }, - Schema: map[string]*schema.Schema{ "uin": { Type: schema.TypeString, @@ -381,156 +380,22 @@ func ResourceTencentCloudCosBatch() *schema.Resource { } } -func resourceTencentCloudCosBatchRead(d *schema.ResourceData, meta interface{}) error { - defer tccommon.LogElapsed("resource.tencentcloud_cos_batch.read")() - defer tccommon.InconsistentCheck(d, meta)() - - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) - idSplit := strings.Split(d.Id(), tccommon.FILED_SP) - if len(idSplit) != 3 { - return fmt.Errorf("id is broken,%s", d.Id()) - } - uin := idSplit[0] - appid, _ := strconv.Atoi(idSplit[1]) - jobId := idSplit[2] - headers := &cos.BatchRequestHeaders{ - XCosAppid: appid, - } - - result, response, err := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCosBatchClient(uin).Batch.DescribeJob(ctx, jobId, headers) - responseBody, _ := json.Marshal(response.Body) - if err != nil { - log.Printf("[DEBUG]%s api[DescribeJob] success, request body [%s], response body [%s], err: [%s]\n", logId, jobId, responseBody, err.Error()) - return err - } - if result == nil || result.Job == nil { - return fmt.Errorf("DescribeJob response is nil!") - } - confirmationRequired, err := strconv.ParseBool(result.Job.ConfirmationRequired) - if err != nil { - return err - } - _ = d.Set("uin", uin) - _ = d.Set("appid", appid) - _ = d.Set("job_id", jobId) - _ = d.Set("confirmation_required", confirmationRequired) - _ = d.Set("description", result.Job.Description) - _ = d.Set("priority", result.Job.Priority) - _ = d.Set("role_arn", result.Job.RoleArn) - manifestResult := make(map[string]interface{}) - locationResult := make(map[string]interface{}) - specResult := make(map[string]interface{}) - manifest := result.Job.Manifest - location := manifest.Location - spec := manifest.Spec - locationResult["etag"] = location.ETag - locationResult["object_arn"] = location.ObjectArn - locationResult["object_version_id"] = location.ObjectVersionId - manifestResult["location"] = []interface{}{locationResult} - specResult["fields"] = spec.Fields - specResult["format"] = spec.Format - manifestResult["spec"] = []interface{}{specResult} - _ = d.Set("manifest", []interface{}{manifestResult}) - - operationResult := make(map[string]interface{}) - if result.Job.Operation.PutObjectCopy != nil { - putObjectCopyResult := make(map[string]interface{}) - putObjectCopy := result.Job.Operation.PutObjectCopy - putObjectCopyResult["access_control_directive"] = putObjectCopy.AccessControlDirective - accessControlGrants := putObjectCopy.AccessControlGrants - if accessControlGrants != nil { - accessControlGrantsResult := make(map[string]interface{}) - accessControlGrantsResult["display_name"] = accessControlGrants.COSGrants.Grantee.DisplayName - accessControlGrantsResult["identifier"] = accessControlGrants.COSGrants.Grantee.Identifier - accessControlGrantsResult["type_identifier"] = accessControlGrants.COSGrants.Grantee.TypeIdentifier - accessControlGrantsResult["permission"] = accessControlGrants.COSGrants.Permission - putObjectCopyResult["access_control_grants"] = []interface{}{accessControlGrantsResult} - - } - - putObjectCopyResult["canned_access_control_list"] = putObjectCopy.CannedAccessControlList - putObjectCopyResult["prefix_replace"] = putObjectCopy.PrefixReplace - putObjectCopyResult["resources_prefix"] = putObjectCopy.ResourcesPrefix - putObjectCopyResult["target_key_prefix"] = putObjectCopy.TargetKeyPrefix - putObjectCopyResult["modified_since_constraint"] = putObjectCopy.ModifiedSinceConstraint - putObjectCopyResult["unmodified_since_constraint"] = putObjectCopy.UnModifiedSinceConstraint - putObjectCopyResult["metadata_directive"] = putObjectCopy.MetadataDirective - - newObjectMetadata := putObjectCopy.NewObjectMetadata - if newObjectMetadata != nil { - newObjectMetadataResult := make(map[string]interface{}) - newObjectMetadataResult["cache_control"] = newObjectMetadata.CacheControl - newObjectMetadataResult["content_disposition"] = newObjectMetadata.ContentDisposition - newObjectMetadataResult["content_encoding"] = newObjectMetadata.ContentEncoding - newObjectMetadataResult["content_type"] = newObjectMetadata.ContentType - newObjectMetadataResult["http_expires_date"] = newObjectMetadata.HttpExpiresDate - newObjectMetadataResult["sse_algorithm"] = newObjectMetadata.SSEAlgorithm - userMetadataResult := make([]interface{}, 0) - userMetadata := newObjectMetadata.UserMetadata - for _, item := range userMetadata { - userMetadataResult = append(userMetadataResult, map[string]interface{}{ - "key": item.Key, - "value": item.Value, - }) - } - newObjectMetadataResult["user_metadata"] = userMetadataResult - putObjectCopyResult["new_object_metadata"] = []interface{}{newObjectMetadataResult} - } - - putObjectCopyResult["tagging_directive"] = putObjectCopy.TaggingDirective - if putObjectCopy.NewObjectTagging != nil { - cosTagResult := make([]interface{}, 0) - for _, item := range putObjectCopy.NewObjectTagging.COSTag { - cosTagResult = append(cosTagResult, map[string]interface{}{ - "key": item.Key, - "value": item.Value, - }) - } - putObjectCopyResult["new_object_tagging"] = cosTagResult - } - - putObjectCopyResult["storage_class"] = putObjectCopy.StorageClass - putObjectCopyResult["target_resource"] = putObjectCopy.TargetResource - - operationResult["cos_put_object_copy"] = []interface{}{putObjectCopyResult} - } - if result.Job.Operation.RestoreObject != nil { - restoreObjectResult := make(map[string]interface{}) - restoreObject := result.Job.Operation.RestoreObject - restoreObjectResult["expiration_in_days"] = restoreObject.ExpirationInDays - restoreObjectResult["job_tier"] = restoreObject.JobTier - operationResult["cos_initiate_restore_object"] = []interface{}{restoreObjectResult} - } - - _ = d.Set("operation", []interface{}{operationResult}) - if result.Job.Report != nil { - report := result.Job.Report - reportResult := make(map[string]interface{}) - reportResult["bucket"] = report.Bucket - reportResult["enabled"] = report.Enabled - reportResult["format"] = report.Format - reportResult["prefix"] = report.Prefix - reportResult["report_scope"] = report.ReportScope - _ = d.Set("report", []interface{}{reportResult}) - } - - _ = d.Set("status", result.Job.Status) - return nil -} - func resourceTencentCloudCosBatchCreate(d *schema.ResourceData, meta interface{}) error { defer tccommon.LogElapsed("resource.tencentcloud_cos_batch.create")() defer tccommon.InconsistentCheck(d, meta)() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + ) + uin := d.Get("uin").(string) opt := &cos.BatchCreateJobOptions{ ClientRequestToken: uuid.New().String(), Priority: d.Get("priority").(int), RoleArn: d.Get("role_arn").(string), } + if v, ok := d.GetOk("confirmation_required"); ok && v.(bool) { opt.ConfirmationRequired = "true" } else { @@ -549,21 +414,23 @@ func resourceTencentCloudCosBatchCreate(d *schema.ResourceData, meta interface{} ETag: locationMap["etag"].(string), ObjectArn: locationMap["object_arn"].(string), } + if v, ok := locationMap["object_version_id"]; ok { location.ObjectVersionId = v.(string) } + batchJobManifest.Location = location - spec := &cos.BatchJobManifestSpec{ - Format: specMap["format"].(string), - } + spec := &cos.BatchJobManifestSpec{Format: specMap["format"].(string)} batchJobManifest.Spec = spec if v, ok := specMap["fields"]; ok { fields := make([]string, 0) for _, item := range v.([]interface{}) { fields = append(fields, item.(string)) } + spec.Fields = fields } + opt.Manifest = batchJobManifest } @@ -572,10 +439,10 @@ func resourceTencentCloudCosBatchCreate(d *schema.ResourceData, meta interface{} if v, ok := operationMap["cos_put_object_copy"]; ok { cosPutObjectCopy := v.([]interface{})[0].(map[string]interface{}) putObjectCopy := &cos.BatchJobOperationCopy{} - if v, ok := cosPutObjectCopy["access_control_directive"]; ok { putObjectCopy.AccessControlDirective = v.(string) } + if v, ok := cosPutObjectCopy["access_control_grants"]; ok && len(v.([]interface{})) > 0 { accessControlGrantMap := v.([]interface{})[0].(map[string]interface{}) grantee := &cos.BatchGrantee{} @@ -583,38 +450,47 @@ func resourceTencentCloudCosBatchCreate(d *schema.ResourceData, meta interface{} if v, ok := accessControlGrantMap["display_name"]; ok { grantee.DisplayName = v.(string) } + if v, ok := accessControlGrantMap["identifier"]; ok { grantee.Identifier = v.(string) } + if v, ok := accessControlGrantMap["type_identifier"]; ok { grantee.TypeIdentifier = v.(string) } + grant.Grantee = grantee if v, ok := accessControlGrantMap["permission"]; ok { grant.Permission = v.(string) } - putObjectCopy.AccessControlGrants = &cos.BatchAccessControlGrants{ - COSGrants: grant, - } + + putObjectCopy.AccessControlGrants = &cos.BatchAccessControlGrants{COSGrants: grant} } + if v, ok := cosPutObjectCopy["canned_access_control_list"]; ok { putObjectCopy.CannedAccessControlList = v.(string) } + if v, ok := cosPutObjectCopy["prefix_replace"]; ok { putObjectCopy.PrefixReplace = v.(bool) } + if v, ok := cosPutObjectCopy["resources_prefix"]; ok { putObjectCopy.ResourcesPrefix = v.(string) } + if v, ok := cosPutObjectCopy["target_key_prefix"]; ok { putObjectCopy.TargetKeyPrefix = v.(string) } + if v, ok := cosPutObjectCopy["metadata_directive"]; ok { putObjectCopy.MetadataDirective = v.(string) } + if v, ok := cosPutObjectCopy["modified_since_constraint"]; ok { putObjectCopy.ModifiedSinceConstraint = int64(v.(int)) } + if v, ok := cosPutObjectCopy["unmodified_since_constraint"]; ok { putObjectCopy.UnModifiedSinceConstraint = int64(v.(int)) } @@ -625,21 +501,27 @@ func resourceTencentCloudCosBatchCreate(d *schema.ResourceData, meta interface{} if v, ok := newObjectMetadataMap["cache_control"]; ok { newObjectMetadata.CacheControl = v.(string) } + if v, ok := newObjectMetadataMap["content_disposition"]; ok { newObjectMetadata.ContentDisposition = v.(string) } + if v, ok := newObjectMetadataMap["content_encoding"]; ok { newObjectMetadata.ContentEncoding = v.(string) } + if v, ok := newObjectMetadataMap["content_type"]; ok { newObjectMetadata.ContentType = v.(string) } + if v, ok := newObjectMetadataMap["http_expires_date"]; ok { newObjectMetadata.HttpExpiresDate = v.(string) } + if v, ok := newObjectMetadataMap["sse_algorithm"]; ok { newObjectMetadata.SSEAlgorithm = v.(string) } + if v, ok := newObjectMetadataMap["user_metadata"]; ok { newObjectMetadata.UserMetadata = make([]cos.BatchMetadata, 0) for _, userMetadataItem := range v.([]interface{}) { @@ -648,15 +530,18 @@ func resourceTencentCloudCosBatchCreate(d *schema.ResourceData, meta interface{} Key: userMetadataItemMap["key"].(string), Value: userMetadataItemMap["value"].(string), } + newObjectMetadata.UserMetadata = append(newObjectMetadata.UserMetadata, batchMetadata) } } + putObjectCopy.NewObjectMetadata = newObjectMetadata } if v, ok := cosPutObjectCopy["tagging_directive"]; ok { putObjectCopy.TaggingDirective = v.(string) } + if v, ok := cosPutObjectCopy["new_object_tagging"]; ok { newObjectTaggings := v.([]interface{}) cosTags := make([]cos.BatchCOSTag, 0) @@ -667,17 +552,19 @@ func resourceTencentCloudCosBatchCreate(d *schema.ResourceData, meta interface{} Value: tag["value"].(string), }) } + putObjectCopy.NewObjectTagging = &cos.BatchNewObjectTagging{COSTag: cosTags} } + if v, ok := cosPutObjectCopy["storage_class"]; ok { putObjectCopy.StorageClass = v.(string) } + if v, ok := cosPutObjectCopy["target_resource"]; ok { putObjectCopy.TargetResource = v.(string) } operation.PutObjectCopy = putObjectCopy - } if v, ok := operationMap["cos_initiate_restore_object"]; ok && len(v.([]interface{})) > 0 { @@ -686,11 +573,14 @@ func resourceTencentCloudCosBatchCreate(d *schema.ResourceData, meta interface{} if v, ok := cosInitiateRestoreObject["expiration_in_days"]; ok { restoreObject.ExpirationInDays = v.(int) } + if v, ok := cosInitiateRestoreObject["job_tier"]; ok { restoreObject.JobTier = v.(string) } + operation.RestoreObject = restoreObject } + opt.Operation = operation } @@ -699,24 +589,28 @@ func resourceTencentCloudCosBatchCreate(d *schema.ResourceData, meta interface{} if v, ok := reportMap["bucket"]; ok { batchJobReport.Bucket = v.(string) } + if v, ok := reportMap["enabled"]; ok { batchJobReport.Enabled = v.(string) } + if v, ok := reportMap["format"]; ok { batchJobReport.Format = v.(string) } + if v, ok := reportMap["prefix"]; ok { batchJobReport.Prefix = v.(string) } + if v, ok := reportMap["report_scope"]; ok { batchJobReport.ReportScope = v.(string) } + opt.Report = batchJobReport } + appid := d.Get("appid").(int) - headers := &cos.BatchRequestHeaders{ - XCosAppid: appid, - } + headers := &cos.BatchRequestHeaders{XCosAppid: appid} var batchCreateJobResult *cos.BatchCreateJobResult err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { req, _ := json.Marshal(opt) @@ -730,10 +624,12 @@ func resourceTencentCloudCosBatchCreate(d *schema.ResourceData, meta interface{} batchCreateJobResult = result return nil }) + if err != nil { log.Printf("[CRITAL]%s create job failed, reason:%+v", logId, err) return err } + if v, ok := d.GetOk("status"); ok { opt := &cos.BatchUpdateStatusOptions{ JobId: batchCreateJobResult.JobId, @@ -747,26 +643,172 @@ func resourceTencentCloudCosBatchCreate(d *schema.ResourceData, meta interface{} return err } } - d.SetId(uin + tccommon.FILED_SP + strconv.Itoa(appid) + tccommon.FILED_SP + batchCreateJobResult.JobId) + + d.SetId(strings.Join([]string{uin, strconv.Itoa(appid), batchCreateJobResult.JobId}, tccommon.FILED_SP)) return resourceTencentCloudCosBatchRead(d, meta) } +func resourceTencentCloudCosBatchRead(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_cos_batch.read")() + defer tccommon.InconsistentCheck(d, meta)() + + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + ) + + idSplit := strings.Split(d.Id(), tccommon.FILED_SP) + if len(idSplit) != 3 { + return fmt.Errorf("id is broken,%s", d.Id()) + } + + uin := idSplit[0] + appid, _ := strconv.Atoi(idSplit[1]) + jobId := idSplit[2] + headers := &cos.BatchRequestHeaders{XCosAppid: appid} + result, response, err := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCosBatchClient(uin).Batch.DescribeJob(ctx, jobId, headers) + responseBody, _ := json.Marshal(response.Body) + if err != nil { + log.Printf("[DEBUG]%s api[DescribeJob] success, request body [%s], response body [%s], err: [%s]\n", logId, jobId, responseBody, err.Error()) + return err + } + + if result == nil || result.Job == nil { + return fmt.Errorf("DescribeJob response is nil!") + } + + confirmationRequired, err := strconv.ParseBool(result.Job.ConfirmationRequired) + if err != nil { + return err + } + + _ = d.Set("uin", uin) + _ = d.Set("appid", appid) + _ = d.Set("job_id", jobId) + _ = d.Set("confirmation_required", confirmationRequired) + _ = d.Set("description", result.Job.Description) + _ = d.Set("priority", result.Job.Priority) + _ = d.Set("role_arn", result.Job.RoleArn) + manifestResult := make(map[string]interface{}) + locationResult := make(map[string]interface{}) + specResult := make(map[string]interface{}) + manifest := result.Job.Manifest + location := manifest.Location + spec := manifest.Spec + locationResult["etag"] = location.ETag + locationResult["object_arn"] = location.ObjectArn + locationResult["object_version_id"] = location.ObjectVersionId + manifestResult["location"] = []interface{}{locationResult} + specResult["fields"] = spec.Fields + specResult["format"] = spec.Format + manifestResult["spec"] = []interface{}{specResult} + _ = d.Set("manifest", []interface{}{manifestResult}) + + operationResult := make(map[string]interface{}) + if result.Job.Operation.PutObjectCopy != nil { + putObjectCopyResult := make(map[string]interface{}) + putObjectCopy := result.Job.Operation.PutObjectCopy + putObjectCopyResult["access_control_directive"] = putObjectCopy.AccessControlDirective + accessControlGrants := putObjectCopy.AccessControlGrants + if accessControlGrants != nil { + accessControlGrantsResult := make(map[string]interface{}) + accessControlGrantsResult["display_name"] = accessControlGrants.COSGrants.Grantee.DisplayName + accessControlGrantsResult["identifier"] = accessControlGrants.COSGrants.Grantee.Identifier + accessControlGrantsResult["type_identifier"] = accessControlGrants.COSGrants.Grantee.TypeIdentifier + accessControlGrantsResult["permission"] = accessControlGrants.COSGrants.Permission + putObjectCopyResult["access_control_grants"] = []interface{}{accessControlGrantsResult} + } + + putObjectCopyResult["canned_access_control_list"] = putObjectCopy.CannedAccessControlList + putObjectCopyResult["prefix_replace"] = putObjectCopy.PrefixReplace + putObjectCopyResult["resources_prefix"] = putObjectCopy.ResourcesPrefix + putObjectCopyResult["target_key_prefix"] = putObjectCopy.TargetKeyPrefix + putObjectCopyResult["modified_since_constraint"] = putObjectCopy.ModifiedSinceConstraint + putObjectCopyResult["unmodified_since_constraint"] = putObjectCopy.UnModifiedSinceConstraint + putObjectCopyResult["metadata_directive"] = putObjectCopy.MetadataDirective + + newObjectMetadata := putObjectCopy.NewObjectMetadata + if newObjectMetadata != nil { + newObjectMetadataResult := make(map[string]interface{}) + newObjectMetadataResult["cache_control"] = newObjectMetadata.CacheControl + newObjectMetadataResult["content_disposition"] = newObjectMetadata.ContentDisposition + newObjectMetadataResult["content_encoding"] = newObjectMetadata.ContentEncoding + newObjectMetadataResult["content_type"] = newObjectMetadata.ContentType + newObjectMetadataResult["http_expires_date"] = newObjectMetadata.HttpExpiresDate + newObjectMetadataResult["sse_algorithm"] = newObjectMetadata.SSEAlgorithm + userMetadataResult := make([]interface{}, 0) + userMetadata := newObjectMetadata.UserMetadata + for _, item := range userMetadata { + userMetadataResult = append(userMetadataResult, map[string]interface{}{ + "key": item.Key, + "value": item.Value, + }) + } + + newObjectMetadataResult["user_metadata"] = userMetadataResult + putObjectCopyResult["new_object_metadata"] = []interface{}{newObjectMetadataResult} + } + + putObjectCopyResult["tagging_directive"] = putObjectCopy.TaggingDirective + if putObjectCopy.NewObjectTagging != nil { + cosTagResult := make([]interface{}, 0) + for _, item := range putObjectCopy.NewObjectTagging.COSTag { + cosTagResult = append(cosTagResult, map[string]interface{}{ + "key": item.Key, + "value": item.Value, + }) + } + + putObjectCopyResult["new_object_tagging"] = cosTagResult + } + + putObjectCopyResult["storage_class"] = putObjectCopy.StorageClass + putObjectCopyResult["target_resource"] = putObjectCopy.TargetResource + operationResult["cos_put_object_copy"] = []interface{}{putObjectCopyResult} + } + + if result.Job.Operation.RestoreObject != nil { + restoreObjectResult := make(map[string]interface{}) + restoreObject := result.Job.Operation.RestoreObject + restoreObjectResult["expiration_in_days"] = restoreObject.ExpirationInDays + restoreObjectResult["job_tier"] = restoreObject.JobTier + operationResult["cos_initiate_restore_object"] = []interface{}{restoreObjectResult} + } + + _ = d.Set("operation", []interface{}{operationResult}) + if result.Job.Report != nil { + report := result.Job.Report + reportResult := make(map[string]interface{}) + reportResult["bucket"] = report.Bucket + reportResult["enabled"] = report.Enabled + reportResult["format"] = report.Format + reportResult["prefix"] = report.Prefix + reportResult["report_scope"] = report.ReportScope + _ = d.Set("report", []interface{}{reportResult}) + } + + _ = d.Set("status", result.Job.Status) + return nil +} + func resourceTencentCloudCosBatchUpdate(d *schema.ResourceData, meta interface{}) error { defer tccommon.LogElapsed("resource.tencentcloud_cos_batch.update")() defer tccommon.InconsistentCheck(d, meta)() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + ) + idSplit := strings.Split(d.Id(), tccommon.FILED_SP) if len(idSplit) != 3 { return fmt.Errorf("id is broken,%s", d.Id()) } + uin := idSplit[0] appid, _ := strconv.Atoi(idSplit[1]) jobId := idSplit[2] - headers := &cos.BatchRequestHeaders{ - XCosAppid: appid, - } + headers := &cos.BatchRequestHeaders{XCosAppid: appid} if d.HasChange("priority") { opt := &cos.BatchUpdatePriorityOptions{ JobId: jobId, @@ -780,6 +822,7 @@ func resourceTencentCloudCosBatchUpdate(d *schema.ResourceData, meta interface{} return err } } + if d.HasChange("status") { opt := &cos.BatchUpdateStatusOptions{ JobId: jobId, @@ -793,18 +836,24 @@ func resourceTencentCloudCosBatchUpdate(d *schema.ResourceData, meta interface{} return err } } + return resourceTencentCloudCosBatchRead(d, meta) } func resourceTencentCloudCosBatchDelete(d *schema.ResourceData, meta interface{}) error { defer tccommon.LogElapsed("resource.tencentcloud_cos_batch.delete")() defer tccommon.InconsistentCheck(d, meta)() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + ) + idSplit := strings.Split(d.Id(), tccommon.FILED_SP) if len(idSplit) != 3 { return fmt.Errorf("id is broken,%s", d.Id()) } + uin := idSplit[0] appid, _ := strconv.Atoi(idSplit[1]) jobId := idSplit[2] @@ -817,5 +866,6 @@ func resourceTencentCloudCosBatchDelete(d *schema.ResourceData, meta interface{} log.Printf("[DEBUG]%s api[DeleteJob] success, response body [%s], err: [%s]\n", logId, responseBody, err.Error()) return err } + return nil } diff --git a/tencentcloud/services/cos/resource_tc_cos_bucket.go b/tencentcloud/services/cos/resource_tc_cos_bucket.go index 47c7fa4c22..193f61b3d9 100644 --- a/tencentcloud/services/cos/resource_tc_cos_bucket.go +++ b/tencentcloud/services/cos/resource_tc_cos_bucket.go @@ -525,6 +525,12 @@ func ResourceTencentCloudCosBucket() *schema.Resource { Computed: true, Description: "Specify the access limit for converting standard layer data into low-frequency layer data in the configuration. The default value is once, which can be used in combination with the number of days to achieve the conversion effect. For example, if the parameter is set to 1 and the number of access days is 30, it means that objects with less than one visit in 30 consecutive days will be reduced from the standard layer to the low frequency layer.", }, + "cdc_id": { + Type: schema.TypeString, + Optional: true, + ForceNew: true, + Description: "CDC cluster ID.", + }, //computed "cos_bucket_url": { Type: schema.TypeString, @@ -538,16 +544,19 @@ func ResourceTencentCloudCosBucket() *schema.Resource { func resourceTencentCloudCosBucketCreate(d *schema.ResourceData, meta interface{}) error { defer tccommon.LogElapsed("resource.tencentcloud_cos_bucket.create")() - var err error - - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + cosService = CosService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + err error + ) bucket := d.Get("bucket").(string) acl := d.Get("acl").(string) role, roleOk := d.GetOk("replica_role") rule, ruleOk := d.GetOk("replica_rules") versioning := d.Get("versioning_enable").(bool) + cdcId := d.Get("cdc_id").(string) if !versioning { if roleOk || role.(string) != "" { @@ -557,23 +566,22 @@ func resourceTencentCloudCosBucketCreate(d *schema.ResourceData, meta interface{ } } - cosService := CosService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} - useCosService, createOptions := getBucketPutOptions(d) - if useCosService { - err = cosService.TencentCosPutBucket(ctx, bucket, createOptions) + // tencent + err = cosService.TencentCosPutBucket(ctx, bucket, createOptions, cdcId) } else { - err = cosService.PutBucket(ctx, bucket, acl) + // s3 + err = cosService.PutBucket(ctx, bucket, acl, cdcId) } + if err != nil { return err } d.SetId(bucket) - if tags := helper.GetTags(d, "tags"); len(tags) > 0 { - if err := cosService.SetBucketTags(ctx, bucket, tags); err != nil { + if err := cosService.SetBucketTags(ctx, bucket, tags, cdcId); err != nil { return err } } @@ -585,13 +593,15 @@ func resourceTencentCloudCosBucketRead(d *schema.ResourceData, meta interface{}) defer tccommon.LogElapsed("resource.tencentcloud_cos_bucket.read")() defer tccommon.InconsistentCheck(d, meta)() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + cosService = CosService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + bucket = d.Id() + ) - bucket := d.Id() - cosService := CosService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} - - code, header, err := cosService.TencentcloudHeadBucket(ctx, bucket) + cdcId := d.Get("cdc_id").(string) + code, header, err := cosService.TencentcloudHeadBucket(ctx, bucket, cdcId) if err != nil { if code == 404 { log.Printf("[WARN]%s bucket (%s) not found, error code (404)", logId, bucket) @@ -613,12 +623,8 @@ func resourceTencentCloudCosBucketRead(d *schema.ResourceData, meta interface{}) _ = d.Set("bucket", d.Id()) } - if err != nil { - return err - } - // acl - aclResult, err := cosService.GetBucketACL(ctx, bucket) + aclResult, err := cosService.GetBucketACL(ctx, bucket, cdcId) if err != nil { return err @@ -636,15 +642,16 @@ func resourceTencentCloudCosBucketRead(d *schema.ResourceData, meta interface{}) _ = d.Set("acl", acl) // read the cors - corsRules, err := cosService.GetBucketCors(ctx, bucket) + 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) } - originPullRules, err := cosService.GetBucketPullOrigin(ctx, bucket) + originPullRules, err := cosService.GetBucketPullOrigin(ctx, bucket, cdcId) if err != nil { return err } @@ -653,65 +660,72 @@ func resourceTencentCloudCosBucketRead(d *schema.ResourceData, meta interface{}) return fmt.Errorf("setting origin_pull_rules error: %v", err) } - originDomainRules, err := cosService.GetBucketOriginDomain(ctx, bucket) + originDomainRules, err := cosService.GetBucketOriginDomain(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) } // read the lifecycle - lifecycleRules, err := cosService.GetBucketLifecycle(ctx, bucket) + 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) + website, err := cosService.GetBucketWebsite(ctx, bucket, cdcId) if err != nil { return err } + if len(website) > 0 { // {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, err := cosService.GetBucketEncryption(ctx, bucket) + encryption, 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) } // read the versioning - versioning, err := cosService.GetBucketVersioning(ctx, bucket) + versioning, err := cosService.GetBucketVersioning(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) } // read the acceleration - acceleration, err := cosService.GetBucketAccleration(ctx, bucket) + 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) } - replicaResult, err := cosService.GetBucketReplication(ctx, bucket) + replicaResult, err := cosService.GetBucketReplication(ctx, bucket, cdcId) if err != nil { return err } @@ -724,7 +738,7 @@ func resourceTencentCloudCosBucketRead(d *schema.ResourceData, meta interface{}) } //read the log - logEnable, logTargetBucket, logPrefix, err := cosService.GetBucketLogStatus(ctx, bucket) + logEnable, logTargetBucket, logPrefix, err := cosService.GetBucketLogStatus(ctx, bucket, cdcId) if err != nil { if e, ok := err.(*errors.TencentCloudSDKError); ok { if e.GetCode() != "UnSupportedLoggingRegion" { @@ -738,19 +752,21 @@ func resourceTencentCloudCosBucketRead(d *schema.ResourceData, meta interface{}) } // read the tags - tags, err := cosService.GetBucketTags(ctx, bucket) + tags, err := cosService.GetBucketTags(ctx, bucket, cdcId) if err != nil { return fmt.Errorf("get tags failed: %v", err) } + if len(tags) > 0 { _ = d.Set("tags", tags) } //read intelligent tiering - result, err := cosService.BucketGetIntelligentTiering(ctx, bucket) + result, err := cosService.BucketGetIntelligentTiering(ctx, bucket, cdcId) if err != nil { return fmt.Errorf("get intelligent tiering failed: %v", err) } + if result != nil { if result.Status == "Enabled" { _ = d.Set("enable_intelligent_tiering", true) @@ -758,34 +774,39 @@ func resourceTencentCloudCosBucketRead(d *schema.ResourceData, meta interface{}) _ = d.Set("enable_intelligent_tiering", false) } } + if result != nil && result.Transition != nil { _ = d.Set("intelligent_tiering_days", result.Transition.Days) _ = d.Set("intelligent_tiering_request_frequent", result.Transition.RequestFrequent) } + return nil } func resourceTencentCloudCosBucketUpdate(d *schema.ResourceData, meta interface{}) error { defer tccommon.LogElapsed("resource.tencentcloud_cos_bucket.update")() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) - - cosService := CosService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + cosService = CosService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + ) d.Partial(true) - + cdcId := d.Get("cdc_id").(string) if d.HasChange("enable_intelligent_tiering") || d.HasChange("intelligent_tiering_days") || d.HasChange("intelligent_tiering_request_frequent") { old, new := d.GetChange("enable_intelligent_tiering") if old.(bool) && !new.(bool) { return fmt.Errorf("enable_intelligent_tiering, intelligent_tiering_days and intelligent_tiering_request_frequent not support change!") } + var transition cos.BucketIntelligentTieringTransition if v, ok := d.GetOk("intelligent_tiering_days"); ok { transition.Days = v.(int) } else { transition.Days = 30 } + if v, ok := d.GetOk("intelligent_tiering_request_frequent"); ok { transition.RequestFrequent = v.(int) } else { @@ -797,7 +818,8 @@ func resourceTencentCloudCosBucketUpdate(d *schema.ResourceData, meta interface{ Status: "Enabled", Transition: &transition, } - err := cosService.BucketPutIntelligentTiering(ctx, d.Id(), opt) + + err := cosService.BucketPutIntelligentTiering(ctx, d.Id(), opt, cdcId) if err != nil { return err } @@ -806,7 +828,7 @@ func resourceTencentCloudCosBucketUpdate(d *schema.ResourceData, meta interface{ if d.HasChange("acl") { bucket := d.Get("bucket").(string) - err := waitAclEnable(ctx, meta, bucket) + err := waitAclEnable(ctx, meta, bucket, cdcId) if err != nil { return err } @@ -820,7 +842,7 @@ func resourceTencentCloudCosBucketUpdate(d *schema.ResourceData, meta interface{ if d.HasChange("acl_body") { body := d.Get("acl_body") bucket := d.Get("bucket").(string) - err := waitAclEnable(ctx, meta, bucket) + err := waitAclEnable(ctx, meta, bucket, cdcId) if err != nil { return err } @@ -836,7 +858,6 @@ func resourceTencentCloudCosBucketUpdate(d *schema.ResourceData, meta interface{ if err != nil { return err } - } if d.HasChange("origin_pull_rules") { @@ -845,6 +866,7 @@ func resourceTencentCloudCosBucketUpdate(d *schema.ResourceData, meta interface{ if err != nil { return err } + _ = d.Set("origin_pull_rules", rules) } @@ -853,6 +875,7 @@ func resourceTencentCloudCosBucketUpdate(d *schema.ResourceData, meta interface{ if err := resourceTencentCloudCosBucketOriginDomainUpdate(ctx, cosService, d); err != nil { return err } + _ = d.Set("origin_domain_rules", rules) } @@ -861,7 +884,6 @@ func resourceTencentCloudCosBucketUpdate(d *schema.ResourceData, meta interface{ if err != nil { return err } - } if d.HasChange("website") { @@ -869,7 +891,6 @@ func resourceTencentCloudCosBucketUpdate(d *schema.ResourceData, meta interface{ if err != nil { return err } - } if d.HasChange("encryption_algorithm") { @@ -877,7 +898,6 @@ func resourceTencentCloudCosBucketUpdate(d *schema.ResourceData, meta interface{ if err != nil { return err } - } if d.HasChange("versioning_enable") { @@ -885,7 +905,6 @@ func resourceTencentCloudCosBucketUpdate(d *schema.ResourceData, meta interface{ if err != nil { return err } - } if d.HasChange("acceleration_enable") { @@ -893,12 +912,10 @@ func resourceTencentCloudCosBucketUpdate(d *schema.ResourceData, meta interface{ if err != nil { return err } - } if d.HasChange("replica_role") || d.HasChange("replica_rules") { err := resourceTencentCloudCosBucketReplicaUpdate(ctx, cosService, d) - if err != nil { return err } @@ -906,12 +923,10 @@ func resourceTencentCloudCosBucketUpdate(d *schema.ResourceData, meta interface{ if d.HasChange("tags") { bucket := d.Id() - cosService := CosService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} - if err := cosService.SetBucketTags(ctx, bucket, helper.GetTags(d, "tags")); err != nil { + if err := cosService.SetBucketTags(ctx, bucket, helper.GetTags(d, "tags"), cdcId); err != nil { return err } - } if d.HasChange("log_enable") || d.HasChange("log_target_bucket") || d.HasChange("log_prefix") { @@ -919,7 +934,6 @@ func resourceTencentCloudCosBucketUpdate(d *schema.ResourceData, meta interface{ if err != nil { return err } - } d.Partial(false) @@ -931,11 +945,11 @@ func resourceTencentCloudCosBucketUpdate(d *schema.ResourceData, meta interface{ return resourceTencentCloudCosBucketRead(d, meta) } -func waitAclEnable(ctx context.Context, meta interface{}, bucket string) error { +func waitAclEnable(ctx context.Context, meta interface{}, bucket, cdcId string) error { logId := tccommon.GetLogId(ctx) cosService := CosService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError { - aclResult, e := cosService.GetBucketACL(ctx, bucket) + aclResult, e := cosService.GetBucketACL(ctx, bucket, cdcId) if e != nil { if strings.Contains(e.Error(), "NoSuchBucket") { log.Printf("[CRITAL][retry]%s api[%s] because of bucket[%s] still on creating, need try again.\n", logId, "GetBucketACL", bucket) @@ -956,16 +970,18 @@ func waitAclEnable(ctx context.Context, meta interface{}, bucket string) error { func resourceTencentCloudCosBucketDelete(d *schema.ResourceData, meta interface{}) error { defer tccommon.LogElapsed("resource.tencentcloud_cos_bucket.delete")() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + cosService = CosService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + ) bucket := d.Id() forced := d.Get("force_clean").(bool) versioned := d.Get("versioning_enable").(bool) - cosService := CosService{ - client: meta.(tccommon.ProviderMeta).GetAPIV3Conn(), - } - err := cosService.DeleteBucket(ctx, bucket, forced, versioned) + cdcId := d.Get("cdc_id").(string) + + err := cosService.DeleteBucket(ctx, bucket, forced, versioned, cdcId) if err != nil { return err } @@ -982,11 +998,12 @@ func resourceTencentCloudCosBucketEncryptionUpdate(ctx context.Context, meta int bucket := d.Get("bucket").(string) encryption := d.Get("encryption_algorithm").(string) + cdcId := d.Get("cdc_id").(string) if encryption == "" { request := s3.DeleteBucketEncryptionInput{ Bucket: aws.String(bucket), } - response, err := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCosClient().DeleteBucketEncryption(&request) + response, err := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCosClient(cdcId).DeleteBucketEncryption(&request) if err != nil { log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, "delete bucket encryption", request.String(), err.Error()) @@ -1012,7 +1029,7 @@ func resourceTencentCloudCosBucketEncryptionUpdate(ctx context.Context, meta int rules = append(rules, rule) request.ServerSideEncryptionConfiguration.Rules = rules - response, err := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCosClient().PutBucketEncryption(&request) + response, err := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCosClient(cdcId).PutBucketEncryption(&request) if err != nil { log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, "put bucket encryption", request.String(), err.Error()) @@ -1029,6 +1046,7 @@ func resourceTencentCloudCosBucketVersioningUpdate(ctx context.Context, meta int bucket := d.Get("bucket").(string) versioning := d.Get("versioning_enable").(bool) + cdcId := d.Get("cdc_id").(string) status := "Suspended" if versioning { status = "Enabled" @@ -1039,7 +1057,7 @@ func resourceTencentCloudCosBucketVersioningUpdate(ctx context.Context, meta int Status: aws.String(status), }, } - response, err := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCosClient().PutBucketVersioning(&request) + response, err := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCosClient(cdcId).PutBucketVersioning(&request) if err != nil { log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, "put bucket encryption", request.String(), err.Error()) @@ -1056,6 +1074,7 @@ func resourceTencentCloudCosBucketAccelerationUpdate(ctx context.Context, meta i bucket := d.Get("bucket").(string) enabled := d.Get("acceleration_enable").(bool) + cdcId := d.Get("cdc_id").(string) status := "Suspended" if enabled { status = "Enabled" @@ -1064,7 +1083,7 @@ func resourceTencentCloudCosBucketAccelerationUpdate(ctx context.Context, meta i opt := &cos.BucketPutAccelerateOptions{ Status: status, } - response, err := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseTencentCosClient(bucket).Bucket.PutAccelerate(ctx, opt) + response, err := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseTencentCosClient(bucket, cdcId).Bucket.PutAccelerate(ctx, opt) if err != nil { log.Printf("[CRITAL]%s api[%s] fail, status [%s], reason[%s]\n", logId, "put bucket acceleration", opt.Status, err.Error()) @@ -1082,25 +1101,26 @@ func resourceTencentCloudCosBucketReplicaUpdate(ctx context.Context, service Cos bucket := d.Get("bucket").(string) oldRole, newRole := d.GetChange("replica_role") oldRules, newRules := d.GetChange("replica_rules") + cdcId := d.Get("cdc_id").(string) oldRuleLength := len(oldRules.([]interface{})) newRuleLength := len(newRules.([]interface{})) // check if remove if oldRole.(string) != "" && newRole.(string) == "" || oldRuleLength > 0 && newRuleLength == 0 { - result, err := service.GetBucketReplication(ctx, bucket) + result, err := service.GetBucketReplication(ctx, bucket, cdcId) if err != nil { return err } if result != nil { - err := service.DeleteBucketReplication(ctx, d.Get("bucket").(string)) + err := service.DeleteBucketReplication(ctx, d.Get("bucket").(string), cdcId) if err != nil { return err } } } else if newRole.(string) != "" || newRuleLength > 0 { role, rules, _ := getBucketReplications(d) - err := service.PutBucketReplication(ctx, d.Get("bucket").(string), role, rules) + err := service.PutBucketReplication(ctx, d.Get("bucket").(string), role, rules, cdcId) if err != nil { return err } @@ -1114,11 +1134,12 @@ func resourceTencentCloudCosBucketAclUpdate(ctx context.Context, meta interface{ bucket := d.Get("bucket").(string) acl := d.Get("acl").(string) + cdcId := d.Get("cdc_id").(string) request := s3.PutBucketAclInput{ Bucket: aws.String(bucket), ACL: aws.String(acl), } - response, err := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCosClient().PutBucketAcl(&request) + response, err := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCosClient(cdcId).PutBucketAcl(&request) if err != nil { log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, "put bucket acl", request.String(), err.Error()) @@ -1135,12 +1156,13 @@ func resourceTencentCloudCosBucketCorsUpdate(ctx context.Context, meta interface bucket := d.Get("bucket").(string) cors := d.Get("cors_rules").([]interface{}) + cdcId := d.Get("cdc_id").(string) if len(cors) == 0 { request := s3.DeleteBucketCorsInput{ Bucket: aws.String(bucket), } - response, err := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCosClient().DeleteBucketCors(&request) + response, err := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCosClient(cdcId).DeleteBucketCors(&request) if err != nil { log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, "delete bucket cors", request.String(), err.Error()) @@ -1183,7 +1205,7 @@ func resourceTencentCloudCosBucketCorsUpdate(ctx context.Context, meta interface CORSRules: rules, }, } - response, err := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCosClient().PutBucketCors(&request) + response, err := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCosClient(cdcId).PutBucketCors(&request) if err != nil { log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, "put bucket cors", request.String(), err.Error()) @@ -1200,11 +1222,12 @@ func resourceTencentCloudCosBucketLifecycleUpdate(ctx context.Context, meta inte bucket := d.Get("bucket").(string) lifecycleRules := d.Get("lifecycle_rules").([]interface{}) + cdcId := d.Get("cdc_id").(string) if len(lifecycleRules) == 0 { request := s3.DeleteBucketLifecycleInput{ Bucket: aws.String(bucket), } - response, err := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCosClient().DeleteBucketLifecycle(&request) + response, err := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCosClient(cdcId).DeleteBucketLifecycle(&request) if err != nil { log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, "delete bucket lifecycle", request.String(), err.Error()) @@ -1326,7 +1349,7 @@ func resourceTencentCloudCosBucketLifecycleUpdate(ctx context.Context, meta inte Rules: rules, }, } - response, err := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCosClient().PutBucketLifecycleConfiguration(&request) + response, err := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCosClient(cdcId).PutBucketLifecycleConfiguration(&request) if err != nil { log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, "put bucket lifecycle", request.String(), err.Error()) @@ -1344,12 +1367,13 @@ func resourceTencentCloudCosBucketWebsiteUpdate(ctx context.Context, meta interf bucket := d.Get("bucket").(string) website := d.Get("website").([]interface{}) + cdcId := d.Get("cdc_id").(string) if len(website) == 0 { request := s3.DeleteBucketWebsiteInput{ Bucket: aws.String(bucket), } - response, err := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCosClient().DeleteBucketWebsite(&request) + response, err := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCosClient(cdcId).DeleteBucketWebsite(&request) if err != nil { log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, "delete bucket website", request.String(), err.Error()) @@ -1382,7 +1406,7 @@ func resourceTencentCloudCosBucketWebsiteUpdate(ctx context.Context, meta interf }, }, } - response, err := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCosClient().PutBucketWebsite(&request) + response, err := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCosClient(cdcId).PutBucketWebsite(&request) if err != nil { log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, "put bucket website", request.String(), err.Error()) @@ -1401,6 +1425,7 @@ func resourceTencentCloudCosBucketLogStatusUpdate(ctx context.Context, meta inte bucket := d.Id() logSwitch := d.Get("log_enable").(bool) + cdcId := d.Get("cdc_id").(string) if logSwitch { if d.HasChange("log_target_bucket") || d.HasChange("log_prefix") { targetBucket := d.Get("log_target_bucket").(string) @@ -1422,7 +1447,7 @@ func resourceTencentCloudCosBucketLogStatusUpdate(ctx context.Context, meta inte }, } - resp, err := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCosClient().PutBucketLogging(request) + resp, err := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCosClient(cdcId).PutBucketLogging(request) if err != nil { log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, "cos enable log error", request.String(), err.Error()) @@ -1444,7 +1469,7 @@ func resourceTencentCloudCosBucketLogStatusUpdate(ctx context.Context, meta inte BucketLoggingStatus: &s3.BucketLoggingStatus{}, } - resp, err := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCosClient().PutBucketLogging(request) + resp, err := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCosClient(cdcId).PutBucketLogging(request) if err != nil { return fmt.Errorf("cos disable log error: %s, bucket: %s", err.Error(), bucket) } @@ -1463,6 +1488,7 @@ func resourceTencentCloudCosBucketOriginACLBodyUpdate(ctx context.Context, servi body, bodyOk := d.GetOk("acl_body") header, headerOk := d.GetOk("acl") bucket := d.Get("bucket").(string) + cdcId := d.Get("cdc_id").(string) // If ACLXML update to empty, this will pass default header to delete verbose acl info if bodyOk { aclBody = body.(string) @@ -1479,7 +1505,7 @@ func resourceTencentCloudCosBucketOriginACLBodyUpdate(ctx context.Context, servi log.Printf("[DEBUG]%s transACLBodyOrderly success, before:[\n%s\n], after:[\n%s\n]\n", logId, aclBody, aclBodyOrderly) - if err = service.TencentCosPutBucketACLBody(ctx, bucket, aclBodyOrderly, aclHeader); err != nil { + if err = service.TencentCosPutBucketACLBody(ctx, bucket, aclBodyOrderly, aclHeader, cdcId); err != nil { return err } @@ -1492,8 +1518,9 @@ func resourceTencentCloudCosBucketOriginPullUpdate(ctx context.Context, service var rules []cos.BucketOriginRule v, ok := d.GetOk("origin_pull_rules") bucket := d.Get("bucket").(string) + cdcId := d.Get("cdc_id").(string) if !ok { - if err := service.DeleteBucketPullOrigin(ctx, bucket); err != nil { + if err := service.DeleteBucketPullOrigin(ctx, bucket, cdcId); err != nil { return err } return nil @@ -1583,7 +1610,7 @@ func resourceTencentCloudCosBucketOriginPullUpdate(ctx context.Context, service rules = append(rules, *item) } - if err := service.PutBucketPullOrigin(ctx, bucket, rules); err != nil { + if err := service.PutBucketPullOrigin(ctx, bucket, rules, cdcId); err != nil { return err } @@ -1593,33 +1620,39 @@ func resourceTencentCloudCosBucketOriginPullUpdate(ctx context.Context, service func resourceTencentCloudCosBucketOriginDomainUpdate(ctx context.Context, service CosService, d *schema.ResourceData) error { v, ok := d.GetOk("origin_domain_rules") bucket := d.Get("bucket").(string) + cdcId := d.Get("cdc_id").(string) if !ok { - if err := service.DeleteBucketOriginDomain(ctx, bucket); err != nil { + if err := service.DeleteBucketOriginDomain(ctx, bucket, cdcId); err != nil { return err } + return nil } + rules := v.([]interface{}) domainRules := make([]cos.BucketDomainRule, 0) - for _, rule := range rules { dMap := rule.(map[string]interface{}) item := cos.BucketDomainRule{} if name, ok := dMap["domain"]; ok { item.Name = name.(string) } + if status, ok := dMap["status"]; ok { item.Status = status.(string) } + if domainType, ok := dMap["type"]; ok { item.Type = domainType.(string) } + domainRules = append(domainRules, item) } - if err := service.PutBucketOriginDomain(ctx, bucket, domainRules); err != nil { + if err := service.PutBucketOriginDomain(ctx, bucket, domainRules, cdcId); err != nil { return err } + return nil } @@ -1644,15 +1677,19 @@ func getBucketPutOptions(d *schema.ResourceData) (useCosService bool, options *c if v, ok := headers["grant_read"]; ok { opt.XCosGrantRead = v.(string) } + if v, ok := headers["grant_write"]; ok { opt.XCosGrantWrite = v.(string) } + if v, ok := headers["grant_read_acp"]; ok { opt.XCosGrantReadACP = v.(string) } + if v, ok := headers["grant_write_acp"]; ok { opt.XCosGrantWriteACP = v.(string) } + if v, ok := headers["grant_full_control"]; ok { opt.XCosGrantFullControl = v.(string) } diff --git a/tencentcloud/services/cos/resource_tc_cos_bucket.md b/tencentcloud/services/cos/resource_tc_cos_bucket.md index 45e3277190..d506fe94e6 100644 --- a/tencentcloud/services/cos/resource_tc_cos_bucket.md +++ b/tencentcloud/services/cos/resource_tc_cos_bucket.md @@ -11,7 +11,7 @@ locals { app_id = data.tencentcloud_user_info.info.app_id } -resource "tencentcloud_cos_bucket" "private_sbucket" { +resource "tencentcloud_cos_bucket" "example" { bucket = "private-bucket-${local.app_id}" acl = "private" } @@ -26,10 +26,10 @@ locals { app_id = data.tencentcloud_user_info.info.app_id } -resource "tencentcloud_cos_bucket" "multi_zone_bucket" { - bucket = "multi-zone-bucket-${local.app_id}" - acl = "private" - multi_az = true +resource "tencentcloud_cos_bucket" "example" { + bucket = "multi-zone-bucket-${local.app_id}" + acl = "private" + multi_az = true versioning_enable = true force_clean = true } @@ -44,7 +44,7 @@ locals { app_id = data.tencentcloud_user_info.info.app_id } -resource "tencentcloud_cos_bucket" "bucket_with_acl" { +resource "tencentcloud_cos_bucket" "example" { bucket = "bucketwith-acl-${local.app_id}" # NOTE: Specify the acl_body by the priority sequence of permission and user type with the following sequence: `CanonicalUser with READ`, `CanonicalUser with WRITE`, `CanonicalUser with FULL_CONTROL`, `CanonicalUser with WRITE_ACP`, `CanonicalUser with READ_ACP`, then specify the `Group` of permissions same as `CanonicalUser`. acl_body = < 0 { encryptionMap := v.([]interface{})[0].(map[string]interface{}) if v, ok := encryptionMap["sse_cos"]; ok { destination.Encryption = &cos.BucketInventoryEncryption{ SSECOS: v.(string), } - } } } @@ -258,19 +276,22 @@ func resourceTencentCloudCosBucketInventoryCreate(d *schema.ResourceData, meta i err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { req, _ := json.Marshal(opt) - resp, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseTencentCosClient(bucket).Bucket.PutInventory(ctx, name, opt) + resp, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseTencentCosClient(bucket, cdcId).Bucket.PutInventory(ctx, name, opt) responseBody, _ := json.Marshal(resp.Body) if e != nil { log.Printf("[DEBUG]%s api[PutInventory] success, request body [%s], response body [%s], err: [%s]\n", logId, req, responseBody, e.Error()) return tccommon.RetryError(e) } + return nil }) + if err != nil { log.Printf("[CRITAL]%s create cos bucketInventory failed, reason:%+v", logId, err) return err } - d.SetId(bucket + tccommon.FILED_SP + name) + + d.SetId(strings.Join([]string{bucket, name}, tccommon.FILED_SP)) return resourceTencentCloudCosBucketInventoryRead(d, meta) } @@ -279,20 +300,25 @@ func resourceTencentCloudCosBucketInventoryRead(d *schema.ResourceData, meta int defer tccommon.LogElapsed("resource.tencentcloud_cos_bucket_inventory.read")() defer tccommon.InconsistentCheck(d, meta)() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + ) idSplit := strings.Split(d.Id(), tccommon.FILED_SP) if len(idSplit) != 2 { return fmt.Errorf("id is broken,%s", d.Id()) } + bucket := idSplit[0] name := idSplit[1] - result, _, err := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseTencentCosClient(bucket).Bucket.GetInventory(ctx, name) + cdcId := d.Get("cdc_id").(string) + result, _, err := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseTencentCosClient(bucket, cdcId).Bucket.GetInventory(ctx, name) if err != nil { log.Printf("[CRITAL]%s get cos bucketInventory failed, reason:%+v", logId, err) return err } + _ = d.Set("bucket", bucket) _ = d.Set("name", name) _ = d.Set("is_enabled", result.IsEnabled) @@ -305,12 +331,15 @@ func resourceTencentCloudCosBucketInventoryRead(d *schema.ResourceData, meta int if result.Filter.Period.StartTime != 0 { periodMap["start_time"] = strconv.FormatInt(result.Filter.Period.StartTime, 10) } + if result.Filter.Period.EndTime != 0 { periodMap["end_time"] = strconv.FormatInt(result.Filter.Period.EndTime, 10) } + filterMap["period"] = []interface{}{periodMap} } } + _ = d.Set("filter", []interface{}{filterMap}) optionalFieldsMap := make(map[string]interface{}) if result.OptionalFields != nil { @@ -320,12 +349,14 @@ func resourceTencentCloudCosBucketInventoryRead(d *schema.ResourceData, meta int optionalFieldsMap["fields"] = fields } } + _ = d.Set("optional_fields", []interface{}{optionalFieldsMap}) scheduleMap := make(map[string]interface{}) if result.Schedule != nil { scheduleMap["frequency"] = result.Schedule.Frequency } + _ = d.Set("schedule", []interface{}{scheduleMap}) destinationMap := make(map[string]interface{}) @@ -336,12 +367,11 @@ func resourceTencentCloudCosBucketInventoryRead(d *schema.ResourceData, meta int destinationMap["format"] = result.Destination.Format if result.Destination.Encryption != nil && result.Destination.Encryption.SSECOS != "" { encryptionMap := make(map[string]interface{}) - encryptionMap["sse_cos"] = result.Destination.Encryption.SSECOS destinationMap["encryption"] = []interface{}{encryptionMap} - } } + _ = d.Set("destination", []interface{}{destinationMap}) return nil @@ -350,20 +380,26 @@ func resourceTencentCloudCosBucketInventoryRead(d *schema.ResourceData, meta int func resourceTencentCloudCosBucketInventoryUpdate(d *schema.ResourceData, meta interface{}) error { defer tccommon.LogElapsed("resource.tencentcloud_cos_bucket_inventory.update")() defer tccommon.InconsistentCheck(d, meta)() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + ) + idSplit := strings.Split(d.Id(), tccommon.FILED_SP) if len(idSplit) != 2 { return fmt.Errorf("id is broken,%s", d.Id()) } + bucket := idSplit[0] name := idSplit[1] if !d.HasChange("is_enabled") && !d.HasChange("included_object_versions") && !d.HasChange("filter") && !d.HasChange("optional_fields") && !d.HasChange("schedule") && !d.HasChange("destination") { return resourceTencentCloudCosBucketInventoryRead(d, meta) } + isEnabled := d.Get("is_enabled").(string) includedObjectVersions := d.Get("included_object_versions").(string) - + cdcId := d.Get("cdc_id").(string) var filter cos.BucketInventoryFilter if v, ok := d.GetOk("filter"); ok && len(v.([]interface{})) != 0 { var period cos.BucketInventoryFilterPeriod @@ -375,21 +411,27 @@ func resourceTencentCloudCosBucketInventoryUpdate(d *schema.ResourceData, meta i if err != nil { return err } + period.StartTime = vStr } + if v, ok := periodMap["end_time"]; ok && v.(string) != "" { vStr, err := strconv.ParseInt(v.(string), 10, 64) if err != nil { return err } + period.EndTime = vStr } + filter.Period = &period } + if v, ok := filterMap["prefix"]; ok { filter.Prefix = v.(string) } } + var optionalFields cos.BucketInventoryOptionalFields if v, ok := d.GetOk("optional_fields"); ok && len(v.([]interface{})) != 0 { optionalFieldsMap := v.([]interface{})[0].(map[string]interface{}) @@ -415,22 +457,25 @@ func resourceTencentCloudCosBucketInventoryUpdate(d *schema.ResourceData, meta i if v, ok := destinationMap["bucket"]; ok { destination.Bucket = v.(string) } + if v, ok := destinationMap["account_id"]; ok { destination.AccountId = v.(string) } + if v, ok := destinationMap["prefix"]; ok { destination.Prefix = v.(string) } + if v, ok := destinationMap["format"]; ok { destination.Format = v.(string) } + if v, ok := destinationMap["encryption"]; ok && len(v.([]interface{})) > 0 { encryptionMap := v.([]interface{})[0].(map[string]interface{}) if v, ok := encryptionMap["sse_cos"]; ok { destination.Encryption = &cos.BucketInventoryEncryption{ SSECOS: v.(string), } - } } } @@ -447,14 +492,16 @@ func resourceTencentCloudCosBucketInventoryUpdate(d *schema.ResourceData, meta i err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { req, _ := json.Marshal(opt) - resp, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseTencentCosClient(bucket).Bucket.PutInventory(ctx, name, opt) + resp, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseTencentCosClient(bucket, cdcId).Bucket.PutInventory(ctx, name, opt) responseBody, _ := json.Marshal(resp.Body) if e != nil { log.Printf("[DEBUG]%s api[PutInventory] success, request body [%s], response body [%s], err: [%s]\n", logId, req, responseBody, e.Error()) return tccommon.RetryError(e) } + return nil }) + if err != nil { log.Printf("[CRITAL]%s create cos bucketInventory failed, reason:%+v", logId, err) return err @@ -467,25 +514,30 @@ func resourceTencentCloudCosBucketInventoryDelete(d *schema.ResourceData, meta i defer tccommon.LogElapsed("resource.tencentcloud_cos_bucket_inventory.delete")() defer tccommon.InconsistentCheck(d, meta)() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + ) idSplit := strings.Split(d.Id(), tccommon.FILED_SP) if len(idSplit) != 2 { return fmt.Errorf("id is broken,%s", d.Id()) } + bucket := idSplit[0] name := idSplit[1] - + cdcId := d.Get("cdc_id").(string) err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { - resp, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseTencentCosClient(bucket).Bucket.DeleteInventory(ctx, name) + resp, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseTencentCosClient(bucket, cdcId).Bucket.DeleteInventory(ctx, name) if e != nil { log.Printf("[CRITAL][retry]%s api[%s] fail, resp body [%s], reason[%s]\n", logId, "DeleteInventory ", resp.Body, e.Error()) return tccommon.RetryError(e) } + return nil }) + if err != nil { log.Printf("[CRITAL]%s delete cos bucketInventory failed, reason:%+v", logId, err) return err diff --git a/tencentcloud/services/cos/resource_tc_cos_bucket_object.go b/tencentcloud/services/cos/resource_tc_cos_bucket_object.go index 9ad80d9a0f..d78e5550cc 100644 --- a/tencentcloud/services/cos/resource_tc_cos_bucket_object.go +++ b/tencentcloud/services/cos/resource_tc_cos_bucket_object.go @@ -100,6 +100,12 @@ func ResourceTencentCloudCosBucketObject() *schema.Resource { Computed: true, Description: "The ETag generated for the object (an MD5 sum of the object content).", }, + "cdc_id": { + Type: schema.TypeString, + Optional: true, + ForceNew: true, + Description: "CDC cluster ID.", + }, }, } } @@ -107,21 +113,28 @@ func ResourceTencentCloudCosBucketObject() *schema.Resource { func resourceTencentCloudCosBucketObjectCreate(d *schema.ResourceData, meta interface{}) error { defer tccommon.LogElapsed("resource.tencentcloud_cos_bucket_object.create")() - logId := tccommon.GetLogId(tccommon.ContextNil) + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + service = CosService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + body io.ReadSeeker + ) bucket := d.Get("bucket").(string) key := d.Get("key").(string) - var body io.ReadSeeker + cdcId := d.Get("cdc_id").(string) if v, ok := d.GetOk("source"); ok { source := v.(string) path, err := homedir.Expand(source) if err != nil { return fmt.Errorf("cos object source (%s) homedir expand error: %s", source, err.Error()) } + file, err := os.Open(path) if err != nil { return fmt.Errorf("cos object source (%s) open error: %s", source, err.Error()) } + body = file defer func() { err := file.Close() @@ -145,41 +158,42 @@ func resourceTencentCloudCosBucketObjectCreate(d *schema.ResourceData, meta inte if v, ok := d.GetOk("acl"); ok { request.ACL = aws.String(v.(string)) } + if v, ok := d.GetOk("cache_control"); ok { request.CacheControl = aws.String(v.(string)) } + if v, ok := d.GetOk("content_disposition"); ok { request.ContentDisposition = aws.String(v.(string)) } + if v, ok := d.GetOk("content_encoding"); ok { request.ContentEncoding = aws.String(v.(string)) } + if v, ok := d.GetOk("content_type"); ok { request.ContentType = aws.String(v.(string)) } + if v, ok := d.GetOk("storage_class"); ok { request.StorageClass = aws.String(v.(string)) } - response, err := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCosClient().PutObject(request) + response, err := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCosClient(cdcId).PutObject(request) if err != nil { return fmt.Errorf("putting object (%s) in cos bucket (%s) error: %s", key, bucket, err.Error()) } + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, "put object", request.String(), response.String()) if v, ok := d.GetOk("tags"); ok { - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) - service := CosService{ - client: meta.(tccommon.ProviderMeta).GetAPIV3Conn(), - } tags := make(map[string]string) - for key, val := range v.(map[string]interface{}) { tags[key] = val.(string) } - if err := service.SetObjectTags(ctx, bucket, key, tags); err != nil { + if err := service.SetObjectTags(ctx, bucket, key, tags, cdcId); err != nil { log.Printf("[WARN] set object tags error, skip processing") } } @@ -191,22 +205,24 @@ func resourceTencentCloudCosBucketObjectCreate(d *schema.ResourceData, meta inte func resourceTencentCloudCosBucketObjectRead(d *schema.ResourceData, meta interface{}) error { defer tccommon.LogElapsed("resource.tencentcloud_cos_bucket_object.read")() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + cosService = CosService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + ) bucket := d.Get("bucket").(string) key := d.Get("key").(string) + cdcId := d.Get("cdc_id").(string) - cosService := CosService{ - client: meta.(tccommon.ProviderMeta).GetAPIV3Conn(), - } - response, err := cosService.HeadObject(ctx, bucket, key) + response, err := cosService.HeadObject(ctx, bucket, key, cdcId) if err != nil { if awsError, ok := err.(awserr.RequestFailure); ok && awsError.StatusCode() == 404 { log.Printf("[WARN]%s object (%s) in bucket (%s) not found, error code (404)", logId, key, bucket) d.SetId("") return nil } + return err } @@ -220,10 +236,11 @@ func resourceTencentCloudCosBucketObjectRead(d *schema.ResourceData, meta interf _ = d.Set("storage_class", response.StorageClass) } - _, aclResponse, aclErr := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseTencentCosClient(bucket).Object.GetACL(ctx, key) + _, aclResponse, aclErr := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseTencentCosClient(bucket, cdcId).Object.GetACL(ctx, key) if aclErr != nil { return fmt.Errorf("cos [GetACL] error: %s, bucket: %s, object: %s", aclErr.Error(), bucket, key) } + if aclResponse.StatusCode == 404 { log.Printf("[WARN] [GetACL] returns %d, %s", 404, err) return nil @@ -232,15 +249,17 @@ func resourceTencentCloudCosBucketObjectRead(d *schema.ResourceData, meta interf _ = d.Set("acl", aclResponse.Header.Get("x-cos-acl")) var tags map[string]string - tags, err = cosService.GetObjectTags(ctx, bucket, key) + tags, err = cosService.GetObjectTags(ctx, bucket, key, cdcId) if err != nil { if awsError, ok := err.(awserr.RequestFailure); ok && awsError.StatusCode() == 404 { log.Printf("[WARN]%s tags in object (%s) of bucket (%s) not found, error code (404)", logId, key, bucket) d.SetId("") return nil } + return err } + _ = d.Set("tags", tags) return nil @@ -249,8 +268,11 @@ func resourceTencentCloudCosBucketObjectRead(d *schema.ResourceData, meta interf func resourceTencentCloudCosBucketObjectUpdate(d *schema.ResourceData, meta interface{}) error { defer tccommon.LogElapsed("resource.tencentcloud_cos_bucket_object.update")() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + cosService = CosService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + ) fields := []string{ "cache_control", @@ -262,6 +284,7 @@ func resourceTencentCloudCosBucketObjectUpdate(d *schema.ResourceData, meta inte "storage_class", "etag", } + for _, key := range fields { if d.HasChange(key) { return resourceTencentCloudCosBucketObjectCreate(d, meta) @@ -270,13 +293,11 @@ func resourceTencentCloudCosBucketObjectUpdate(d *schema.ResourceData, meta inte bucket := d.Get("bucket").(string) key := d.Get("key").(string) - cosService := CosService{ - client: meta.(tccommon.ProviderMeta).GetAPIV3Conn(), - } + cdcId := d.Get("cdc_id").(string) if d.HasChange("acl") { acl := d.Get("acl").(string) - err := cosService.PutObjectAcl(ctx, bucket, key, acl) + err := cosService.PutObjectAcl(ctx, bucket, key, acl, cdcId) if err != nil { return err } @@ -288,7 +309,8 @@ func resourceTencentCloudCosBucketObjectUpdate(d *schema.ResourceData, meta inte for key, val := range v { tags[key] = val.(string) } - if err := cosService.SetObjectTags(ctx, bucket, key, tags); err != nil { + + if err := cosService.SetObjectTags(ctx, bucket, key, tags, cdcId); err != nil { return err } } @@ -299,16 +321,17 @@ func resourceTencentCloudCosBucketObjectUpdate(d *schema.ResourceData, meta inte func resourceTencentCloudCosBucketObjectDelete(d *schema.ResourceData, meta interface{}) error { defer tccommon.LogElapsed("resource.tencentcloud_cos_bucket_object.delete")() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + cosService = CosService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + ) bucket := d.Get("bucket").(string) key := d.Get("key").(string) + cdcId := d.Get("cdc_id").(string) - cosService := CosService{ - client: meta.(tccommon.ProviderMeta).GetAPIV3Conn(), - } - err := cosService.DeleteObject(ctx, bucket, key) + err := cosService.DeleteObject(ctx, bucket, key, cdcId) if err != nil { return err } diff --git a/tencentcloud/services/cos/resource_tc_cos_bucket_policy.go b/tencentcloud/services/cos/resource_tc_cos_bucket_policy.go index d5a793d786..87424debea 100644 --- a/tencentcloud/services/cos/resource_tc_cos_bucket_policy.go +++ b/tencentcloud/services/cos/resource_tc_cos_bucket_policy.go @@ -54,6 +54,12 @@ func ResourceTencentCloudCosBucketPolicy() *schema.Resource { }, Description: "The text of the policy. For more info please refer to [Tencent official doc](https://intl.cloud.tencent.com/document/product/436/18023).", }, + "cdc_id": { + Type: schema.TypeString, + Optional: true, + ForceNew: true, + Description: "CDC cluster ID.", + }, }, } } @@ -61,24 +67,27 @@ func ResourceTencentCloudCosBucketPolicy() *schema.Resource { func resourceTencentCloudCosBucketPolicyCreate(d *schema.ResourceData, meta interface{}) error { defer tccommon.LogElapsed("resource.tencentcloud_cos_bucket_policy.create")() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + cosService = CosService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + camService = svccam.NewCamService(meta.(tccommon.ProviderMeta).GetAPIV3Conn()) + ) + bucket := d.Get("bucket").(string) policy := d.Get("policy").(string) + cdcId := d.Get("cdc_id").(string) - cosService := CosService{ - client: meta.(tccommon.ProviderMeta).GetAPIV3Conn(), - } - camService := svccam.NewCamService(meta.(tccommon.ProviderMeta).GetAPIV3Conn()) policyErr := camService.PolicyDocumentForceCheck(policy) if policyErr != nil { return policyErr } - err := cosService.PutBucketPolicy(ctx, bucket, policy) + err := cosService.PutBucketPolicy(ctx, bucket, policy, cdcId) if err != nil { return err } + d.SetId(bucket) return resourceTencentCloudCosBucketPolicyRead(d, meta) @@ -87,34 +96,41 @@ func resourceTencentCloudCosBucketPolicyCreate(d *schema.ResourceData, meta inte func resourceTencentCloudCosBucketPolicyRead(d *schema.ResourceData, meta interface{}) error { defer tccommon.LogElapsed("resource.tencentcloud_cos_bucket_policy.read")() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + cosService = CosService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + result string + ) bucket := d.Id() - cosService := CosService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} - - var result string + cdcId := d.Get("cdc_id").(string) err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError { - policy, e := cosService.DescribePolicyByBucket(ctx, bucket) + policy, e := cosService.DescribePolicyByBucket(ctx, bucket, cdcId) if e != nil { return tccommon.RetryError(e) } + result = policy return nil }) + if err != nil { log.Printf("[CRITAL]%s read cos bucket policy failed, reason:%s\n", logId, err.Error()) return err } + result, err = removeSid(result) if err != nil { log.Printf("[CRITAL]%s read cos bucket policy failed, reason:%s\n", logId, err.Error()) return err } + if result == "" { d.SetId("") return nil } + _ = d.Set("policy", result) _ = d.Set("bucket", bucket) @@ -124,11 +140,14 @@ func resourceTencentCloudCosBucketPolicyRead(d *schema.ResourceData, meta interf func resourceTencentCloudCosBucketPolicyUpdate(d *schema.ResourceData, meta interface{}) error { defer tccommon.LogElapsed("resource.tencentcloud_cos_bucket_policy.update")() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) - cosService := CosService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} - bucket := d.Id() + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + cosService = CosService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + ) + bucket := d.Id() + cdcId := d.Get("cdc_id").(string) if d.HasChange("policy") { policy := d.Get("policy").(string) camService := svccam.NewCamService(meta.(tccommon.ProviderMeta).GetAPIV3Conn()) @@ -136,7 +155,8 @@ func resourceTencentCloudCosBucketPolicyUpdate(d *schema.ResourceData, meta inte if policyErr != nil { return policyErr } - err := cosService.PutBucketPolicy(ctx, bucket, policy) + + err := cosService.PutBucketPolicy(ctx, bucket, policy, cdcId) if err != nil { return err } @@ -152,14 +172,15 @@ func resourceTencentCloudCosBucketPolicyUpdate(d *schema.ResourceData, meta inte func resourceTencentCloudCosBucketPolicyDelete(d *schema.ResourceData, meta interface{}) error { defer tccommon.LogElapsed("resource.tencentcloud_cos_bucket_policy.delete")() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + cosService = CosService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + ) bucket := d.Id() - cosService := CosService{ - client: meta.(tccommon.ProviderMeta).GetAPIV3Conn(), - } - err := cosService.DeleteBucketPolicy(ctx, bucket) + cdcId := d.Get("cdc_id").(string) + err := cosService.DeleteBucketPolicy(ctx, bucket, cdcId) if err != nil { return err } @@ -178,18 +199,22 @@ func removeSid(v string) (result string, err error) { if err != nil { return } + var stateMend []interface{} if v, ok := m["Statement"]; ok { stateMend = v.([]interface{}) } + for index, v := range stateMend { mp := v.(map[string]interface{}) delete(mp, "Sid") stateMend[index] = mp } + if _, ok := m["Statement"]; ok { m["Statement"] = stateMend } + s, err := json.Marshal(m) return string(s), err } diff --git a/tencentcloud/services/cos/resource_tc_cos_bucket_referer.go b/tencentcloud/services/cos/resource_tc_cos_bucket_referer.go index 494ff83a6d..8a6756ddb0 100644 --- a/tencentcloud/services/cos/resource_tc_cos_bucket_referer.go +++ b/tencentcloud/services/cos/resource_tc_cos_bucket_referer.go @@ -49,6 +49,12 @@ func ResourceTencentCloudCosBucketReferer() *schema.Resource { Optional: true, Description: "Whether to allow access with an empty referer. Enumerated values: `Allow`, `Deny` (default).", }, + "cdc_id": { + Type: schema.TypeString, + Optional: true, + ForceNew: true, + Description: "CDC cluster ID.", + }, }, } } @@ -71,14 +77,15 @@ func resourceTencentCloudCosBucketRefererRead(d *schema.ResourceData, meta inter defer tccommon.LogElapsed("resource.tencentcloud_cos_bucket_referer.read")() defer tccommon.InconsistentCheck(d, meta)() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) - - service := CosService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + service = CosService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + ) bucket := d.Id() - - bucketReferer, err := service.DescribeCosBucketRefererById(ctx, bucket) + cdcId := d.Get("cdc_id").(string) + bucketReferer, err := service.DescribeCosBucketRefererById(ctx, bucket, cdcId) if err != nil { return err } @@ -114,18 +121,21 @@ func resourceTencentCloudCosBucketRefererUpdate(d *schema.ResourceData, meta int defer tccommon.LogElapsed("resource.tencentcloud_cos_bucket_referer.update")() defer tccommon.InconsistentCheck(d, meta)() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + request = cos.BucketPutRefererOptions{} + ) bucket := d.Id() - - request := cos.BucketPutRefererOptions{} if v, ok := d.GetOk("status"); ok { request.Status = v.(string) } + if v, ok := d.GetOk("referer_type"); ok { request.RefererType = v.(string) } + if v, ok := d.GetOk("domain_list"); ok { domainListSet := v.(*schema.Set).List() for i := range domainListSet { @@ -133,19 +143,23 @@ func resourceTencentCloudCosBucketRefererUpdate(d *schema.ResourceData, meta int request.DomainList = append(request.DomainList, domainList) } } + if v, ok := d.GetOk("empty_refer_configuration"); ok { request.EmptyReferConfiguration = v.(string) } + cdcId := d.Get("cdc_id").(string) err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { - result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseTencentCosClient(bucket).Bucket.PutReferer(ctx, &request) + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseTencentCosClient(bucket, cdcId).Bucket.PutReferer(ctx, &request) if e != nil { return tccommon.RetryError(e) } else { log.Printf("[DEBUG]%s api[%s] success, request body [%+v], response status [%s]\n", logId, "PutReferer", request, result.Status) } + return nil }) + if err != nil { log.Printf("[CRITAL]%s cos bucketReferer failed, reason:%+v", logId, err) return err diff --git a/tencentcloud/services/cos/resource_tc_cos_bucket_version.go b/tencentcloud/services/cos/resource_tc_cos_bucket_version.go index 01191a85fc..1ee8e03bb9 100644 --- a/tencentcloud/services/cos/resource_tc_cos_bucket_version.go +++ b/tencentcloud/services/cos/resource_tc_cos_bucket_version.go @@ -26,12 +26,17 @@ func ResourceTencentCloudCosBucketVersion() *schema.Resource { Type: schema.TypeString, Description: "Bucket format should be [custom name]-[appid], for example `mycos-1258798060`.", }, - "status": { Type: schema.TypeString, Required: true, Description: "Whether to enable versioning. Valid values: `Suspended`, `Enabled`.", }, + "cdc_id": { + Type: schema.TypeString, + Optional: true, + ForceNew: true, + Description: "CDC cluster ID.", + }, }, } } @@ -54,14 +59,15 @@ func resourceTencentCloudCosBucketVersionRead(d *schema.ResourceData, meta inter defer tccommon.LogElapsed("resource.tencentcloud_cos_bucket_version.read")() defer tccommon.InconsistentCheck(d, meta)() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) - - service := CosService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + service = CosService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + ) bucket := d.Id() - - bucketVersion, err := service.DescribeCosBucketVersionById(ctx, bucket) + cdcId := d.Get("cdc_id").(string) + bucketVersion, err := service.DescribeCosBucketVersionById(ctx, bucket, cdcId) if err != nil { return err } @@ -85,25 +91,29 @@ func resourceTencentCloudCosBucketVersionUpdate(d *schema.ResourceData, meta int defer tccommon.LogElapsed("resource.tencentcloud_cos_bucket_version.update")() defer tccommon.InconsistentCheck(d, meta)() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + request = cos.BucketPutVersionOptions{} + ) bucket := d.Id() - - request := cos.BucketPutVersionOptions{} if v, ok := d.GetOk("status"); ok { request.Status = v.(string) } + cdcId := d.Get("cdc_id").(string) err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { - result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseTencentCosClient(bucket).Bucket.PutVersioning(ctx, &request) + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseTencentCosClient(bucket, cdcId).Bucket.PutVersioning(ctx, &request) if e != nil { return tccommon.RetryError(e) } else { log.Printf("[DEBUG]%s api[%s] success, request body [%+v], response status [%s]\n", logId, "PutVersioning", request, result.Status) } + return nil }) + if err != nil { log.Printf("[CRITAL]%s cos versioning failed, reason:%+v", logId, err) return err diff --git a/tencentcloud/services/cos/resource_tc_cos_object_abort_multipart_upload_operation.go b/tencentcloud/services/cos/resource_tc_cos_object_abort_multipart_upload_operation.go index 01ebc3eb03..6a829d6025 100644 --- a/tencentcloud/services/cos/resource_tc_cos_object_abort_multipart_upload_operation.go +++ b/tencentcloud/services/cos/resource_tc_cos_object_abort_multipart_upload_operation.go @@ -34,6 +34,12 @@ func ResourceTencentCloudCosObjectAbortMultipartUploadOperation() *schema.Resour Type: schema.TypeString, Description: "Multipart uploaded id.", }, + "cdc_id": { + Type: schema.TypeString, + Optional: true, + ForceNew: true, + Description: "CDC cluster ID.", + }, }, } } @@ -42,12 +48,16 @@ func resourceTencentCloudCosObjectAbortMultipartUploadOperationCreate(d *schema. defer tccommon.LogElapsed("resource.tencentcloud_cos_object_abort_multipart_upload_operation.create")() defer tccommon.InconsistentCheck(d, meta)() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + ) + bucket := d.Get("bucket").(string) key := d.Get("key").(string) uploadId := d.Get("upload_id").(string) - _, err := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseTencentCosClient(bucket).Object.AbortMultipartUpload(ctx, key, uploadId) + cdcId := d.Get("cdc_id").(string) + _, err := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseTencentCosClient(bucket, cdcId).Object.AbortMultipartUpload(ctx, key, uploadId) if err != nil { log.Printf("[CRITAL]%s AbortMultipartUpload failed, reason:%+v", logId, err) return err diff --git a/tencentcloud/services/cos/resource_tc_cos_object_copy_operation.go b/tencentcloud/services/cos/resource_tc_cos_object_copy_operation.go index 16faffd283..0fb4c5ac63 100644 --- a/tencentcloud/services/cos/resource_tc_cos_object_copy_operation.go +++ b/tencentcloud/services/cos/resource_tc_cos_object_copy_operation.go @@ -3,6 +3,7 @@ package cos import ( "context" "log" + "strings" tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common" @@ -34,6 +35,12 @@ func ResourceTencentCloudCosObjectCopyOperation() *schema.Resource { Type: schema.TypeString, Description: "Object key.", }, + "cdc_id": { + Type: schema.TypeString, + Optional: true, + ForceNew: true, + Description: "CDC cluster ID.", + }, }, } } @@ -42,18 +49,22 @@ func resourceTencentCloudCosObjectCopyOperationCreate(d *schema.ResourceData, me defer tccommon.LogElapsed("resource.tencentcloud_cos_object_copy_operation.create")() defer tccommon.InconsistentCheck(d, meta)() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + ) + bucket := d.Get("bucket").(string) key := d.Get("key").(string) sourceURL := d.Get("source_url").(string) - _, _, err := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseTencentCosClient(bucket).Object.Copy(ctx, key, sourceURL, nil) + cdcId := d.Get("cdc_id").(string) + _, _, err := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseTencentCosClient(bucket, cdcId).Object.Copy(ctx, key, sourceURL, nil) if err != nil { log.Printf("[CRITAL]%s Restore failed, reason:%+v", logId, err) return err } - d.SetId(bucket + tccommon.FILED_SP + key) + d.SetId(strings.Join([]string{bucket, key}, tccommon.FILED_SP)) return resourceTencentCloudCosObjectCopyOperationRead(d, meta) } diff --git a/tencentcloud/services/cos/resource_tc_cos_object_download_operation.go b/tencentcloud/services/cos/resource_tc_cos_object_download_operation.go index b079142a69..95dc573cc8 100644 --- a/tencentcloud/services/cos/resource_tc_cos_object_download_operation.go +++ b/tencentcloud/services/cos/resource_tc_cos_object_download_operation.go @@ -5,6 +5,7 @@ import ( "io" "log" "os" + "strings" tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common" @@ -36,6 +37,12 @@ func ResourceTencentCloudCosObjectDownloadOperation() *schema.Resource { Type: schema.TypeString, Description: "Download path.", }, + "cdc_id": { + Type: schema.TypeString, + Optional: true, + ForceNew: true, + Description: "CDC cluster ID.", + }, }, } } @@ -44,16 +51,21 @@ func resourceTencentCloudCosObjectDownloadOperationCreate(d *schema.ResourceData defer tccommon.LogElapsed("resource.tencentcloud_cos_object_download_operation.create")() defer tccommon.InconsistentCheck(d, meta)() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + ) + bucket := d.Get("bucket").(string) key := d.Get("key").(string) downloadPath := d.Get("download_path").(string) - resp, err := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseTencentCosClient(bucket).Object.Get(ctx, key, nil) + cdcId := d.Get("cdc_id").(string) + resp, err := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseTencentCosClient(bucket, cdcId).Object.Get(ctx, key, nil) if err != nil { log.Printf("[CRITAL]%s object download failed, reason:%+v", logId, err) return err } + defer resp.Body.Close() fd, err := os.OpenFile(downloadPath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0660) @@ -67,7 +79,7 @@ func resourceTencentCloudCosObjectDownloadOperationCreate(d *schema.ResourceData return err } - d.SetId(bucket + tccommon.FILED_SP + key) + d.SetId(strings.Join([]string{bucket, key}, tccommon.FILED_SP)) return resourceTencentCloudCosObjectDownloadOperationRead(d, meta) } diff --git a/tencentcloud/services/cos/resource_tc_cos_object_restore_operation.go b/tencentcloud/services/cos/resource_tc_cos_object_restore_operation.go index c620602789..9908ba5466 100644 --- a/tencentcloud/services/cos/resource_tc_cos_object_restore_operation.go +++ b/tencentcloud/services/cos/resource_tc_cos_object_restore_operation.go @@ -3,6 +3,7 @@ package cos import ( "context" "log" + "strings" tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common" @@ -48,6 +49,12 @@ func ResourceTencentCloudCosObjectRestoreOperation() *schema.Resource { Type: schema.TypeInt, Description: "Specifies the valid duration of the restored temporary copy in days.", }, + "cdc_id": { + Type: schema.TypeString, + Optional: true, + ForceNew: true, + Description: "CDC cluster ID.", + }, }, } } @@ -56,25 +63,30 @@ func resourceTencentCloudCosObjectRestoreOperationCreate(d *schema.ResourceData, defer tccommon.LogElapsed("resource.tencentcloud_cos_object_restore_operation.create")() defer tccommon.InconsistentCheck(d, meta)() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + ) + bucket := d.Get("bucket").(string) key := d.Get("key").(string) tier := d.Get("tier").(string) days := d.Get("days").(int) + cdcId := d.Get("cdc_id").(string) opt := &cos.ObjectRestoreOptions{ Days: days, Tier: &cos.CASJobParameters{ Tier: tier, }, } - _, err := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseTencentCosClient(bucket).Object.PostRestore(ctx, key, opt) + + _, err := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseTencentCosClient(bucket, cdcId).Object.PostRestore(ctx, key, opt) if err != nil { log.Printf("[CRITAL]%s Restore failed, reason:%+v", logId, err) return err } - d.SetId(bucket + tccommon.FILED_SP + key) + d.SetId(strings.Join([]string{bucket, key}, tccommon.FILED_SP)) return resourceTencentCloudCosObjectRestoreOperationRead(d, meta) } diff --git a/tencentcloud/services/cos/service_tencentcloud_cos.go b/tencentcloud/services/cos/service_tencentcloud_cos.go index 56cef4a28d..9cde463e4f 100644 --- a/tencentcloud/services/cos/service_tencentcloud_cos.go +++ b/tencentcloud/services/cos/service_tencentcloud_cos.go @@ -47,7 +47,7 @@ const ( const PUBLIC_GRANTEE = "http://cam.qcloud.com/groups/global/AllUsers" -func (me *CosService) HeadObject(ctx context.Context, bucket, key string) (info *s3.HeadObjectOutput, errRet error) { +func (me *CosService) HeadObject(ctx context.Context, bucket, key, cdcId string) (info *s3.HeadObjectOutput, errRet error) { logId := tccommon.GetLogId(ctx) request := s3.HeadObjectInput{ @@ -55,7 +55,7 @@ func (me *CosService) HeadObject(ctx context.Context, bucket, key string) (info Key: aws.String(key), } ratelimit.Check("HeadObject") - response, err := me.client.UseCosClient().HeadObject(&request) + response, err := me.client.UseCosClient(cdcId).HeadObject(&request) if err != nil { log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, "head object", request.String(), err.Error()) @@ -69,7 +69,7 @@ func (me *CosService) HeadObject(ctx context.Context, bucket, key string) (info return response, nil } -func (me *CosService) DeleteObject(ctx context.Context, bucket, key string) (errRet error) { +func (me *CosService) DeleteObject(ctx context.Context, bucket, key, cdcId string) (errRet error) { logId := tccommon.GetLogId(ctx) request := s3.DeleteObjectInput{ @@ -83,7 +83,7 @@ func (me *CosService) DeleteObject(ctx context.Context, bucket, key string) (err } }() ratelimit.Check("DeleteObject") - response, err := me.client.UseCosClient().DeleteObject(&request) + response, err := me.client.UseCosClient(cdcId).DeleteObject(&request) if err != nil { errRet = fmt.Errorf("cos delete object error: %s, bucket: %s, object: %s", err.Error(), bucket, key) return @@ -95,7 +95,7 @@ func (me *CosService) DeleteObject(ctx context.Context, bucket, key string) (err return nil } -func (me *CosService) PutObjectAcl(ctx context.Context, bucket, key, acl string) (errRet error) { +func (me *CosService) PutObjectAcl(ctx context.Context, bucket, key, acl, cdcId string) (errRet error) { logId := tccommon.GetLogId(ctx) request := s3.PutObjectAclInput{ @@ -110,7 +110,7 @@ func (me *CosService) PutObjectAcl(ctx context.Context, bucket, key, acl string) } }() ratelimit.Check("PutObjectAcl") - response, err := me.client.UseCosClient().PutObjectAcl(&request) + response, err := me.client.UseCosClient(cdcId).PutObjectAcl(&request) if err != nil { errRet = fmt.Errorf("cos put object acl error: %s, bucket: %s, object: %s", err.Error(), bucket, key) return @@ -123,7 +123,7 @@ func (me *CosService) PutObjectAcl(ctx context.Context, bucket, key, acl string) } // PutBucket - base on aws s3 -func (me *CosService) PutBucket(ctx context.Context, bucket, acl string) (errRet error) { +func (me *CosService) PutBucket(ctx context.Context, bucket, acl, cdcId string) (errRet error) { logId := tccommon.GetLogId(ctx) request := s3.CreateBucketInput{ @@ -137,20 +137,20 @@ func (me *CosService) PutBucket(ctx context.Context, bucket, acl string) (errRet } }() ratelimit.Check("CreateBucket") - response, err := me.client.UseCosClient().CreateBucket(&request) + response, err := me.client.UseCosClient(cdcId).CreateBucket(&request) if err != nil { errRet = fmt.Errorf("cos put bucket error: %s, bucket: %s", err.Error(), bucket) return } log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s], endpoint %s\n", - logId, "put bucket", request.String(), response.String(), me.client.UseCosClient().Endpoint) + logId, "put bucket", request.String(), response.String(), me.client.UseCosClient(cdcId).Endpoint) return nil } // TencentCosPutBucket - To support MAZ config, We use tencentcloud cos sdk instead of aws s3 -func (me *CosService) TencentCosPutBucket(ctx context.Context, bucket string, opt *cos.BucketPutOptions) (errRet error) { +func (me *CosService) TencentCosPutBucket(ctx context.Context, bucket string, opt *cos.BucketPutOptions, cdcId string) (errRet error) { logId := tccommon.GetLogId(ctx) req, _ := json.Marshal(opt) @@ -163,7 +163,8 @@ func (me *CosService) TencentCosPutBucket(ctx context.Context, bucket string, op }() ratelimit.Check("TencentcloudCosPutBucket") - response, err := me.client.UseTencentCosClient(bucket).Bucket.Put(ctx, opt) + + response, err := me.client.UseTencentCosClient(bucket, cdcId).Bucket.Put(ctx, opt) if err != nil { errRet = fmt.Errorf("cos put bucket error: %s, bucket: %s", err.Error(), bucket) @@ -173,12 +174,12 @@ func (me *CosService) TencentCosPutBucket(ctx context.Context, bucket string, op resp, _ := json.Marshal(response.Response.Body) log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s], baseUrl %s\n", - logId, "put bucket", req, resp, me.client.UseTencentCosClient(bucket).BaseURL.BucketURL) + logId, "put bucket", req, resp, me.client.UseTencentCosClient(bucket, cdcId).BaseURL.BucketURL) return nil } -func (me *CosService) TencentCosBucketGetLocation(ctx context.Context, bucket string, opt *cos.BucketPutOptions) (location string, errRet error) { +func (me *CosService) TencentCosBucketGetLocation(ctx context.Context, bucket string, opt *cos.BucketPutOptions, cdcId string) (location string, errRet error) { logId := tccommon.GetLogId(ctx) req, _ := json.Marshal(opt) @@ -191,7 +192,7 @@ func (me *CosService) TencentCosBucketGetLocation(ctx context.Context, bucket st }() ratelimit.Check("TencentcloudCosPutBucket") - result, response, err := me.client.UseTencentCosClient(bucket).Bucket.GetLocation(ctx) + result, response, err := me.client.UseTencentCosClient(bucket, cdcId).Bucket.GetLocation(ctx) if err != nil { errRet = fmt.Errorf("cos get location error: %s, bucket: %s", err.Error(), bucket) return @@ -200,7 +201,7 @@ func (me *CosService) TencentCosBucketGetLocation(ctx context.Context, bucket st resp, _ := json.Marshal(response.Response.Body) log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s], baseUrl %s\n", - logId, "put bucket", req, resp, me.client.UseTencentCosClient(bucket).BaseURL.BucketURL) + logId, "put bucket", req, resp, me.client.UseTencentCosClient(bucket, cdcId).BaseURL.BucketURL) return } @@ -210,6 +211,7 @@ func (me *CosService) TencentCosPutBucketACLBody( bucket string, reqBody string, header string, + cdcId string, ) (errRet error) { logId := tccommon.GetLogId(ctx) @@ -240,7 +242,7 @@ func (me *CosService) TencentCosPutBucketACLBody( }() ratelimit.Check("TencentcloudCosPutBucketACLBody") - response, err := me.client.UseTencentCosClient(bucket).Bucket.PutACL(ctx, opt) + response, err := me.client.UseTencentCosClient(bucket, cdcId).Bucket.PutACL(ctx, opt) if err != nil { errRet = fmt.Errorf("cos [PutBucketACLBody] error: %s, bucket: %s", err.Error(), bucket) @@ -255,14 +257,14 @@ func (me *CosService) TencentCosPutBucketACLBody( return nil } -func (me *CosService) HeadBucket(ctx context.Context, bucket string) (errRet error) { +func (me *CosService) HeadBucket(ctx context.Context, bucket, cdcId string) (errRet error) { logId := tccommon.GetLogId(ctx) request := s3.HeadBucketInput{ Bucket: aws.String(bucket), } ratelimit.Check("HeadBucket") - response, err := me.client.UseCosClient().HeadBucket(&request) + response, err := me.client.UseCosClient(cdcId).HeadBucket(&request) if err != nil { log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, "head bucket", request.String(), err.Error()) @@ -276,10 +278,10 @@ 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) { +func (me *CosService) TencentcloudHeadBucket(ctx context.Context, bucket, cdcId string) (code int, header http.Header, errRet error) { logId := tccommon.GetLogId(ctx) - response, err := me.client.UseTencentCosClient(bucket).Bucket.Head(ctx) + response, err := me.client.UseTencentCosClient(bucket, cdcId).Bucket.Head(ctx) if response != nil { code = response.StatusCode @@ -299,13 +301,13 @@ func (me *CosService) TencentcloudHeadBucket(ctx context.Context, bucket string) return } -func (me *CosService) DeleteBucket(ctx context.Context, bucket string, forced bool, versioned bool) (errRet error) { +func (me *CosService) DeleteBucket(ctx context.Context, bucket string, forced bool, versioned bool, cdcId string) (errRet error) { logId := tccommon.GetLogId(ctx) if forced { log.Printf("[DEBUG]%s api[%s] triggered, bucket [%s], versioned [%v]\n", logId, "ForceCleanObject", bucket, versioned) - err := me.ForceCleanObject(ctx, bucket, versioned) + err := me.ForceCleanObject(ctx, bucket, versioned, cdcId) if err != nil { return err } @@ -315,7 +317,7 @@ func (me *CosService) DeleteBucket(ctx context.Context, bucket string, forced bo Bucket: aws.String(bucket), } ratelimit.Check("DeleteBucket") - response, err := me.client.UseCosClient().DeleteBucket(&request) + response, err := me.client.UseCosClient(cdcId).DeleteBucket(&request) if err != nil { log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, "delete bucket", request.String(), err.Error()) @@ -327,12 +329,12 @@ func (me *CosService) DeleteBucket(ctx context.Context, bucket string, forced bo return nil } -func (me *CosService) ForceCleanObject(ctx context.Context, bucket string, versioned bool) error { +func (me *CosService) ForceCleanObject(ctx context.Context, bucket string, versioned bool, cdcId string) error { logId := tccommon.GetLogId(ctx) // Get the object list of bucket with all versions verOpt := cos.BucketGetObjectVersionsOptions{} - objList, resp, err := me.client.UseTencentCosClient(bucket).Bucket.GetObjectVersions(ctx, &verOpt) + objList, resp, err := me.client.UseTencentCosClient(bucket, cdcId).Bucket.GetObjectVersions(ctx, &verOpt) if err != nil { log.Printf("[CRITAL]%s api[%s] fail, resp body [%s], reason[%s]\n", @@ -382,7 +384,7 @@ func (me *CosService) ForceCleanObject(ctx context.Context, bucket string, versi } // Multi-delete by specified object. - result, resp, err := me.client.UseTencentCosClient(bucket).Object.DeleteMulti(ctx, &opt) + result, resp, err := me.client.UseTencentCosClient(bucket, cdcId).Object.DeleteMulti(ctx, &opt) if err != nil { log.Printf("[CRITAL]%s api[%s] fail, resp body [%s], reason[%s], opt[%v]\n", @@ -410,7 +412,7 @@ func (me *CosService) ForceCleanObject(ctx context.Context, bucket string, versi Objects: unDelObjs, } - result, resp, err := me.client.UseTencentCosClient(bucket).Object.DeleteMulti(ctx, &unDelOpt) + result, resp, err := me.client.UseTencentCosClient(bucket, cdcId).Object.DeleteMulti(ctx, &unDelOpt) if err != nil { log.Printf("[CRITAL][retry]%s api[%s] fail, resp body [%s], reason[%s]\n", logId, "DeleteMulti ", resp.Body, err.Error()) @@ -431,7 +433,7 @@ func (me *CosService) ForceCleanObject(ctx context.Context, bucket string, versi return nil } -func (me *CosService) GetBucketCors(ctx context.Context, bucket string) (corsRules []map[string]interface{}, errRet error) { +func (me *CosService) GetBucketCors(ctx context.Context, bucket, cdcId string) (corsRules []map[string]interface{}, errRet error) { logId := tccommon.GetLogId(ctx) request := s3.GetBucketCorsInput{ @@ -439,7 +441,7 @@ func (me *CosService) GetBucketCors(ctx context.Context, bucket string) (corsRul } ratelimit.Check("GetBucketCors") - response, err := me.client.UseCosClient().GetBucketCors(&request) + response, err := me.client.UseCosClient(cdcId).GetBucketCors(&request) if err != nil { awsError, ok := err.(awserr.Error) if !ok || awsError.Code() != "NoSuchCORSConfiguration" { @@ -475,14 +477,14 @@ func (me *CosService) GetBucketCors(ctx context.Context, bucket string) (corsRul return } -func (me *CosService) GetBucketLifecycle(ctx context.Context, bucket string) (lifecycleRules []map[string]interface{}, errRet error) { +func (me *CosService) GetBucketLifecycle(ctx context.Context, bucket, cdcId string) (lifecycleRules []map[string]interface{}, errRet error) { logId := tccommon.GetLogId(ctx) request := s3.GetBucketLifecycleConfigurationInput{ Bucket: aws.String(bucket), } ratelimit.Check("GetBucketLifecycleConfiguration") - response, err := me.client.UseCosClient().GetBucketLifecycleConfiguration(&request) + response, err := me.client.UseCosClient(cdcId).GetBucketLifecycleConfiguration(&request) if err != nil { awsError, ok := err.(awserr.Error) if !ok || awsError.Code() != "NoSuchLifecycleConfiguration" { @@ -586,7 +588,7 @@ func (me *CosService) GetBucketLifecycle(ctx context.Context, bucket string) (li return } -func (me *CosService) GetDataSourceBucketLifecycle(ctx context.Context, bucket string) (lifecycleRules []map[string]interface{}, errRet error) { +func (me *CosService) GetDataSourceBucketLifecycle(ctx context.Context, bucket, cdcId string) (lifecycleRules []map[string]interface{}, errRet error) { logId := tccommon.GetLogId(ctx) request := s3.GetBucketLifecycleConfigurationInput{ @@ -594,7 +596,7 @@ func (me *CosService) GetDataSourceBucketLifecycle(ctx context.Context, bucket s } ratelimit.Check("GetBucketLifecycleConfiguration") - response, err := me.client.UseCosClient().GetBucketLifecycleConfiguration(&request) + response, err := me.client.UseCosClient(cdcId).GetBucketLifecycleConfiguration(&request) if err != nil { awsError, ok := err.(awserr.Error) if !ok || awsError.Code() != "NoSuchLifecycleConfiguration" { @@ -690,14 +692,14 @@ func (me *CosService) GetDataSourceBucketLifecycle(ctx context.Context, bucket s return } -func (me *CosService) GetBucketWebsite(ctx context.Context, bucket string) (websites []map[string]interface{}, errRet error) { +func (me *CosService) GetBucketWebsite(ctx context.Context, bucket, cdcId string) (websites []map[string]interface{}, errRet error) { logId := tccommon.GetLogId(ctx) request := s3.GetBucketWebsiteInput{ Bucket: aws.String(bucket), } ratelimit.Check("GetBucketWebsite") - response, err := me.client.UseCosClient().GetBucketWebsite(&request) + response, err := me.client.UseCosClient(cdcId).GetBucketWebsite(&request) if err != nil { awsError, ok := err.(awserr.Error) if ok && awsError.Code() == "NoSuchWebsiteConfiguration" { @@ -727,14 +729,14 @@ func (me *CosService) GetBucketWebsite(ctx context.Context, bucket string) (webs return } -func (me *CosService) GetBucketEncryption(ctx context.Context, bucket string) (encryption string, errRet error) { +func (me *CosService) GetBucketEncryption(ctx context.Context, bucket, cdcId string) (encryption string, errRet error) { logId := tccommon.GetLogId(ctx) request := s3.GetBucketEncryptionInput{ Bucket: aws.String(bucket), } ratelimit.Check("GetBucketEncryption") - response, err := me.client.UseCosClient().GetBucketEncryption(&request) + response, err := me.client.UseCosClient(cdcId).GetBucketEncryption(&request) if err != nil { awsError, ok := err.(awserr.Error) if ok && awsError.Code() == "NoSuchEncryptionConfiguration" { @@ -755,14 +757,14 @@ func (me *CosService) GetBucketEncryption(ctx context.Context, bucket string) (e return } -func (me *CosService) GetBucketVersioning(ctx context.Context, bucket string) (versioningEnable bool, errRet error) { +func (me *CosService) GetBucketVersioning(ctx context.Context, bucket, cdcId string) (versioningEnable bool, errRet error) { logId := tccommon.GetLogId(ctx) request := s3.GetBucketVersioningInput{ Bucket: aws.String(bucket), } ratelimit.Check("GetBucketVersioning") - response, err := me.client.UseCosClient().GetBucketVersioning(&request) + response, err := me.client.UseCosClient(cdcId).GetBucketVersioning(&request) if err != nil { awsError, ok := err.(awserr.Error) if ok && awsError.Code() == "NoSuchVersioningConfiguration" { @@ -786,14 +788,14 @@ func (me *CosService) GetBucketVersioning(ctx context.Context, bucket string) (v return } -func (me *CosService) GetBucketAccleration(ctx context.Context, bucket string) (accelerationEnable bool, errRet error) { +func (me *CosService) GetBucketAccleration(ctx context.Context, bucket, cdcId string) (accelerationEnable bool, errRet error) { logId := tccommon.GetLogId(ctx) request := s3.GetBucketAccelerateConfigurationInput{ Bucket: aws.String(bucket), } ratelimit.Check("GetBucketAccelerateConfiguration") - response, err := me.client.UseCosClient().GetBucketAccelerateConfiguration(&request) + response, err := me.client.UseCosClient(cdcId).GetBucketAccelerateConfiguration(&request) if err != nil { awsError, ok := err.(awserr.Error) if ok && awsError.Code() == "NoSuchAccelerateConfiguration" { @@ -817,14 +819,14 @@ func (me *CosService) GetBucketAccleration(ctx context.Context, bucket string) ( return } -func (me *CosService) GetBucketLogStatus(ctx context.Context, bucket string) (logEnable bool, logTargetBucket string, logPrefix string, errRet error) { +func (me *CosService) GetBucketLogStatus(ctx context.Context, bucket, cdcId string) (logEnable bool, logTargetBucket string, logPrefix string, errRet error) { logId := tccommon.GetLogId(ctx) request := s3.GetBucketLoggingInput{ Bucket: aws.String(bucket), } ratelimit.Check("GetBucketVersioning") - response, err := me.client.UseCosClient().GetBucketLogging(&request) + response, err := me.client.UseCosClient(cdcId).GetBucketLogging(&request) if err != nil { log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, "get bucket log status", request.String(), err.Error()) @@ -846,12 +848,12 @@ func (me *CosService) GetBucketLogStatus(ctx context.Context, bucket string) (lo return } -func (me *CosService) ListBuckets(ctx context.Context) (buckets []*s3.Bucket, errRet error) { +func (me *CosService) ListBuckets(ctx context.Context, cdcId string) (buckets []*s3.Bucket, errRet error) { logId := tccommon.GetLogId(ctx) request := s3.ListBucketsInput{} ratelimit.Check("ListBuckets") - response, err := me.client.UseCosClient().ListBuckets(&request) + response, err := me.client.UseCosClient(cdcId).ListBuckets(&request) if err != nil { log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, "get bucket list", request.String(), err.Error()) @@ -865,14 +867,14 @@ func (me *CosService) ListBuckets(ctx context.Context) (buckets []*s3.Bucket, er return } -func (me *CosService) ListObjects(ctx context.Context, bucket string) (objects []*s3.Object, errRet error) { +func (me *CosService) ListObjects(ctx context.Context, bucket, cdcId string) (objects []*s3.Object, errRet error) { logId := tccommon.GetLogId(ctx) request := s3.ListObjectsInput{ Bucket: aws.String(bucket), } ratelimit.Check("ListObjects") - response, err := me.client.UseCosClient().ListObjects(&request) + response, err := me.client.UseCosClient(cdcId).ListObjects(&request) if err != nil { log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, "get object list", request.String(), err.Error()) @@ -887,14 +889,14 @@ func (me *CosService) ListObjects(ctx context.Context, bucket string) (objects [ } // SetBucketTags if len(tags) == 0, only delete tags -func (me *CosService) SetBucketTags(ctx context.Context, bucket string, tags map[string]string) error { +func (me *CosService) SetBucketTags(ctx context.Context, bucket string, tags map[string]string, cdcId string) error { logId := tccommon.GetLogId(ctx) deleteReq := &s3.DeleteBucketTaggingInput{Bucket: aws.String(bucket)} ratelimit.Check("DeleteBucketTagging") - deleteResp, err := me.client.UseCosClient().DeleteBucketTagging(deleteReq) + deleteResp, err := me.client.UseCosClient(cdcId).DeleteBucketTagging(deleteReq) if err != nil { log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]", logId, "delete olg tags", deleteReq.String(), err) @@ -922,7 +924,7 @@ func (me *CosService) SetBucketTags(ctx context.Context, bucket string, tags map ratelimit.Check("PutBucketTagging") - resp, err := me.client.UseCosClient().PutBucketTagging(putReq) + resp, err := me.client.UseCosClient(cdcId).PutBucketTagging(putReq) if err != nil { log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%v]", logId, "put new tags", deleteReq.String(), err) @@ -935,14 +937,14 @@ func (me *CosService) SetBucketTags(ctx context.Context, bucket string, tags map return nil } -func (me *CosService) GetBucketTags(ctx context.Context, bucket string) (map[string]string, error) { +func (me *CosService) GetBucketTags(ctx context.Context, bucket, cdcId string) (map[string]string, error) { logId := tccommon.GetLogId(ctx) req := &s3.GetBucketTaggingInput{Bucket: aws.String(bucket)} ratelimit.Check("GetBucketTagging") - resp, err := me.client.UseCosClient().GetBucketTagging(req) + resp, err := me.client.UseCosClient(cdcId).GetBucketTagging(req) if err != nil { if awsErr, ok := err.(awserr.Error); !ok || awsErr.Code() != "404" { return nil, nil @@ -964,7 +966,7 @@ func (me *CosService) GetBucketTags(ctx context.Context, bucket string) (map[str return tags, nil } -func (me *CosService) GetObjectTags(ctx context.Context, bucket string, key string) (map[string]string, error) { +func (me *CosService) GetObjectTags(ctx context.Context, bucket string, key string, cdcId string) (map[string]string, error) { logId := tccommon.GetLogId(ctx) req := &s3.GetObjectTaggingInput{ @@ -973,7 +975,7 @@ func (me *CosService) GetObjectTags(ctx context.Context, bucket string, key stri } ratelimit.Check("GetObjectTagging") - resp, err := me.client.UseCosClient().GetObjectTagging(req) + resp, err := me.client.UseCosClient(cdcId).GetObjectTagging(req) if err != nil { if awsErr, ok := err.(awserr.Error); !ok || awsErr.Code() != "404" { return nil, nil @@ -997,7 +999,7 @@ func (me *CosService) GetObjectTags(ctx context.Context, bucket string, key stri } // SetObjectTags same as delete Bucket Tags -func (me *CosService) SetObjectTags(ctx context.Context, bucket string, key string, tags map[string]string) error { +func (me *CosService) SetObjectTags(ctx context.Context, bucket string, key string, tags map[string]string, cdcId string) error { logId := tccommon.GetLogId(ctx) deleteReq := &s3.DeleteObjectTaggingInput{ @@ -1007,7 +1009,7 @@ func (me *CosService) SetObjectTags(ctx context.Context, bucket string, key stri ratelimit.Check("DeleteObjectTagging") - deleteResp, err := me.client.UseCosClient().DeleteObjectTagging(deleteReq) + deleteResp, err := me.client.UseCosClient(cdcId).DeleteObjectTagging(deleteReq) if err != nil { log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]", logId, "delete olg object tags", deleteReq.String(), err) @@ -1036,7 +1038,7 @@ func (me *CosService) SetObjectTags(ctx context.Context, bucket string, key stri ratelimit.Check("PutObjectTagging") - resp, err := me.client.UseCosClient().PutObjectTagging(putReq) + resp, err := me.client.UseCosClient(cdcId).PutObjectTagging(putReq) if err != nil { log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%v]", logId, "put new object tags", deleteReq.String(), err) @@ -1049,7 +1051,7 @@ func (me *CosService) SetObjectTags(ctx context.Context, bucket string, key stri return nil } -func (me *CosService) PutBucketPolicy(ctx context.Context, bucket, policy string) (errRet error) { +func (me *CosService) PutBucketPolicy(ctx context.Context, bucket, policy, cdcId string) (errRet error) { logId := tccommon.GetLogId(ctx) request := s3.PutBucketPolicyInput{ @@ -1063,7 +1065,7 @@ func (me *CosService) PutBucketPolicy(ctx context.Context, bucket, policy string } }() ratelimit.Check("PutBucketPolicy") - response, err := me.client.UseCosClient().PutBucketPolicy(&request) + response, err := me.client.UseCosClient(cdcId).PutBucketPolicy(&request) if err != nil { errRet = fmt.Errorf("cos put bucket policy error: %s, bucket: %s", err.Error(), bucket) return @@ -1075,12 +1077,12 @@ func (me *CosService) PutBucketPolicy(ctx context.Context, bucket, policy string return nil } -func (me *CosService) DescribePolicyByBucket(ctx context.Context, bucket string) (bucketPolicy string, errRet error) { +func (me *CosService) DescribePolicyByBucket(ctx context.Context, bucket, cdcId string) (bucketPolicy string, errRet error) { logId := tccommon.GetLogId(ctx) request := s3.GetBucketPolicyInput{Bucket: aws.String(bucket)} ratelimit.Check("GetBucketPolicy") - response, err := me.client.UseCosClient().GetBucketPolicy(&request) + response, err := me.client.UseCosClient(cdcId).GetBucketPolicy(&request) if err != nil { log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, "get bucket policy", request.String(), err.Error()) @@ -1093,14 +1095,14 @@ func (me *CosService) DescribePolicyByBucket(ctx context.Context, bucket string) return } -func (me *CosService) DeleteBucketPolicy(ctx context.Context, bucket string) (errRet error) { +func (me *CosService) DeleteBucketPolicy(ctx context.Context, bucket, cdcId string) (errRet error) { logId := tccommon.GetLogId(ctx) request := s3.DeleteBucketPolicyInput{ Bucket: aws.String(bucket), } ratelimit.Check("DeleteBucketPolicy") - response, err := me.client.UseCosClient().DeleteBucketPolicy(&request) + response, err := me.client.UseCosClient(cdcId).DeleteBucketPolicy(&request) if err != nil { log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, "delete bucket policy", request.String(), err.Error()) @@ -1112,7 +1114,7 @@ func (me *CosService) DeleteBucketPolicy(ctx context.Context, bucket string) (er return nil } -func (me *CosService) GetBucketACL(ctx context.Context, bucket string) (result *cos.BucketGetACLResult, errRet error) { +func (me *CosService) GetBucketACL(ctx context.Context, bucket, cdcId string) (result *cos.BucketGetACLResult, errRet error) { logId := tccommon.GetLogId(ctx) defer func() { @@ -1123,7 +1125,7 @@ func (me *CosService) GetBucketACL(ctx context.Context, bucket string) (result * }() ratelimit.Check("TencentcloudCosPutBucketACL") - acl, _, err := me.client.UseTencentCosClient(bucket).Bucket.GetACL(ctx) + acl, _, err := me.client.UseTencentCosClient(bucket, cdcId).Bucket.GetACL(ctx) if err != nil { errRet = fmt.Errorf("cos [GetBucketACL] error: %s, bucket: %s", err.Error(), bucket) @@ -1171,7 +1173,7 @@ func GetBucketPublicACL(acl *cos.BucketGetACLResult) string { return s3.ObjectCannedACLPrivate } -func (me *CosService) GetBucketPullOrigin(ctx context.Context, bucket string) (result []map[string]interface{}, errRet error) { +func (me *CosService) GetBucketPullOrigin(ctx context.Context, bucket, cdcId string) (result []map[string]interface{}, errRet error) { logId := tccommon.GetLogId(ctx) defer func() { @@ -1182,7 +1184,7 @@ func (me *CosService) GetBucketPullOrigin(ctx context.Context, bucket string) (r }() ratelimit.Check("TencentcloudCosGetBucketPullOrigin") - originConfig, response, err := me.client.UseTencentCosClient(bucket).Bucket.GetOrigin(ctx) + originConfig, response, err := me.client.UseTencentCosClient(bucket, cdcId).Bucket.GetOrigin(ctx) if response.StatusCode == 404 { return make([]map[string]interface{}, 0), nil @@ -1253,14 +1255,14 @@ func (me *CosService) GetBucketPullOrigin(ctx context.Context, bucket string) (r return rules, nil } -func (me *CosService) PutBucketPullOrigin(ctx context.Context, bucket string, rules []cos.BucketOriginRule) (errRet error) { +func (me *CosService) PutBucketPullOrigin(ctx context.Context, bucket string, rules []cos.BucketOriginRule, cdcId string) (errRet error) { logId := tccommon.GetLogId(ctx) opt := &cos.BucketPutOriginOptions{ Rule: rules, } ratelimit.Check("PutBucketPullOrigin") - response, err := me.client.UseTencentCosClient(bucket).Bucket.PutOrigin(ctx, opt) + response, err := me.client.UseTencentCosClient(bucket, cdcId).Bucket.PutOrigin(ctx, opt) req, _ := json.Marshal(opt) resp, _ := json.Marshal(response.Response.Body) @@ -1282,7 +1284,7 @@ func (me *CosService) PutBucketPullOrigin(ctx context.Context, bucket string, ru return nil } -func (me *CosService) DeleteBucketPullOrigin(ctx context.Context, bucket string) (errRet error) { +func (me *CosService) DeleteBucketPullOrigin(ctx context.Context, bucket, cdcId string) (errRet error) { logId := tccommon.GetLogId(ctx) defer func() { @@ -1293,7 +1295,7 @@ func (me *CosService) DeleteBucketPullOrigin(ctx context.Context, bucket string) }() ratelimit.Check("DeleteBucketPullOrigin") - response, err := me.client.UseTencentCosClient(bucket).Bucket.DeleteOrigin(ctx) + response, err := me.client.UseTencentCosClient(bucket, cdcId).Bucket.DeleteOrigin(ctx) resp, _ := json.Marshal(response.Response.Body) if err != nil { @@ -1307,7 +1309,7 @@ func (me *CosService) DeleteBucketPullOrigin(ctx context.Context, bucket string) return nil } -func (me *CosService) GetBucketOriginDomain(ctx context.Context, bucket string) (result []map[string]interface{}, errRet error) { +func (me *CosService) GetBucketOriginDomain(ctx context.Context, bucket, cdcId string) (result []map[string]interface{}, errRet error) { logId := tccommon.GetLogId(ctx) defer func() { @@ -1318,7 +1320,7 @@ func (me *CosService) GetBucketOriginDomain(ctx context.Context, bucket string) }() ratelimit.Check("TencentcloudCosGetBucketOriginDomain") - domain, response, err := me.client.UseTencentCosClient(bucket).Bucket.GetDomain(ctx) + domain, response, err := me.client.UseTencentCosClient(bucket, cdcId).Bucket.GetDomain(ctx) if response != nil && response.StatusCode == 404 { log.Printf("[WARN] [GetBucketOriginDomain] returns %d, %s", 404, err) @@ -1348,14 +1350,14 @@ func (me *CosService) GetBucketOriginDomain(ctx context.Context, bucket string) return rules, nil } -func (me *CosService) PutBucketOriginDomain(ctx context.Context, bucket string, rules []cos.BucketDomainRule) (errRet error) { +func (me *CosService) PutBucketOriginDomain(ctx context.Context, bucket string, rules []cos.BucketDomainRule, cdcId string) (errRet error) { logId := tccommon.GetLogId(ctx) opt := &cos.BucketPutDomainOptions{ Rules: rules, } ratelimit.Check("PutBucketOriginDomain") - response, err := me.client.UseTencentCosClient(bucket).Bucket.PutDomain(ctx, opt) + response, err := me.client.UseTencentCosClient(bucket, cdcId).Bucket.PutDomain(ctx, opt) req, _ := json.Marshal(opt) resp, _ := json.Marshal(response.Response.Body) @@ -1377,7 +1379,7 @@ func (me *CosService) PutBucketOriginDomain(ctx context.Context, bucket string, return nil } -func (me *CosService) DeleteBucketOriginDomain(ctx context.Context, bucket string) (errRet error) { +func (me *CosService) DeleteBucketOriginDomain(ctx context.Context, bucket, cdcId string) (errRet error) { logId := tccommon.GetLogId(ctx) defer func() { @@ -1388,7 +1390,7 @@ func (me *CosService) DeleteBucketOriginDomain(ctx context.Context, bucket strin }() ratelimit.Check("DeleteBucketOriginDomain") - response, err := me.client.UseTencentCosClient(bucket).Bucket.DeleteDomain(ctx) + response, err := me.client.UseTencentCosClient(bucket, cdcId).Bucket.DeleteDomain(ctx) resp, _ := json.Marshal(response.Response.Body) if err != nil { @@ -1402,7 +1404,7 @@ func (me *CosService) DeleteBucketOriginDomain(ctx context.Context, bucket strin return nil } -func (me *CosService) GetBucketReplication(ctx context.Context, bucket string) (result *cos.GetBucketReplicationResult, errRet error) { +func (me *CosService) GetBucketReplication(ctx context.Context, bucket, cdcId string) (result *cos.GetBucketReplicationResult, errRet error) { logId := tccommon.GetLogId(ctx) defer func() { if errRet != nil { @@ -1412,7 +1414,7 @@ func (me *CosService) GetBucketReplication(ctx context.Context, bucket string) ( }() ratelimit.Check("GetBucketReplication") - result, response, err := me.client.UseTencentCosClient(bucket).Bucket.GetBucketReplication(ctx) + result, response, err := me.client.UseTencentCosClient(bucket, cdcId).Bucket.GetBucketReplication(ctx) if response.StatusCode == 404 { log.Printf("[WARN]%s, api[%s] returns %d", logId, "GetBucketReplication", response.StatusCode) @@ -1432,7 +1434,7 @@ func (me *CosService) GetBucketReplication(ctx context.Context, bucket string) ( return } -func (me *CosService) PutBucketReplication(ctx context.Context, bucket string, role string, rules []cos.BucketReplicationRule) (errRet error) { +func (me *CosService) PutBucketReplication(ctx context.Context, bucket string, role string, rules []cos.BucketReplicationRule, cdcId string) (errRet error) { logId := tccommon.GetLogId(ctx) option := &cos.PutBucketReplicationOptions{ @@ -1450,7 +1452,7 @@ func (me *CosService) PutBucketReplication(ctx context.Context, bucket string, r }() ratelimit.Check("PutBucketReplication") - response, err := me.client.UseTencentCosClient(bucket).Bucket.PutBucketReplication(ctx, option) + response, err := me.client.UseTencentCosClient(bucket, cdcId).Bucket.PutBucketReplication(ctx, option) resp, _ := json.Marshal(response.Response.Body) @@ -1465,7 +1467,7 @@ func (me *CosService) PutBucketReplication(ctx context.Context, bucket string, r return } -func (me *CosService) DeleteBucketReplication(ctx context.Context, bucket string) (errRet error) { +func (me *CosService) DeleteBucketReplication(ctx context.Context, bucket, cdcId string) (errRet error) { logId := tccommon.GetLogId(ctx) defer func() { if errRet != nil { @@ -1475,7 +1477,7 @@ func (me *CosService) DeleteBucketReplication(ctx context.Context, bucket string }() ratelimit.Check("DeleteBucketReplication") - response, err := me.client.UseTencentCosClient(bucket).Bucket.DeleteBucketReplication(ctx) + response, err := me.client.UseTencentCosClient(bucket, cdcId).Bucket.DeleteBucketReplication(ctx) resp, _ := json.Marshal(response.Response.Body) @@ -1490,7 +1492,7 @@ func (me *CosService) DeleteBucketReplication(ctx context.Context, bucket string return } -func (me *CosService) DescribeCosBucketDomainCertificate(ctx context.Context, certId string) (result *cos.BucketGetDomainCertificateResult, bucket string, errRet error) { +func (me *CosService) DescribeCosBucketDomainCertificate(ctx context.Context, certId, cdcId string) (result *cos.BucketGetDomainCertificateResult, bucket string, errRet error) { logId := tccommon.GetLogId(ctx) ids, err := me.parseCertId(certId) @@ -1513,7 +1515,7 @@ func (me *CosService) DescribeCosBucketDomainCertificate(ctx context.Context, ce } }() - result, response, err := me.client.UseTencentCosClient(bucket).Bucket.GetDomainCertificate(ctx, option) + result, response, err := me.client.UseTencentCosClient(bucket, cdcId).Bucket.GetDomainCertificate(ctx, option) resp, _ := json.Marshal(response.Response.Body) if response.StatusCode == 404 { log.Printf("[WARN]%s, api[%s] returns %d", logId, "GetDomainCertificate", response.StatusCode) @@ -1531,7 +1533,7 @@ func (me *CosService) DescribeCosBucketDomainCertificate(ctx context.Context, ce return } -func (me *CosService) DeleteCosBucketDomainCertificate(ctx context.Context, certId string) (errRet error) { +func (me *CosService) DeleteCosBucketDomainCertificate(ctx context.Context, certId, cdcId string) (errRet error) { logId := tccommon.GetLogId(ctx) ids, err := me.parseCertId(certId) @@ -1554,7 +1556,7 @@ func (me *CosService) DeleteCosBucketDomainCertificate(ctx context.Context, cert }() ratelimit.Check("DeleteDomainCertificate") - response, err := me.client.UseTencentCosClient(bucket).Bucket.DeleteDomainCertificate(ctx, option) + response, err := me.client.UseTencentCosClient(bucket, cdcId).Bucket.DeleteDomainCertificate(ctx, option) if err != nil { errRet = err @@ -1585,7 +1587,7 @@ func (me *CosService) parseCertId(configId string) (ret *CosBucketDomainCertItem return } -func (me *CosService) DescribeCosBucketRefererById(ctx context.Context, bucket string) (*cos.BucketGetRefererResult, error) { +func (me *CosService) DescribeCosBucketRefererById(ctx context.Context, bucket, cdcId string) (*cos.BucketGetRefererResult, error) { var errRet error logId := tccommon.GetLogId(ctx) @@ -1596,7 +1598,7 @@ func (me *CosService) DescribeCosBucketRefererById(ctx context.Context, bucket s }() resRaw, err := tccommon.RetryWithContext(ctx, tccommon.ReadRetryTimeout, func(ctx context.Context) (interface{}, error) { - res, _, err := me.client.UseTencentCosClient(bucket).Bucket.GetReferer(ctx) + res, _, err := me.client.UseTencentCosClient(bucket, cdcId).Bucket.GetReferer(ctx) return res, err }) @@ -1609,7 +1611,7 @@ func (me *CosService) DescribeCosBucketRefererById(ctx context.Context, bucket s return resRaw.(*cos.BucketGetRefererResult), nil } -func (me *CosService) DescribeCosBucketVersionById(ctx context.Context, bucket string) (*cos.BucketGetVersionResult, error) { +func (me *CosService) DescribeCosBucketVersionById(ctx context.Context, bucket, cdcId string) (*cos.BucketGetVersionResult, error) { var errRet error logId := tccommon.GetLogId(ctx) @@ -1620,7 +1622,7 @@ func (me *CosService) DescribeCosBucketVersionById(ctx context.Context, bucket s }() resRaw, err := tccommon.RetryWithContext(ctx, tccommon.ReadRetryTimeout, func(ctx context.Context) (interface{}, error) { - res, _, err := me.client.UseTencentCosClient(bucket).Bucket.GetVersioning(ctx) + res, _, err := me.client.UseTencentCosClient(bucket, cdcId).Bucket.GetVersioning(ctx) return res, err }) @@ -1633,7 +1635,7 @@ func (me *CosService) DescribeCosBucketVersionById(ctx context.Context, bucket s return resRaw.(*cos.BucketGetVersionResult), nil } -func (me *CosService) BucketPutIntelligentTiering(ctx context.Context, bucket string, opt *cos.BucketPutIntelligentTieringOptions) (errRet error) { +func (me *CosService) BucketPutIntelligentTiering(ctx context.Context, bucket string, opt *cos.BucketPutIntelligentTieringOptions, cdcId string) (errRet error) { logId := tccommon.GetLogId(ctx) req, _ := json.Marshal(opt) @@ -1646,7 +1648,7 @@ func (me *CosService) BucketPutIntelligentTiering(ctx context.Context, bucket st }() ratelimit.Check("BucketPutIntelligentTiering") - response, err := me.client.UseTencentCosClient(bucket).Bucket.PutIntelligentTiering(ctx, opt) + response, err := me.client.UseTencentCosClient(bucket, cdcId).Bucket.PutIntelligentTiering(ctx, opt) if err != nil { errRet = fmt.Errorf("cos bucket put intelligent tiering error: %s, bucket: %s", err.Error(), bucket) return @@ -1665,11 +1667,11 @@ func (me *CosService) BucketPutIntelligentTiering(ctx context.Context, bucket st return nil } -func (me *CosService) BucketGetIntelligentTiering(ctx context.Context, bucket string) (result *cos.BucketGetIntelligentTieringResult, errRet error) { +func (me *CosService) BucketGetIntelligentTiering(ctx context.Context, bucket, cdcId string) (result *cos.BucketGetIntelligentTieringResult, errRet error) { logId := tccommon.GetLogId(ctx) ratelimit.Check("BucketGetIntelligentTiering") - intelligentTieringResult, response, err := me.client.UseTencentCosClient(bucket).Bucket.GetIntelligentTiering(ctx) + intelligentTieringResult, response, err := me.client.UseTencentCosClient(bucket, cdcId).Bucket.GetIntelligentTiering(ctx) resp, _ := json.Marshal(response.Response.Body) if response.StatusCode == 404 { log.Printf("[WARN]%s, api[%s] returns %d", logId, "GetDomainCertificate", response.StatusCode) diff --git a/website/docs/d/cos_bucket_inventorys.html.markdown b/website/docs/d/cos_bucket_inventorys.html.markdown index 03b1ae19cd..8810362f42 100644 --- a/website/docs/d/cos_bucket_inventorys.html.markdown +++ b/website/docs/d/cos_bucket_inventorys.html.markdown @@ -24,6 +24,7 @@ data "tencentcloud_cos_bucket_inventorys" "cos_bucket_inventorys" { The following arguments are supported: * `bucket` - (Required, String) Bucket. +* `cdc_id` - (Optional, String) CDC cluster ID. * `result_output_file` - (Optional, String) Used to save results. ## Attributes Reference diff --git a/website/docs/d/cos_bucket_multipart_uploads.html.markdown b/website/docs/d/cos_bucket_multipart_uploads.html.markdown index e55bbc043f..65ba8fc681 100644 --- a/website/docs/d/cos_bucket_multipart_uploads.html.markdown +++ b/website/docs/d/cos_bucket_multipart_uploads.html.markdown @@ -24,6 +24,7 @@ data "tencentcloud_cos_bucket_multipart_uploads" "cos_bucket_multipart_uploads" The following arguments are supported: * `bucket` - (Required, String) Bucket. +* `cdc_id` - (Optional, String) CDC cluster ID. * `delimiter` - (Optional, String) The delimiter is a symbol, and the Object name contains the Object between the specified prefix and the first occurrence of delimiter characters as a set of elements: common prefix. If there is no prefix, start from the beginning of the path. * `encoding_type` - (Optional, String) Specifies the encoding format of the return value. Legal value: url. * `prefix` - (Optional, String) The returned Object key must be prefixed with Prefix. Note that when using the prefix query, the returned key still contains Prefix. diff --git a/website/docs/d/cos_bucket_object.html.markdown b/website/docs/d/cos_bucket_object.html.markdown index 654ad6e4f9..62a453b239 100644 --- a/website/docs/d/cos_bucket_object.html.markdown +++ b/website/docs/d/cos_bucket_object.html.markdown @@ -27,6 +27,7 @@ The following arguments are supported: * `bucket` - (Required, String) Name of the bucket that contains the objects to query. * `key` - (Required, String) The full path to the object inside the bucket. +* `cdc_id` - (Optional, String) CDC cluster ID. * `result_output_file` - (Optional, String) Used to save results. ## Attributes Reference diff --git a/website/docs/d/cos_buckets.html.markdown b/website/docs/d/cos_buckets.html.markdown index 6247dc91b1..91e255df07 100644 --- a/website/docs/d/cos_buckets.html.markdown +++ b/website/docs/d/cos_buckets.html.markdown @@ -25,6 +25,7 @@ data "tencentcloud_cos_buckets" "cos_buckets" { The following arguments are supported: * `bucket_prefix` - (Optional, String) A prefix string to filter results by bucket name. +* `cdc_id` - (Optional, String) CDC cluster ID. * `result_output_file` - (Optional, String) Used to save results. * `tags` - (Optional, Map) Tags to filter bucket. diff --git a/website/docs/r/cos_bucket.html.markdown b/website/docs/r/cos_bucket.html.markdown index d404e34a03..11f66ea4e4 100644 --- a/website/docs/r/cos_bucket.html.markdown +++ b/website/docs/r/cos_bucket.html.markdown @@ -22,7 +22,7 @@ locals { app_id = data.tencentcloud_user_info.info.app_id } -resource "tencentcloud_cos_bucket" "private_sbucket" { +resource "tencentcloud_cos_bucket" "example" { bucket = "private-bucket-${local.app_id}" acl = "private" } @@ -37,7 +37,7 @@ locals { app_id = data.tencentcloud_user_info.info.app_id } -resource "tencentcloud_cos_bucket" "multi_zone_bucket" { +resource "tencentcloud_cos_bucket" "example" { bucket = "multi-zone-bucket-${local.app_id}" acl = "private" multi_az = true @@ -55,7 +55,7 @@ locals { app_id = data.tencentcloud_user_info.info.app_id } -resource "tencentcloud_cos_bucket" "bucket_with_acl" { +resource "tencentcloud_cos_bucket" "example" { bucket = "bucketwith-acl-${local.app_id}" # NOTE: Specify the acl_body by the priority sequence of permission and user type with the following sequence: `CanonicalUser with READ`, `CanonicalUser with WRITE`, `CanonicalUser with FULL_CONTROL`, `CanonicalUser with WRITE_ACP`, `CanonicalUser with READ_ACP`, then specify the `Group` of permissions same as `CanonicalUser`. acl_body = <