diff --git a/.changelog/3659.txt b/.changelog/3659.txt new file mode 100644 index 0000000000..1e77fa55be --- /dev/null +++ b/.changelog/3659.txt @@ -0,0 +1,3 @@ +```release-note:new-resource +tencentcloud_cynosdb_cls_delivery +``` \ No newline at end of file diff --git a/go.mod b/go.mod index 0d9c788805..a1cffaa972 100644 --- a/go.mod +++ b/go.mod @@ -46,10 +46,10 @@ require ( github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.3.8 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cloudaudit v1.0.1033 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cls v1.0.1148 - github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.8 + github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.11 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.1206 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cwp v1.0.762 - github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.3.7 + github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.3.11 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dayu v1.0.335 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dbbrain v1.0.652 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dc v1.0.633 diff --git a/go.sum b/go.sum index d7278b1cdc..862572bdf5 100644 --- a/go.sum +++ b/go.sum @@ -935,9 +935,9 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.50/go.mod h github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.51/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.3/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.4/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= -github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.7/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= -github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.8 h1:DdeB0VtEs8UmJSPdNCTeqMW5ifX3Phlvu0o0WJXZ6yE= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.8/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.11 h1:pexLAyZVjVcxS8dmGY5qtiYyXZ68vKUmKPamMqsAoso= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.11/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/controlcenter v1.1.51 h1:pGwrfCBBCt1u+EDHwfNj9NLQpvk5MVKVMcsE7SvwqM4= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/controlcenter v1.1.51/go.mod h1:aTEdZDUTIOTS0CMDMMpKIkoc0HqtQ5+dRlaZO1KF/gg= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/csip v1.0.860 h1:F3esKBIT3HW9+7Gt8cVgf8X06VdGIczpgLBUECzSEzU= @@ -946,8 +946,8 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.1206 h1:tx8L5s github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.1206/go.mod h1:zkdrFNYxTFX7E3QRgNVayQi7fq/A1TYRKLkGE8NS0lQ= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cwp v1.0.762 h1:2egy69SP/wPsmnfozcQVZ6tUY6F6N/TpEe/7xtXrc/8= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cwp v1.0.762/go.mod h1:1XylIfNUbAzmNqi4XMhwcM3VhmUHdu1OYybOeaJ4sOw= -github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.3.7 h1:HvkbNkVwUdg//O4BKwd87BqSJIH3NJKOLVROdHeCcVQ= -github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.3.7/go.mod h1:k0qhXvE8aIHsC3tjaXr7VvOxcD8pEW+ohsFS5vMZquE= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.3.11 h1:MPAXIEszoMhyks18vqcDkMj8nzSV698+lXKfWvQQUg8= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.3.11/go.mod h1:EgkuM4By2dxr2qsJNupW4sX2eWCdepnRR3axxLC0flg= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dasb v1.0.970 h1:qVIRHgG1twsqF4aVN/x2T2yMRfPpsZBTNefDkqzM06M= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dasb v1.0.970/go.mod h1:NJuuQD4z6vcnsZnC7Tvz2U9hElNS1wroc34UQbZvP2U= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dayu v1.0.335 h1:D8qrelkK5udv8RzJJIABMzItGIyaZoYnxEVeIsYqiNw= diff --git a/tencentcloud/provider.go b/tencentcloud/provider.go index 3e0fdc6a84..1f0549ae1d 100644 --- a/tencentcloud/provider.go +++ b/tencentcloud/provider.go @@ -1813,6 +1813,7 @@ func Provider() *schema.Provider { "tencentcloud_cynosdb_audit_log_file": cynosdb.ResourceTencentCloudCynosdbAuditLogFile(), "tencentcloud_cynosdb_security_group": cynosdb.ResourceTencentCloudCynosdbSecurityGroup(), "tencentcloud_cynosdb_audit_service": cynosdb.ResourceTencentCloudCynosdbAuditService(), + "tencentcloud_cynosdb_cls_delivery": cynosdb.ResourceTencentCloudCynosdbClsDelivery(), "tencentcloud_vod_adaptive_dynamic_streaming_template": vod.ResourceTencentCloudVodAdaptiveDynamicStreamingTemplate(), "tencentcloud_vod_image_sprite_template": vod.ResourceTencentCloudVodImageSpriteTemplate(), "tencentcloud_vod_procedure_template": vod.ResourceTencentCloudVodProcedureTemplate(), diff --git a/tencentcloud/provider.md b/tencentcloud/provider.md index d5ab0d088c..314f99b2e6 100644 --- a/tencentcloud/provider.md +++ b/tencentcloud/provider.md @@ -548,6 +548,7 @@ tencentcloud_cynosdb_backup_config tencentcloud_cynosdb_ssl tencentcloud_cynosdb_cluster_transparent_encrypt tencentcloud_cynosdb_audit_service +tencentcloud_cynosdb_cls_delivery Direct Connect(DC) Data Source diff --git a/tencentcloud/services/cynosdb/resource_tc_cynosdb_cls_delivery.go b/tencentcloud/services/cynosdb/resource_tc_cynosdb_cls_delivery.go new file mode 100644 index 0000000000..9ba4ab3138 --- /dev/null +++ b/tencentcloud/services/cynosdb/resource_tc_cynosdb_cls_delivery.go @@ -0,0 +1,713 @@ +package cynosdb + +import ( + "context" + "fmt" + "log" + "strings" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + cynosdb "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb/v20190107" + cynosdbv20190107 "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb/v20190107" + + tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common" + "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper" +) + +func ResourceTencentCloudCynosdbClsDelivery() *schema.Resource { + return &schema.Resource{ + Create: resourceTencentCloudCynosdbClsDeliveryCreate, + Read: resourceTencentCloudCynosdbClsDeliveryRead, + Update: resourceTencentCloudCynosdbClsDeliveryUpdate, + Delete: resourceTencentCloudCynosdbClsDeliveryDelete, + Importer: &schema.ResourceImporter{ + State: schema.ImportStatePassthrough, + }, + Schema: map[string]*schema.Schema{ + "instance_id": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + Description: "Intance ID.", + }, + + "cls_info_list": { + Type: schema.TypeList, + Required: true, + ForceNew: true, + MaxItems: 1, + Description: "Log shipping configuration.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "region": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + Description: "Log delivery area.", + }, + "topic_id": { + Type: schema.TypeString, + Optional: true, + Computed: true, + ForceNew: true, + Description: "Log topic ID.", + }, + "topic_name": { + Type: schema.TypeString, + Optional: true, + Computed: true, + ForceNew: true, + Description: "Log topic name.", + }, + "group_id": { + Type: schema.TypeString, + Optional: true, + Computed: true, + ForceNew: true, + Description: "Log set ID.", + }, + "group_name": { + Type: schema.TypeString, + Optional: true, + Computed: true, + ForceNew: true, + Description: "Log set name.", + }, + }, + }, + }, + + "log_type": { + Type: schema.TypeString, + Optional: true, + Computed: true, + ForceNew: true, + Description: "Log type.", + }, + + "running_status": { + Type: schema.TypeBool, + Optional: true, + Computed: true, + Description: "Delivery status. true: Enabled; false: Disabled.", + }, + }, + } +} + +func resourceTencentCloudCynosdbClsDeliveryCreate(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_cynosdb_cls_delivery.create")() + defer tccommon.InconsistentCheck(d, meta)() + + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta) + request = cynosdbv20190107.NewCreateCLSDeliveryRequest() + response = cynosdbv20190107.NewCreateCLSDeliveryResponse() + instanceId string + topicId string + ) + + if v, ok := d.GetOk("instance_id"); ok { + request.InstanceId = helper.String(v.(string)) + instanceId = v.(string) + } + + if v, ok := d.GetOk("cls_info_list"); ok { + for _, item := range v.([]interface{}) { + dMap := item.(map[string]interface{}) + clsInfo := cynosdb.CLSInfo{} + if v, ok := dMap["region"]; ok && v.(string) != "" { + clsInfo.Region = helper.String(v.(string)) + } + + if v, ok := dMap["topic_id"]; ok && v.(string) != "" { + clsInfo.TopicId = helper.String(v.(string)) + topicId = v.(string) + + clsInfo.TopicOperation = helper.String("reuse") + clsInfo.GroupOperation = helper.String("reuse") + } + + if v, ok := dMap["topic_name"]; ok && v.(string) != "" { + clsInfo.TopicName = helper.String(v.(string)) + + clsInfo.TopicOperation = helper.String("create") + clsInfo.GroupOperation = helper.String("create") + } + + if v, ok := dMap["group_id"]; ok && v.(string) != "" { + clsInfo.GroupId = helper.String(v.(string)) + + clsInfo.TopicOperation = helper.String("reuse") + clsInfo.GroupOperation = helper.String("reuse") + } + + if v, ok := dMap["group_name"]; ok && v.(string) != "" { + clsInfo.GroupName = helper.String(v.(string)) + + clsInfo.TopicOperation = helper.String("create") + clsInfo.GroupOperation = helper.String("create") + } + + request.CLSInfoList = append(request.CLSInfoList, &clsInfo) + } + } + + if v, ok := d.GetOk("log_type"); ok { + request.LogType = helper.String(v.(string)) + } + + reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCynosdbClient().CreateCLSDeliveryWithContext(ctx, request) + if e != nil { + return tccommon.RetryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString()) + } + + if result == nil || result.Response == nil || result.Response.TaskId == nil { + return resource.NonRetryableError(fmt.Errorf("Create cynosdb cls delivery failed, Response is nil.")) + } + + response = result + return nil + }) + + if reqErr != nil { + log.Printf("[CRITAL]%s create cynosdb cls delivery failed, reason:%+v", logId, reqErr) + return reqErr + } + + // wait + taskId := *response.Response.TaskId + waitReq := cynosdb.NewDescribeTasksRequest() + waitReq.Filters = []*cynosdb.QueryFilter{ + { + Values: helper.Strings([]string{helper.Int64ToStr(taskId)}), + Names: helper.Strings([]string{"TaskId"}), + ExactMatch: helper.Bool(true), + }, + } + + reqErr = resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCynosdbClient().DescribeTasks(waitReq) + if e != nil { + return tccommon.RetryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, waitReq.GetAction(), waitReq.ToJsonString(), result.ToJsonString()) + } + + if result == nil || result.Response == nil || result.Response.TaskList == nil || len(result.Response.TaskList) == 0 { + return resource.NonRetryableError(fmt.Errorf("Describe tasks failed, Response is nil.")) + } + + task := result.Response.TaskList[0] + if task.Status == nil { + return resource.NonRetryableError(fmt.Errorf("Status is nil.")) + } + + if *task.Status == "success" { + return nil + } + + return resource.RetryableError(fmt.Errorf("Tasks is still running, status is %s.", *task.Status)) + }) + + if reqErr != nil { + log.Printf("[CRITAL]%s describe tasks failed, reason:%+v", logId, reqErr) + return reqErr + } + + // get topicId + if topicId == "" { + service := CynosdbService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + respData, err := service.DescribeCynosdbClsDeliveryById(ctx, instanceId, topicId) + if err != nil { + return err + } + + if respData == nil { + return fmt.Errorf("Describe instance cls log delivery failed, Response is nil.") + } + + if respData.TopicId == nil { + return fmt.Errorf("TopicId is nil.") + } + + topicId = *respData.TopicId + } + + d.SetId(strings.Join([]string{instanceId, topicId}, tccommon.FILED_SP)) + + // set status + if v, ok := d.GetOkExists("running_status"); ok { + if !v.(bool) { + request := cynosdbv20190107.NewStopCLSDeliveryRequest() + response := cynosdbv20190107.NewStopCLSDeliveryResponse() + request.InstanceId = helper.String(instanceId) + request.CLSTopicIds = helper.Strings([]string{topicId}) + reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCynosdbClient().StopCLSDeliveryWithContext(ctx, request) + if e != nil { + return tccommon.RetryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString()) + } + + if result == nil || result.Response == nil || result.Response.TaskId == nil { + return resource.NonRetryableError(fmt.Errorf("Stop cynosdb cls delivery failed, Response is nil.")) + } + + response = result + return nil + }) + + if reqErr != nil { + log.Printf("[CRITAL]%s stop cynosdb cls delivery failed, reason:%+v", logId, reqErr) + return reqErr + } + + taskId := *response.Response.TaskId + waitReq := cynosdb.NewDescribeTasksRequest() + waitReq.Filters = []*cynosdb.QueryFilter{ + { + Values: helper.Strings([]string{helper.Int64ToStr(taskId)}), + Names: helper.Strings([]string{"TaskId"}), + ExactMatch: helper.Bool(true), + }, + } + + reqErr = resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCynosdbClient().DescribeTasks(waitReq) + if e != nil { + return tccommon.RetryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, waitReq.GetAction(), waitReq.ToJsonString(), result.ToJsonString()) + } + + if result == nil || result.Response == nil || result.Response.TaskList == nil || len(result.Response.TaskList) == 0 { + return resource.NonRetryableError(fmt.Errorf("Describe tasks failed, Response is nil.")) + } + + task := result.Response.TaskList[0] + if task.Status == nil { + return resource.NonRetryableError(fmt.Errorf("Status is nil.")) + } + + if *task.Status == "success" { + return nil + } + + return resource.RetryableError(fmt.Errorf("Tasks is still running, status is %s.", *task.Status)) + }) + + if reqErr != nil { + log.Printf("[CRITAL]%s describe tasks failed, reason:%+v", logId, reqErr) + return reqErr + } + } + } + return resourceTencentCloudCynosdbClsDeliveryRead(d, meta) +} + +func resourceTencentCloudCynosdbClsDeliveryRead(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_cynosdb_cls_delivery.read")() + defer tccommon.InconsistentCheck(d, meta)() + + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta) + service = CynosdbService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + ) + + idSplit := strings.Split(d.Id(), tccommon.FILED_SP) + if len(idSplit) != 2 { + return fmt.Errorf("id is broken,%s", d.Id()) + } + + instanceId := idSplit[0] + topicId := idSplit[1] + + respData, err := service.DescribeCynosdbClsDeliveryById(ctx, instanceId, topicId) + if err != nil { + return err + } + + if respData == nil { + log.Printf("[WARN]%s resource `tencentcloud_cynosdb_cls_delivery` [%s] not found, please check if it has been deleted.\n", logId, d.Id()) + d.SetId("") + return nil + } + + if respData.InstanceId != nil { + _ = d.Set("instance_id", *respData.InstanceId) + } + + dMap := make(map[string]interface{}, 0) + if respData.Region != nil { + dMap["region"] = *respData.Region + } + + if respData.TopicId != nil { + dMap["topic_id"] = *respData.TopicId + } + + if respData.TopicName != nil { + dMap["topic_name"] = trimPrefixSuffix(*respData.TopicName, "cloud_cynos_", "_topic") + } + + if respData.GroupId != nil { + dMap["group_id"] = *respData.GroupId + } + + if respData.GroupName != nil { + dMap["group_name"] = trimPrefixSuffix(*respData.GroupName, "cloud_cynos_", "_logset") + } + + _ = d.Set("cls_info_list", []interface{}{dMap}) + + if respData.LogType != nil { + _ = d.Set("log_type", *respData.LogType) + } + + if respData.Status != nil { + if *respData.Status == "running" { + _ = d.Set("running_status", true) + } else if *respData.Status == "offlined" { + _ = d.Set("running_status", false) + } + } + + return nil +} + +func resourceTencentCloudCynosdbClsDeliveryUpdate(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_cynosdb_cls_delivery.update")() + defer tccommon.InconsistentCheck(d, meta)() + + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta) + ) + + idSplit := strings.Split(d.Id(), tccommon.FILED_SP) + if len(idSplit) != 2 { + return fmt.Errorf("id is broken,%s", d.Id()) + } + + instanceId := idSplit[0] + topicId := idSplit[1] + + if d.HasChange("running_status") { + if v, ok := d.GetOkExists("running_status"); ok { + if v.(bool) { + request := cynosdbv20190107.NewStartCLSDeliveryRequest() + response := cynosdbv20190107.NewStartCLSDeliveryResponse() + request.InstanceId = helper.String(instanceId) + request.CLSTopicIds = helper.Strings([]string{topicId}) + reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCynosdbClient().StartCLSDeliveryWithContext(ctx, request) + if e != nil { + return tccommon.RetryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString()) + } + + if result == nil || result.Response == nil || result.Response.TaskId == nil { + return resource.NonRetryableError(fmt.Errorf("Start cynosdb cls delivery failed, Response is nil.")) + } + + response = result + return nil + }) + + if reqErr != nil { + log.Printf("[CRITAL]%s start cynosdb cls delivery failed, reason:%+v", logId, reqErr) + return reqErr + } + + taskId := *response.Response.TaskId + waitReq := cynosdb.NewDescribeTasksRequest() + waitReq.Filters = []*cynosdb.QueryFilter{ + { + Values: helper.Strings([]string{helper.Int64ToStr(taskId)}), + Names: helper.Strings([]string{"TaskId"}), + ExactMatch: helper.Bool(true), + }, + } + + reqErr = resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCynosdbClient().DescribeTasks(waitReq) + if e != nil { + return tccommon.RetryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, waitReq.GetAction(), waitReq.ToJsonString(), result.ToJsonString()) + } + + if result == nil || result.Response == nil || result.Response.TaskList == nil || len(result.Response.TaskList) == 0 { + return resource.NonRetryableError(fmt.Errorf("Describe tasks failed, Response is nil.")) + } + + task := result.Response.TaskList[0] + if task.Status == nil { + return resource.NonRetryableError(fmt.Errorf("Status is nil.")) + } + + if *task.Status == "success" { + return nil + } + + return resource.RetryableError(fmt.Errorf("Tasks is still running, status is %s.", *task.Status)) + }) + + if reqErr != nil { + log.Printf("[CRITAL]%s describe tasks failed, reason:%+v", logId, reqErr) + return reqErr + } + } else { + request := cynosdbv20190107.NewStopCLSDeliveryRequest() + response := cynosdbv20190107.NewStopCLSDeliveryResponse() + request.InstanceId = helper.String(instanceId) + request.CLSTopicIds = helper.Strings([]string{topicId}) + reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCynosdbClient().StopCLSDeliveryWithContext(ctx, request) + if e != nil { + return tccommon.RetryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString()) + } + + if result == nil || result.Response == nil || result.Response.TaskId == nil { + return resource.NonRetryableError(fmt.Errorf("Stop cynosdb cls delivery failed, Response is nil.")) + } + + response = result + return nil + }) + + if reqErr != nil { + log.Printf("[CRITAL]%s stop cynosdb cls delivery failed, reason:%+v", logId, reqErr) + return reqErr + } + + taskId := *response.Response.TaskId + waitReq := cynosdb.NewDescribeTasksRequest() + waitReq.Filters = []*cynosdb.QueryFilter{ + { + Values: helper.Strings([]string{helper.Int64ToStr(taskId)}), + Names: helper.Strings([]string{"TaskId"}), + ExactMatch: helper.Bool(true), + }, + } + + reqErr = resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCynosdbClient().DescribeTasks(waitReq) + if e != nil { + return tccommon.RetryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, waitReq.GetAction(), waitReq.ToJsonString(), result.ToJsonString()) + } + + if result == nil || result.Response == nil || result.Response.TaskList == nil || len(result.Response.TaskList) == 0 { + return resource.NonRetryableError(fmt.Errorf("Describe tasks failed, Response is nil.")) + } + + task := result.Response.TaskList[0] + if task.Status == nil { + return resource.NonRetryableError(fmt.Errorf("Status is nil.")) + } + + if *task.Status == "success" { + return nil + } + + return resource.RetryableError(fmt.Errorf("Tasks is still running, status is %s.", *task.Status)) + }) + + if reqErr != nil { + log.Printf("[CRITAL]%s describe tasks failed, reason:%+v", logId, reqErr) + return reqErr + } + } + } + } + + return resourceTencentCloudCynosdbClsDeliveryRead(d, meta) +} + +func resourceTencentCloudCynosdbClsDeliveryDelete(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_cynosdb_cls_delivery.delete")() + defer tccommon.InconsistentCheck(d, meta)() + + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta) + service = CynosdbService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + request = cynosdbv20190107.NewDeleteCLSDeliveryRequest() + response = cynosdbv20190107.NewDeleteCLSDeliveryResponse() + ) + + idSplit := strings.Split(d.Id(), tccommon.FILED_SP) + if len(idSplit) != 2 { + return fmt.Errorf("id is broken,%s", d.Id()) + } + + instanceId := idSplit[0] + topicId := idSplit[1] + + // get status + respData, err := service.DescribeCynosdbClsDeliveryById(ctx, instanceId, topicId) + if err != nil { + return err + } + + if respData == nil { + return fmt.Errorf("Describe instance cls log delivery failed, Response is nil.") + } + + if respData.Status == nil { + return fmt.Errorf("Status is nil.") + } + + // stop first + if *respData.Status == "running" { + stopReq := cynosdbv20190107.NewStopCLSDeliveryRequest() + stopResp := cynosdbv20190107.NewStopCLSDeliveryResponse() + stopReq.InstanceId = helper.String(instanceId) + stopReq.CLSTopicIds = helper.Strings([]string{topicId}) + reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCynosdbClient().StopCLSDeliveryWithContext(ctx, stopReq) + if e != nil { + return tccommon.RetryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, stopReq.GetAction(), stopReq.ToJsonString(), result.ToJsonString()) + } + + if result == nil || result.Response == nil || result.Response.TaskId == nil { + return resource.NonRetryableError(fmt.Errorf("Stop cynosdb cls delivery failed, Response is nil.")) + } + + stopResp = result + return nil + }) + + if reqErr != nil { + log.Printf("[CRITAL]%s stop cynosdb cls delivery failed, reason:%+v", logId, reqErr) + return reqErr + } + + // wait stop + taskId := *stopResp.Response.TaskId + waitReq := cynosdb.NewDescribeTasksRequest() + waitReq.Filters = []*cynosdb.QueryFilter{ + { + Values: helper.Strings([]string{helper.Int64ToStr(taskId)}), + Names: helper.Strings([]string{"TaskId"}), + ExactMatch: helper.Bool(true), + }, + } + + reqErr = resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCynosdbClient().DescribeTasks(waitReq) + if e != nil { + return tccommon.RetryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, waitReq.GetAction(), waitReq.ToJsonString(), result.ToJsonString()) + } + + if result == nil || result.Response == nil || result.Response.TaskList == nil || len(result.Response.TaskList) == 0 { + return resource.NonRetryableError(fmt.Errorf("Describe tasks failed, Response is nil.")) + } + + task := result.Response.TaskList[0] + if task.Status == nil { + return resource.NonRetryableError(fmt.Errorf("Status is nil.")) + } + + if *task.Status == "success" { + return nil + } + + return resource.RetryableError(fmt.Errorf("Tasks is still running, status is %s.", *task.Status)) + }) + + if reqErr != nil { + log.Printf("[CRITAL]%s describe tasks failed, reason:%+v", logId, reqErr) + return reqErr + } + } + + // delete + request.InstanceId = &instanceId + request.CLSTopicIds = helper.Strings([]string{topicId}) + reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCynosdbClient().DeleteCLSDeliveryWithContext(ctx, request) + if e != nil { + return tccommon.RetryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString()) + } + + if result == nil || result.Response == nil || result.Response.TaskId == nil { + return resource.NonRetryableError(fmt.Errorf("Delete cynosdb cls delivery failed, Response is nil.")) + } + + response = result + return nil + }) + + if reqErr != nil { + log.Printf("[CRITAL]%s delete cynosdb cls delivery failed, reason:%+v", logId, reqErr) + return reqErr + } + + // wait delete + taskId := *response.Response.TaskId + waitReq := cynosdb.NewDescribeTasksRequest() + waitReq.Filters = []*cynosdb.QueryFilter{ + { + Values: helper.Strings([]string{helper.Int64ToStr(taskId)}), + Names: helper.Strings([]string{"TaskId"}), + ExactMatch: helper.Bool(true), + }, + } + + reqErr = resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCynosdbClient().DescribeTasks(waitReq) + if e != nil { + return tccommon.RetryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, waitReq.GetAction(), waitReq.ToJsonString(), result.ToJsonString()) + } + + if result == nil || result.Response == nil || result.Response.TaskList == nil || len(result.Response.TaskList) == 0 { + return resource.NonRetryableError(fmt.Errorf("Describe tasks failed, Response is nil.")) + } + + task := result.Response.TaskList[0] + if task.Status == nil { + return resource.NonRetryableError(fmt.Errorf("Status is nil.")) + } + + if *task.Status == "success" { + return nil + } + + return resource.RetryableError(fmt.Errorf("Tasks is still running, status is %s.", *task.Status)) + }) + + if reqErr != nil { + log.Printf("[CRITAL]%s describe tasks failed, reason:%+v", logId, reqErr) + return reqErr + } + + return nil +} + +func trimPrefixSuffix(s, prefix, suffix string) string { + trimmed := strings.TrimPrefix(s, prefix) + trimmed = strings.TrimSuffix(trimmed, suffix) + return trimmed +} diff --git a/tencentcloud/services/cynosdb/resource_tc_cynosdb_cls_delivery.md b/tencentcloud/services/cynosdb/resource_tc_cynosdb_cls_delivery.md new file mode 100644 index 0000000000..c27b997028 --- /dev/null +++ b/tencentcloud/services/cynosdb/resource_tc_cynosdb_cls_delivery.md @@ -0,0 +1,43 @@ +Provides a resource to create a CynosDB cls delivery + +~> **NOTE:** After executing `terraform destroy`, slow logs will no longer be uploaded, but historical logs will continue to be stored in the log topic until they expire. Log storage fees will continue to be charged during this period. If you do not wish to continue storing historical logs, you can go to CLS to delete the log topic. + +Example Usage + +Use topic_name and group_name + +```hcl +resource "tencentcloud_cynosdb_cls_delivery" "example" { + instance_id = "cynosdbmysql-ins-m2903cxq" + cls_info_list { + region = "ap-guangzhou" + topic_name = "tf-example" + group_name = "tf-example" + } + + running_status = true +} +``` + +Use topic_id and group_id + +```hcl +resource "tencentcloud_cynosdb_cls_delivery" "example" { + instance_id = "cynosdbmysql-ins-m2903cxq" + cls_info_list { + region = "ap-guangzhou" + topic_id = "a9d582f8-8c14-462c-94b8-bbc579a04f02" + group_id = "67fca013-379b-4bc6-8e72-390227d869c4" + } + + running_status = false +} +``` + +Import + +CynosDB cls delivery can be imported using the instanceId#topicId, e.g. + +``` +terraform import tencentcloud_cynosdb_cls_delivery.example cynosdbmysql-ins-m2903cxq#222932ff-a10a-41f1-8d29-ff0cfe2a2d99 +``` diff --git a/tencentcloud/services/cynosdb/resource_tc_cynosdb_cls_delivery_test.go b/tencentcloud/services/cynosdb/resource_tc_cynosdb_cls_delivery_test.go new file mode 100644 index 0000000000..cfab9639ea --- /dev/null +++ b/tencentcloud/services/cynosdb/resource_tc_cynosdb_cls_delivery_test.go @@ -0,0 +1,64 @@ +package cynosdb_test + +import ( + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + + tcacctest "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/acctest" +) + +func TestAccTencentCloudCynosdbClsDeliveryResource_basic(t *testing.T) { + t.Parallel() + resource.Test(t, resource.TestCase{ + PreCheck: func() { + tcacctest.AccPreCheck(t) + }, + Providers: tcacctest.AccProviders, + Steps: []resource.TestStep{ + { + Config: testAccCynosdbClsDelivery, + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrSet("tencentcloud_cynosdb_cls_delivery.example", "id"), + ), + }, + { + Config: testAccCynosdbClsDeliveryUpdate, + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrSet("tencentcloud_cynosdb_cls_delivery.example", "id"), + ), + }, + { + ResourceName: "tencentcloud_cynosdb_cls_delivery.example", + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + +const testAccCynosdbClsDelivery = ` +resource "tencentcloud_cynosdb_cls_delivery" "example" { + instance_id = "cynosdbmysql-ins-m2903cxq" + cls_info_list { + region = "ap-guangzhou" + topic_id = "a9d582f8-8c14-462c-94b8-bbc579a04f02" + group_id = "67fca013-379b-4bc6-8e72-390227d869c4" + } + + running_status = false +} +` + +const testAccCynosdbClsDeliveryUpdate = ` +resource "tencentcloud_cynosdb_cls_delivery" "example" { + instance_id = "cynosdbmysql-ins-m2903cxq" + cls_info_list { + region = "ap-guangzhou" + topic_id = "a9d582f8-8c14-462c-94b8-bbc579a04f02" + group_id = "67fca013-379b-4bc6-8e72-390227d869c4" + } + + running_status = true +} +` diff --git a/tencentcloud/services/cynosdb/service_tencentcloud_cynosdb.go b/tencentcloud/services/cynosdb/service_tencentcloud_cynosdb.go index f35f172887..eacbba1128 100644 --- a/tencentcloud/services/cynosdb/service_tencentcloud_cynosdb.go +++ b/tencentcloud/services/cynosdb/service_tencentcloud_cynosdb.go @@ -3079,3 +3079,50 @@ func (me *CynosdbService) DescribeCynosdbAuditServiceById(ctx context.Context, i ret = response.Response.Items[0] return } + +func (me *CynosdbService) DescribeCynosdbClsDeliveryById(ctx context.Context, instanceId, topicId string) (ret *cynosdb.InstanceCLSDeliveryInfo, errRet error) { + logId := tccommon.GetLogId(ctx) + + request := cynosdb.NewDescribeInstanceCLSLogDeliveryRequest() + response := cynosdb.NewDescribeInstanceCLSLogDeliveryResponse() + request.InstanceId = &instanceId + + defer func() { + if errRet != nil { + log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, request.GetAction(), request.ToJsonString(), errRet.Error()) + } + }() + + err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError { + ratelimit.Check(request.GetAction()) + result, e := me.client.UseCynosdbClient().DescribeInstanceCLSLogDelivery(request) + if e != nil { + return tccommon.RetryError(e) + } + + if result == nil || result.Response == nil || result.Response.InstanceCLSDeliveryInfos == nil || len(result.Response.InstanceCLSDeliveryInfos) == 0 { + return resource.NonRetryableError(fmt.Errorf("Describe instance cls log delivery failed, Response is nil.")) + } + + response = result + return nil + }) + + if err != nil { + errRet = err + return + } + + if topicId == "" { + ret = response.Response.InstanceCLSDeliveryInfos[0] + } else { + for _, item := range response.Response.InstanceCLSDeliveryInfos { + if item != nil && item.TopicId != nil && *item.TopicId == topicId { + ret = item + return + } + } + } + + return +} diff --git a/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/http/request.go b/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/http/request.go index f7856f10e3..7f4a06c888 100644 --- a/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/http/request.go +++ b/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/http/request.go @@ -265,7 +265,7 @@ func CompleteCommonParams(request Request, region string, requestClient string) params["Action"] = request.GetAction() params["Timestamp"] = strconv.FormatInt(time.Now().Unix(), 10) params["Nonce"] = strconv.Itoa(rand.Int()) - params["RequestClient"] = "SDK_GO_1.3.8" + params["RequestClient"] = "SDK_GO_1.3.11" if requestClient != "" { params["RequestClient"] += ": " + requestClient } diff --git a/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb/v20190107/models.go b/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb/v20190107/models.go index d1b3f2dc5a..89b3226934 100644 --- a/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb/v20190107/models.go +++ b/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb/v20190107/models.go @@ -242,7 +242,9 @@ type AddInstancesRequestParams struct { // 新增只读实例数,取值范围为(0,15] ReadOnlyCount *int64 `json:"ReadOnlyCount,omitnil,omitempty" name:"ReadOnlyCount"` - // 实例机器类型 + // 实例机器类型,支持值如下: + // - common:表示通用型 + // - exclusive:表示独享型 DeviceType *string `json:"DeviceType,omitnil,omitempty" name:"DeviceType"` // 实例组ID,在已有RO组中新增实例时使用,不传则新增RO组。当前版本不建议传输该值。 @@ -303,7 +305,9 @@ type AddInstancesRequest struct { // 新增只读实例数,取值范围为(0,15] ReadOnlyCount *int64 `json:"ReadOnlyCount,omitnil,omitempty" name:"ReadOnlyCount"` - // 实例机器类型 + // 实例机器类型,支持值如下: + // - common:表示通用型 + // - exclusive:表示独享型 DeviceType *string `json:"DeviceType,omitnil,omitempty" name:"DeviceType"` // 实例组ID,在已有RO组中新增实例时使用,不传则新增RO组。当前版本不建议传输该值。 @@ -872,6 +876,9 @@ type BinlogItem struct { // Binlog文件ID BinlogId *int64 `json:"BinlogId,omitnil,omitempty" name:"BinlogId"` + + // binlog所跨地域 + CrossRegions []*string `json:"CrossRegions,omitnil,omitempty" name:"CrossRegions"` } type BizTaskInfo struct { @@ -1485,12 +1492,14 @@ type ClusterInstanceDetail struct { InstanceDeviceType *string `json:"InstanceDeviceType,omitnil,omitempty" name:"InstanceDeviceType"` // 实例存储类型 + // 说明:仅当要查询的资源为 LibraDB 时,此参数才会返回值。 InstanceStorageType *string `json:"InstanceStorageType,omitnil,omitempty" name:"InstanceStorageType"` // 数据库类型 DbMode *string `json:"DbMode,omitnil,omitempty" name:"DbMode"` // 节点列表 + // 说明:仅当要查询的资源为 LibraDB 时,此参数才会返回值。 NodeList []*string `json:"NodeList,omitnil,omitempty" name:"NodeList"` } @@ -3578,7 +3587,16 @@ type CynosdbClusterDetail struct { // 物理可用区 PhysicalZone *string `json:"PhysicalZone,omitnil,omitempty" name:"PhysicalZone"` - // 状态 + // 状态,支持的值如下: + // - creating:创建中 + // - running:运行中 + // - isolating:隔离中 + // - isolated:已隔离 + // - activating:从回收站重新恢复 + // - offlining:下线中 + // - offlined:已下线 + // - deleting:删除中 + // - deleted:已删除 Status *string `json:"Status,omitnil,omitempty" name:"Status"` // 状态描述 @@ -3967,11 +3985,9 @@ type CynosdbInstanceDetail struct { // running:运行中 // isolating:隔离中 // isolated:已隔离 - // activating:解隔离中 + // activating:恢复中 // offlining:下线中 // offlined:已下线 - // deleting:删除中 - // deleted:已删除 Status *string `json:"Status,omitnil,omitempty" name:"Status"` // 实例状态中文描述 @@ -6063,7 +6079,7 @@ type DescribeBinlogsRequestParams struct { // 偏移量 Offset *int64 `json:"Offset,omitnil,omitempty" name:"Offset"` - // 限制条数 + // 限制条数,默认值为20 Limit *int64 `json:"Limit,omitnil,omitempty" name:"Limit"` } @@ -6082,7 +6098,7 @@ type DescribeBinlogsRequest struct { // 偏移量 Offset *int64 `json:"Offset,omitnil,omitempty" name:"Offset"` - // 限制条数 + // 限制条数,默认值为20 Limit *int64 `json:"Limit,omitnil,omitempty" name:"Limit"` } @@ -10327,7 +10343,9 @@ type InquirePriceCreateRequestParams struct { // 存储购买类型,可选值为:PREPAID, POSTPAID StoragePayMode *string `json:"StoragePayMode,omitnil,omitempty" name:"StoragePayMode"` - // 实例设备类型 + // 实例设备类型,支持值如下: + // - common:表示通用型 + // - exclusive:表示独享型 DeviceType *string `json:"DeviceType,omitnil,omitempty" name:"DeviceType"` // CPU核数,PREPAID与POSTPAID实例类型必传 @@ -10364,7 +10382,9 @@ type InquirePriceCreateRequest struct { // 存储购买类型,可选值为:PREPAID, POSTPAID StoragePayMode *string `json:"StoragePayMode,omitnil,omitempty" name:"StoragePayMode"` - // 实例设备类型 + // 实例设备类型,支持值如下: + // - common:表示通用型 + // - exclusive:表示独享型 DeviceType *string `json:"DeviceType,omitnil,omitempty" name:"DeviceType"` // CPU核数,PREPAID与POSTPAID实例类型必传 @@ -13354,7 +13374,6 @@ type ModifyProxyRwSplitRequestParams struct { WeightMode *string `json:"WeightMode,omitnil,omitempty" name:"WeightMode"` // 实例只读权重。 - // 该参数必填。 InstanceWeights []*ProxyInstanceWeight `json:"InstanceWeights,omitnil,omitempty" name:"InstanceWeights"` // 是否开启故障转移,代理出现故障后,连接地址将路由到主实例,取值:"yes" , "no" @@ -13418,7 +13437,6 @@ type ModifyProxyRwSplitRequest struct { WeightMode *string `json:"WeightMode,omitnil,omitempty" name:"WeightMode"` // 实例只读权重。 - // 该参数必填。 InstanceWeights []*ProxyInstanceWeight `json:"InstanceWeights,omitnil,omitempty" name:"InstanceWeights"` // 是否开启故障转移,代理出现故障后,连接地址将路由到主实例,取值:"yes" , "no" diff --git a/vendor/modules.txt b/vendor/modules.txt index f737f0463d..5eefd775da 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1171,7 +1171,7 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cloudaudit/v20190319 # github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cls v1.0.1148 ## explicit; go 1.14 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cls/v20201016 -# github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.8 +# github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.11 ## explicit; go 1.11 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors @@ -1191,7 +1191,7 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312 # github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cwp v1.0.762 ## explicit; go 1.14 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cwp/v20180228 -# github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.3.7 +# github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.3.11 ## explicit; go 1.14 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb/v20190107 # github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dasb v1.0.970 diff --git a/website/docs/r/cynosdb_cls_delivery.html.markdown b/website/docs/r/cynosdb_cls_delivery.html.markdown new file mode 100644 index 0000000000..2d30d7df32 --- /dev/null +++ b/website/docs/r/cynosdb_cls_delivery.html.markdown @@ -0,0 +1,80 @@ +--- +subcategory: "TDSQL-C MySQL(CynosDB)" +layout: "tencentcloud" +page_title: "TencentCloud: tencentcloud_cynosdb_cls_delivery" +sidebar_current: "docs-tencentcloud-resource-cynosdb_cls_delivery" +description: |- + Provides a resource to create a CynosDB cls delivery +--- + +# tencentcloud_cynosdb_cls_delivery + +Provides a resource to create a CynosDB cls delivery + +~> **NOTE:** After executing `terraform destroy`, slow logs will no longer be uploaded, but historical logs will continue to be stored in the log topic until they expire. Log storage fees will continue to be charged during this period. If you do not wish to continue storing historical logs, you can go to CLS to delete the log topic. + +## Example Usage + +### Use topic_name and group_name + +```hcl +resource "tencentcloud_cynosdb_cls_delivery" "example" { + instance_id = "cynosdbmysql-ins-m2903cxq" + cls_info_list { + region = "ap-guangzhou" + topic_name = "tf-example" + group_name = "tf-example" + } + + running_status = true +} +``` + +### Use topic_id and group_id + +```hcl +resource "tencentcloud_cynosdb_cls_delivery" "example" { + instance_id = "cynosdbmysql-ins-m2903cxq" + cls_info_list { + region = "ap-guangzhou" + topic_id = "a9d582f8-8c14-462c-94b8-bbc579a04f02" + group_id = "67fca013-379b-4bc6-8e72-390227d869c4" + } + + running_status = false +} +``` + +## Argument Reference + +The following arguments are supported: + +* `cls_info_list` - (Required, List, ForceNew) Log shipping configuration. +* `instance_id` - (Required, String, ForceNew) Intance ID. +* `log_type` - (Optional, String, ForceNew) Log type. +* `running_status` - (Optional, Bool) Delivery status. true: Enabled; false: Disabled. + +The `cls_info_list` object supports the following: + +* `region` - (Required, String, ForceNew) Log delivery area. +* `group_id` - (Optional, String, ForceNew) Log set ID. +* `group_name` - (Optional, String, ForceNew) Log set name. +* `topic_id` - (Optional, String, ForceNew) Log topic ID. +* `topic_name` - (Optional, String, ForceNew) Log topic name. + +## Attributes Reference + +In addition to all arguments above, the following attributes are exported: + +* `id` - ID of the resource. + + + +## Import + +CynosDB cls delivery can be imported using the instanceId#topicId, e.g. + +``` +terraform import tencentcloud_cynosdb_cls_delivery.example cynosdbmysql-ins-m2903cxq#222932ff-a10a-41f1-8d29-ff0cfe2a2d99 +``` + diff --git a/website/tencentcloud.erb b/website/tencentcloud.erb index 1df0bab713..041ba56c37 100644 --- a/website/tencentcloud.erb +++ b/website/tencentcloud.erb @@ -4608,6 +4608,9 @@