diff --git a/.changelog/3539.txt b/.changelog/3539.txt new file mode 100644 index 0000000000..af30ca4021 --- /dev/null +++ b/.changelog/3539.txt @@ -0,0 +1,27 @@ +```release-note:new-data-source +tencentcloud_wedata_sql_script_runs +``` + +```release-note:new-resource +tencentcloud_wedata_sql_folder +``` + +```release-note:new-resource +tencentcloud_wedata_sql_script +``` + +```release-note:new-resource +tencentcloud_wedata_code_folder +``` + +```release-note:new-resource +tencentcloud_wedata_code_file +``` + +```release-note:new-resource +tencentcloud_wedata_run_sql_script_operation +``` + +```release-note:new-resource +tencentcloud_wedata_stop_sql_script_run_operation +``` diff --git a/tencentcloud/provider.go b/tencentcloud/provider.go index 0a5df158b7..c7cc309675 100644 --- a/tencentcloud/provider.go +++ b/tencentcloud/provider.go @@ -1187,6 +1187,7 @@ func Provider() *schema.Provider { "tencentcloud_wedata_downstream_task_instances": wedata.DataSourceTencentCloudWedataDownstreamTaskInstances(), "tencentcloud_wedata_task_instance_executions": wedata.DataSourceTencentCloudWedataTaskInstanceExecutions(), "tencentcloud_wedata_data_source_list": wedata.DataSourceTencentCloudWedataDataSourceList(), + "tencentcloud_wedata_sql_script_runs": wedata.DataSourceTencentCloudWedataSqlScriptRuns(), "tencentcloud_private_dns_records": privatedns.DataSourceTencentCloudPrivateDnsRecords(), "tencentcloud_private_dns_private_zone_list": privatedns.DataSourceTencentCloudPrivateDnsPrivateZoneList(), "tencentcloud_private_dns_forward_rules": privatedns.DataSourceTencentCloudPrivateDnsForwardRules(), @@ -2323,6 +2324,12 @@ func Provider() *schema.Provider { "tencentcloud_wedata_integration_offline_task": wedata.ResourceTencentCloudWedataIntegrationOfflineTask(), "tencentcloud_wedata_integration_realtime_task": wedata.ResourceTencentCloudWedataIntegrationRealtimeTask(), "tencentcloud_wedata_integration_task_node": wedata.ResourceTencentCloudWedataIntegrationTaskNode(), + "tencentcloud_wedata_sql_folder": wedata.ResourceTencentCloudWedataSqlFolder(), + "tencentcloud_wedata_sql_script": wedata.ResourceTencentCloudWedataSqlScript(), + "tencentcloud_wedata_code_folder": wedata.ResourceTencentCloudWedataCodeFolder(), + "tencentcloud_wedata_code_file": wedata.ResourceTencentCloudWedataCodeFile(), + "tencentcloud_wedata_run_sql_script_operation": wedata.ResourceTencentCloudWedataRunSqlScriptOperation(), + "tencentcloud_wedata_stop_sql_script_run_operation": wedata.ResourceTencentCloudWedataStopSqlScriptRunOperation(), "tencentcloud_cfw_address_template": cfw.ResourceTencentCloudCfwAddressTemplate(), "tencentcloud_cfw_block_ignore": cfw.ResourceTencentCloudCfwBlockIgnore(), "tencentcloud_cfw_edge_policy": cfw.ResourceTencentCloudCfwEdgePolicy(), diff --git a/tencentcloud/provider.md b/tencentcloud/provider.md index 91226e9318..60173dd9e7 100644 --- a/tencentcloud/provider.md +++ b/tencentcloud/provider.md @@ -2248,6 +2248,7 @@ tencentcloud_wedata_upstream_task_instances tencentcloud_wedata_downstream_task_instances tencentcloud_wedata_task_instance_executions tencentcloud_wedata_data_source_list +tencentcloud_wedata_sql_script_runs Resource tencentcloud_wedata_submit_task_operation @@ -2271,6 +2272,12 @@ tencentcloud_wedata_ops_task tencentcloud_wedata_integration_offline_task tencentcloud_wedata_integration_realtime_task tencentcloud_wedata_integration_task_node +tencentcloud_wedata_sql_folder +tencentcloud_wedata_sql_script +tencentcloud_wedata_code_folder +tencentcloud_wedata_code_file +tencentcloud_wedata_run_sql_script_operation +tencentcloud_wedata_stop_sql_script_run_operation Cloud Firewall(CFW) Data Source diff --git a/tencentcloud/services/wedata/data_source_tc_wedata_sql_script_runs.go b/tencentcloud/services/wedata/data_source_tc_wedata_sql_script_runs.go new file mode 100644 index 0000000000..6d2f2dac49 --- /dev/null +++ b/tencentcloud/services/wedata/data_source_tc_wedata_sql_script_runs.go @@ -0,0 +1,462 @@ +package wedata + +import ( + "context" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + wedatav20250806 "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/wedata/v20250806" + + tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common" + "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper" +) + +func DataSourceTencentCloudWedataSqlScriptRuns() *schema.Resource { + return &schema.Resource{ + Read: dataSourceTencentCloudWedataSqlScriptRunsRead, + Schema: map[string]*schema.Schema{ + "project_id": { + Type: schema.TypeString, + Required: true, + Description: "Project ID.", + }, + + "script_id": { + Type: schema.TypeString, + Required: true, + Description: "Script ID.", + }, + + "job_id": { + Type: schema.TypeString, + Optional: true, + Description: "Job ID.", + }, + + "search_word": { + Type: schema.TypeString, + Optional: true, + Description: "Search keyword.", + }, + + "execute_user_uin": { + Type: schema.TypeString, + Optional: true, + Description: "Execute user UIN.", + }, + + "start_time": { + Type: schema.TypeString, + Optional: true, + Description: "Start time.", + }, + + "end_time": { + Type: schema.TypeString, + Optional: true, + Description: "End time.", + }, + + "data": { + Type: schema.TypeList, + Computed: true, + Description: "Data exploration tasks.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "job_id": { + Type: schema.TypeString, + Computed: true, + Description: "Data exploration task ID.", + }, + "job_name": { + Type: schema.TypeString, + Computed: true, + Description: "Data exploration task name.", + }, + "job_type": { + Type: schema.TypeString, + Computed: true, + Description: "Job type.", + }, + "script_id": { + Type: schema.TypeString, + Computed: true, + Description: "Script ID.", + }, + "job_execution_list": { + Type: schema.TypeList, + Computed: true, + Description: "Subtask list.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "job_id": { + Type: schema.TypeString, + Computed: true, + Description: "Data exploration task ID.", + }, + "job_execution_id": { + Type: schema.TypeString, + Computed: true, + Description: "Subquery task ID.", + }, + "job_execution_name": { + Type: schema.TypeString, + Computed: true, + Description: "Subquery name.", + }, + "script_content": { + Type: schema.TypeString, + Computed: true, + Description: "Subquery SQL content.", + }, + "status": { + Type: schema.TypeString, + Computed: true, + Description: "Subquery status.", + }, + "create_time": { + Type: schema.TypeString, + Computed: true, + Description: "Create time.", + }, + "execute_stage_info": { + Type: schema.TypeString, + Computed: true, + Description: "Execution phase.", + }, + "log_file_path": { + Type: schema.TypeString, + Computed: true, + Description: "Log file path.", + }, + "result_file_path": { + Type: schema.TypeString, + Computed: true, + Description: "Result file path.", + }, + "result_preview_file_path": { + Type: schema.TypeString, + Computed: true, + Description: "Preview result file path.", + }, + "result_total_count": { + Type: schema.TypeInt, + Computed: true, + Description: "Total number of rows in the task execution result.", + }, + "update_time": { + Type: schema.TypeString, + Computed: true, + Description: "Update time.", + }, + "end_time": { + Type: schema.TypeString, + Computed: true, + Description: "End time.", + }, + "time_cost": { + Type: schema.TypeInt, + Computed: true, + Description: "Time consumed.", + }, + "context_script_content": { + Type: schema.TypeSet, + Computed: true, + Description: "Context SQL content.", + Elem: &schema.Schema{ + Type: schema.TypeString, + }, + }, + "result_preview_count": { + Type: schema.TypeInt, + Computed: true, + Description: "Number of rows for previewing the task execution results.", + }, + "result_effect_count": { + Type: schema.TypeInt, + Computed: true, + Description: "Number of rows affected by the task execution result.", + }, + "collecting_total_result": { + Type: schema.TypeBool, + Computed: true, + Description: "Whether collecting full results: default false, true means collecting full results, used for frontend polling.", + }, + "script_content_truncate": { + Type: schema.TypeBool, + Computed: true, + Description: "Whether the script content is truncated.", + }, + }, + }, + }, + "script_content": { + Type: schema.TypeString, + Computed: true, + Description: "Script content.", + }, + "status": { + Type: schema.TypeString, + Computed: true, + Description: "Task status.", + }, + "create_time": { + Type: schema.TypeString, + Computed: true, + Description: "Task creation time.", + }, + "update_time": { + Type: schema.TypeString, + Computed: true, + Description: "Update time.", + }, + "end_time": { + Type: schema.TypeString, + Computed: true, + Description: "End time.", + }, + "owner_uin": { + Type: schema.TypeString, + Computed: true, + Description: "Cloud owner account UIN.", + }, + "user_uin": { + Type: schema.TypeString, + Computed: true, + Description: "Account UIN.", + }, + "time_cost": { + Type: schema.TypeInt, + Computed: true, + Description: "Time consumed.", + }, + "script_content_truncate": { + Type: schema.TypeBool, + Computed: true, + Description: "Whether the script content is truncated.", + }, + }, + }, + }, + + "result_output_file": { + Type: schema.TypeString, + Optional: true, + Description: "Used to save results.", + }, + }, + } +} + +func dataSourceTencentCloudWedataSqlScriptRunsRead(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("data_source.tencentcloud_wedata_sql_script_runs.read")() + defer tccommon.InconsistentCheck(d, meta)() + + var ( + logId = tccommon.GetLogId(nil) + ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta) + service = WedataService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + ) + + paramMap := make(map[string]interface{}) + if v, ok := d.GetOk("project_id"); ok { + paramMap["ProjectId"] = helper.String(v.(string)) + } + + if v, ok := d.GetOk("script_id"); ok { + paramMap["ScriptId"] = helper.String(v.(string)) + } + + if v, ok := d.GetOk("job_id"); ok { + paramMap["JobId"] = helper.String(v.(string)) + } + + if v, ok := d.GetOk("search_word"); ok { + paramMap["SearchWord"] = helper.String(v.(string)) + } + + if v, ok := d.GetOk("execute_user_uin"); ok { + paramMap["ExecuteUserUin"] = helper.String(v.(string)) + } + + if v, ok := d.GetOk("start_time"); ok { + paramMap["StartTime"] = helper.String(v.(string)) + } + + if v, ok := d.GetOk("end_time"); ok { + paramMap["EndTime"] = helper.String(v.(string)) + } + + var respData []*wedatav20250806.JobDto + reqErr := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError { + result, e := service.DescribeWedataSqlScriptRunsByFilter(ctx, paramMap) + if e != nil { + return tccommon.RetryError(e) + } + + respData = result + return nil + }) + + if reqErr != nil { + return reqErr + } + + dataList := make([]map[string]interface{}, 0, len(respData)) + if respData != nil { + for _, data := range respData { + dataMap := map[string]interface{}{} + if data.JobId != nil { + dataMap["job_id"] = data.JobId + } + + if data.JobName != nil { + dataMap["job_name"] = data.JobName + } + + if data.JobType != nil { + dataMap["job_type"] = data.JobType + } + + if data.ScriptId != nil { + dataMap["script_id"] = data.ScriptId + } + + jobExecutionListList := make([]map[string]interface{}, 0, len(data.JobExecutionList)) + if data.JobExecutionList != nil { + for _, jobExecutionList := range data.JobExecutionList { + jobExecutionListMap := map[string]interface{}{} + + if jobExecutionList.JobId != nil { + jobExecutionListMap["job_id"] = jobExecutionList.JobId + } + + if jobExecutionList.JobExecutionId != nil { + jobExecutionListMap["job_execution_id"] = jobExecutionList.JobExecutionId + } + + if jobExecutionList.JobExecutionName != nil { + jobExecutionListMap["job_execution_name"] = jobExecutionList.JobExecutionName + } + + if jobExecutionList.ScriptContent != nil { + jobExecutionListMap["script_content"] = jobExecutionList.ScriptContent + } + + if jobExecutionList.Status != nil { + jobExecutionListMap["status"] = jobExecutionList.Status + } + + if jobExecutionList.CreateTime != nil { + jobExecutionListMap["create_time"] = jobExecutionList.CreateTime + } + + if jobExecutionList.ExecuteStageInfo != nil { + jobExecutionListMap["execute_stage_info"] = jobExecutionList.ExecuteStageInfo + } + + if jobExecutionList.LogFilePath != nil { + jobExecutionListMap["log_file_path"] = jobExecutionList.LogFilePath + } + + if jobExecutionList.ResultFilePath != nil { + jobExecutionListMap["result_file_path"] = jobExecutionList.ResultFilePath + } + + if jobExecutionList.ResultPreviewFilePath != nil { + jobExecutionListMap["result_preview_file_path"] = jobExecutionList.ResultPreviewFilePath + } + + if jobExecutionList.ResultTotalCount != nil { + jobExecutionListMap["result_total_count"] = jobExecutionList.ResultTotalCount + } + + if jobExecutionList.UpdateTime != nil { + jobExecutionListMap["update_time"] = jobExecutionList.UpdateTime + } + + if jobExecutionList.EndTime != nil { + jobExecutionListMap["end_time"] = jobExecutionList.EndTime + } + + if jobExecutionList.TimeCost != nil { + jobExecutionListMap["time_cost"] = jobExecutionList.TimeCost + } + + if jobExecutionList.ContextScriptContent != nil { + jobExecutionListMap["context_script_content"] = jobExecutionList.ContextScriptContent + } + + if jobExecutionList.ResultPreviewCount != nil { + jobExecutionListMap["result_preview_count"] = jobExecutionList.ResultPreviewCount + } + + if jobExecutionList.ResultEffectCount != nil { + jobExecutionListMap["result_effect_count"] = jobExecutionList.ResultEffectCount + } + + if jobExecutionList.CollectingTotalResult != nil { + jobExecutionListMap["collecting_total_result"] = jobExecutionList.CollectingTotalResult + } + + if jobExecutionList.ScriptContentTruncate != nil { + jobExecutionListMap["script_content_truncate"] = jobExecutionList.ScriptContentTruncate + } + + jobExecutionListList = append(jobExecutionListList, jobExecutionListMap) + } + + dataMap["job_execution_list"] = jobExecutionListList + } + if data.ScriptContent != nil { + dataMap["script_content"] = data.ScriptContent + } + + if data.Status != nil { + dataMap["status"] = data.Status + } + + if data.CreateTime != nil { + dataMap["create_time"] = data.CreateTime + } + + if data.UpdateTime != nil { + dataMap["update_time"] = data.UpdateTime + } + + if data.EndTime != nil { + dataMap["end_time"] = data.EndTime + } + + if data.OwnerUin != nil { + dataMap["owner_uin"] = data.OwnerUin + } + + if data.UserUin != nil { + dataMap["user_uin"] = data.UserUin + } + + if data.TimeCost != nil { + dataMap["time_cost"] = data.TimeCost + } + + if data.ScriptContentTruncate != nil { + dataMap["script_content_truncate"] = data.ScriptContentTruncate + } + + dataList = append(dataList, dataMap) + } + + _ = d.Set("data", dataList) + } + + d.SetId(helper.BuildToken()) + output, ok := d.GetOk("result_output_file") + if ok && output.(string) != "" { + if e := tccommon.WriteToFile(output.(string), dataList); e != nil { + return e + } + } + + return nil +} diff --git a/tencentcloud/services/wedata/data_source_tc_wedata_sql_script_runs.md b/tencentcloud/services/wedata/data_source_tc_wedata_sql_script_runs.md new file mode 100644 index 0000000000..dffd47f500 --- /dev/null +++ b/tencentcloud/services/wedata/data_source_tc_wedata_sql_script_runs.md @@ -0,0 +1,10 @@ +Use this data source to query detailed information of WeData sql script runs + +Example Usage + +```hcl +data "tencentcloud_wedata_sql_script_runs" "example" { + project_id = "1460947878944567296" + script_id = "971c1520-836f-41be-b13f-7a6c637317c8" +} +``` diff --git a/tencentcloud/services/wedata/data_source_tc_wedata_sql_script_runs_test.go b/tencentcloud/services/wedata/data_source_tc_wedata_sql_script_runs_test.go new file mode 100644 index 0000000000..98cfbeadf1 --- /dev/null +++ b/tencentcloud/services/wedata/data_source_tc_wedata_sql_script_runs_test.go @@ -0,0 +1,35 @@ +package wedata_test + +import ( + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + + tcacctest "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/acctest" +) + +func TestAccTencentCloudWedataSqlScriptRunsDataSource_basic(t *testing.T) { + t.Parallel() + resource.Test(t, resource.TestCase{ + PreCheck: func() { + tcacctest.AccPreCheck(t) + }, + Providers: tcacctest.AccProviders, + Steps: []resource.TestStep{{ + Config: testAccWedataSqlScriptRunsDataSource, + Check: resource.ComposeTestCheckFunc( + tcacctest.AccCheckTencentCloudDataSourceID("data.tencentcloud_wedata_sql_script_runs.example"), + resource.TestCheckResourceAttrSet("tencentcloud_wedata_sql_script_runs.example", "id"), + resource.TestCheckResourceAttrSet("tencentcloud_wedata_sql_script_runs.example", "project_id"), + resource.TestCheckResourceAttrSet("tencentcloud_wedata_sql_script_runs.example", "script_id"), + ), + }}, + }) +} + +const testAccWedataSqlScriptRunsDataSource = ` +data "tencentcloud_wedata_sql_script_runs" "example" { + project_id = "1460947878944567296" + script_id = "971c1520-836f-41be-b13f-7a6c637317c8" +} +` diff --git a/tencentcloud/services/wedata/resource_tc_wedata_code_file.go b/tencentcloud/services/wedata/resource_tc_wedata_code_file.go new file mode 100644 index 0000000000..dd4e393532 --- /dev/null +++ b/tencentcloud/services/wedata/resource_tc_wedata_code_file.go @@ -0,0 +1,405 @@ +package wedata + +import ( + "context" + "fmt" + "log" + "strings" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + wedatav20250806 "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/wedata/v20250806" + + tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common" + "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper" +) + +func ResourceTencentCloudWedataCodeFile() *schema.Resource { + return &schema.Resource{ + Create: resourceTencentCloudWedataCodeFileCreate, + Read: resourceTencentCloudWedataCodeFileRead, + Update: resourceTencentCloudWedataCodeFileUpdate, + Delete: resourceTencentCloudWedataCodeFileDelete, + Importer: &schema.ResourceImporter{ + State: schema.ImportStatePassthrough, + }, + Schema: map[string]*schema.Schema{ + "project_id": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + Description: "Project ID.", + }, + + "code_file_name": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + Description: "Code file name.", + }, + + "parent_folder_path": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + Description: "Parent folder path, for example /aaa/bbb/ccc, path header must start with a slash, root directory pass /.", + }, + + "code_file_config": { + Type: schema.TypeList, + Optional: true, + MaxItems: 1, + Description: "Code file configuration.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "params": { + Type: schema.TypeString, + Optional: true, + Description: "Advanced runtime parameters, variable substitution, map-json String,String.", + }, + "notebook_session_info": { + Type: schema.TypeList, + Optional: true, + MaxItems: 1, + Description: "Notebook kernel session information.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "notebook_session_id": { + Type: schema.TypeString, + Optional: true, + Description: "Session ID.", + }, + "notebook_session_name": { + Type: schema.TypeString, + Optional: true, + Description: "Session name.", + }, + }, + }, + }, + }, + }, + }, + + "code_file_content": { + Type: schema.TypeString, + Optional: true, + Description: "Code file content.", + }, + + // computed + "code_file_id": { + Type: schema.TypeString, + Computed: true, + Description: "Code file ID.", + }, + + "access_scope": { + Type: schema.TypeString, + Computed: true, + Description: "Permission range: SHARED, PRIVATE.", + }, + + "path": { + Type: schema.TypeString, + Computed: true, + Description: "The full path of the node, /aaa/bbb/ccc.ipynb, consists of the names of each node.", + }, + }, + } +} + +func resourceTencentCloudWedataCodeFileCreate(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_wedata_code_file.create")() + defer tccommon.InconsistentCheck(d, meta)() + + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta) + request = wedatav20250806.NewCreateCodeFileRequest() + response = wedatav20250806.NewCreateCodeFileResponse() + projectId string + codeFileId string + ) + + if v, ok := d.GetOk("project_id"); ok { + request.ProjectId = helper.String(v.(string)) + projectId = v.(string) + } + + if v, ok := d.GetOk("code_file_name"); ok { + request.CodeFileName = helper.String(v.(string)) + } + + if v, ok := d.GetOk("parent_folder_path"); ok { + request.ParentFolderPath = helper.String(v.(string)) + } + + if codeFileConfigMap, ok := helper.InterfacesHeadMap(d, "code_file_config"); ok { + codeFileConfig := wedatav20250806.CodeFileConfig{} + if v, ok := codeFileConfigMap["params"].(string); ok && v != "" { + codeFileConfig.Params = helper.String(v) + } + + if notebookSessionInfoMap, ok := helper.ConvertInterfacesHeadToMap(codeFileConfigMap["notebook_session_info"]); ok { + notebookSessionInfo := wedatav20250806.NotebookSessionInfo{} + if v, ok := notebookSessionInfoMap["notebook_session_id"].(string); ok && v != "" { + notebookSessionInfo.NotebookSessionId = helper.String(v) + } + + if v, ok := notebookSessionInfoMap["notebook_session_name"].(string); ok && v != "" { + notebookSessionInfo.NotebookSessionName = helper.String(v) + } + + codeFileConfig.NotebookSessionInfo = ¬ebookSessionInfo + } + + request.CodeFileConfig = &codeFileConfig + } + + if v, ok := d.GetOk("code_file_content"); ok { + request.CodeFileContent = helper.String(v.(string)) + } + + reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseWedataV20250806Client().CreateCodeFileWithContext(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.Data == nil { + return tccommon.RetryError(fmt.Errorf("create wedata code file failed, Response is nil.")) + } + + response = result + return nil + }) + + if reqErr != nil { + log.Printf("[CRITAL]%s create wedata code file failed, reason:%+v", logId, reqErr) + return reqErr + } + + if response.Response.Data.CodeFileId == nil { + return fmt.Errorf("CodeFileId is nil.") + } + + codeFileId = *response.Response.Data.CodeFileId + d.SetId(strings.Join([]string{projectId, codeFileId}, tccommon.FILED_SP)) + return resourceTencentCloudWedataCodeFileRead(d, meta) +} + +func resourceTencentCloudWedataCodeFileRead(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_wedata_code_file.read")() + defer tccommon.InconsistentCheck(d, meta)() + + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta) + service = WedataService{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()) + } + + projectId := idSplit[0] + codeFileId := idSplit[1] + + respData, err := service.DescribeWedataCodeFileById(ctx, projectId, codeFileId) + if err != nil { + return err + } + + if respData == nil { + log.Printf("[WARN]%s resource `tencentcloud_wedata_code_file` [%s] not found, please check if it has been deleted.\n", logId, d.Id()) + d.SetId("") + return nil + } + + if respData.ProjectId != nil { + _ = d.Set("project_id", respData.ProjectId) + } + + if respData.CodeFileName != nil { + _ = d.Set("code_file_name", respData.CodeFileName) + } + + if respData.ParentFolderPath != nil { + if *respData.ParentFolderPath == "" { + _ = d.Set("parent_folder_path", "/") + } else { + _ = d.Set("parent_folder_path", *respData.ParentFolderPath) + } + } + + if respData.CodeFileConfig != nil { + codeFileConfigMap := map[string]interface{}{} + if respData.CodeFileConfig.Params != nil { + codeFileConfigMap["params"] = respData.CodeFileConfig.Params + } + + notebookSessionInfoMap := map[string]interface{}{} + if respData.CodeFileConfig.NotebookSessionInfo != nil { + if respData.CodeFileConfig.NotebookSessionInfo.NotebookSessionId != nil { + notebookSessionInfoMap["notebook_session_id"] = respData.CodeFileConfig.NotebookSessionInfo.NotebookSessionId + } + + if respData.CodeFileConfig.NotebookSessionInfo.NotebookSessionName != nil { + notebookSessionInfoMap["notebook_session_name"] = respData.CodeFileConfig.NotebookSessionInfo.NotebookSessionName + } + + codeFileConfigMap["notebook_session_info"] = []interface{}{notebookSessionInfoMap} + } + + _ = d.Set("code_file_config", []interface{}{codeFileConfigMap}) + } + + if respData.CodeFileContent != nil { + _ = d.Set("code_file_content", respData.CodeFileContent) + } + + if respData.CodeFileId != nil { + _ = d.Set("code_file_id", respData.CodeFileId) + } + + if respData.AccessScope != nil { + _ = d.Set("access_scope", *respData.AccessScope) + } + + if respData.Path != nil { + _ = d.Set("path", *respData.Path) + } + + return nil +} + +func resourceTencentCloudWedataCodeFileUpdate(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_wedata_code_file.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()) + } + + projectId := idSplit[0] + codeFileId := idSplit[1] + + needChange := false + mutableArgs := []string{"code_file_config", "code_file_content"} + for _, v := range mutableArgs { + if d.HasChange(v) { + needChange = true + break + } + } + + if needChange { + request := wedatav20250806.NewUpdateCodeFileRequest() + if codeFileConfigMap, ok := helper.InterfacesHeadMap(d, "code_file_config"); ok { + codeFileConfig := wedatav20250806.CodeFileConfig{} + if v, ok := codeFileConfigMap["params"].(string); ok && v != "" { + codeFileConfig.Params = helper.String(v) + } + + if notebookSessionInfoMap, ok := helper.ConvertInterfacesHeadToMap(codeFileConfigMap["notebook_session_info"]); ok { + notebookSessionInfo := wedatav20250806.NotebookSessionInfo{} + if v, ok := notebookSessionInfoMap["notebook_session_id"].(string); ok && v != "" { + notebookSessionInfo.NotebookSessionId = helper.String(v) + } + + if v, ok := notebookSessionInfoMap["notebook_session_name"].(string); ok && v != "" { + notebookSessionInfo.NotebookSessionName = helper.String(v) + } + + codeFileConfig.NotebookSessionInfo = ¬ebookSessionInfo + } + + request.CodeFileConfig = &codeFileConfig + } + + if v, ok := d.GetOk("code_file_content"); ok { + request.CodeFileContent = helper.String(v.(string)) + } + + request.ProjectId = &projectId + request.CodeFileId = &codeFileId + reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseWedataV20250806Client().UpdateCodeFileWithContext(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()) + } + + return nil + }) + + if reqErr != nil { + log.Printf("[CRITAL]%s update wedata code file failed, reason:%+v", logId, reqErr) + return reqErr + } + } + + return resourceTencentCloudWedataCodeFileRead(d, meta) +} + +func resourceTencentCloudWedataCodeFileDelete(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_wedata_code_file.delete")() + defer tccommon.InconsistentCheck(d, meta)() + + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta) + request = wedatav20250806.NewDeleteCodeFileRequest() + ) + + idSplit := strings.Split(d.Id(), tccommon.FILED_SP) + if len(idSplit) != 2 { + return fmt.Errorf("id is broken,%s", d.Id()) + } + + projectId := idSplit[0] + codeFileId := idSplit[1] + + request.ProjectId = &projectId + request.CodeFileId = &codeFileId + reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseWedataV20250806Client().DeleteCodeFileWithContext(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.Data == nil { + return resource.NonRetryableError(fmt.Errorf("Delete wedata code file failed, Response is nil.")) + } + + if result.Response.Data.Status == nil { + return resource.NonRetryableError(fmt.Errorf("Delete wedata code file failed, Status is nil.")) + } + + if !*result.Response.Data.Status { + return resource.NonRetryableError(fmt.Errorf("Delete wedata code file failed, Status is false.")) + } + + return nil + }) + + if reqErr != nil { + log.Printf("[CRITAL]%s delete wedata code file failed, reason:%+v", logId, reqErr) + return reqErr + } + + return nil +} diff --git a/tencentcloud/services/wedata/resource_tc_wedata_code_file.md b/tencentcloud/services/wedata/resource_tc_wedata_code_file.md new file mode 100644 index 0000000000..faa5915b36 --- /dev/null +++ b/tencentcloud/services/wedata/resource_tc_wedata_code_file.md @@ -0,0 +1,26 @@ +Provides a resource to create a WeData code file + +Example Usage + +```hcl +resource "tencentcloud_wedata_code_folder" "example" { + project_id = "2983848457986924544" + folder_name = "tf_example" + parent_folder_path = "/" +} + +resource "tencentcloud_wedata_code_file" "example" { + project_id = "2983848457986924544" + code_file_name = "tf_example_code_file" + parent_folder_path = tencentcloud_wedata_code_folder.example.path + code_file_content = "Hello Terraform" +} +``` + +Import + +WeData code file can be imported using the projectId#codeFileId, e.g. + +``` +terraform import tencentcloud_wedata_code_file.example 1470547050521227264#2bfa8813-344f-4858-a2cc-7a07bd10ac1d +``` diff --git a/tencentcloud/services/wedata/resource_tc_wedata_code_file_test.go b/tencentcloud/services/wedata/resource_tc_wedata_code_file_test.go new file mode 100644 index 0000000000..189a4d1d37 --- /dev/null +++ b/tencentcloud/services/wedata/resource_tc_wedata_code_file_test.go @@ -0,0 +1,66 @@ +package wedata_test + +import ( + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + + tcacctest "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/acctest" +) + +func TestAccTencentCloudWedataCodeFileResource_basic(t *testing.T) { + t.Parallel() + resource.Test(t, resource.TestCase{ + PreCheck: func() { + tcacctest.AccPreCheck(t) + }, + Providers: tcacctest.AccProviders, + Steps: []resource.TestStep{ + { + Config: testAccWedataCodeFile, + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrSet("tencentcloud_wedata_code_file.example", "id"), + resource.TestCheckResourceAttrSet("tencentcloud_wedata_code_file.example", "project_id"), + resource.TestCheckResourceAttrSet("tencentcloud_wedata_code_file.example", "code_file_name"), + resource.TestCheckResourceAttrSet("tencentcloud_wedata_code_file.example", "parent_folder_path"), + resource.TestCheckResourceAttrSet("tencentcloud_wedata_code_file.example", "code_file_config.#"), + resource.TestCheckResourceAttrSet("tencentcloud_wedata_code_file.example", "code_file_content"), + ), + }, + { + Config: testAccWedataCodeFileUpdate, + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrSet("tencentcloud_wedata_code_file.example", "id"), + resource.TestCheckResourceAttrSet("tencentcloud_wedata_code_file.example", "project_id"), + resource.TestCheckResourceAttrSet("tencentcloud_wedata_code_file.example", "code_file_name"), + resource.TestCheckResourceAttrSet("tencentcloud_wedata_code_file.example", "parent_folder_path"), + resource.TestCheckResourceAttrSet("tencentcloud_wedata_code_file.example", "code_file_config.#"), + resource.TestCheckResourceAttrSet("tencentcloud_wedata_code_file.example", "code_file_content"), + ), + }, + { + ResourceName: "tencentcloud_wedata_code_file.example", + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + +const testAccWedataCodeFile = ` +resource "tencentcloud_wedata_code_file" "example" { + project_id = "2983848457986924544" + code_file_name = "tf_example_code_file" + parent_folder_path = "/tf_example" + code_file_content = "Hello Terraform" +} +` + +const testAccWedataCodeFileUpdate = ` +resource "tencentcloud_wedata_code_file" "example" { + project_id = "2983848457986924544" + code_file_name = "tf_example_code_file" + parent_folder_path = "/tf_example" + code_file_content = "Hello Terraform Update" +} +` diff --git a/tencentcloud/services/wedata/resource_tc_wedata_code_folder.go b/tencentcloud/services/wedata/resource_tc_wedata_code_folder.go new file mode 100644 index 0000000000..e2d010fa1d --- /dev/null +++ b/tencentcloud/services/wedata/resource_tc_wedata_code_folder.go @@ -0,0 +1,299 @@ +package wedata + +import ( + "context" + "fmt" + "log" + "strings" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + wedatav20250806 "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/wedata/v20250806" + + tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common" + "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper" +) + +func ResourceTencentCloudWedataCodeFolder() *schema.Resource { + return &schema.Resource{ + Create: resourceTencentCloudWedataCodeFolderCreate, + Read: resourceTencentCloudWedataCodeFolderRead, + Update: resourceTencentCloudWedataCodeFolderUpdate, + Delete: resourceTencentCloudWedataCodeFolderDelete, + Importer: &schema.ResourceImporter{ + State: schema.ImportStatePassthrough, + }, + Schema: map[string]*schema.Schema{ + "project_id": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + Description: "Project ID.", + }, + + "folder_name": { + Type: schema.TypeString, + Required: true, + Description: "Folder name.", + }, + + "parent_folder_path": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + Description: "Parent folder path, for example /aaa/bbb/ccc, path header must start with a slash, root directory pass /.", + }, + + // computed + "folder_id": { + Type: schema.TypeString, + Computed: true, + Description: "Folder ID.", + }, + + "access_scope": { + Type: schema.TypeString, + Computed: true, + Description: "Permission range: SHARED, PRIVATE.", + }, + + "type": { + Type: schema.TypeString, + Computed: true, + Description: "Type. folder, script.", + }, + + "path": { + Type: schema.TypeString, + Computed: true, + Description: "Node path.", + }, + }, + } +} + +func resourceTencentCloudWedataCodeFolderCreate(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_wedata_code_folder.create")() + defer tccommon.InconsistentCheck(d, meta)() + + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta) + request = wedatav20250806.NewCreateCodeFolderRequest() + response = wedatav20250806.NewCreateCodeFolderResponse() + projectId string + folderId string + ) + + if v, ok := d.GetOk("project_id"); ok { + request.ProjectId = helper.String(v.(string)) + projectId = v.(string) + } + + if v, ok := d.GetOk("folder_name"); ok { + request.FolderName = helper.String(v.(string)) + } + + if v, ok := d.GetOk("parent_folder_path"); ok { + request.ParentFolderPath = helper.String(v.(string)) + } + + reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseWedataV20250806Client().CreateCodeFolderWithContext(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.Data == nil { + return tccommon.RetryError(fmt.Errorf("create wedata code folder failed, Response is nil.")) + } + + response = result + return nil + }) + + if reqErr != nil { + log.Printf("[CRITAL]%s create wedata code folder failed, reason:%+v", logId, reqErr) + return reqErr + } + + if response.Response.Data.FolderId == nil { + return fmt.Errorf("FolderId is nil.") + } + + folderId = *response.Response.Data.FolderId + d.SetId(strings.Join([]string{projectId, folderId}, tccommon.FILED_SP)) + return resourceTencentCloudWedataCodeFolderRead(d, meta) +} + +func resourceTencentCloudWedataCodeFolderRead(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_wedata_code_folder.read")() + defer tccommon.InconsistentCheck(d, meta)() + + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta) + service = WedataService{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()) + } + + projectId := idSplit[0] + folderId := idSplit[1] + + respData, err := service.DescribeWedataGetCodeFolderById(ctx, projectId, folderId) + if err != nil { + return err + } + + if respData == nil { + log.Printf("[WARN]%s resource `tencentcloud_wedata_code_folder` [%s] not found, please check if it has been deleted.\n", logId, d.Id()) + d.SetId("") + return nil + } + + _ = d.Set("project_id", projectId) + + if respData.Title != nil { + _ = d.Set("folder_name", *respData.Title) + } + + if respData.ParentFolderPath != nil { + if *respData.ParentFolderPath == "" { + _ = d.Set("parent_folder_path", "/") + } else { + _ = d.Set("parent_folder_path", *respData.ParentFolderPath) + } + } + + if respData.Id != nil { + _ = d.Set("folder_id", *respData.Id) + } + + if respData.AccessScope != nil { + _ = d.Set("access_scope", *respData.AccessScope) + } + + if respData.Type != nil { + _ = d.Set("type", *respData.Type) + } + + if respData.Path != nil { + _ = d.Set("path", *respData.Path) + } + + return nil +} + +func resourceTencentCloudWedataCodeFolderUpdate(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_wedata_code_folder.update")() + defer tccommon.InconsistentCheck(d, meta)() + + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta) + request = wedatav20250806.NewUpdateCodeFolderRequest() + ) + + idSplit := strings.Split(d.Id(), tccommon.FILED_SP) + if len(idSplit) != 2 { + return fmt.Errorf("id is broken,%s", d.Id()) + } + + projectId := idSplit[0] + folderId := idSplit[1] + + if d.HasChange("folder_name") { + if v, ok := d.GetOk("folder_name"); ok { + request.FolderName = helper.String(v.(string)) + } + + request.ProjectId = &projectId + request.FolderId = &folderId + reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseWedataV20250806Client().UpdateCodeFolderWithContext(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.Data == nil { + return resource.NonRetryableError(fmt.Errorf("Update wedata code folder failed, Response is nil.")) + } + + if result.Response.Data.Status == nil { + return resource.NonRetryableError(fmt.Errorf("Update wedata code folder failed, Status is nil.")) + } + + if !*result.Response.Data.Status { + return resource.NonRetryableError(fmt.Errorf("Update wedata code folder failed, Status is false.")) + } + + return nil + }) + + if reqErr != nil { + log.Printf("[CRITAL]%s update wedata code folder failed, reason:%+v", logId, reqErr) + return reqErr + } + } + + return resourceTencentCloudWedataCodeFolderRead(d, meta) +} + +func resourceTencentCloudWedataCodeFolderDelete(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_wedata_code_folder.delete")() + defer tccommon.InconsistentCheck(d, meta)() + + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta) + request = wedatav20250806.NewDeleteCodeFolderRequest() + ) + + idSplit := strings.Split(d.Id(), tccommon.FILED_SP) + if len(idSplit) != 2 { + return fmt.Errorf("id is broken,%s", d.Id()) + } + + projectId := idSplit[0] + folderId := idSplit[1] + + request.ProjectId = &projectId + request.FolderId = &folderId + reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseWedataV20250806Client().DeleteCodeFolderWithContext(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.Data == nil { + return resource.NonRetryableError(fmt.Errorf("Delete wedata code folder failed, Response is nil.")) + } + + if result.Response.Data.Status == nil { + return resource.NonRetryableError(fmt.Errorf("Delete wedata code folder failed, Status is nil.")) + } + + if !*result.Response.Data.Status { + return resource.NonRetryableError(fmt.Errorf("Delete wedata code folder failed, Status is false.")) + } + + return nil + }) + + if reqErr != nil { + log.Printf("[CRITAL]%s delete wedata code folder failed, reason:%+v", logId, reqErr) + return reqErr + } + + return nil +} diff --git a/tencentcloud/services/wedata/resource_tc_wedata_code_folder.md b/tencentcloud/services/wedata/resource_tc_wedata_code_folder.md new file mode 100644 index 0000000000..b6b0b67a71 --- /dev/null +++ b/tencentcloud/services/wedata/resource_tc_wedata_code_folder.md @@ -0,0 +1,19 @@ +Provides a resource to create a WeData code folder + +Example Usage + +```hcl +resource "tencentcloud_wedata_code_folder" "example" { + project_id = "2983848457986924544" + folder_name = "tf_example" + parent_folder_path = "/" +} +``` + +Import + +WeData code folder can be imported using the projectId#folderId, e.g. + +``` +terraform import tencentcloud_wedata_code_folder.example 1470547050521227264#2ee111df-5573-4ac4-9f93-cf9e8e438d80 +``` diff --git a/tencentcloud/services/wedata/resource_tc_wedata_code_folder_test.go b/tencentcloud/services/wedata/resource_tc_wedata_code_folder_test.go new file mode 100644 index 0000000000..e88608144d --- /dev/null +++ b/tencentcloud/services/wedata/resource_tc_wedata_code_folder_test.go @@ -0,0 +1,60 @@ +package wedata_test + +import ( + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + + tcacctest "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/acctest" +) + +func TestAccTencentCloudWedataCodeFolderResource_basic(t *testing.T) { + t.Parallel() + resource.Test(t, resource.TestCase{ + PreCheck: func() { + tcacctest.AccPreCheck(t) + }, + Providers: tcacctest.AccProviders, + Steps: []resource.TestStep{ + { + Config: testAccWedataCodeFolder, + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrSet("tencentcloud_wedata_code_folder.example", "id"), + resource.TestCheckResourceAttrSet("tencentcloud_wedata_code_folder.example", "project_id"), + resource.TestCheckResourceAttrSet("tencentcloud_wedata_code_folder.example", "folder_name"), + resource.TestCheckResourceAttrSet("tencentcloud_wedata_code_folder.example", "parent_folder_path"), + ), + }, + { + Config: testAccWedataCodeFolderUpdate, + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrSet("tencentcloud_wedata_code_folder.example", "id"), + resource.TestCheckResourceAttrSet("tencentcloud_wedata_code_folder.example", "project_id"), + resource.TestCheckResourceAttrSet("tencentcloud_wedata_code_folder.example", "folder_name"), + resource.TestCheckResourceAttrSet("tencentcloud_wedata_code_folder.example", "parent_folder_path"), + ), + }, + { + ResourceName: "tencentcloud_wedata_code_folder.example", + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + +const testAccWedataCodeFolder = ` +resource "tencentcloud_wedata_code_folder" "example" { + project_id = "2983848457986924544" + folder_name = "tf_example" + parent_folder_path = "/" +} +` + +const testAccWedataCodeFolderUpdate = ` +resource "tencentcloud_wedata_code_folder" "example" { + project_id = "2983848457986924544" + folder_name = "tf_example_update" + parent_folder_path = "/" +} +` diff --git a/tencentcloud/services/wedata/resource_tc_wedata_run_sql_script_operation.go b/tencentcloud/services/wedata/resource_tc_wedata_run_sql_script_operation.go new file mode 100644 index 0000000000..44a657aa37 --- /dev/null +++ b/tencentcloud/services/wedata/resource_tc_wedata_run_sql_script_operation.go @@ -0,0 +1,132 @@ +package wedata + +import ( + "context" + "fmt" + "log" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + wedatav20250806 "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/wedata/v20250806" + + tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common" + "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper" +) + +func ResourceTencentCloudWedataRunSqlScriptOperation() *schema.Resource { + return &schema.Resource{ + Create: resourceTencentCloudWedataRunSqlScriptOperationCreate, + Read: resourceTencentCloudWedataRunSqlScriptOperationRead, + Delete: resourceTencentCloudWedataRunSqlScriptOperationDelete, + Schema: map[string]*schema.Schema{ + "script_id": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + Description: "Script id.", + }, + + "project_id": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + Description: "Project ID.", + }, + + "script_content": { + Type: schema.TypeString, + Optional: true, + ForceNew: true, + Description: "Script content. executed by default if not transmitted.", + }, + + "params": { + Type: schema.TypeString, + Optional: true, + ForceNew: true, + Description: "Advanced running parameter.", + }, + + // computed + "job_id": { + Type: schema.TypeString, + Computed: true, + Description: "Job ID of the SQL script operation.", + }, + }, + } +} + +func resourceTencentCloudWedataRunSqlScriptOperationCreate(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_wedata_run_sql_script_operation.create")() + defer tccommon.InconsistentCheck(d, meta)() + + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta) + request = wedatav20250806.NewRunSQLScriptRequest() + response = wedatav20250806.NewRunSQLScriptResponse() + jobId string + ) + + if v, ok := d.GetOk("script_id"); ok { + request.ScriptId = helper.String(v.(string)) + } + + if v, ok := d.GetOk("project_id"); ok { + request.ProjectId = helper.String(v.(string)) + } + + if v, ok := d.GetOk("script_content"); ok { + request.ScriptContent = helper.String(tccommon.StringToBase64(v.(string))) + } + + if v, ok := d.GetOk("params"); ok { + request.Params = helper.String(tccommon.StringToBase64(v.(string))) + } + + reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseWedataV20250806Client().RunSQLScriptWithContext(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.Data == nil { + return resource.NonRetryableError(fmt.Errorf("Create wedata run sql script operation failed, Response is nil.")) + } + + response = result + return nil + }) + + if reqErr != nil { + log.Printf("[CRITAL]%s create wedata run sql script operation failed, reason:%+v", logId, reqErr) + return reqErr + } + + if response.Response.Data.JobId == nil { + return fmt.Errorf("JobId is nil") + } + + jobId = *response.Response.Data.JobId + _ = d.Set("job_id", jobId) + + d.SetId(jobId) + return resourceTencentCloudWedataRunSqlScriptOperationRead(d, meta) +} + +func resourceTencentCloudWedataRunSqlScriptOperationRead(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_wedata_run_sql_script_operation.read")() + defer tccommon.InconsistentCheck(d, meta)() + + return nil +} + +func resourceTencentCloudWedataRunSqlScriptOperationDelete(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_wedata_run_sql_script_operation.delete")() + defer tccommon.InconsistentCheck(d, meta)() + + return nil +} diff --git a/tencentcloud/services/wedata/resource_tc_wedata_run_sql_script_operation.md b/tencentcloud/services/wedata/resource_tc_wedata_run_sql_script_operation.md new file mode 100644 index 0000000000..0d125dac2d --- /dev/null +++ b/tencentcloud/services/wedata/resource_tc_wedata_run_sql_script_operation.md @@ -0,0 +1,20 @@ +Provides a resource to create a WeData run sql script operation + +Example Usage + +```hcl +resource "tencentcloud_wedata_run_sql_script_operation" "example" { + script_id = "195a5f49-8e43-4e05-8b42-cecdfb6349f8" + project_id = "2983848457986924544" +} +``` + +Or + +```hcl +resource "tencentcloud_wedata_run_sql_script_operation" "example" { + script_id = "195a5f49-8e43-4e05-8b42-cecdfb6349f8" + project_id = "2983848457986924544" + script_content = "SHOW DATABASES;" +} +``` diff --git a/tencentcloud/services/wedata/resource_tc_wedata_run_sql_script_operation_test.go b/tencentcloud/services/wedata/resource_tc_wedata_run_sql_script_operation_test.go new file mode 100644 index 0000000000..1470d5ee00 --- /dev/null +++ b/tencentcloud/services/wedata/resource_tc_wedata_run_sql_script_operation_test.go @@ -0,0 +1,36 @@ +package wedata_test + +import ( + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + + tcacctest "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/acctest" +) + +func TestAccTencentCloudWedataRunSqlScriptOperationResource_basic(t *testing.T) { + t.Parallel() + resource.Test(t, resource.TestCase{ + PreCheck: func() { + tcacctest.AccPreCheck(t) + }, + Providers: tcacctest.AccProviders, + Steps: []resource.TestStep{ + { + Config: testAccWedataRunSqlScriptOperation, + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrSet("tencentcloud_wedata_run_sql_script_operation.example", "id"), + resource.TestCheckResourceAttrSet("tencentcloud_wedata_run_sql_script_operation.example", "script_id"), + resource.TestCheckResourceAttrSet("tencentcloud_wedata_run_sql_script_operation.example", "project_id"), + ), + }, + }, + }) +} + +const testAccWedataRunSqlScriptOperation = ` +resource "tencentcloud_wedata_run_sql_script_operation" "example" { + script_id = "195a5f49-8e43-4e05-8b42-cecdfb6349f8" + project_id = "2983848457986924544" +} +` diff --git a/tencentcloud/services/wedata/resource_tc_wedata_sql_folder.go b/tencentcloud/services/wedata/resource_tc_wedata_sql_folder.go new file mode 100644 index 0000000000..aee78863a9 --- /dev/null +++ b/tencentcloud/services/wedata/resource_tc_wedata_sql_folder.go @@ -0,0 +1,306 @@ +package wedata + +import ( + "context" + "fmt" + "log" + "strings" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + wedatav20250806 "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/wedata/v20250806" + + tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common" + "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper" +) + +func ResourceTencentCloudWedataSqlFolder() *schema.Resource { + return &schema.Resource{ + Create: resourceTencentCloudWedataSqlFolderCreate, + Read: resourceTencentCloudWedataSqlFolderRead, + Update: resourceTencentCloudWedataSqlFolderUpdate, + Delete: resourceTencentCloudWedataSqlFolderDelete, + Importer: &schema.ResourceImporter{ + State: schema.ImportStatePassthrough, + }, + Schema: map[string]*schema.Schema{ + "folder_name": { + Type: schema.TypeString, + Required: true, + Description: "Folder name.", + }, + + "project_id": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + Description: "Project ID.", + }, + + "parent_folder_path": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + Description: "The parent folder path is /aaa/bbb/ccc. The path header must have a slash. To query the root directory, pass /.", + }, + + "access_scope": { + Type: schema.TypeString, + Optional: true, + Description: "Permission range: SHARED, PRIVATE.", + }, + + // computed + "folder_id": { + Type: schema.TypeString, + Computed: true, + Description: "Folder ID.", + }, + + "path": { + Type: schema.TypeString, + Computed: true, + Description: "Node path.", + }, + }, + } +} + +func resourceTencentCloudWedataSqlFolderCreate(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_wedata_sql_folder.create")() + defer tccommon.InconsistentCheck(d, meta)() + + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta) + request = wedatav20250806.NewCreateSQLFolderRequest() + response = wedatav20250806.NewCreateSQLFolderResponse() + projectId string + folderId string + ) + + if v, ok := d.GetOk("folder_name"); ok { + request.FolderName = helper.String(v.(string)) + } + + if v, ok := d.GetOk("project_id"); ok { + request.ProjectId = helper.String(v.(string)) + projectId = v.(string) + } + + if v, ok := d.GetOk("parent_folder_path"); ok { + request.ParentFolderPath = helper.String(v.(string)) + } + + if v, ok := d.GetOk("access_scope"); ok { + request.AccessScope = helper.String(v.(string)) + } + + reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseWedataV20250806Client().CreateSQLFolderWithContext(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.Data == nil { + return resource.NonRetryableError(fmt.Errorf("Create wedata sql folder failed, Response is nil.")) + } + + response = result + return nil + }) + + if reqErr != nil { + log.Printf("[CRITAL]%s create wedata sql folder failed, reason:%+v", logId, reqErr) + return reqErr + } + + if response.Response.Data.FolderId == nil { + return fmt.Errorf("FolderId is nil.") + } + + folderId = *response.Response.Data.FolderId + d.SetId(strings.Join([]string{projectId, folderId}, tccommon.FILED_SP)) + return resourceTencentCloudWedataSqlFolderRead(d, meta) +} + +func resourceTencentCloudWedataSqlFolderRead(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_wedata_sql_folder.read")() + defer tccommon.InconsistentCheck(d, meta)() + + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta) + service = WedataService{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()) + } + + projectId := idSplit[0] + folderId := idSplit[1] + + respData, err := service.DescribeWedataGetSqlFolderById(ctx, projectId, folderId) + if err != nil { + return err + } + + if respData == nil { + log.Printf("[WARN]%s resource `tencentcloud_wedata_sql_folder` [%s] not found, please check if it has been deleted.\n", logId, d.Id()) + d.SetId("") + return nil + } + + _ = d.Set("project_id", projectId) + + if respData.Name != nil { + _ = d.Set("folder_name", *respData.Name) + } + + if respData.ParentFolderPath != nil { + if *respData.ParentFolderPath == "" { + _ = d.Set("parent_folder_path", "/") + } else { + _ = d.Set("parent_folder_path", *respData.ParentFolderPath) + } + } + + if respData.AccessScope != nil { + _ = d.Set("access_scope", *respData.AccessScope) + } + + if respData.Id != nil { + _ = d.Set("folder_id", *respData.Id) + } + + if respData.Path != nil { + _ = d.Set("path", *respData.Path) + } + + return nil +} + +func resourceTencentCloudWedataSqlFolderUpdate(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_wedata_sql_folder.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()) + } + + projectId := idSplit[0] + folderId := idSplit[1] + + needChange := false + mutableArgs := []string{"folder_name", "access_scope"} + for _, v := range mutableArgs { + if d.HasChange(v) { + needChange = true + break + } + } + + if needChange { + request := wedatav20250806.NewUpdateSQLFolderRequest() + if v, ok := d.GetOk("folder_name"); ok { + request.FolderName = helper.String(v.(string)) + } + + if v, ok := d.GetOk("access_scope"); ok { + request.AccessScope = helper.String(v.(string)) + } + + request.ProjectId = helper.String(projectId) + request.FolderId = helper.String(folderId) + reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseWedataV20250806Client().UpdateSQLFolderWithContext(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.Data == nil { + return resource.NonRetryableError(fmt.Errorf("Update wedata sql folder failed, Response is nil.")) + } + + if result.Response.Data.Status == nil { + return resource.NonRetryableError(fmt.Errorf("Update wedata sql folder failed, Status is nil.")) + } + + if !*result.Response.Data.Status { + return resource.NonRetryableError(fmt.Errorf("Update wedata sql folder failed, Status is false.")) + } + + return nil + }) + + if reqErr != nil { + log.Printf("[CRITAL]%s update wedata sql folder failed, reason:%+v", logId, reqErr) + return reqErr + } + } + + return resourceTencentCloudWedataSqlFolderRead(d, meta) +} + +func resourceTencentCloudWedataSqlFolderDelete(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_wedata_sql_folder.delete")() + defer tccommon.InconsistentCheck(d, meta)() + + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta) + request = wedatav20250806.NewDeleteSQLFolderRequest() + ) + + idSplit := strings.Split(d.Id(), tccommon.FILED_SP) + if len(idSplit) != 2 { + return fmt.Errorf("id is broken,%s", d.Id()) + } + + projectId := idSplit[0] + folderId := idSplit[1] + + request.ProjectId = helper.String(projectId) + request.FolderId = helper.String(folderId) + reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseWedataV20250806Client().DeleteSQLFolderWithContext(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.Data == nil { + return resource.NonRetryableError(fmt.Errorf("Delete wedata sql folder failed, Response is nil.")) + } + + if result.Response.Data.Status == nil { + return resource.NonRetryableError(fmt.Errorf("Delete wedata sql folder failed, Status is nil.")) + } + + if !*result.Response.Data.Status { + return resource.NonRetryableError(fmt.Errorf("Delete wedata sql folder failed, Status is false.")) + } + + return nil + }) + + if reqErr != nil { + log.Printf("[CRITAL]%s delete wedata sql folder failed, reason:%+v", logId, reqErr) + return reqErr + } + + return nil +} diff --git a/tencentcloud/services/wedata/resource_tc_wedata_sql_folder.md b/tencentcloud/services/wedata/resource_tc_wedata_sql_folder.md new file mode 100644 index 0000000000..9c2e502eb6 --- /dev/null +++ b/tencentcloud/services/wedata/resource_tc_wedata_sql_folder.md @@ -0,0 +1,20 @@ +Provides a resource to create a WeData sql folder + +Example Usage + +```hcl +resource "tencentcloud_wedata_sql_folder" "example" { + folder_name = "tf_example" + project_id = "2983848457986924544" + parent_folder_path = "/" + access_scope = "SHARED" +} +``` + +Import + +WeData sql folder can be imported using the projectId#folderId, e.g. + +``` +terraform import tencentcloud_wedata_sql_folder.example 2917455276892352512#1c9db971-58c6-43b4-93a0-be526123a1d8 +``` diff --git a/tencentcloud/services/wedata/resource_tc_wedata_sql_folder_test.go b/tencentcloud/services/wedata/resource_tc_wedata_sql_folder_test.go new file mode 100644 index 0000000000..e4cbca6e76 --- /dev/null +++ b/tencentcloud/services/wedata/resource_tc_wedata_sql_folder_test.go @@ -0,0 +1,64 @@ +package wedata_test + +import ( + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + + tcacctest "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/acctest" +) + +func TestAccTencentCloudWedataSqlFolderResource_basic(t *testing.T) { + t.Parallel() + resource.Test(t, resource.TestCase{ + PreCheck: func() { + tcacctest.AccPreCheck(t) + }, + Providers: tcacctest.AccProviders, + Steps: []resource.TestStep{ + { + Config: testAccWedataSqlFolder, + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrSet("tencentcloud_wedata_sql_folder.example", "id"), + resource.TestCheckResourceAttrSet("tencentcloud_wedata_sql_folder.example", "folder_name"), + resource.TestCheckResourceAttrSet("tencentcloud_wedata_sql_folder.example", "project_id"), + resource.TestCheckResourceAttrSet("tencentcloud_wedata_sql_folder.example", "parent_folder_path"), + resource.TestCheckResourceAttrSet("tencentcloud_wedata_sql_folder.example", "access_scope"), + ), + }, + { + Config: testAccWedataSqlFolderUpdate, + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrSet("tencentcloud_wedata_sql_folder.example", "id"), + resource.TestCheckResourceAttrSet("tencentcloud_wedata_sql_folder.example", "folder_name"), + resource.TestCheckResourceAttrSet("tencentcloud_wedata_sql_folder.example", "project_id"), + resource.TestCheckResourceAttrSet("tencentcloud_wedata_sql_folder.example", "parent_folder_path"), + resource.TestCheckResourceAttrSet("tencentcloud_wedata_sql_folder.example", "access_scope"), + ), + }, + { + ResourceName: "tencentcloud_wedata_sql_folder.example", + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + +const testAccWedataSqlFolder = ` +resource "tencentcloud_wedata_sql_folder" "example" { + folder_name = "tf_example" + project_id = "2983848457986924544" + parent_folder_path = "/" + access_scope = "SHARED" +} +` + +const testAccWedataSqlFolderUpdate = ` +resource "tencentcloud_wedata_sql_folder" "example" { + folder_name = "tf_example_update" + project_id = "2983848457986924544" + parent_folder_path = "/" + access_scope = "PRIVATE" +} +` diff --git a/tencentcloud/services/wedata/resource_tc_wedata_sql_script.go b/tencentcloud/services/wedata/resource_tc_wedata_sql_script.go new file mode 100644 index 0000000000..f3712ecbed --- /dev/null +++ b/tencentcloud/services/wedata/resource_tc_wedata_sql_script.go @@ -0,0 +1,440 @@ +package wedata + +import ( + "context" + "fmt" + "log" + "strings" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + wedatav20250806 "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/wedata/v20250806" + + tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common" + "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper" +) + +func ResourceTencentCloudWedataSqlScript() *schema.Resource { + return &schema.Resource{ + Create: resourceTencentCloudWedataSqlScriptCreate, + Read: resourceTencentCloudWedataSqlScriptRead, + Update: resourceTencentCloudWedataSqlScriptUpdate, + Delete: resourceTencentCloudWedataSqlScriptDelete, + Importer: &schema.ResourceImporter{ + State: schema.ImportStatePassthrough, + }, + Schema: map[string]*schema.Schema{ + "script_name": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + Description: "Script name.", + }, + + "project_id": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + Description: "Project ID.", + }, + + "parent_folder_path": { + Type: schema.TypeString, + Optional: true, + ForceNew: true, + Description: "Parent folder path, /aaa/bbb/ccc, root directory is empty string or /.", + }, + + "script_config": { + Type: schema.TypeList, + Optional: true, + Computed: true, + MaxItems: 1, + Description: "Data exploration script configuration.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "datasource_id": { + Type: schema.TypeString, + Optional: true, + Description: "Data source ID.", + }, + "datasource_env": { + Type: schema.TypeString, + Optional: true, + Description: "Data source environment.", + }, + "compute_resource": { + Type: schema.TypeString, + Optional: true, + Description: "Computing resource.", + }, + "executor_group_id": { + Type: schema.TypeString, + Optional: true, + Description: "Execution resource group.", + }, + "params": { + Type: schema.TypeString, + Optional: true, + Description: "Advanced runtime parameters, variable substitution, map-json String,String.", + }, + "advance_config": { + Type: schema.TypeString, + Optional: true, + Description: "Advanced settings, execution configuration parameters, map-json String,String. Encoded in Base64.", + }, + }, + }, + }, + + "script_content": { + Type: schema.TypeString, + Optional: true, + Description: "Script content, if there is a value.", + }, + + "access_scope": { + Type: schema.TypeString, + Optional: true, + Computed: true, + ForceNew: true, + Description: "Permission scope: SHARED, PRIVATE.", + }, + + // computed + "script_id": { + Type: schema.TypeString, + Computed: true, + Description: "Script ID.", + }, + + "path": { + Type: schema.TypeString, + Computed: true, + Description: "The full path of the node, /aaa/bbb/ccc.ipynb, consists of the names of each node.", + }, + }, + } +} + +func resourceTencentCloudWedataSqlScriptCreate(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_wedata_sql_script.create")() + defer tccommon.InconsistentCheck(d, meta)() + + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta) + request = wedatav20250806.NewCreateSQLScriptRequest() + response = wedatav20250806.NewCreateSQLScriptResponse() + projectId string + scriptId string + ) + + if v, ok := d.GetOk("script_name"); ok { + request.ScriptName = helper.String(v.(string)) + } + + if v, ok := d.GetOk("project_id"); ok { + request.ProjectId = helper.String(v.(string)) + projectId = v.(string) + } + + if v, ok := d.GetOk("parent_folder_path"); ok { + request.ParentFolderPath = helper.String(v.(string)) + } + + if scriptConfigMap, ok := helper.InterfacesHeadMap(d, "script_config"); ok { + sQLScriptConfig := wedatav20250806.SQLScriptConfig{} + if v, ok := scriptConfigMap["datasource_id"].(string); ok && v != "" { + sQLScriptConfig.DatasourceId = helper.String(v) + } + + if v, ok := scriptConfigMap["datasource_env"].(string); ok && v != "" { + sQLScriptConfig.DatasourceEnv = helper.String(v) + } + + if v, ok := scriptConfigMap["compute_resource"].(string); ok && v != "" { + sQLScriptConfig.ComputeResource = helper.String(v) + } + + if v, ok := scriptConfigMap["executor_group_id"].(string); ok && v != "" { + sQLScriptConfig.ExecutorGroupId = helper.String(v) + } + + if v, ok := scriptConfigMap["params"].(string); ok && v != "" { + sQLScriptConfig.Params = helper.String(v) + } + + if v, ok := scriptConfigMap["advance_config"].(string); ok && v != "" { + sQLScriptConfig.AdvanceConfig = helper.String(v) + } + + request.ScriptConfig = &sQLScriptConfig + } + + if v, ok := d.GetOk("script_content"); ok { + request.ScriptContent = helper.String(tccommon.StringToBase64(v.(string))) + } + + if v, ok := d.GetOk("access_scope"); ok { + request.AccessScope = helper.String(v.(string)) + } + + reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseWedataV20250806Client().CreateSQLScriptWithContext(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.Data == nil { + return resource.NonRetryableError(fmt.Errorf("Create wedata sql script failed, Response is nil.")) + } + + response = result + return nil + }) + + if reqErr != nil { + log.Printf("[CRITAL]%s create wedata sql script failed, reason:%+v", logId, reqErr) + return reqErr + } + + if response.Response.Data.ScriptId == nil { + return fmt.Errorf("ScriptId is nil.") + } + + scriptId = *response.Response.Data.ScriptId + d.SetId(strings.Join([]string{projectId, scriptId}, tccommon.FILED_SP)) + return resourceTencentCloudWedataSqlScriptRead(d, meta) +} + +func resourceTencentCloudWedataSqlScriptRead(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_wedata_sql_script.read")() + defer tccommon.InconsistentCheck(d, meta)() + + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta) + service = WedataService{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()) + } + + projectId := idSplit[0] + scriptId := idSplit[1] + + respData, err := service.DescribeWedataSqlScriptById(ctx, projectId, scriptId) + if err != nil { + return err + } + + if respData == nil { + log.Printf("[WARN]%s resource `tencentcloud_wedata_sql_script` [%s] not found, please check if it has been deleted.\n", logId, d.Id()) + d.SetId("") + return nil + } + + if respData.ScriptName != nil { + _ = d.Set("script_name", respData.ScriptName) + } + + if respData.ProjectId != nil { + _ = d.Set("project_id", respData.ProjectId) + } + + if respData.ParentFolderPath != nil { + _ = d.Set("parent_folder_path", respData.ParentFolderPath) + } + + if respData.ScriptConfig != nil { + scriptConfigMap := map[string]interface{}{} + if respData.ScriptConfig.DatasourceId != nil { + scriptConfigMap["datasource_id"] = respData.ScriptConfig.DatasourceId + } + + if respData.ScriptConfig.DatasourceEnv != nil { + scriptConfigMap["datasource_env"] = respData.ScriptConfig.DatasourceEnv + } + + if respData.ScriptConfig.ComputeResource != nil { + scriptConfigMap["compute_resource"] = respData.ScriptConfig.ComputeResource + } + + if respData.ScriptConfig.ExecutorGroupId != nil { + scriptConfigMap["executor_group_id"] = respData.ScriptConfig.ExecutorGroupId + } + + if respData.ScriptConfig.Params != nil { + scriptConfigMap["params"] = respData.ScriptConfig.Params + } + + if respData.ScriptConfig.AdvanceConfig != nil { + scriptConfigMap["advance_config"] = respData.ScriptConfig.AdvanceConfig + } + + _ = d.Set("script_config", []interface{}{scriptConfigMap}) + } + + if respData.ScriptContent != nil { + sqlStr, err := tccommon.Base64ToString(*respData.ScriptContent) + if err != nil { + log.Printf("[ERROR]%s base64 decode failed, reason:%+v", logId, err) + return err + } + + _ = d.Set("script_content", sqlStr) + } + + if respData.AccessScope != nil { + _ = d.Set("access_scope", respData.AccessScope) + } + + if respData.ScriptId != nil { + _ = d.Set("script_id", respData.ScriptId) + } + + if respData.Path != nil { + _ = d.Set("path", *respData.Path) + } + + return nil +} + +func resourceTencentCloudWedataSqlScriptUpdate(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_wedata_sql_script.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()) + } + + projectId := idSplit[0] + scriptId := idSplit[1] + + needChange := false + mutableArgs := []string{"script_config", "script_content"} + for _, v := range mutableArgs { + if d.HasChange(v) { + needChange = true + break + } + } + + if needChange { + request := wedatav20250806.NewUpdateSQLScriptRequest() + if scriptConfigMap, ok := helper.InterfacesHeadMap(d, "script_config"); ok { + sQLScriptConfig := wedatav20250806.SQLScriptConfig{} + if v, ok := scriptConfigMap["datasource_id"].(string); ok && v != "" { + sQLScriptConfig.DatasourceId = helper.String(v) + } + + if v, ok := scriptConfigMap["datasource_env"].(string); ok && v != "" { + sQLScriptConfig.DatasourceEnv = helper.String(v) + } + + if v, ok := scriptConfigMap["compute_resource"].(string); ok && v != "" { + sQLScriptConfig.ComputeResource = helper.String(v) + } + + if v, ok := scriptConfigMap["executor_group_id"].(string); ok && v != "" { + sQLScriptConfig.ExecutorGroupId = helper.String(v) + } + + if v, ok := scriptConfigMap["params"].(string); ok && v != "" { + sQLScriptConfig.Params = helper.String(v) + } + + if v, ok := scriptConfigMap["advance_config"].(string); ok && v != "" { + sQLScriptConfig.AdvanceConfig = helper.String(v) + } + + request.ScriptConfig = &sQLScriptConfig + } + + if v, ok := d.GetOk("script_content"); ok { + request.ScriptContent = helper.String(v.(string)) + } + + request.ProjectId = &projectId + request.ScriptId = &scriptId + reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseWedataV20250806Client().UpdateSQLScriptWithContext(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()) + } + + return nil + }) + + if reqErr != nil { + log.Printf("[CRITAL]%s update wedata sql script failed, reason:%+v", logId, reqErr) + return reqErr + } + } + + return resourceTencentCloudWedataSqlScriptRead(d, meta) +} + +func resourceTencentCloudWedataSqlScriptDelete(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_wedata_sql_script.delete")() + defer tccommon.InconsistentCheck(d, meta)() + + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta) + request = wedatav20250806.NewDeleteSQLScriptRequest() + ) + + idSplit := strings.Split(d.Id(), tccommon.FILED_SP) + if len(idSplit) != 2 { + return fmt.Errorf("id is broken,%s", d.Id()) + } + + projectId := idSplit[0] + scriptId := idSplit[1] + + request.ProjectId = &projectId + request.ScriptId = &scriptId + reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseWedataV20250806Client().DeleteSQLScriptWithContext(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.Data == nil { + return resource.NonRetryableError(fmt.Errorf("Delete wedata sql script failed, Response is nil.")) + } + + if result.Response.Data.Status == nil { + return resource.NonRetryableError(fmt.Errorf("Delete wedata sql script failed, Status is nil.")) + } + + if !*result.Response.Data.Status { + return resource.NonRetryableError(fmt.Errorf("Delete wedata sql script failed, Status is false.")) + } + + return nil + }) + + if reqErr != nil { + log.Printf("[CRITAL]%s delete wedata sql script failed, reason:%+v", logId, reqErr) + return reqErr + } + + return nil +} diff --git a/tencentcloud/services/wedata/resource_tc_wedata_sql_script.md b/tencentcloud/services/wedata/resource_tc_wedata_sql_script.md new file mode 100644 index 0000000000..615b0e92c7 --- /dev/null +++ b/tencentcloud/services/wedata/resource_tc_wedata_sql_script.md @@ -0,0 +1,33 @@ +Provides a resource to create a WeData sql script + +Example Usage + +```hcl +resource "tencentcloud_wedata_sql_folder" "example" { + folder_name = "tf_example" + project_id = "2983848457986924544" + parent_folder_path = "/" + access_scope = "SHARED" +} + +resource "tencentcloud_wedata_sql_script" "example" { + script_name = "tf_example_script" + project_id = "2983848457986924544" + parent_folder_path = tencentcloud_wedata_sql_folder.example.path + script_config { + datasource_id = "108826" + compute_resource = "svmgao_stability" + } + + script_content = "SHOW DATABASES;" + access_scope = "SHARED" +} +``` + +Import + +WeData sql script can be imported using the projectId#scriptId, e.g. + +``` +terraform import tencentcloud_wedata_sql_script.example 2983848457986924544#cccc3170-6334-46c3-adce-c5776ad2280c +``` diff --git a/tencentcloud/services/wedata/resource_tc_wedata_sql_script_test.go b/tencentcloud/services/wedata/resource_tc_wedata_sql_script_test.go new file mode 100644 index 0000000000..e57ab9cfe3 --- /dev/null +++ b/tencentcloud/services/wedata/resource_tc_wedata_sql_script_test.go @@ -0,0 +1,80 @@ +package wedata_test + +import ( + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + + tcacctest "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/acctest" +) + +func TestAccTencentCloudWedataSqlScriptResource_basic(t *testing.T) { + t.Parallel() + resource.Test(t, resource.TestCase{ + PreCheck: func() { + tcacctest.AccPreCheck(t) + }, + Providers: tcacctest.AccProviders, + Steps: []resource.TestStep{ + { + Config: testAccWedataSqlScript, + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrSet("tencentcloud_wedata_sql_script.example", "id"), + resource.TestCheckResourceAttrSet("tencentcloud_wedata_sql_script.example", "script_name"), + resource.TestCheckResourceAttrSet("tencentcloud_wedata_sql_script.example", "project_id"), + resource.TestCheckResourceAttrSet("tencentcloud_wedata_sql_script.example", "parent_folder_path"), + resource.TestCheckResourceAttrSet("tencentcloud_wedata_sql_script.example", "script_config.#"), + resource.TestCheckResourceAttrSet("tencentcloud_wedata_sql_script.example", "script_content"), + resource.TestCheckResourceAttrSet("tencentcloud_wedata_sql_script.example", "access_scope"), + ), + }, + { + Config: testAccWedataSqlScriptUpdate, + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrSet("tencentcloud_wedata_sql_script.example", "id"), + resource.TestCheckResourceAttrSet("tencentcloud_wedata_sql_script.example", "script_name"), + resource.TestCheckResourceAttrSet("tencentcloud_wedata_sql_script.example", "project_id"), + resource.TestCheckResourceAttrSet("tencentcloud_wedata_sql_script.example", "parent_folder_path"), + resource.TestCheckResourceAttrSet("tencentcloud_wedata_sql_script.example", "script_config.#"), + resource.TestCheckResourceAttrSet("tencentcloud_wedata_sql_script.example", "script_content"), + resource.TestCheckResourceAttrSet("tencentcloud_wedata_sql_script.example", "access_scope"), + ), + }, + { + ResourceName: "tencentcloud_wedata_sql_script.example", + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + +const testAccWedataSqlScript = ` +resource "tencentcloud_wedata_sql_script" "example" { + script_name = "tf_example_script" + project_id = "2983848457986924544" + parent_folder_path = "/tf_example" + script_config { + datasource_id = "108826" + compute_resource = "svmgao_stability" + } + + script_content = "SHOW DATABASES;" + access_scope = "SHARED" +} +` + +const testAccWedataSqlScriptUpdate = ` +resource "tencentcloud_wedata_sql_script" "example" { + script_name = "tf_example_script" + project_id = "2983848457986924544" + parent_folder_path = "/tf_example" + script_config { + datasource_id = "108826" + compute_resource = "svmgao_stability" + } + + script_content = "SHOW DATABASES;" + access_scope = "PRIVATE" +} +` diff --git a/tencentcloud/services/wedata/resource_tc_wedata_stop_sql_script_run_operation.go b/tencentcloud/services/wedata/resource_tc_wedata_stop_sql_script_run_operation.go new file mode 100644 index 0000000000..f6847d93fd --- /dev/null +++ b/tencentcloud/services/wedata/resource_tc_wedata_stop_sql_script_run_operation.go @@ -0,0 +1,93 @@ +package wedata + +import ( + "context" + "log" + "strings" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + wedatav20250806 "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/wedata/v20250806" + + tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common" + "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper" +) + +func ResourceTencentCloudWedataStopSqlScriptRunOperation() *schema.Resource { + return &schema.Resource{ + Create: resourceTencentCloudWedataStopSqlScriptRunOperationCreate, + Read: resourceTencentCloudWedataStopSqlScriptRunOperationRead, + Delete: resourceTencentCloudWedataStopSqlScriptRunOperationDelete, + Schema: map[string]*schema.Schema{ + "job_id": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + Description: "Specifies the query id.", + }, + + "project_id": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + Description: "Project ID.", + }, + }, + } +} + +func resourceTencentCloudWedataStopSqlScriptRunOperationCreate(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_wedata_stop_sql_script_run_operation.create")() + defer tccommon.InconsistentCheck(d, meta)() + + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta) + request = wedatav20250806.NewStopSQLScriptRunRequest() + projectId string + jobId string + ) + + if v, ok := d.GetOk("job_id"); ok { + request.JobId = helper.String(v.(string)) + jobId = v.(string) + } + + if v, ok := d.GetOk("project_id"); ok { + request.ProjectId = helper.String(v.(string)) + projectId = v.(string) + } + + reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseWedataV20250806Client().StopSQLScriptRunWithContext(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()) + } + + return nil + }) + + if reqErr != nil { + log.Printf("[CRITAL]%s create wedata stop sql script run operation failed, reason:%+v", logId, reqErr) + return reqErr + } + + d.SetId(strings.Join([]string{projectId, jobId}, tccommon.FILED_SP)) + return resourceTencentCloudWedataStopSqlScriptRunOperationRead(d, meta) +} + +func resourceTencentCloudWedataStopSqlScriptRunOperationRead(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_wedata_stop_sql_script_run_operation.read")() + defer tccommon.InconsistentCheck(d, meta)() + + return nil +} + +func resourceTencentCloudWedataStopSqlScriptRunOperationDelete(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_wedata_stop_sql_script_run_operation.delete")() + defer tccommon.InconsistentCheck(d, meta)() + + return nil +} diff --git a/tencentcloud/services/wedata/resource_tc_wedata_stop_sql_script_run_operation.md b/tencentcloud/services/wedata/resource_tc_wedata_stop_sql_script_run_operation.md new file mode 100644 index 0000000000..03b03ed626 --- /dev/null +++ b/tencentcloud/services/wedata/resource_tc_wedata_stop_sql_script_run_operation.md @@ -0,0 +1,10 @@ +Provides a resource to create a WeData stop sql script run operation + +Example Usage + +```hcl +resource "tencentcloud_wedata_stop_sql_script_run_operation" "example" { + job_id = "ac13aceb-7a30-4414-91c0-6504f177462f" + project_id = "2983848457986924544" +} +``` diff --git a/tencentcloud/services/wedata/resource_tc_wedata_stop_sql_script_run_operation_test.go b/tencentcloud/services/wedata/resource_tc_wedata_stop_sql_script_run_operation_test.go new file mode 100644 index 0000000000..75f8db1849 --- /dev/null +++ b/tencentcloud/services/wedata/resource_tc_wedata_stop_sql_script_run_operation_test.go @@ -0,0 +1,36 @@ +package wedata_test + +import ( + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + + tcacctest "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/acctest" +) + +func TestAccTencentCloudWedataStopSqlScriptRunOperationResource_basic(t *testing.T) { + t.Parallel() + resource.Test(t, resource.TestCase{ + PreCheck: func() { + tcacctest.AccPreCheck(t) + }, + Providers: tcacctest.AccProviders, + Steps: []resource.TestStep{ + { + Config: testAccWedataStopSqlScriptRunOperation, + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrSet("tencentcloud_wedata_stop_sql_script_run_operation.example", "id"), + resource.TestCheckResourceAttrSet("tencentcloud_wedata_stop_sql_script_run_operation.example", "job_id"), + resource.TestCheckResourceAttrSet("tencentcloud_wedata_stop_sql_script_run_operation.example", "project_id"), + ), + }, + }, + }) +} + +const testAccWedataStopSqlScriptRunOperation = ` +resource "tencentcloud_wedata_stop_sql_script_run_operation" "example" { + job_id = "ac13aceb-7a30-4414-91c0-6504f177462f" + project_id = "2983848457986924544" +} +` diff --git a/tencentcloud/services/wedata/service_tencentcloud_wedata.go b/tencentcloud/services/wedata/service_tencentcloud_wedata.go index 2d98744f58..51caf7bfeb 100644 --- a/tencentcloud/services/wedata/service_tencentcloud_wedata.go +++ b/tencentcloud/services/wedata/service_tencentcloud_wedata.go @@ -2,14 +2,17 @@ package wedata import ( "context" + "fmt" "log" "strconv" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common" + "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common" wedata "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/wedata/v20210820" wedatav20250806 "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/wedata/v20250806" - tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common" "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/connectivity" "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper" "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/ratelimit" @@ -1748,6 +1751,295 @@ func (me *WedataService) DeleteWedataIntegrationTaskNodeById(ctx context.Context return } +func (me *WedataService) DescribeWedataSqlScriptRunsByFilter(ctx context.Context, param map[string]interface{}) (ret []*wedatav20250806.JobDto, errRet error) { + var ( + logId = tccommon.GetLogId(ctx) + request = wedatav20250806.NewListSQLScriptRunsRequest() + ) + + 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()) + } + }() + + for k, v := range param { + if k == "ProjectId" { + request.ProjectId = v.(*string) + } + + if k == "ScriptId" { + request.ScriptId = v.(*string) + } + + if k == "JobId" { + request.JobId = v.(*string) + } + + if k == "SearchWord" { + request.SearchWord = v.(*string) + } + + if k == "ExecuteUserUin" { + request.ExecuteUserUin = v.(*string) + } + + if k == "StartTime" { + request.StartTime = v.(*string) + } + + if k == "EndTime" { + request.EndTime = v.(*string) + } + } + + ratelimit.Check(request.GetAction()) + response, err := me.client.UseWedataV20250806Client().ListSQLScriptRuns(request) + if err != nil { + errRet = err + return + } + + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), response.ToJsonString()) + ret = response.Response.Data + return +} + +func (me *WedataService) DescribeWedataSqlFolderById(ctx context.Context, projectId, folderId string) (ret *wedatav20250806.SQLFolderNode, errRet error) { + logId := tccommon.GetLogId(ctx) + + request := wedatav20250806.NewListSQLFolderContentsRequest() + response := wedatav20250806.NewListSQLFolderContentsResponse() + request.ProjectId = helper.String(projectId) + request.ParentFolderPath = helper.String(folderId) + + 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()) + } + }() + + errRet = resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError { + ratelimit.Check(request.GetAction()) + result, e := me.client.UseWedataV20250806Client().ListSQLFolderContents(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.Data == nil { + return resource.NonRetryableError(fmt.Errorf("Describe wedata sql folder contents failed, Response is nil.")) + } + + response = result + return nil + }) + + if errRet != nil { + return + } + + ret = response.Response.Data[0] + return +} + +func (me *WedataService) DescribeWedataGetSqlFolderById(ctx context.Context, projectId, folderId string) (ret *wedatav20250806.SQLFolderNode, errRet error) { + logId := tccommon.GetLogId(ctx) + + request := wedatav20250806.NewGetSQLFolderRequest() + response := wedatav20250806.NewGetSQLFolderResponse() + request.ProjectId = helper.String(projectId) + request.FolderId = helper.String(folderId) + + 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()) + } + }() + + errRet = resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError { + ratelimit.Check(request.GetAction()) + result, e := me.client.UseWedataV20250806Client().GetSQLFolder(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.Data == nil { + return resource.NonRetryableError(fmt.Errorf("Describe wedata get sql folder failed, Response is nil.")) + } + + response = result + return nil + }) + + if errRet != nil { + return + } + + ret = response.Response.Data + return +} + +func (me *WedataService) DescribeWedataSqlScriptById(ctx context.Context, projectId, scriptId string) (ret *wedatav20250806.SQLScript, errRet error) { + logId := tccommon.GetLogId(ctx) + + request := wedatav20250806.NewGetSQLScriptRequest() + response := wedatav20250806.NewGetSQLScriptResponse() + request.ProjectId = &projectId + request.ScriptId = &scriptId + + 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()) + } + }() + + errRet = resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError { + ratelimit.Check(request.GetAction()) + result, e := me.client.UseWedataV20250806Client().GetSQLScript(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.Data == nil { + return resource.NonRetryableError(fmt.Errorf("Get wedata sql folder script failed, Response is nil.")) + } + + response = result + return nil + }) + + if errRet != nil { + return + } + + ret = response.Response.Data + return +} + +func (me *WedataService) DescribeWedataCodeFolderById(ctx context.Context, projectId, folderId string) (ret *wedatav20250806.CodeFolderNode, errRet error) { + logId := tccommon.GetLogId(ctx) + + request := wedatav20250806.NewListCodeFolderContentsRequest() + response := wedatav20250806.NewListCodeFolderContentsResponse() + request.ProjectId = &projectId + request.ParentFolderPath = &folderId + + 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()) + } + }() + + errRet = resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError { + ratelimit.Check(request.GetAction()) + result, e := me.client.UseWedataV20250806Client().ListCodeFolderContents(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.Data == nil { + return resource.NonRetryableError(fmt.Errorf("Get wedata code folder contents failed, Response is nil.")) + } + + response = result + return nil + }) + + if errRet != nil { + return + } + + ret = response.Response.Data[0] + return +} + +func (me *WedataService) DescribeWedataGetCodeFolderById(ctx context.Context, projectId, folderId string) (ret *wedatav20250806.CodeFolderNode, errRet error) { + logId := tccommon.GetLogId(ctx) + + request := wedatav20250806.NewGetCodeFolderRequest() + response := wedatav20250806.NewGetCodeFolderResponse() + request.ProjectId = &projectId + request.FolderId = &folderId + + 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()) + } + }() + + errRet = resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError { + ratelimit.Check(request.GetAction()) + result, e := me.client.UseWedataV20250806Client().GetCodeFolder(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.Data == nil { + return resource.NonRetryableError(fmt.Errorf("Get wedata get code folder failed, Response is nil.")) + } + + response = result + return nil + }) + + if errRet != nil { + return + } + + ret = response.Response.Data + return +} + +func (me *WedataService) DescribeWedataCodeFileById(ctx context.Context, projectId, codeFileId string) (ret *wedatav20250806.CodeFile, errRet error) { + logId := tccommon.GetLogId(ctx) + + request := wedatav20250806.NewGetCodeFileRequest() + response := wedatav20250806.NewGetCodeFileResponse() + request.ProjectId = &projectId + request.CodeFileId = &codeFileId + request.IncludeContent = helper.Bool(true) + + 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()) + } + }() + + errRet = resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError { + ratelimit.Check(request.GetAction()) + result, e := me.client.UseWedataV20250806Client().GetCodeFile(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.Data == nil { + return resource.NonRetryableError(fmt.Errorf("Get wedata code file failed, Response is nil.")) + } + + response = result + return nil + }) + + if errRet != nil { + return + } + + ret = response.Response.Data + return +} + func (me *WedataService) DescribeWedataResourceFilesByFilter(ctx context.Context, param map[string]interface{}) (ret []*wedatav20250806.ResourceFileItem, errRet error) { var ( logId = tccommon.GetLogId(ctx) diff --git a/website/docs/d/wedata_sql_script_runs.html.markdown b/website/docs/d/wedata_sql_script_runs.html.markdown new file mode 100644 index 0000000000..2f744701b5 --- /dev/null +++ b/website/docs/d/wedata_sql_script_runs.html.markdown @@ -0,0 +1,75 @@ +--- +subcategory: "Wedata" +layout: "tencentcloud" +page_title: "TencentCloud: tencentcloud_wedata_sql_script_runs" +sidebar_current: "docs-tencentcloud-datasource-wedata_sql_script_runs" +description: |- + Use this data source to query detailed information of WeData sql script runs +--- + +# tencentcloud_wedata_sql_script_runs + +Use this data source to query detailed information of WeData sql script runs + +## Example Usage + +```hcl +data "tencentcloud_wedata_sql_script_runs" "example" { + project_id = "1460947878944567296" + script_id = "971c1520-836f-41be-b13f-7a6c637317c8" +} +``` + +## Argument Reference + +The following arguments are supported: + +* `project_id` - (Required, String) Project ID. +* `script_id` - (Required, String) Script ID. +* `end_time` - (Optional, String) End time. +* `execute_user_uin` - (Optional, String) Execute user UIN. +* `job_id` - (Optional, String) Job ID. +* `result_output_file` - (Optional, String) Used to save results. +* `search_word` - (Optional, String) Search keyword. +* `start_time` - (Optional, String) Start time. + +## Attributes Reference + +In addition to all arguments above, the following attributes are exported: + +* `data` - Data exploration tasks. + * `create_time` - Task creation time. + * `end_time` - End time. + * `job_execution_list` - Subtask list. + * `collecting_total_result` - Whether collecting full results: default false, true means collecting full results, used for frontend polling. + * `context_script_content` - Context SQL content. + * `create_time` - Create time. + * `end_time` - End time. + * `execute_stage_info` - Execution phase. + * `job_execution_id` - Subquery task ID. + * `job_execution_name` - Subquery name. + * `job_id` - Data exploration task ID. + * `log_file_path` - Log file path. + * `result_effect_count` - Number of rows affected by the task execution result. + * `result_file_path` - Result file path. + * `result_preview_count` - Number of rows for previewing the task execution results. + * `result_preview_file_path` - Preview result file path. + * `result_total_count` - Total number of rows in the task execution result. + * `script_content_truncate` - Whether the script content is truncated. + * `script_content` - Subquery SQL content. + * `status` - Subquery status. + * `time_cost` - Time consumed. + * `update_time` - Update time. + * `job_id` - Data exploration task ID. + * `job_name` - Data exploration task name. + * `job_type` - Job type. + * `owner_uin` - Cloud owner account UIN. + * `script_content_truncate` - Whether the script content is truncated. + * `script_content` - Script content. + * `script_id` - Script ID. + * `status` - Task status. + * `time_cost` - Time consumed. + * `update_time` - Update time. + * `user_uin` - Account UIN. + + diff --git a/website/docs/r/wedata_code_file.html.markdown b/website/docs/r/wedata_code_file.html.markdown new file mode 100644 index 0000000000..4d41b9164a --- /dev/null +++ b/website/docs/r/wedata_code_file.html.markdown @@ -0,0 +1,68 @@ +--- +subcategory: "Wedata" +layout: "tencentcloud" +page_title: "TencentCloud: tencentcloud_wedata_code_file" +sidebar_current: "docs-tencentcloud-resource-wedata_code_file" +description: |- + Provides a resource to create a WeData code file +--- + +# tencentcloud_wedata_code_file + +Provides a resource to create a WeData code file + +## Example Usage + +```hcl +resource "tencentcloud_wedata_code_folder" "example" { + project_id = "2983848457986924544" + folder_name = "tf_example" + parent_folder_path = "/" +} + +resource "tencentcloud_wedata_code_file" "example" { + project_id = "2983848457986924544" + code_file_name = "tf_example_code_file" + parent_folder_path = tencentcloud_wedata_code_folder.example.path + code_file_content = "Hello Terraform" +} +``` + +## Argument Reference + +The following arguments are supported: + +* `code_file_name` - (Required, String, ForceNew) Code file name. +* `parent_folder_path` - (Required, String, ForceNew) Parent folder path, for example /aaa/bbb/ccc, path header must start with a slash, root directory pass /. +* `project_id` - (Required, String, ForceNew) Project ID. +* `code_file_config` - (Optional, List) Code file configuration. +* `code_file_content` - (Optional, String) Code file content. + +The `code_file_config` object supports the following: + +* `notebook_session_info` - (Optional, List) Notebook kernel session information. +* `params` - (Optional, String) Advanced runtime parameters, variable substitution, map-json String,String. + +The `notebook_session_info` object of `code_file_config` supports the following: + +* `notebook_session_id` - (Optional, String) Session ID. +* `notebook_session_name` - (Optional, String) Session name. + +## Attributes Reference + +In addition to all arguments above, the following attributes are exported: + +* `id` - ID of the resource. +* `access_scope` - Permission range: SHARED, PRIVATE. +* `code_file_id` - Code file ID. +* `path` - The full path of the node, /aaa/bbb/ccc.ipynb, consists of the names of each node. + + +## Import + +WeData code file can be imported using the projectId#codeFileId, e.g. + +``` +terraform import tencentcloud_wedata_code_file.example 1470547050521227264#2bfa8813-344f-4858-a2cc-7a07bd10ac1d +``` + diff --git a/website/docs/r/wedata_code_folder.html.markdown b/website/docs/r/wedata_code_folder.html.markdown new file mode 100644 index 0000000000..c0c1917c4d --- /dev/null +++ b/website/docs/r/wedata_code_folder.html.markdown @@ -0,0 +1,50 @@ +--- +subcategory: "Wedata" +layout: "tencentcloud" +page_title: "TencentCloud: tencentcloud_wedata_code_folder" +sidebar_current: "docs-tencentcloud-resource-wedata_code_folder" +description: |- + Provides a resource to create a WeData code folder +--- + +# tencentcloud_wedata_code_folder + +Provides a resource to create a WeData code folder + +## Example Usage + +```hcl +resource "tencentcloud_wedata_code_folder" "example" { + project_id = "2983848457986924544" + folder_name = "tf_example" + parent_folder_path = "/" +} +``` + +## Argument Reference + +The following arguments are supported: + +* `folder_name` - (Required, String) Folder name. +* `parent_folder_path` - (Required, String, ForceNew) Parent folder path, for example /aaa/bbb/ccc, path header must start with a slash, root directory pass /. +* `project_id` - (Required, String, ForceNew) Project ID. + +## Attributes Reference + +In addition to all arguments above, the following attributes are exported: + +* `id` - ID of the resource. +* `access_scope` - Permission range: SHARED, PRIVATE. +* `folder_id` - Folder ID. +* `path` - Node path. +* `type` - Type. folder, script. + + +## Import + +WeData code folder can be imported using the projectId#folderId, e.g. + +``` +terraform import tencentcloud_wedata_code_folder.example 1470547050521227264#2ee111df-5573-4ac4-9f93-cf9e8e438d80 +``` + diff --git a/website/docs/r/wedata_run_sql_script_operation.html.markdown b/website/docs/r/wedata_run_sql_script_operation.html.markdown new file mode 100644 index 0000000000..28f4259b8f --- /dev/null +++ b/website/docs/r/wedata_run_sql_script_operation.html.markdown @@ -0,0 +1,49 @@ +--- +subcategory: "Wedata" +layout: "tencentcloud" +page_title: "TencentCloud: tencentcloud_wedata_run_sql_script_operation" +sidebar_current: "docs-tencentcloud-resource-wedata_run_sql_script_operation" +description: |- + Provides a resource to create a WeData run sql script operation +--- + +# tencentcloud_wedata_run_sql_script_operation + +Provides a resource to create a WeData run sql script operation + +## Example Usage + +```hcl +resource "tencentcloud_wedata_run_sql_script_operation" "example" { + script_id = "195a5f49-8e43-4e05-8b42-cecdfb6349f8" + project_id = "2983848457986924544" +} +``` + +### Or + +```hcl +resource "tencentcloud_wedata_run_sql_script_operation" "example" { + script_id = "195a5f49-8e43-4e05-8b42-cecdfb6349f8" + project_id = "2983848457986924544" + script_content = "SHOW DATABASES;" +} +``` + +## Argument Reference + +The following arguments are supported: + +* `project_id` - (Required, String, ForceNew) Project ID. +* `script_id` - (Required, String, ForceNew) Script id. +* `params` - (Optional, String, ForceNew) Advanced running parameter. +* `script_content` - (Optional, String, ForceNew) Script content. executed by default if not transmitted. + +## Attributes Reference + +In addition to all arguments above, the following attributes are exported: + +* `id` - ID of the resource. +* `job_id` - Job ID of the SQL script operation. + + diff --git a/website/docs/r/wedata_sql_folder.html.markdown b/website/docs/r/wedata_sql_folder.html.markdown new file mode 100644 index 0000000000..a67cf4fb1b --- /dev/null +++ b/website/docs/r/wedata_sql_folder.html.markdown @@ -0,0 +1,50 @@ +--- +subcategory: "Wedata" +layout: "tencentcloud" +page_title: "TencentCloud: tencentcloud_wedata_sql_folder" +sidebar_current: "docs-tencentcloud-resource-wedata_sql_folder" +description: |- + Provides a resource to create a WeData sql folder +--- + +# tencentcloud_wedata_sql_folder + +Provides a resource to create a WeData sql folder + +## Example Usage + +```hcl +resource "tencentcloud_wedata_sql_folder" "example" { + folder_name = "tf_example" + project_id = "2983848457986924544" + parent_folder_path = "/" + access_scope = "SHARED" +} +``` + +## Argument Reference + +The following arguments are supported: + +* `folder_name` - (Required, String) Folder name. +* `parent_folder_path` - (Required, String, ForceNew) The parent folder path is /aaa/bbb/ccc. The path header must have a slash. To query the root directory, pass /. +* `project_id` - (Required, String, ForceNew) Project ID. +* `access_scope` - (Optional, String) Permission range: SHARED, PRIVATE. + +## Attributes Reference + +In addition to all arguments above, the following attributes are exported: + +* `id` - ID of the resource. +* `folder_id` - Folder ID. +* `path` - Node path. + + +## Import + +WeData sql folder can be imported using the projectId#folderId, e.g. + +``` +terraform import tencentcloud_wedata_sql_folder.example 2917455276892352512#1c9db971-58c6-43b4-93a0-be526123a1d8 +``` + diff --git a/website/docs/r/wedata_sql_script.html.markdown b/website/docs/r/wedata_sql_script.html.markdown new file mode 100644 index 0000000000..c81fe13df7 --- /dev/null +++ b/website/docs/r/wedata_sql_script.html.markdown @@ -0,0 +1,74 @@ +--- +subcategory: "Wedata" +layout: "tencentcloud" +page_title: "TencentCloud: tencentcloud_wedata_sql_script" +sidebar_current: "docs-tencentcloud-resource-wedata_sql_script" +description: |- + Provides a resource to create a WeData sql script +--- + +# tencentcloud_wedata_sql_script + +Provides a resource to create a WeData sql script + +## Example Usage + +```hcl +resource "tencentcloud_wedata_sql_folder" "example" { + folder_name = "tf_example" + project_id = "2983848457986924544" + parent_folder_path = "/" + access_scope = "SHARED" +} + +resource "tencentcloud_wedata_sql_script" "example" { + script_name = "tf_example_script" + project_id = "2983848457986924544" + parent_folder_path = tencentcloud_wedata_sql_folder.example.path + script_config { + datasource_id = "108826" + compute_resource = "svmgao_stability" + } + + script_content = "SHOW DATABASES;" + access_scope = "SHARED" +} +``` + +## Argument Reference + +The following arguments are supported: + +* `project_id` - (Required, String, ForceNew) Project ID. +* `script_name` - (Required, String, ForceNew) Script name. +* `access_scope` - (Optional, String, ForceNew) Permission scope: SHARED, PRIVATE. +* `parent_folder_path` - (Optional, String, ForceNew) Parent folder path, /aaa/bbb/ccc, root directory is empty string or /. +* `script_config` - (Optional, List) Data exploration script configuration. +* `script_content` - (Optional, String) Script content, if there is a value. + +The `script_config` object supports the following: + +* `advance_config` - (Optional, String) Advanced settings, execution configuration parameters, map-json String,String. Encoded in Base64. +* `compute_resource` - (Optional, String) Computing resource. +* `datasource_env` - (Optional, String) Data source environment. +* `datasource_id` - (Optional, String) Data source ID. +* `executor_group_id` - (Optional, String) Execution resource group. +* `params` - (Optional, String) Advanced runtime parameters, variable substitution, map-json String,String. + +## Attributes Reference + +In addition to all arguments above, the following attributes are exported: + +* `id` - ID of the resource. +* `path` - The full path of the node, /aaa/bbb/ccc.ipynb, consists of the names of each node. +* `script_id` - Script ID. + + +## Import + +WeData sql script can be imported using the projectId#scriptId, e.g. + +``` +terraform import tencentcloud_wedata_sql_script.example 2983848457986924544#cccc3170-6334-46c3-adce-c5776ad2280c +``` + diff --git a/website/docs/r/wedata_stop_sql_script_run_operation.html.markdown b/website/docs/r/wedata_stop_sql_script_run_operation.html.markdown new file mode 100644 index 0000000000..74659dac7d --- /dev/null +++ b/website/docs/r/wedata_stop_sql_script_run_operation.html.markdown @@ -0,0 +1,37 @@ +--- +subcategory: "Wedata" +layout: "tencentcloud" +page_title: "TencentCloud: tencentcloud_wedata_stop_sql_script_run_operation" +sidebar_current: "docs-tencentcloud-resource-wedata_stop_sql_script_run_operation" +description: |- + Provides a resource to create a WeData stop sql script run operation +--- + +# tencentcloud_wedata_stop_sql_script_run_operation + +Provides a resource to create a WeData stop sql script run operation + +## Example Usage + +```hcl +resource "tencentcloud_wedata_stop_sql_script_run_operation" "example" { + job_id = "ac13aceb-7a30-4414-91c0-6504f177462f" + project_id = "2983848457986924544" +} +``` + +## Argument Reference + +The following arguments are supported: + +* `job_id` - (Required, String, ForceNew) Specifies the query id. +* `project_id` - (Required, String, ForceNew) Project ID. + +## Attributes Reference + +In addition to all arguments above, the following attributes are exported: + +* `id` - ID of the resource. + + + diff --git a/website/tencentcloud.erb b/website/tencentcloud.erb index c1831a21c0..fd3f77fda0 100644 --- a/website/tencentcloud.erb +++ b/website/tencentcloud.erb @@ -7057,6 +7057,9 @@
  • tencentcloud_wedata_rule_templates
  • +
  • + tencentcloud_wedata_sql_script_runs +
  • tencentcloud_wedata_task_code
  • @@ -7098,6 +7101,12 @@
  • Resources