Skip to content

Commit 6a5de47

Browse files
authored
Merge pull request #674 from tencentcloudstack/fix/cam_user_id_field
fix: cam role user - modify argument field 'id' to 'name'
2 parents 60b7d31 + f33ef5b commit 6a5de47

8 files changed

+136
-44
lines changed

tencentcloud/data_source_tc_cam_group_memberships.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,15 @@ func dataSourceTencentCloudCamGroupMemberships() *schema.Resource {
4747
Description: "ID of CAM group.",
4848
},
4949
"user_ids": {
50+
Type: schema.TypeSet,
51+
Computed: true,
52+
Elem: &schema.Schema{
53+
Type: schema.TypeString,
54+
},
55+
Deprecated: "It has been deprecated from version 1.59.5. Use `user_names` instead.",
56+
Description: "ID set of the CAM group members.",
57+
},
58+
"user_names": {
5059
Type: schema.TypeSet,
5160
Computed: true,
5261
Elem: &schema.Schema{
@@ -89,6 +98,7 @@ func dataSourceTencentCloudCamGroupMembershipsRead(d *schema.ResourceData, meta
8998
mapping := map[string]interface{}{
9099
"group_id": groupId,
91100
"user_ids": memberships,
101+
"user_names": memberships,
92102
}
93103
groupList = append(groupList, mapping)
94104
ids = append(ids, groupId)

tencentcloud/resource_tc_cam_group_membership.go

Lines changed: 85 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ Example Usage
66
```hcl
77
resource "tencentcloud_cam_group_membership" "foo" {
88
group_id = tencentcloud_cam_group.foo.id
9-
user_ids = [tencentcloud_cam_user.foo.id, tencentcloud_cam_user.bar.id]
9+
user_names = [tencentcloud_cam_user.foo.name, tencentcloud_cam_user.bar.name]
1010
}
1111
```
1212
@@ -51,12 +51,23 @@ func resourceTencentCloudCamGroupMembership() *schema.Resource {
5151
},
5252
"user_ids": {
5353
Type: schema.TypeSet,
54-
Required: true,
54+
Optional: true,
55+
AtLeastOneOf: []string{"user_ids", "user_names"},
5556
Elem: &schema.Schema{
5657
Type: schema.TypeString,
5758
},
59+
Deprecated: "It has been deprecated from version 1.59.5. Use `user_names` instead.",
5860
Description: "ID set of the CAM group members.",
5961
},
62+
"user_names": {
63+
Type: schema.TypeSet,
64+
Optional: true,
65+
AtLeastOneOf: []string{"user_ids", "user_names"},
66+
Elem: &schema.Schema{
67+
Type: schema.TypeString,
68+
},
69+
Description: "User name set as ID of the CAM group members.",
70+
},
6071
},
6172
}
6273
}
@@ -67,8 +78,11 @@ func resourceTencentCloudCamGroupMembershipCreate(d *schema.ResourceData, meta i
6778
logId := getLogId(contextNil)
6879

6980
groupId := d.Get("group_id").(string)
70-
members := d.Get("user_ids").(*schema.Set).List()
71-
err := addUsersToGroup(members, groupId, meta)
81+
members, _, err := getUserIds(d)
82+
if err != nil {
83+
return err
84+
}
85+
err = addUsersToGroup(members.List(), groupId, meta)
7286
if err != nil {
7387
log.Printf("[CRITAL]%s create CAM group membership failed, reason:%s\n", logId, err.Error())
7488
return err
@@ -132,7 +146,11 @@ func resourceTencentCloudCamGroupMembershipRead(d *schema.ResourceData, meta int
132146
//this may cause problems when there are members in two dimensions array
133147
//need to read state of the tfstate file to clear the relationships
134148
//in this situation, import action is not supported
135-
stateMembers := d.Get("user_ids").(*schema.Set)
149+
stateMembers, usingNames, err := getUserIds(d)
150+
if err != nil {
151+
stateMembers = &schema.Set{}
152+
}
153+
memberResult := make([]*string, 0)
136154
if stateMembers.Len() != 0 {
137155
//the old state exist
138156
//create a new membership with state
@@ -142,9 +160,15 @@ func resourceTencentCloudCamGroupMembershipRead(d *schema.ResourceData, meta int
142160
exactMembers = append(exactMembers, v)
143161
}
144162
}
145-
_ = d.Set("user_ids", exactMembers)
163+
memberResult = exactMembers
146164
} else {
147-
_ = d.Set("user_ids", members)
165+
memberResult = members
166+
}
167+
168+
if usingNames {
169+
_ = d.Set("user_names", memberResult)
170+
} else {
171+
_ = d.Set("user_ids", memberResult)
148172
}
149173
_ = d.Set("group_id", groupId)
150174

@@ -158,26 +182,8 @@ func resourceTencentCloudCamGroupMembershipUpdate(d *schema.ResourceData, meta i
158182

159183
groupId := d.Id()
160184

161-
if d.HasChange("user_ids") {
162-
o, n := d.GetChange("user_ids")
163-
os := o.(*schema.Set)
164-
ns := n.(*schema.Set)
165-
add := ns.Difference(os).List()
166-
remove := os.Difference(ns).List()
167-
if len(remove) > 0 {
168-
oErr := removeUsersFromGroup(remove, groupId, meta)
169-
if oErr != nil {
170-
log.Printf("[CRITAL]%s update CAM group membership failed, reason:%s\n", logId, oErr.Error())
171-
return oErr
172-
}
173-
}
174-
if len(add) > 0 {
175-
nErr := addUsersToGroup(add, groupId, meta)
176-
if nErr != nil {
177-
log.Printf("[CRITAL]%s update CAM group membership failed, reason:%s\n", logId, nErr.Error())
178-
return nErr
179-
}
180-
}
185+
if err := processChange(d, groupId, logId, meta); err != nil {
186+
return err
181187
}
182188

183189
return resourceTencentCloudCamGroupMembershipRead(d, meta)
@@ -188,8 +194,12 @@ func resourceTencentCloudCamGroupMembershipDelete(d *schema.ResourceData, meta i
188194

189195
logId := getLogId(contextNil)
190196
groupId := d.Get("group_id").(string)
191-
members := d.Get("user_ids").(*schema.Set).List()
192-
err := removeUsersFromGroup(members, groupId, meta)
197+
userIds, _, err := getUserIds(d)
198+
if err != nil {
199+
return err
200+
}
201+
members := userIds.List()
202+
err = removeUsersFromGroup(members, groupId, meta)
193203
if err != nil {
194204
log.Printf("[CRITAL]%s delete CAM group failed, reason:%s\n", logId, err.Error())
195205
return err
@@ -320,3 +330,49 @@ func removeUsersFromGroup(members []interface{}, groupId string, meta interface{
320330
}
321331
return nil
322332
}
333+
334+
func getUserIds(d *schema.ResourceData) (data *schema.Set, usingNames bool, errRet error) {
335+
names, hasNames := d.GetOk("user_names")
336+
ids, hasIds := d.GetOk("user_ids")
337+
338+
if hasNames {
339+
return names.(*schema.Set), true, nil
340+
} else if hasIds {
341+
return ids.(*schema.Set), false, nil
342+
}
343+
return nil, true, fmt.Errorf("no user names provided")
344+
}
345+
346+
func processChange(d *schema.ResourceData, groupId string, logId string, meta interface{}) error {
347+
var (
348+
o interface{}
349+
n interface{}
350+
)
351+
if d.HasChange("user_names") {
352+
o, n = d.GetChange("user_names")
353+
} else if d.HasChange("user_ids") {
354+
o, n = d.GetChange("user_ids")
355+
} else {
356+
return nil
357+
}
358+
359+
os := o.(*schema.Set)
360+
ns := n.(*schema.Set)
361+
add := ns.Difference(os).List()
362+
remove := os.Difference(ns).List()
363+
if len(remove) > 0 {
364+
oErr := removeUsersFromGroup(remove, groupId, meta)
365+
if oErr != nil {
366+
log.Printf("[CRITAL]%s update CAM group membership failed, reason:%s\n", logId, oErr.Error())
367+
return oErr
368+
}
369+
}
370+
if len(add) > 0 {
371+
nErr := addUsersToGroup(add, groupId, meta)
372+
if nErr != nil {
373+
log.Printf("[CRITAL]%s update CAM group membership failed, reason:%s\n", logId, nErr.Error())
374+
return nErr
375+
}
376+
}
377+
return nil
378+
}

tencentcloud/resource_tc_cam_group_membership_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,14 @@ func TestAccTencentCloudCamGroupMembership_basic(t *testing.T) {
2020
Check: resource.ComposeTestCheckFunc(
2121
testAccCheckCamGroupMembershipExists("tencentcloud_cam_group_membership.group_membership_basic"),
2222
resource.TestCheckResourceAttrSet("tencentcloud_cam_group_membership.group_membership_basic", "group_id"),
23-
resource.TestCheckResourceAttr("tencentcloud_cam_group_membership.group_membership_basic", "user_ids.#", "1"),
23+
resource.TestCheckResourceAttr("tencentcloud_cam_group_membership.group_membership_basic", "user_names.#", "1"),
2424
),
2525
}, {
2626
Config: testAccCamGroupMembership_update,
2727
Check: resource.ComposeTestCheckFunc(
2828
testAccCheckCamGroupMembershipExists("tencentcloud_cam_group_membership.group_membership_basic"),
2929
resource.TestCheckResourceAttrSet("tencentcloud_cam_group_membership.group_membership_basic", "group_id"),
30-
resource.TestCheckResourceAttr("tencentcloud_cam_group_membership.group_membership_basic", "user_ids.#", "1"),
30+
resource.TestCheckResourceAttr("tencentcloud_cam_group_membership.group_membership_basic", "user_names.#", "1"),
3131
),
3232
},
3333
{
@@ -106,7 +106,7 @@ resource "tencentcloud_cam_user" "foo" {
106106
107107
resource "tencentcloud_cam_group_membership" "group_membership_basic" {
108108
group_id = tencentcloud_cam_group.group_basic.id
109-
user_ids = [tencentcloud_cam_user.foo.id,]
109+
user_names = [tencentcloud_cam_user.foo.id]
110110
}
111111
`
112112

@@ -131,6 +131,6 @@ resource "tencentcloud_cam_user" "user_basic" {
131131
132132
resource "tencentcloud_cam_group_membership" "group_membership_basic" {
133133
group_id = tencentcloud_cam_group.group_basic.id
134-
user_ids = [tencentcloud_cam_user.user_basic.id]
134+
user_names = [tencentcloud_cam_user.user_basic.id]
135135
}
136136
`

tencentcloud/resource_tc_cam_user_policy_attachment.go

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,19 @@ func resourceTencentCloudCamUserPolicyAttachment() *schema.Resource {
4444
Schema: map[string]*schema.Schema{
4545
"user_id": {
4646
Type: schema.TypeString,
47-
Required: true,
47+
Optional: true,
4848
ForceNew: true,
49+
AtLeastOneOf: []string{"user_name", "user_id"},
50+
Deprecated: "It has been deprecated from version 1.59.5. Use `user_name` instead.",
4951
Description: "ID of the attached CAM user.",
5052
},
53+
"user_name": {
54+
Type: schema.TypeString,
55+
Optional: true,
56+
ForceNew: true,
57+
AtLeastOneOf: []string{"user_name", "user_id"},
58+
Description: "Name of the attached CAM user as uniq key.",
59+
},
5160
"policy_id": {
5261
Type: schema.TypeString,
5362
Required: true,
@@ -84,12 +93,15 @@ func resourceTencentCloudCamUserPolicyAttachmentCreate(d *schema.ResourceData, m
8493
logId := getLogId(contextNil)
8594
ctx := context.WithValue(context.TODO(), logIdKey, logId)
8695

87-
userId := d.Get("user_id").(string)
96+
userId, _, err := getUserId(d)
97+
if err != nil {
98+
return err
99+
}
88100
policyId := d.Get("policy_id").(string)
89101
camService := CamService{
90102
client: meta.(*TencentCloudClient).apiV3Conn,
91103
}
92-
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
104+
err = resource.Retry(writeRetryTimeout, func() *resource.RetryError {
93105
e := camService.AddUserPolicyAttachment(ctx, userId, policyId)
94106
if e != nil {
95107
log.Printf("[CRITAL]%s reason[%s]\n", logId, e.Error())
@@ -161,7 +173,7 @@ func resourceTencentCloudCamUserPolicyAttachmentRead(d *schema.ResourceData, met
161173
if e != nil {
162174
return e
163175
}
164-
_ = d.Set("user_id", userId)
176+
_ = d.Set("user_name", userId)
165177
_ = d.Set("policy_id", strconv.Itoa(int(policyId)))
166178
_ = d.Set("policy_name", *instance.PolicyName)
167179
_ = d.Set("create_time", *instance.AddTime)
@@ -196,3 +208,14 @@ func resourceTencentCloudCamUserPolicyAttachmentDelete(d *schema.ResourceData, m
196208

197209
return nil
198210
}
211+
212+
func getUserId(d *schema.ResourceData) (value string, usingName bool, err error) {
213+
name, hasName := d.GetOk("user_name")
214+
id, hasId := d.GetOk("user_id")
215+
if hasName {
216+
return name.(string), true, nil
217+
} else if hasId {
218+
return id.(string), false, nil
219+
}
220+
return "", false, fmt.Errorf("no user name provided")
221+
}

tencentcloud/resource_tc_cam_user_policy_attachment_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ func TestAccTencentCloudCamUserPolicyAttachment_basic(t *testing.T) {
1919
Config: testAccCamUserPolicyAttachment_basic,
2020
Check: resource.ComposeTestCheckFunc(
2121
testAccCheckCamUserPolicyAttachmentExists("tencentcloud_cam_user_policy_attachment.user_policy_attachment_basic"),
22-
resource.TestCheckResourceAttrSet("tencentcloud_cam_user_policy_attachment.user_policy_attachment_basic", "user_id"),
22+
resource.TestCheckResourceAttrSet("tencentcloud_cam_user_policy_attachment.user_policy_attachment_basic", "user_name"),
2323
resource.TestCheckResourceAttrSet("tencentcloud_cam_user_policy_attachment.user_policy_attachment_basic", "policy_id"),
2424
),
2525
},
@@ -100,7 +100,7 @@ resource "tencentcloud_cam_policy" "policy" {
100100
}
101101
102102
resource "tencentcloud_cam_user_policy_attachment" "user_policy_attachment_basic" {
103-
user_id = tencentcloud_cam_user.user.id
103+
user_name = tencentcloud_cam_user.user.name
104104
policy_id = tencentcloud_cam_policy.policy.id
105105
}
106106
`

website/docs/d/cam_group_memberships.html.markdown

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ In addition to all arguments above, the following attributes are exported:
3232

3333
* `membership_list` - A list of CAM group membership. Each element contains the following attributes:
3434
* `group_id` - ID of CAM group.
35-
* `user_ids` - ID set of the CAM group members.
35+
* `user_ids` - (**Deprecated**) It has been deprecated from version 1.59.5. Use `user_names` instead. ID set of the CAM group members.
36+
* `user_names` - ID set of the CAM group members.
3637

3738

website/docs/r/cam_group_membership.html.markdown

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ Provides a resource to create a CAM group membership.
1515

1616
```hcl
1717
resource "tencentcloud_cam_group_membership" "foo" {
18-
group_id = tencentcloud_cam_group.foo.id
19-
user_ids = [tencentcloud_cam_user.foo.id, tencentcloud_cam_user.bar.id]
18+
group_id = tencentcloud_cam_group.foo.id
19+
user_names = [tencentcloud_cam_user.foo.name, tencentcloud_cam_user.bar.name]
2020
}
2121
```
2222

@@ -25,7 +25,8 @@ resource "tencentcloud_cam_group_membership" "foo" {
2525
The following arguments are supported:
2626

2727
* `group_id` - (Required) ID of CAM group.
28-
* `user_ids` - (Required) ID set of the CAM group members.
28+
* `user_ids` - (Optional, **Deprecated**) It has been deprecated from version 1.59.5. Use `user_names` instead. ID set of the CAM group members.
29+
* `user_names` - (Optional) User name set as ID of the CAM group members.
2930

3031
## Attributes Reference
3132

website/docs/r/cam_user_policy_attachment.html.markdown

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ resource "tencentcloud_cam_user_policy_attachment" "foo" {
2525
The following arguments are supported:
2626

2727
* `policy_id` - (Required, ForceNew) ID of the policy.
28-
* `user_id` - (Required, ForceNew) ID of the attached CAM user.
28+
* `user_id` - (Optional, ForceNew, **Deprecated**) It has been deprecated from version 1.59.5. Use `user_name` instead. ID of the attached CAM user.
29+
* `user_name` - (Optional, ForceNew) Name of the attached CAM user as uniq key.
2930

3031
## Attributes Reference
3132

0 commit comments

Comments
 (0)