Skip to content

Commit 33df96f

Browse files
authored
Merge pull request #1408 from tencentcloudstack/feat/add_tco_orgnization
add tco org
2 parents d56f4a0 + c7d28f2 commit 33df96f

29 files changed

+3584
-46
lines changed

.changelog/1408.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_organization_org_node
3+
```

go.mod

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ require (
3535
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.0.445
3636
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cloudaudit v1.0.199
3737
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cls v1.0.412
38-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.539
38+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.540
3939
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.445
4040
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.488
4141
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dayu v1.0.335
@@ -52,6 +52,7 @@ require (
5252
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/mariadb v1.0.532
5353
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/mongodb v1.0.199
5454
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/monitor v1.0.518
55+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/organization v1.0.540
5556
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/postgres v1.0.391
5657
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/privatedns v1.0.290
5758
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/pts v1.0.533

go.sum

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -517,6 +517,8 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.538 h1:z3LR
517517
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.538/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
518518
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.539 h1:5lhWDRRpLF1hErX0H/N4CA2VKEZdx4lxf8tGKj0sQAo=
519519
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.539/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
520+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.540 h1:gcESVrWAja6ap5WMz0NbmSxI6S2ee89j4KM3BNEXuoA=
521+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.540/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
520522
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.445 h1:Bh7XD0ypNMHYyBOM8hhKsSu+y0VVKUnJVS+YKKhfpGg=
521523
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.445/go.mod h1:jMDD351efCFpT1+KVFbcpu6SbmP4TYmp4qkoCfr63nQ=
522524
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.488 h1:A1seXWtMf2atBjSNYvcwxyDoFzCMgqyVnsxnWzhqJEA=
@@ -554,6 +556,8 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/mongodb v1.0.199 h1:2js
554556
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/mongodb v1.0.199/go.mod h1:f5GhbJyuYQBzRaDHGe3I4U9utb0Pmx2NlI+XcqSQRp0=
555557
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/monitor v1.0.518 h1:XClo3Xa5F9pko91olHT85aZXXcRkQiOYBCMqm8+tHG8=
556558
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/monitor v1.0.518/go.mod h1:WDTvvrrc90KE+90iizkoSQRsoSSQ3881eBC6NeypmTI=
559+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/organization v1.0.540 h1:gUVuwcjt9baj+/5LFafjdR53/xSdQxfA45Vp6E65rXU=
560+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/organization v1.0.540/go.mod h1:jHcHwlsdNL9ycLwNtqYZVjLKJILA1xuODMeMDMOxCrA=
557561
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/postgres v1.0.391 h1:1yZh5MrlFqawVGhLdd38hi5HoaKc4LgB+8cEgLT2Qo4=
558562
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/postgres v1.0.391/go.mod h1:BZSQiBjNQ+6/gL1fFXBr/0BOuPTdHmSYoIg4/AkmZB4=
559563
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/privatedns v1.0.290 h1:osYZxh9ApEc8UpvIMwjAUfdl7ytRcWUpcnnqLIpiJ/U=

tencentcloud/connectivity/client.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ import (
5151
mariadb "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/mariadb/v20170312"
5252
mongodb "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/mongodb/v20190725"
5353
monitor "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/monitor/v20180724"
54+
organization "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/organization/v20210331"
5455
postgre "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/postgres/v20170312"
5556
privatedns "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/privatedns/v20201028"
5657
pts "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/pts/v20210728"
@@ -141,6 +142,7 @@ type TencentCloudClient struct {
141142
mariadbConn *mariadb.Client
142143
ptsConn *pts.Client
143144
tatConn *tat.Client
145+
organizationConn *organization.Client
144146
}
145147

146148
// NewClientProfile returns a new ClientProfile
@@ -898,6 +900,19 @@ func (me *TencentCloudClient) UseTatClient() *tat.Client {
898900
return me.tatConn
899901
}
900902

903+
// UseOrganizationClient returns organization client for service
904+
func (me *TencentCloudClient) UseOrganizationClient() *organization.Client {
905+
if me.organizationConn != nil {
906+
return me.organizationConn
907+
}
908+
909+
cpf := me.NewClientProfile(300)
910+
me.organizationConn, _ = organization.NewClient(me.Credential, me.Region, cpf)
911+
me.organizationConn.WithHttpTransport(&LogRoundTripper{})
912+
913+
return me.organizationConn
914+
}
915+
901916
func getEnvDefault(key string, defVal int) int {
902917
val, ex := os.LookupEnv(key)
903918
if !ex {

tencentcloud/provider.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -457,7 +457,7 @@ PostgreSQL
457457
tencentcloud_postgresql_readonly_group
458458
tencentcloud_postgresql_readonly_attachment
459459
460-
Redis
460+
TencentDB for Redis
461461
Data Source
462462
tencentcloud_redis_zone_config
463463
tencentcloud_redis_instances
@@ -709,7 +709,7 @@ Security Token Service(STS)
709709
Data Source
710710
tencentcloud_sts_caller_identity
711711
712-
TDSQL for MySQL(dcdb)
712+
TDSQL for MySQL(DCDB)
713713
Data Source
714714
tencentcloud_dcdb_instances
715715
tencentcloud_dcdb_accounts
@@ -772,6 +772,10 @@ TencentCloud Automation Tools(TAT)
772772
Resource
773773
tencentcloud_tat_command
774774
tencentcloud_tat_invoker
775+
776+
Tencent Cloud Organization (TCO)
777+
Resource
778+
tencentcloud_organization_org_node
775779
*/
776780
package tencentcloud
777781

@@ -1376,6 +1380,7 @@ func Provider() terraform.ResourceProvider {
13761380
"tencentcloud_pts_cron_job": resourceTencentCloudPtsCronJob(),
13771381
"tencentcloud_tat_command": resourceTencentCloudTatCommand(),
13781382
"tencentcloud_tat_invoker": resourceTencentCloudTatInvoker(),
1383+
"tencentcloud_organization_org_node": resourceTencentCloudOrganizationOrgNode(),
13791384
},
13801385

13811386
ConfigureFunc: providerConfigure,
Lines changed: 234 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,234 @@
1+
/*
2+
Provides a resource to create a organization org_node
3+
4+
Example Usage
5+
6+
```hcl
7+
resource "tencentcloud_organization_org_node" "org_node" {
8+
name = "terraform_test"
9+
parent_node_id = 2003721
10+
remark = "for terraform test"
11+
}
12+
13+
14+
```
15+
Import
16+
17+
organization org_node can be imported using the id, e.g.
18+
```
19+
$ terraform import tencentcloud_organization_org_node.org_node orgNode_id
20+
```
21+
*/
22+
package tencentcloud
23+
24+
import (
25+
"context"
26+
"fmt"
27+
"log"
28+
29+
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
30+
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
31+
organization "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/organization/v20210331"
32+
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
33+
)
34+
35+
func resourceTencentCloudOrganizationOrgNode() *schema.Resource {
36+
return &schema.Resource{
37+
Read: resourceTencentCloudOrganizationOrgNodeRead,
38+
Create: resourceTencentCloudOrganizationOrgNodeCreate,
39+
Update: resourceTencentCloudOrganizationOrgNodeUpdate,
40+
Delete: resourceTencentCloudOrganizationOrgNodeDelete,
41+
Importer: &schema.ResourceImporter{
42+
State: schema.ImportStatePassthrough,
43+
},
44+
Schema: map[string]*schema.Schema{
45+
"parent_node_id": {
46+
Type: schema.TypeInt,
47+
Required: true,
48+
Description: "Parent node ID.",
49+
},
50+
51+
"name": {
52+
Type: schema.TypeString,
53+
Required: true,
54+
Description: "Node name.",
55+
},
56+
57+
"remark": {
58+
Type: schema.TypeString,
59+
Optional: true,
60+
Description: "Notes.",
61+
},
62+
63+
"create_time": {
64+
Type: schema.TypeString,
65+
Computed: true,
66+
Description: "Node creation time.",
67+
},
68+
69+
"update_time": {
70+
Type: schema.TypeString,
71+
Computed: true,
72+
Description: "Node update time.",
73+
},
74+
},
75+
}
76+
}
77+
78+
func resourceTencentCloudOrganizationOrgNodeCreate(d *schema.ResourceData, meta interface{}) error {
79+
defer logElapsed("resource.tencentcloud_organization_org_node.create")()
80+
defer inconsistentCheck(d, meta)()
81+
82+
logId := getLogId(contextNil)
83+
84+
var (
85+
request = organization.NewAddOrganizationNodeRequest()
86+
response *organization.AddOrganizationNodeResponse
87+
nodeId int64
88+
)
89+
90+
if v, ok := d.GetOk("parent_node_id"); ok {
91+
request.ParentNodeId = helper.IntUint64(v.(int))
92+
}
93+
94+
if v, ok := d.GetOk("name"); ok {
95+
96+
request.Name = helper.String(v.(string))
97+
}
98+
99+
if v, ok := d.GetOk("remark"); ok {
100+
101+
request.Remark = helper.String(v.(string))
102+
}
103+
104+
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
105+
result, e := meta.(*TencentCloudClient).apiV3Conn.UseOrganizationClient().AddOrganizationNode(request)
106+
if e != nil {
107+
return retryError(e)
108+
} else {
109+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n",
110+
logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
111+
}
112+
response = result
113+
return nil
114+
})
115+
116+
if err != nil {
117+
log.Printf("[CRITAL]%s create organization orgNode failed, reason:%+v", logId, err)
118+
return err
119+
}
120+
121+
nodeId = *response.Response.NodeId
122+
123+
d.SetId(helper.Int64ToStr(nodeId))
124+
return resourceTencentCloudOrganizationOrgNodeRead(d, meta)
125+
}
126+
127+
func resourceTencentCloudOrganizationOrgNodeRead(d *schema.ResourceData, meta interface{}) error {
128+
defer logElapsed("resource.tencentcloud_organization_org_node.read")()
129+
defer inconsistentCheck(d, meta)()
130+
131+
logId := getLogId(contextNil)
132+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
133+
134+
service := OrganizationService{client: meta.(*TencentCloudClient).apiV3Conn}
135+
136+
orgNodeId := d.Id()
137+
138+
orgNode, err := service.DescribeOrganizationOrgNode(ctx, orgNodeId)
139+
140+
if err != nil {
141+
return err
142+
}
143+
144+
if orgNode == nil {
145+
d.SetId("")
146+
return fmt.Errorf("resource `orgNode` %s does not exist", orgNodeId)
147+
}
148+
149+
if orgNode.ParentNodeId != nil {
150+
_ = d.Set("parent_node_id", orgNode.ParentNodeId)
151+
}
152+
153+
if orgNode.Name != nil {
154+
_ = d.Set("name", orgNode.Name)
155+
}
156+
157+
if orgNode.Remark != nil {
158+
_ = d.Set("remark", orgNode.Remark)
159+
}
160+
161+
if orgNode.CreateTime != nil {
162+
_ = d.Set("create_time", orgNode.CreateTime)
163+
}
164+
165+
if orgNode.UpdateTime != nil {
166+
_ = d.Set("update_time", orgNode.UpdateTime)
167+
}
168+
169+
return nil
170+
}
171+
172+
func resourceTencentCloudOrganizationOrgNodeUpdate(d *schema.ResourceData, meta interface{}) error {
173+
defer logElapsed("resource.tencentcloud_organization_org_node.update")()
174+
defer inconsistentCheck(d, meta)()
175+
176+
logId := getLogId(contextNil)
177+
request := organization.NewUpdateOrganizationNodeRequest()
178+
179+
orgNodeId := d.Id()
180+
181+
request.NodeId = helper.StrToUint64Point(orgNodeId)
182+
183+
if d.HasChange("parent_node_id") {
184+
return fmt.Errorf("`parent_node_id` do not support change now.")
185+
}
186+
187+
if d.HasChange("name") {
188+
if v, ok := d.GetOk("name"); ok {
189+
request.Name = helper.String(v.(string))
190+
}
191+
}
192+
193+
if d.HasChange("remark") {
194+
if v, ok := d.GetOk("remark"); ok {
195+
request.Remark = helper.String(v.(string))
196+
}
197+
}
198+
199+
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
200+
result, e := meta.(*TencentCloudClient).apiV3Conn.UseOrganizationClient().UpdateOrganizationNode(request)
201+
if e != nil {
202+
return retryError(e)
203+
} else {
204+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n",
205+
logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
206+
}
207+
return nil
208+
})
209+
210+
if err != nil {
211+
log.Printf("[CRITAL]%s create organization orgNode failed, reason:%+v", logId, err)
212+
return err
213+
}
214+
215+
return resourceTencentCloudOrganizationOrgNodeRead(d, meta)
216+
}
217+
218+
func resourceTencentCloudOrganizationOrgNodeDelete(d *schema.ResourceData, meta interface{}) error {
219+
defer logElapsed("resource.tencentcloud_organization_org_node.delete")()
220+
defer inconsistentCheck(d, meta)()
221+
222+
logId := getLogId(contextNil)
223+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
224+
225+
service := OrganizationService{client: meta.(*TencentCloudClient).apiV3Conn}
226+
227+
orgNodeId := d.Id()
228+
229+
if err := service.DeleteOrganizationOrgNodeById(ctx, orgNodeId); err != nil {
230+
return err
231+
}
232+
233+
return nil
234+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package tencentcloud
2+
3+
import (
4+
"testing"
5+
6+
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
7+
)
8+
9+
func TestAccTencentCloudOrganizationOrgNode_basic(t *testing.T) {
10+
t.Parallel()
11+
12+
resource.Test(t, resource.TestCase{
13+
PreCheck: func() { testAccPreCheckCommon(t, ACCOUNT_TYPE_SMS) },
14+
Providers: testAccProviders,
15+
Steps: []resource.TestStep{
16+
{
17+
Config: testAccOrganizationOrgNode,
18+
Check: resource.ComposeTestCheckFunc(
19+
resource.TestCheckResourceAttrSet("tencentcloud_organization_org_node.org_node", "id"),
20+
resource.TestCheckResourceAttr("tencentcloud_organization_org_node.org_node", "parent_node_id", "2003721"),
21+
resource.TestCheckResourceAttr("tencentcloud_organization_org_node.org_node", "name", "terraform_test"),
22+
resource.TestCheckResourceAttr("tencentcloud_organization_org_node.org_node", "remark", "for terraform test"),
23+
),
24+
},
25+
{
26+
ResourceName: "tencentcloud_organization_org_node.org_node",
27+
ImportState: true,
28+
ImportStateVerify: true,
29+
},
30+
},
31+
})
32+
}
33+
34+
const testAccOrganizationOrgNode = `
35+
36+
resource "tencentcloud_organization_org_node" "org_node" {
37+
name = "terraform_test"
38+
parent_node_id = 2003721
39+
remark = "for terraform test"
40+
}
41+
42+
`

0 commit comments

Comments
 (0)