Skip to content

Commit dcabba8

Browse files
tongyimingmikatong
andauthored
feat(wedata): [127481633]add resource (#3540)
* add resource * add force_delete * add unit test * update doc * add changelog * update unit test * fix * update doc * update resource file doc --------- Co-authored-by: mikatong <mikatong@tencent.com>
1 parent 3b6df3e commit dcabba8

25 files changed

+4340
-2
lines changed

.changelog/3540.txt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
```release-note:new-resource
2+
tencentcloud_wedata_task
3+
```
4+
5+
```release-note:new-resource
6+
tencentcloud_wedata_workflow_folder
7+
```
8+
9+
```release-note:new-resource
10+
tencentcloud_wedata_workflow
11+
```
12+
13+
```release-note:new-resource
14+
tencentcloud_wedata_resource_file
15+
```
16+
17+
```release-note:new-resource
18+
tencentcloud_wedata_resource_folder
19+
```

tencentcloud/provider.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2295,6 +2295,11 @@ func Provider() *schema.Provider {
22952295
"tencentcloud_waf_bot_scene_ucb_rule": waf.ResourceTencentCloudWafBotSceneUCBRule(),
22962296
"tencentcloud_waf_attack_white_rule": waf.ResourceTencentCloudWafAttackWhiteRule(),
22972297
"tencentcloud_wedata_submit_task_operation": wedata.ResourceTencentCloudWedataSubmitTaskOperation(),
2298+
"tencentcloud_wedata_task": wedata.ResourceTencentCloudWedataTask(),
2299+
"tencentcloud_wedata_workflow_folder": wedata.ResourceTencentCloudWedataWorkflowFolder(),
2300+
"tencentcloud_wedata_workflow": wedata.ResourceTencentCloudWedataWorkflow(),
2301+
"tencentcloud_wedata_resource_file": wedata.ResourceTencentCloudWedataResourceFile(),
2302+
"tencentcloud_wedata_resource_folder": wedata.ResourceTencentCloudWedataResourceFolder(),
22982303
"tencentcloud_wedata_rule_template": wedata.ResourceTencentCloudWedataRuleTemplate(),
22992304
"tencentcloud_wedata_datasource": wedata.ResourceTencentCloudWedataDatasource(),
23002305
"tencentcloud_wedata_function": wedata.ResourceTencentCloudWedataFunction(),

tencentcloud/provider.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2243,6 +2243,11 @@ tencentcloud_wedata_data_source_list
22432243

22442244
Resource
22452245
tencentcloud_wedata_submit_task_operation
2246+
tencentcloud_wedata_task
2247+
tencentcloud_wedata_workflow_folder
2248+
tencentcloud_wedata_workflow
2249+
tencentcloud_wedata_resource_file
2250+
tencentcloud_wedata_resource_folder
22462251
tencentcloud_wedata_datasource
22472252
tencentcloud_wedata_function
22482253
tencentcloud_wedata_script
Lines changed: 316 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,316 @@
1+
package wedata
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"log"
7+
"strings"
8+
9+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
10+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
11+
wedatav20250806 "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/wedata/v20250806"
12+
13+
tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
14+
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
15+
)
16+
17+
func ResourceTencentCloudWedataResourceFile() *schema.Resource {
18+
return &schema.Resource{
19+
Create: resourceTencentCloudWedataResourceFileCreate,
20+
Read: resourceTencentCloudWedataResourceFileRead,
21+
Update: resourceTencentCloudWedataResourceFileUpdate,
22+
Delete: resourceTencentCloudWedataResourceFileDelete,
23+
Schema: map[string]*schema.Schema{
24+
"project_id": {
25+
Type: schema.TypeString,
26+
Required: true,
27+
ForceNew: true,
28+
Description: "Project id.",
29+
},
30+
31+
"resource_name": {
32+
Type: schema.TypeString,
33+
Required: true,
34+
Description: "The resource file name should be consistent with the uploaded file name as much as possible.",
35+
},
36+
37+
"bucket_name": {
38+
Type: schema.TypeString,
39+
Required: true,
40+
Description: "cos bucket name, which can be obtained from the GetResourceCosPath interface.",
41+
},
42+
43+
"cos_region": {
44+
Type: schema.TypeString,
45+
Required: true,
46+
Description: "The cos bucket area corresponding to the BucketName bucket.",
47+
},
48+
49+
"parent_folder_path": {
50+
Type: schema.TypeString,
51+
Required: true,
52+
Description: "The path to upload resource files in the project, example value: /wedata/qxxxm/, root directory, please use/.",
53+
},
54+
55+
"resource_file": {
56+
Type: schema.TypeString,
57+
Required: true,
58+
Description: "- You can only choose one of the two methods of uploading a file and manually filling. If both are provided, the order of values is file> manual filling value\n-the manual filling value must be the existing cos path, /datastudio/resource/is a fixed prefix, projectId is the project ID, and a specific value needs to be passed in, parentFolderPath is the parent folder path, name is the file name, and examples of manual filling value values are: /datastudio/resource/projectId/parentFolderPath/name \n.",
59+
},
60+
61+
"bundle_id": {
62+
Type: schema.TypeString,
63+
Optional: true,
64+
Description: "bundle client ID.",
65+
},
66+
67+
"bundle_info": {
68+
Type: schema.TypeString,
69+
Optional: true,
70+
Description: "bundle client information.",
71+
},
72+
},
73+
}
74+
}
75+
76+
func resourceTencentCloudWedataResourceFileCreate(d *schema.ResourceData, meta interface{}) error {
77+
defer tccommon.LogElapsed("resource.tencentcloud_wedata_resource_file.create")()
78+
defer tccommon.InconsistentCheck(d, meta)()
79+
80+
logId := tccommon.GetLogId(tccommon.ContextNil)
81+
82+
ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
83+
84+
var (
85+
projectId string
86+
resourceId string
87+
)
88+
var (
89+
request = wedatav20250806.NewCreateResourceFileRequest()
90+
response = wedatav20250806.NewCreateResourceFileResponse()
91+
)
92+
93+
if v, ok := d.GetOk("project_id"); ok {
94+
projectId = v.(string)
95+
request.ProjectId = helper.String(projectId)
96+
}
97+
98+
if v, ok := d.GetOk("resource_name"); ok {
99+
request.ResourceName = helper.String(v.(string))
100+
}
101+
102+
if v, ok := d.GetOk("bucket_name"); ok {
103+
request.BucketName = helper.String(v.(string))
104+
}
105+
106+
if v, ok := d.GetOk("cos_region"); ok {
107+
request.CosRegion = helper.String(v.(string))
108+
}
109+
110+
if v, ok := d.GetOk("parent_folder_path"); ok {
111+
request.ParentFolderPath = helper.String(v.(string))
112+
}
113+
114+
if v, ok := d.GetOk("resource_file"); ok {
115+
request.ResourceFile = helper.String(v.(string))
116+
}
117+
118+
if v, ok := d.GetOk("bundle_id"); ok {
119+
request.BundleId = helper.String(v.(string))
120+
}
121+
122+
if v, ok := d.GetOk("bundle_info"); ok {
123+
request.BundleInfo = helper.String(v.(string))
124+
}
125+
126+
err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
127+
result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseWedataV20250806Client().CreateResourceFileWithContext(ctx, request)
128+
if e != nil {
129+
return tccommon.RetryError(e)
130+
} else {
131+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
132+
}
133+
response = result
134+
return nil
135+
})
136+
if err != nil {
137+
log.Printf("[CRITAL]%s create wedata resource file failed, reason:%+v", logId, err)
138+
return err
139+
}
140+
141+
if response.Response.Data != nil && response.Response.Data.ResourceId != nil {
142+
resourceId = *response.Response.Data.ResourceId
143+
d.SetId(strings.Join([]string{projectId, resourceId}, tccommon.FILED_SP))
144+
145+
}
146+
147+
return resourceTencentCloudWedataResourceFileRead(d, meta)
148+
}
149+
150+
func resourceTencentCloudWedataResourceFileRead(d *schema.ResourceData, meta interface{}) error {
151+
defer tccommon.LogElapsed("resource.tencentcloud_wedata_resource_file.read")()
152+
defer tccommon.InconsistentCheck(d, meta)()
153+
154+
logId := tccommon.GetLogId(tccommon.ContextNil)
155+
156+
ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
157+
158+
service := WedataService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
159+
160+
idSplit := strings.Split(d.Id(), tccommon.FILED_SP)
161+
if len(idSplit) != 2 {
162+
return fmt.Errorf("id is broken,%s", d.Id())
163+
}
164+
projectId := idSplit[0]
165+
resourceId := idSplit[1]
166+
167+
respData, err := service.DescribeWedataResourceFileById(ctx, projectId, resourceId)
168+
if err != nil {
169+
return err
170+
}
171+
172+
if respData == nil {
173+
d.SetId("")
174+
log.Printf("[WARN]%s resource `wedata_resource_file` [%s] not found, please check if it has been deleted.\n", logId, d.Id())
175+
return nil
176+
}
177+
178+
_ = d.Set("project_id", projectId)
179+
if respData.ResourceName != nil {
180+
_ = d.Set("resource_name", respData.ResourceName)
181+
}
182+
183+
if respData.BucketName != nil {
184+
_ = d.Set("bucket_name", respData.BucketName)
185+
}
186+
187+
if respData.CosRegion != nil {
188+
_ = d.Set("cos_region", respData.CosRegion)
189+
}
190+
191+
if respData.BundleId != nil {
192+
_ = d.Set("bundle_id", respData.BundleId)
193+
}
194+
195+
if respData.BundleInfo != nil {
196+
_ = d.Set("bundle_info", respData.BundleInfo)
197+
}
198+
199+
_ = projectId
200+
_ = resourceId
201+
return nil
202+
}
203+
204+
func resourceTencentCloudWedataResourceFileUpdate(d *schema.ResourceData, meta interface{}) error {
205+
defer tccommon.LogElapsed("resource.tencentcloud_wedata_resource_file.update")()
206+
defer tccommon.InconsistentCheck(d, meta)()
207+
208+
logId := tccommon.GetLogId(tccommon.ContextNil)
209+
210+
ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
211+
212+
immutableArgs := []string{"bucket_name", "cos_region", "parent_folder_path"}
213+
for _, v := range immutableArgs {
214+
if d.HasChange(v) {
215+
return fmt.Errorf("argument `%s` cannot be changed", v)
216+
}
217+
}
218+
idSplit := strings.Split(d.Id(), tccommon.FILED_SP)
219+
if len(idSplit) != 2 {
220+
return fmt.Errorf("id is broken,%s", d.Id())
221+
}
222+
projectId := idSplit[0]
223+
resourceId := idSplit[1]
224+
225+
needChange := false
226+
mutableArgs := []string{"resource_file", "resource_name", "bundle_id", "bundle_info"}
227+
for _, v := range mutableArgs {
228+
if d.HasChange(v) {
229+
needChange = true
230+
break
231+
}
232+
}
233+
234+
if needChange {
235+
request := wedatav20250806.NewUpdateResourceFileRequest()
236+
request.ProjectId = helper.String(projectId)
237+
request.ResourceId = helper.String(resourceId)
238+
239+
if v, ok := d.GetOk("resource_file"); ok {
240+
request.ResourceFile = helper.String(v.(string))
241+
}
242+
243+
if v, ok := d.GetOk("resource_name"); ok {
244+
request.ResourceName = helper.String(v.(string))
245+
}
246+
247+
if v, ok := d.GetOk("bundle_id"); ok {
248+
request.BundleId = helper.String(v.(string))
249+
}
250+
251+
if v, ok := d.GetOk("bundle_info"); ok {
252+
request.BundleInfo = helper.String(v.(string))
253+
}
254+
255+
err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
256+
result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseWedataV20250806Client().UpdateResourceFileWithContext(ctx, request)
257+
if e != nil {
258+
return tccommon.RetryError(e)
259+
} else {
260+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
261+
}
262+
return nil
263+
})
264+
if err != nil {
265+
log.Printf("[CRITAL]%s update wedata resource file failed, reason:%+v", logId, err)
266+
return err
267+
}
268+
}
269+
270+
_ = projectId
271+
_ = resourceId
272+
return resourceTencentCloudWedataResourceFileRead(d, meta)
273+
}
274+
275+
func resourceTencentCloudWedataResourceFileDelete(d *schema.ResourceData, meta interface{}) error {
276+
defer tccommon.LogElapsed("resource.tencentcloud_wedata_resource_file.delete")()
277+
defer tccommon.InconsistentCheck(d, meta)()
278+
279+
logId := tccommon.GetLogId(tccommon.ContextNil)
280+
ctx := tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
281+
282+
idSplit := strings.Split(d.Id(), tccommon.FILED_SP)
283+
if len(idSplit) != 2 {
284+
return fmt.Errorf("id is broken,%s", d.Id())
285+
}
286+
projectId := idSplit[0]
287+
resourceId := idSplit[1]
288+
289+
var (
290+
request = wedatav20250806.NewDeleteResourceFileRequest()
291+
response = wedatav20250806.NewDeleteResourceFileResponse()
292+
)
293+
294+
request.ProjectId = helper.String(projectId)
295+
request.ResourceId = helper.String(resourceId)
296+
297+
err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
298+
result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseWedataV20250806Client().DeleteResourceFileWithContext(ctx, request)
299+
if e != nil {
300+
return tccommon.RetryError(e)
301+
} else {
302+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
303+
}
304+
response = result
305+
return nil
306+
})
307+
if err != nil {
308+
log.Printf("[CRITAL]%s delete wedata resource file failed, reason:%+v", logId, err)
309+
return err
310+
}
311+
312+
_ = response
313+
_ = projectId
314+
_ = resourceId
315+
return nil
316+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
Provides a resource to create a wedata wedata_resource_file
2+
3+
Example Usage
4+
5+
```hcl
6+
resource "tencentcloud_wedata_resource_folder" "wedata_resource_folder" {
7+
project_id = 2905622749543821312
8+
parent_folder_path = "/"
9+
folder_name = "folder"
10+
}
11+
12+
resource "tencentcloud_wedata_resource_file" "wedata_resource_file" {
13+
project_id = 2905622749543821312
14+
resource_name = "tftest.txt"
15+
bucket_name = "data-manage-fsi-1315051789"
16+
cos_region = "ap-beijing-fsi"
17+
parent_folder_path = "${tencentcloud_wedata_resource_folder.wedata_resource_folder.parent_folder_path}${tencentcloud_wedata_resource_folder.wedata_resource_folder.folder_name}"
18+
resource_file = "/datastudio/resource/2905622749543821312/${tencentcloud_wedata_resource_folder.wedata_resource_folder.parent_folder_path}${tencentcloud_wedata_resource_folder.wedata_resource_folder.folder_name}/test"
19+
}
20+
```

0 commit comments

Comments
 (0)