Skip to content

Commit 64ac4b4

Browse files
authored
add product ciam (#1946)
* add product ciam * add changelog
1 parent 904e59b commit 64ac4b4

File tree

19 files changed

+6386
-4
lines changed

19 files changed

+6386
-4
lines changed

.changelog/1946.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
```release-note:new-resource
2+
tencentcloud_ciam_user_store
3+
```
4+
5+
```release-note:new-resource
6+
tencentcloud_ciam_user_group
7+
```

go.mod

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,12 @@ require (
3636
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdn v1.0.539
3737
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cfs v1.0.627
3838
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/chdfs v1.0.600
39+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ciam v1.0.695
3940
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ckafka v1.0.667
4041
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.0.659
4142
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cloudaudit v1.0.544
4243
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cls v1.0.663
43-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.692
44+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.695
4445
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.624
4546
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cwp v1.0.589
4647
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.692

go.sum

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -794,6 +794,8 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cfs v1.0.627 h1:nChNdoC
794794
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cfs v1.0.627/go.mod h1:lr3IyWgJk4rLWr0vVd8J1Tfs5O+wNcwSZ9ciMhGUrlI=
795795
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/chdfs v1.0.600 h1:qSpp4rEgAzfXhi1rPxes+AJp2mwnsyRGPY/Km1FuYGs=
796796
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/chdfs v1.0.600/go.mod h1:xud1dQ7Rc23yC5kS00TYRrvZ/A+94EOkwquaI6xGVac=
797+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ciam v1.0.695 h1:FGwsF1/PgY+M92bEC+0NH4tJkI8i0qjrLbZWVjLXOAY=
798+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ciam v1.0.695/go.mod h1:HAasVoWz8ed6kAg7Q/DTg+8uZXiOgW7lmJeAGGrquEQ=
797799
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ckafka v1.0.667 h1:cecrsRRZ5bvKC/3DHvngMkkHe52+Run+73kLy/I/xLU=
798800
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ckafka v1.0.667/go.mod h1:oMEFOM7AR1K/5pJyhQ9x+TXWX3AsxCqYACdqZLxH/kA=
799801
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.0.659 h1:Hleh17bTIva3PWprkgA/qR1mkHlzV0TSBBOEzqxI500=
@@ -851,8 +853,9 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.680/go.mod
851853
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.688/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
852854
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.689/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
853855
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.691/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
854-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.692 h1:BS3D1DcM2nRMPYW9DaIQT0OaQ7A0AkUl3zglBBXalB4=
855856
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.692/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
857+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.695 h1:p2p8V1WmR2LLQKRof2ljXePtbtlv+nzoF3e8A0AXbUc=
858+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.695/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
856859
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.624 h1:nEZqsoqt1pEoaP9JjkHQy3/H00suCfzlHW1qOm2nYD8=
857860
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.624/go.mod h1:+TXSVyeKwt1IhZRqKPbTREteBcP+K07Q846/ilNzLWA=
858861
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cwp v1.0.589 h1:LZihgirMH0vsaGScYexxwY0fTss9vHaSZs/YOQUVESg=

tencentcloud/connectivity/client.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import (
88
"strconv"
99
"time"
1010

11+
ciam "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ciam/v20220331"
12+
1113
"github.com/tencentyun/cos-go-sdk-v5"
1214

1315
"github.com/aws/aws-sdk-go/aws"
@@ -165,6 +167,7 @@ type TencentCloudClient struct {
165167
chdfsConn *chdfs.Client
166168
mdlConn *mdl.Client
167169
apmConn *apm.Client
170+
ciamConn *ciam.Client
168171
tseConn *tse.Client
169172
}
170173

@@ -1163,6 +1166,20 @@ func (me *TencentCloudClient) UseApmClient() *apm.Client {
11631166
return me.apmConn
11641167
}
11651168

1169+
// UseCiamClient returns ciam client for service
1170+
func (me *TencentCloudClient) UseCiamClient() *ciam.Client {
1171+
if me.ciamConn != nil {
1172+
return me.ciamConn
1173+
}
1174+
1175+
cpf := me.NewClientProfile(300)
1176+
cpf.Language = "zh-CN"
1177+
me.ciamConn, _ = ciam.NewClient(me.Credential, me.Region, cpf)
1178+
me.ciamConn.WithHttpTransport(&LogRoundTripper{})
1179+
1180+
return me.ciamConn
1181+
}
1182+
11661183
// UseTseClient returns tse client for service
11671184
func (me *TencentCloudClient) UseTseClient() *tse.Client {
11681185
if me.tseConn != nil {

tencentcloud/provider.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,11 @@ Cloud Access Management(CAM)
225225
tencentcloud_cam_service_linked_role
226226
tencentcloud_cam_user_saml_config
227227
228+
Customer Identity and Access Management(CIAM)
229+
Resource
230+
tencentcloud_ciam_user_store
231+
tencentcloud_ciam_user_group
232+
228233
Cloud Block Storage(CBS)
229234
Data Source
230235
tencentcloud_cbs_snapshots
@@ -2442,6 +2447,8 @@ func Provider() *schema.Provider {
24422447
"tencentcloud_cam_saml_provider": resourceTencentCloudCamSAMLProvider(),
24432448
"tencentcloud_cam_service_linked_role": resourceTencentCloudCamServiceLinkedRole(),
24442449
"tencentcloud_cam_user_saml_config": resourceTencentCloudCamUserSamlConfig(),
2450+
"tencentcloud_ciam_user_group": resourceTencentCloudCiamUserGroup(),
2451+
"tencentcloud_ciam_user_store": resourceTencentCloudCiamUserStore(),
24452452
"tencentcloud_scf_function": resourceTencentCloudScfFunction(),
24462453
"tencentcloud_scf_function_version": resourceTencentCloudScfFunctionVersion(),
24472454
"tencentcloud_scf_function_event_invoke_config": resourceTencentCloudScfFunctionEventInvokeConfig(),
Lines changed: 243 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,243 @@
1+
/*
2+
Provides a resource to create a ciam user group
3+
4+
Example Usage
5+
6+
```hcl
7+
resource "tencentcloud_ciam_user_store" "user_store" {
8+
user_pool_name = "tf_user_store"
9+
user_pool_desc = "for terraform test"
10+
user_pool_logo = "https://ciam-prd-1302490086.cos.ap-guangzhou.myqcloud.com/temporary/92630252a2c5422d9663db5feafd619b.png"
11+
}
12+
13+
resource "tencentcloud_ciam_user_group" "user_group" {
14+
display_name = "tf_user_group"
15+
user_store_id = tencentcloud_ciam_user_store.user_store.id
16+
description = "for terrafrom test"
17+
}
18+
```
19+
20+
Import
21+
22+
ciam user_group can be imported using the id, e.g.
23+
24+
```
25+
terraform import tencentcloud_ciam_user_group.user_group userStoreId#userGroupId
26+
```
27+
*/
28+
package tencentcloud
29+
30+
import (
31+
"context"
32+
"fmt"
33+
"log"
34+
"strings"
35+
36+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
37+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
38+
ciam "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ciam/v20220331"
39+
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
40+
)
41+
42+
func resourceTencentCloudCiamUserGroup() *schema.Resource {
43+
return &schema.Resource{
44+
Create: resourceTencentCloudCiamUserGroupCreate,
45+
Read: resourceTencentCloudCiamUserGroupRead,
46+
Update: resourceTencentCloudCiamUserGroupUpdate,
47+
Delete: resourceTencentCloudCiamUserGroupDelete,
48+
Importer: &schema.ResourceImporter{
49+
State: schema.ImportStatePassthrough,
50+
},
51+
Schema: map[string]*schema.Schema{
52+
"user_store_id": {
53+
Required: true,
54+
Type: schema.TypeString,
55+
Description: "User Store ID.",
56+
},
57+
"display_name": {
58+
Required: true,
59+
Type: schema.TypeString,
60+
Description: "User Group Name.",
61+
},
62+
"description": {
63+
Optional: true,
64+
Type: schema.TypeString,
65+
Description: "User Group Description.",
66+
},
67+
},
68+
}
69+
}
70+
71+
func resourceTencentCloudCiamUserGroupCreate(d *schema.ResourceData, meta interface{}) error {
72+
defer logElapsed("resource.tencentcloud_ciam_user_group.create")()
73+
defer inconsistentCheck(d, meta)()
74+
75+
logId := getLogId(contextNil)
76+
77+
var (
78+
request = ciam.NewCreateUserGroupRequest()
79+
response = ciam.NewCreateUserGroupResponse()
80+
userStoreId string
81+
userGroupId string
82+
)
83+
if v, ok := d.GetOk("user_store_id"); ok {
84+
userStoreId = v.(string)
85+
request.UserStoreId = helper.String(v.(string))
86+
}
87+
88+
if v, ok := d.GetOk("display_name"); ok {
89+
request.DisplayName = helper.String(v.(string))
90+
}
91+
92+
if v, ok := d.GetOk("description"); ok {
93+
request.Description = helper.String(v.(string))
94+
}
95+
96+
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
97+
result, e := meta.(*TencentCloudClient).apiV3Conn.UseCiamClient().CreateUserGroup(request)
98+
if e != nil {
99+
return retryError(e)
100+
} else {
101+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
102+
}
103+
response = result
104+
return nil
105+
})
106+
if err != nil {
107+
log.Printf("[CRITAL]%s create ciam userGroup failed, reason:%+v", logId, err)
108+
return err
109+
}
110+
111+
userGroupId = *response.Response.UserGroupId
112+
113+
d.SetId(userStoreId + FILED_SP + userGroupId)
114+
115+
return resourceTencentCloudCiamUserGroupRead(d, meta)
116+
}
117+
118+
func resourceTencentCloudCiamUserGroupRead(d *schema.ResourceData, meta interface{}) error {
119+
defer logElapsed("resource.tencentcloud_ciam_user_group.read")()
120+
defer inconsistentCheck(d, meta)()
121+
122+
logId := getLogId(contextNil)
123+
124+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
125+
126+
service := CiamService{client: meta.(*TencentCloudClient).apiV3Conn}
127+
128+
idSplit := strings.Split(d.Id(), FILED_SP)
129+
if len(idSplit) != 2 {
130+
return fmt.Errorf("id is broken,%s", d.Id())
131+
}
132+
userStoreId := idSplit[0]
133+
userGroupId := idSplit[1]
134+
135+
userGroup, err := service.DescribeCiamUserGroupById(ctx, userStoreId, userGroupId)
136+
if err != nil {
137+
return err
138+
}
139+
140+
if userGroup == nil {
141+
d.SetId("")
142+
log.Printf("[WARN]%s resource `CiamUserGroup` [%s] not found, please check if it has been deleted.\n", logId, d.Id())
143+
return nil
144+
}
145+
146+
if userGroup.DisplayName != nil {
147+
_ = d.Set("display_name", userGroup.DisplayName)
148+
}
149+
150+
if userGroup.UserStoreId != nil {
151+
_ = d.Set("user_store_id", userGroup.UserStoreId)
152+
}
153+
154+
if userGroup.Description != nil {
155+
_ = d.Set("description", userGroup.Description)
156+
}
157+
158+
return nil
159+
}
160+
161+
func resourceTencentCloudCiamUserGroupUpdate(d *schema.ResourceData, meta interface{}) error {
162+
defer logElapsed("resource.tencentcloud_ciam_user_group.update")()
163+
defer inconsistentCheck(d, meta)()
164+
165+
logId := getLogId(contextNil)
166+
167+
request := ciam.NewUpdateUserGroupRequest()
168+
169+
idSplit := strings.Split(d.Id(), FILED_SP)
170+
if len(idSplit) != 2 {
171+
return fmt.Errorf("id is broken,%s", d.Id())
172+
}
173+
userStoreId := idSplit[0]
174+
userGroupId := idSplit[1]
175+
176+
request.UserStoreId = &userStoreId
177+
request.UserGroupId = &userGroupId
178+
179+
needChange := false
180+
mutableArgs := []string{
181+
"display_name", "user_store_id", "description",
182+
}
183+
184+
for _, v := range mutableArgs {
185+
if d.HasChange(v) {
186+
needChange = true
187+
break
188+
}
189+
}
190+
191+
if needChange {
192+
193+
if v, ok := d.GetOk("display_name"); ok {
194+
request.DisplayName = helper.String(v.(string))
195+
}
196+
197+
if v, ok := d.GetOk("user_store_id"); ok {
198+
request.UserStoreId = helper.String(v.(string))
199+
}
200+
201+
if v, ok := d.GetOk("description"); ok {
202+
request.Description = helper.String(v.(string))
203+
}
204+
205+
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
206+
result, e := meta.(*TencentCloudClient).apiV3Conn.UseCiamClient().UpdateUserGroup(request)
207+
if e != nil {
208+
return retryError(e)
209+
} else {
210+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
211+
}
212+
return nil
213+
})
214+
if err != nil {
215+
log.Printf("[CRITAL]%s update ciam userGroup failed, reason:%+v", logId, err)
216+
return err
217+
}
218+
219+
}
220+
return resourceTencentCloudCiamUserGroupRead(d, meta)
221+
}
222+
223+
func resourceTencentCloudCiamUserGroupDelete(d *schema.ResourceData, meta interface{}) error {
224+
defer logElapsed("resource.tencentcloud_ciam_user_group.delete")()
225+
defer inconsistentCheck(d, meta)()
226+
227+
logId := getLogId(contextNil)
228+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
229+
230+
service := CiamService{client: meta.(*TencentCloudClient).apiV3Conn}
231+
idSplit := strings.Split(d.Id(), FILED_SP)
232+
if len(idSplit) != 2 {
233+
return fmt.Errorf("id is broken,%s", d.Id())
234+
}
235+
userStoreId := idSplit[0]
236+
userGroupId := idSplit[1]
237+
238+
if err := service.DeleteCiamUserGroupById(ctx, userStoreId, userGroupId); err != nil {
239+
return err
240+
}
241+
242+
return nil
243+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package tencentcloud
2+
3+
import (
4+
"testing"
5+
6+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
7+
)
8+
9+
func TestAccTencentCloudCiamUserGroupResource_basic(t *testing.T) {
10+
t.Parallel()
11+
resource.Test(t, resource.TestCase{
12+
PreCheck: func() {
13+
testAccPreCheck(t)
14+
},
15+
Providers: testAccProviders,
16+
Steps: []resource.TestStep{
17+
{
18+
Config: testAccCiamUserGroup,
19+
Check: resource.ComposeTestCheckFunc(resource.TestCheckResourceAttrSet("tencentcloud_ciam_user_group.user_group", "id")),
20+
},
21+
{
22+
ResourceName: "tencentcloud_ciam_user_group.user_group",
23+
ImportState: true,
24+
ImportStateVerify: true,
25+
},
26+
},
27+
})
28+
}
29+
30+
const testAccCiamUserGroup = `
31+
32+
resource "tencentcloud_ciam_user_store" "user_store" {
33+
user_pool_name = "tf_user_store_test"
34+
user_pool_desc = "for terraform test"
35+
user_pool_logo = "https://ciam-prd-1302490086.cos.ap-guangzhou.myqcloud.com/temporary/92630252a2c5422d9663db5feafd619b.png"
36+
}
37+
38+
resource "tencentcloud_ciam_user_group" "user_group" {
39+
display_name = "tf_user_group"
40+
user_store_id = tencentcloud_ciam_user_store.user_store.id
41+
description = "for terrafrom test"
42+
}
43+
44+
`

0 commit comments

Comments
 (0)