Skip to content

Commit b9e7b07

Browse files
authored
feat/oceanus (#2372)
* feat/oceanus * feat/oceanus
1 parent 53c62bb commit b9e7b07

File tree

13 files changed

+660
-9
lines changed

13 files changed

+660
-9
lines changed

.changelog/2372.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:new-resource
2+
tencentcloud_oceanus_folder
3+
```

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ require (
4646
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.0.693
4747
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cloudaudit v1.0.544
4848
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cls v1.0.711
49-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.807
49+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.810
5050
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.624
5151
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cwp v1.0.762
5252
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.692
@@ -109,7 +109,7 @@ require (
109109
github.com/hashicorp/go-uuid v1.0.3
110110
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdwpg v1.0.772
111111
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dasb v1.0.798
112-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/oceanus v1.0.775
112+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/oceanus v1.0.810
113113
github.com/wI2L/jsondiff v0.3.0
114114
k8s.io/apimachinery v0.22.4
115115
)

go.sum

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -930,6 +930,8 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.806 h1:FnKM
930930
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.806/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
931931
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.807 h1:L/frkQ4e34Q9WsVJn+666Mk3WmJQuAwBKOs5198c/So=
932932
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.807/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
933+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.810 h1:Cj5eyNp3K3gMlrrsDhX+fqX5lpTJItKHeLf8qRHoe/4=
934+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.810/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
933935
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.624 h1:nEZqsoqt1pEoaP9JjkHQy3/H00suCfzlHW1qOm2nYD8=
934936
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.624/go.mod h1:+TXSVyeKwt1IhZRqKPbTREteBcP+K07Q846/ilNzLWA=
935937
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cwp v1.0.762 h1:2egy69SP/wPsmnfozcQVZ6tUY6F6N/TpEe/7xtXrc/8=
@@ -978,6 +980,8 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/mps v1.0.777 h1:SoH/Kkq
978980
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/mps v1.0.777/go.mod h1:sBmwqD3GkczHFiArdYpHPp9QriIbzNtO99DueYVyGwE=
979981
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/oceanus v1.0.775 h1:VIZop5bJScxARZjqQj/01zs2TA1nGX1klgkqmjvf+5s=
980982
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/oceanus v1.0.775/go.mod h1:xBt3wq6VMlfNXvegSCGmPySjfEShqiv56j3LrWyhmGs=
983+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/oceanus v1.0.810 h1:P9eQ4I/cFcLnNGH8tjZsFVNTpJ4iizI5RBEkNfyKbDg=
984+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/oceanus v1.0.810/go.mod h1:jWIMZDz6D+bwcfc1n4idP3S1581bOqRPaXjU4wllnZ8=
981985
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/organization v1.0.770 h1:Ksu947uY/fafnlILemfMuyKqL/RxHh9dfVowWX8paeQ=
982986
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/organization v1.0.770/go.mod h1:Ew8jug2Kq03q9Kkjzov7IMYgugGLEw3FGYPofuRqzKw=
983987
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/postgres v1.0.676 h1:KDt87M2b8j/Xo/9o+kaVtJ46fOtPctCpMDa1CJpSlkY=

tencentcloud/provider.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1134,6 +1134,7 @@ Oceanus
11341134
tencentcloud_oceanus_resource
11351135
tencentcloud_oceanus_resource_config
11361136
tencentcloud_oceanus_work_space
1137+
tencentcloud_oceanus_folder
11371138
11381139
Virtual Private Cloud(VPC)
11391140
Data Source
@@ -3019,6 +3020,7 @@ func Provider() *schema.Provider {
30193020
"tencentcloud_oceanus_resource": resourceTencentCloudOceanusResource(),
30203021
"tencentcloud_oceanus_resource_config": resourceTencentCloudOceanusResourceConfig(),
30213022
"tencentcloud_oceanus_work_space": resourceTencentCloudOceanusWorkSpace(),
3023+
"tencentcloud_oceanus_folder": resourceTencentCloudOceanusFolder(),
30223024
"tencentcloud_tag": resourceTencentCloudTag(),
30233025
"tencentcloud_tag_attachment": resourceTencentCloudTagAttachment(),
30243026
"tencentcloud_eip": resourceTencentCloudEip(),
Lines changed: 261 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,261 @@
1+
/*
2+
Provides a resource to create a oceanus folder
3+
4+
Example Usage
5+
6+
```hcl
7+
resource "tencentcloud_oceanus_folder" "example" {
8+
folder_name = "tf_example"
9+
parent_id = "folder-lfqkt11s"
10+
folder_type = 0
11+
work_space_id = "space-125703345ap-shenzhen-fsi"
12+
}
13+
```
14+
15+
Import
16+
17+
oceanus folder can be imported using the id, e.g.
18+
19+
```
20+
terraform import tencentcloud_oceanus_folder.example space-125703345ap-shenzhen-fsi#folder-f40fq79g#0
21+
```
22+
*/
23+
package tencentcloud
24+
25+
import (
26+
"context"
27+
"fmt"
28+
"log"
29+
"strconv"
30+
"strings"
31+
32+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
33+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
34+
oceanus "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/oceanus/v20190422"
35+
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
36+
)
37+
38+
func resourceTencentCloudOceanusFolder() *schema.Resource {
39+
return &schema.Resource{
40+
Create: resourceTencentCloudOceanusFolderCreate,
41+
Read: resourceTencentCloudOceanusFolderRead,
42+
Update: resourceTencentCloudOceanusFolderUpdate,
43+
Delete: resourceTencentCloudOceanusFolderDelete,
44+
Importer: &schema.ResourceImporter{
45+
State: schema.ImportStatePassthrough,
46+
},
47+
Schema: map[string]*schema.Schema{
48+
"folder_name": {
49+
Required: true,
50+
Type: schema.TypeString,
51+
Description: "New file name.",
52+
},
53+
"parent_id": {
54+
Required: true,
55+
Type: schema.TypeString,
56+
Description: "Parent folder id.",
57+
},
58+
"folder_type": {
59+
Optional: true,
60+
Type: schema.TypeInt,
61+
ValidateFunc: validateAllowedIntValue([]int{0, 1}),
62+
Default: 0,
63+
Description: "Folder type, 0: job folder, 1: resource folder. Default is 0.",
64+
},
65+
"work_space_id": {
66+
Required: true,
67+
Type: schema.TypeString,
68+
Description: "Workspace SerialId.",
69+
},
70+
},
71+
}
72+
}
73+
74+
func resourceTencentCloudOceanusFolderCreate(d *schema.ResourceData, meta interface{}) error {
75+
defer logElapsed("resource.tencentcloud_oceanus_folder.create")()
76+
defer inconsistentCheck(d, meta)()
77+
78+
var (
79+
logId = getLogId(contextNil)
80+
request = oceanus.NewCreateFolderRequest()
81+
response = oceanus.NewCreateFolderResponse()
82+
folderId string
83+
folderType string
84+
workSpaceId string
85+
)
86+
87+
if v, ok := d.GetOk("folder_name"); ok {
88+
request.FolderName = helper.String(v.(string))
89+
}
90+
91+
if v, ok := d.GetOk("parent_id"); ok {
92+
request.ParentId = helper.String(v.(string))
93+
}
94+
95+
if v, ok := d.GetOkExists("folder_type"); ok {
96+
request.FolderType = helper.IntInt64(v.(int))
97+
folderType = strconv.Itoa(v.(int))
98+
}
99+
100+
if v, ok := d.GetOk("work_space_id"); ok {
101+
request.WorkSpaceId = helper.String(v.(string))
102+
workSpaceId = v.(string)
103+
}
104+
105+
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
106+
result, e := meta.(*TencentCloudClient).apiV3Conn.UseOceanusClient().CreateFolder(request)
107+
if e != nil {
108+
return retryError(e)
109+
} else {
110+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
111+
}
112+
113+
if result == nil {
114+
e = fmt.Errorf("oceanus Folder not exists")
115+
return resource.NonRetryableError(e)
116+
}
117+
118+
response = result
119+
return nil
120+
})
121+
122+
if err != nil {
123+
log.Printf("[CRITAL]%s create oceanus Folder failed, reason:%+v", logId, err)
124+
return err
125+
}
126+
127+
folderId = *response.Response.FolderId
128+
d.SetId(strings.Join([]string{workSpaceId, folderId, folderType}, FILED_SP))
129+
130+
return resourceTencentCloudOceanusFolderRead(d, meta)
131+
}
132+
133+
func resourceTencentCloudOceanusFolderRead(d *schema.ResourceData, meta interface{}) error {
134+
defer logElapsed("resource.tencentcloud_oceanus_folder.read")()
135+
defer inconsistentCheck(d, meta)()
136+
137+
var (
138+
logId = getLogId(contextNil)
139+
ctx = context.WithValue(context.TODO(), logIdKey, logId)
140+
service = OceanusService{client: meta.(*TencentCloudClient).apiV3Conn}
141+
)
142+
143+
idSplit := strings.Split(d.Id(), FILED_SP)
144+
if len(idSplit) != 3 {
145+
return fmt.Errorf("id is broken,%s", idSplit)
146+
}
147+
workSpaceId := idSplit[0]
148+
folderId := idSplit[1]
149+
folderType := idSplit[2]
150+
151+
Folder, err := service.DescribeOceanusFolderById(ctx, workSpaceId, folderId, folderType)
152+
if err != nil {
153+
return err
154+
}
155+
156+
if Folder == nil {
157+
d.SetId("")
158+
log.Printf("[WARN]%s resource `OceanusFolder` [%s] not found, please check if it has been deleted.\n", logId, d.Id())
159+
return nil
160+
}
161+
162+
if Folder.FolderName != nil {
163+
_ = d.Set("folder_name", Folder.FolderName)
164+
}
165+
166+
if Folder.ParentId != nil {
167+
_ = d.Set("parent_id", Folder.ParentId)
168+
}
169+
170+
if Folder.FolderType != nil {
171+
_ = d.Set("folder_type", Folder.FolderType)
172+
}
173+
174+
if Folder.WorkSpaceId != nil {
175+
_ = d.Set("work_space_id", Folder.WorkSpaceId)
176+
}
177+
178+
return nil
179+
}
180+
181+
func resourceTencentCloudOceanusFolderUpdate(d *schema.ResourceData, meta interface{}) error {
182+
defer logElapsed("resource.tencentcloud_oceanus_folder.update")()
183+
defer inconsistentCheck(d, meta)()
184+
185+
var (
186+
logId = getLogId(contextNil)
187+
request = oceanus.NewModifyFolderRequest()
188+
)
189+
190+
immutableArgs := []string{"folder_type", "work_space_id"}
191+
192+
for _, v := range immutableArgs {
193+
if d.HasChange(v) {
194+
return fmt.Errorf("argument `%s` cannot be changed", v)
195+
}
196+
}
197+
198+
idSplit := strings.Split(d.Id(), FILED_SP)
199+
if len(idSplit) != 3 {
200+
return fmt.Errorf("id is broken,%s", idSplit)
201+
}
202+
workSpaceId := idSplit[0]
203+
folderId := idSplit[1]
204+
folderType := idSplit[2]
205+
206+
request.WorkSpaceId = &workSpaceId
207+
request.SourceFolderId = &folderId
208+
folderTypeInt, _ := strconv.ParseInt(folderType, 10, 64)
209+
request.FolderType = &folderTypeInt
210+
211+
if v, ok := d.GetOk("parent_id"); ok {
212+
request.TargetFolderId = helper.String(v.(string))
213+
}
214+
215+
if v, ok := d.GetOk("folder_name"); ok {
216+
request.FolderName = helper.String(v.(string))
217+
}
218+
219+
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
220+
result, e := meta.(*TencentCloudClient).apiV3Conn.UseOceanusClient().ModifyFolder(request)
221+
if e != nil {
222+
return retryError(e)
223+
} else {
224+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
225+
}
226+
227+
return nil
228+
})
229+
230+
if err != nil {
231+
log.Printf("[CRITAL]%s update oceanus Folder failed, reason:%+v", logId, err)
232+
return err
233+
}
234+
235+
return resourceTencentCloudOceanusFolderRead(d, meta)
236+
}
237+
238+
func resourceTencentCloudOceanusFolderDelete(d *schema.ResourceData, meta interface{}) error {
239+
defer logElapsed("resource.tencentcloud_oceanus_folder.delete")()
240+
defer inconsistentCheck(d, meta)()
241+
242+
var (
243+
logId = getLogId(contextNil)
244+
ctx = context.WithValue(context.TODO(), logIdKey, logId)
245+
service = OceanusService{client: meta.(*TencentCloudClient).apiV3Conn}
246+
)
247+
248+
idSplit := strings.Split(d.Id(), FILED_SP)
249+
if len(idSplit) != 3 {
250+
return fmt.Errorf("id is broken,%s", idSplit)
251+
}
252+
workSpaceId := idSplit[0]
253+
folderId := idSplit[1]
254+
folderType := idSplit[2]
255+
256+
if err := service.DeleteOceanusFolderById(ctx, workSpaceId, folderId, folderType); err != nil {
257+
return err
258+
}
259+
260+
return nil
261+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package tencentcloud
2+
3+
import (
4+
"testing"
5+
6+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
7+
)
8+
9+
// go test -i; go test -test.run TestAccTencentCloudNeedFixOceanusFolderResource_basic -v
10+
func TestAccTencentCloudNeedFixOceanusFolderResource_basic(t *testing.T) {
11+
t.Parallel()
12+
resource.Test(t, resource.TestCase{
13+
PreCheck: func() {
14+
testAccPreCheck(t)
15+
},
16+
Providers: testAccProviders,
17+
Steps: []resource.TestStep{
18+
{
19+
Config: testAccOceanusFolder,
20+
Check: resource.ComposeTestCheckFunc(
21+
resource.TestCheckResourceAttrSet("tencentcloud_oceanus_folder.example", "id"),
22+
resource.TestCheckResourceAttr("tencentcloud_oceanus_folder.example", "folder_name", "tf_example"),
23+
resource.TestCheckResourceAttr("tencentcloud_oceanus_folder.example", "parent_id", "folder-f40fq79g"),
24+
resource.TestCheckResourceAttrSet("tencentcloud_oceanus_folder.example", "folder_type"),
25+
resource.TestCheckResourceAttr("tencentcloud_oceanus_folder.example", "work_space_id", "space-bshmbms5"),
26+
),
27+
},
28+
{
29+
ResourceName: "tencentcloud_oceanus_folder.example",
30+
ImportState: true,
31+
ImportStateVerify: true,
32+
},
33+
{
34+
Config: testAccOceanusFolderUpdate,
35+
Check: resource.ComposeTestCheckFunc(
36+
resource.TestCheckResourceAttrSet("tencentcloud_oceanus_folder.example", "id"),
37+
resource.TestCheckResourceAttr("tencentcloud_oceanus_folder.example", "folder_name", "tf_example_update"),
38+
resource.TestCheckResourceAttr("tencentcloud_oceanus_folder.example", "parent_id", "folder-f40fq79g"),
39+
resource.TestCheckResourceAttrSet("tencentcloud_oceanus_folder.example", "folder_type"),
40+
resource.TestCheckResourceAttr("tencentcloud_oceanus_folder.example", "work_space_id", "space-bshmbms5"),
41+
),
42+
},
43+
},
44+
})
45+
}
46+
47+
const testAccOceanusFolder = `
48+
resource "tencentcloud_oceanus_folder" "example" {
49+
folder_name = "tf_example"
50+
parent_id = "folder-f40fq79g"
51+
folder_type = 0
52+
work_space_id = "space-bshmbms5"
53+
}
54+
`
55+
56+
const testAccOceanusFolderUpdate = `
57+
resource "tencentcloud_oceanus_folder" "example" {
58+
folder_name = "tf_example_update"
59+
parent_id = "folder-f40fq79g"
60+
folder_type = 0
61+
work_space_id = "space-bshmbms5"
62+
}
63+
`

0 commit comments

Comments
 (0)