Skip to content

Commit 9e37bf3

Browse files
WeiMengXSWeiMengXS
andauthored
feat: cam permission boundary (#2177)
* feat: cam permission boundary * feat: changelog --------- Co-authored-by: WeiMengXS <nickcchen@tencent.com>
1 parent f99dc74 commit 9e37bf3

7 files changed

+300
-0
lines changed

.changelog/2177.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_cam_user_permission_boundary_attachment
3+
```

tencentcloud/provider.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,7 @@ Cloud Access Management(CAM)
235235
tencentcloud_cam_service_linked_role
236236
tencentcloud_cam_mfa_flag
237237
tencentcloud_cam_user_saml_config
238+
tencentcloud_cam_user_permission_boundary_attachment
238239
239240
Customer Identity and Access Management(CIAM)
240241
Resource
@@ -2654,6 +2655,7 @@ func Provider() *schema.Provider {
26542655
"tencentcloud_cam_service_linked_role": resourceTencentCloudCamServiceLinkedRole(),
26552656
"tencentcloud_cam_mfa_flag": resourceTencentCloudCamMfaFlag(),
26562657
"tencentcloud_cam_user_saml_config": resourceTencentCloudCamUserSamlConfig(),
2658+
"tencentcloud_cam_user_permission_boundary_attachment": resourceTencentCloudCamUserPermissionBoundaryAttachment(),
26572659
"tencentcloud_ciam_user_group": resourceTencentCloudCiamUserGroup(),
26582660
"tencentcloud_ciam_user_store": resourceTencentCloudCiamUserStore(),
26592661
"tencentcloud_scf_function": resourceTencentCloudScfFunction(),
Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
/*
2+
Provides a resource to create a cam user_permission_boundary
3+
4+
Example Usage
5+
6+
```hcl
7+
resource "tencentcloud_cam_user_permission_boundary_attachment" "user_permission_boundary" {
8+
target_uin = 100032767426
9+
policy_id = 151113272
10+
}
11+
```
12+
13+
Import
14+
15+
cam user_permission_boundary can be imported using the id, e.g.
16+
17+
```
18+
terraform import tencentcloud_cam_user_permission_boundary_attachment.user_permission_boundary user_permission_boundary_id
19+
```
20+
*/
21+
package tencentcloud
22+
23+
import (
24+
"context"
25+
"fmt"
26+
"log"
27+
"strings"
28+
29+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
30+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
31+
cam "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cam/v20190116"
32+
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
33+
)
34+
35+
func resourceTencentCloudCamUserPermissionBoundaryAttachment() *schema.Resource {
36+
return &schema.Resource{
37+
Create: resourceTencentCloudCamUserPermissionBoundaryAttachmentCreate,
38+
Read: resourceTencentCloudCamUserPermissionBoundaryAttachmentRead,
39+
Delete: resourceTencentCloudCamUserPermissionBoundaryAttachmentDelete,
40+
Importer: &schema.ResourceImporter{
41+
State: schema.ImportStatePassthrough,
42+
},
43+
Schema: map[string]*schema.Schema{
44+
"target_uin": {
45+
Required: true,
46+
ForceNew: true,
47+
Type: schema.TypeInt,
48+
Description: "Sub account Uin.",
49+
},
50+
51+
"policy_id": {
52+
Required: true,
53+
ForceNew: true,
54+
Type: schema.TypeInt,
55+
Description: "Policy ID.",
56+
},
57+
},
58+
}
59+
}
60+
61+
func resourceTencentCloudCamUserPermissionBoundaryAttachmentCreate(d *schema.ResourceData, meta interface{}) error {
62+
defer logElapsed("resource.tencentcloud_cam_user_permission_boundary_attachment.create")()
63+
defer inconsistentCheck(d, meta)()
64+
65+
logId := getLogId(contextNil)
66+
67+
var (
68+
request = cam.NewPutUserPermissionsBoundaryRequest()
69+
targetUin string
70+
policyId string
71+
)
72+
if v, ok := d.GetOkExists("target_uin"); ok {
73+
targetUin = helper.IntToStr(v.(int))
74+
request.TargetUin = helper.IntInt64(v.(int))
75+
}
76+
77+
if v, ok := d.GetOkExists("policy_id"); ok {
78+
policyId = helper.IntToStr(v.(int))
79+
request.PolicyId = helper.IntInt64(v.(int))
80+
}
81+
82+
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
83+
result, e := meta.(*TencentCloudClient).apiV3Conn.UseCamClient().PutUserPermissionsBoundary(request)
84+
if e != nil {
85+
return retryError(e)
86+
} else {
87+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
88+
}
89+
return nil
90+
})
91+
if err != nil {
92+
log.Printf("[CRITAL]%s create cam UserPermissionBoundary failed, reason:%+v", logId, err)
93+
return err
94+
}
95+
96+
d.SetId(targetUin + FILED_SP + policyId)
97+
98+
return resourceTencentCloudCamUserPermissionBoundaryAttachmentRead(d, meta)
99+
}
100+
101+
func resourceTencentCloudCamUserPermissionBoundaryAttachmentRead(d *schema.ResourceData, meta interface{}) error {
102+
defer logElapsed("resource.tencentcloud_cam_user_permission_boundary_attachment.read")()
103+
defer inconsistentCheck(d, meta)()
104+
105+
logId := getLogId(contextNil)
106+
107+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
108+
109+
service := CamService{client: meta.(*TencentCloudClient).apiV3Conn}
110+
111+
idSplit := strings.Split(d.Id(), FILED_SP)
112+
if len(idSplit) != 2 {
113+
return fmt.Errorf("id is broken,%s", d.Id())
114+
}
115+
targetUin := idSplit[0]
116+
117+
UserPermissionBoundary, err := service.DescribeCamUserPermissionBoundaryById(ctx, targetUin)
118+
if err != nil {
119+
return err
120+
}
121+
122+
if UserPermissionBoundary == nil || UserPermissionBoundary.Response == nil {
123+
d.SetId("")
124+
log.Printf("[WARN]%s resource `CamUserPermissionBoundary` [%s] not found, please check if it has been deleted.\n", logId, d.Id())
125+
return nil
126+
}
127+
128+
if UserPermissionBoundary.Response.PolicyId != nil {
129+
_ = d.Set("policy_id", UserPermissionBoundary.Response.PolicyId)
130+
}
131+
return nil
132+
}
133+
134+
func resourceTencentCloudCamUserPermissionBoundaryAttachmentDelete(d *schema.ResourceData, meta interface{}) error {
135+
defer logElapsed("resource.tencentcloud_cam_user_permission_boundary_attachment.delete")()
136+
defer inconsistentCheck(d, meta)()
137+
138+
logId := getLogId(contextNil)
139+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
140+
141+
service := CamService{client: meta.(*TencentCloudClient).apiV3Conn}
142+
idSplit := strings.Split(d.Id(), FILED_SP)
143+
if len(idSplit) != 2 {
144+
return fmt.Errorf("id is broken,%s", d.Id())
145+
}
146+
targetUin := idSplit[0]
147+
148+
if err := service.DeleteCamUserPermissionBoundaryById(ctx, targetUin); err != nil {
149+
return err
150+
}
151+
152+
return nil
153+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package tencentcloud
2+
3+
import (
4+
"testing"
5+
6+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
7+
)
8+
9+
func TestAccTencentCloudCamUserPermissionBoundaryAttachmentResource_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: testAccCamUserPermissionBoundary,
19+
Check: resource.ComposeTestCheckFunc(resource.TestCheckResourceAttrSet("tencentcloud_cam_user_permission_boundary_attachment.user_permission_boundary", "id"),
20+
resource.TestCheckResourceAttr("tencentcloud_cam_user_permission_boundary_attachment.user_permission_boundary", "target_uin", "100032767426"),
21+
resource.TestCheckResourceAttr("tencentcloud_cam_user_permission_boundary_attachment.user_permission_boundary", "policy_id", "151113272"),
22+
),
23+
},
24+
{
25+
ResourceName: "tencentcloud_cam_user_permission_boundary_attachment.user_permission_boundary",
26+
ImportState: true,
27+
ImportStateVerify: true,
28+
ImportStateVerifyIgnore: []string{"target_uin"},
29+
},
30+
},
31+
})
32+
}
33+
34+
const testAccCamUserPermissionBoundary = `
35+
36+
resource "tencentcloud_cam_user_permission_boundary_attachment" "user_permission_boundary" {
37+
target_uin = 100032767426
38+
policy_id = 151113272
39+
}
40+
41+
`

tencentcloud/service_tencentcloud_cam.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1384,3 +1384,56 @@ func (me *CamService) DescribeCamMfaFlagById(ctx context.Context, id uint64) (lo
13841384
actionFlag = response.Response.ActionFlag
13851385
return
13861386
}
1387+
1388+
func (me *CamService) DescribeCamUserPermissionBoundaryById(ctx context.Context, targetUin string) (UserPermissionBoundary *cam.GetUserPermissionBoundaryResponse, errRet error) {
1389+
logId := getLogId(ctx)
1390+
1391+
request := cam.NewGetUserPermissionBoundaryRequest()
1392+
request.TargetUin = helper.StrToInt64Point(targetUin)
1393+
1394+
defer func() {
1395+
if errRet != nil {
1396+
log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, request.GetAction(), request.ToJsonString(), errRet.Error())
1397+
}
1398+
}()
1399+
1400+
ratelimit.Check(request.GetAction())
1401+
1402+
response, err := me.client.UseCamClient().GetUserPermissionBoundary(request)
1403+
if err != nil {
1404+
errRet = err
1405+
return
1406+
}
1407+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
1408+
1409+
if response == nil {
1410+
return
1411+
}
1412+
1413+
UserPermissionBoundary = response
1414+
return
1415+
}
1416+
1417+
func (me *CamService) DeleteCamUserPermissionBoundaryById(ctx context.Context, targetUin string) (errRet error) {
1418+
logId := getLogId(ctx)
1419+
1420+
request := cam.NewDeleteUserPermissionsBoundaryRequest()
1421+
request.TargetUin = helper.StrToInt64Point(targetUin)
1422+
1423+
defer func() {
1424+
if errRet != nil {
1425+
log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, request.GetAction(), request.ToJsonString(), errRet.Error())
1426+
}
1427+
}()
1428+
1429+
ratelimit.Check(request.GetAction())
1430+
1431+
response, err := me.client.UseCamClient().DeleteUserPermissionsBoundary(request)
1432+
if err != nil {
1433+
errRet = err
1434+
return
1435+
}
1436+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
1437+
1438+
return
1439+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
---
2+
subcategory: "Cloud Access Management(CAM)"
3+
layout: "tencentcloud"
4+
page_title: "TencentCloud: tencentcloud_cam_user_permission_boundary_attachment"
5+
sidebar_current: "docs-tencentcloud-resource-cam_user_permission_boundary_attachment"
6+
description: |-
7+
Provides a resource to create a cam user_permission_boundary
8+
---
9+
10+
# tencentcloud_cam_user_permission_boundary_attachment
11+
12+
Provides a resource to create a cam user_permission_boundary
13+
14+
## Example Usage
15+
16+
```hcl
17+
resource "tencentcloud_cam_user_permission_boundary_attachment" "user_permission_boundary" {
18+
target_uin = 100032767426
19+
policy_id = 151113272
20+
}
21+
```
22+
23+
## Argument Reference
24+
25+
The following arguments are supported:
26+
27+
* `policy_id` - (Required, Int, ForceNew) Policy ID.
28+
* `target_uin` - (Required, Int, ForceNew) Sub account Uin.
29+
30+
## Attributes Reference
31+
32+
In addition to all arguments above, the following attributes are exported:
33+
34+
* `id` - ID of the resource.
35+
36+
37+
38+
## Import
39+
40+
cam user_permission_boundary can be imported using the id, e.g.
41+
42+
```
43+
terraform import tencentcloud_cam_user_permission_boundary_attachment.user_permission_boundary user_permission_boundary_id
44+
```
45+

website/tencentcloud.erb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -541,6 +541,9 @@
541541
<li>
542542
<a href="/docs/providers/tencentcloud/r/cam_user.html">tencentcloud_cam_user</a>
543543
</li>
544+
<li>
545+
<a href="/docs/providers/tencentcloud/r/cam_user_permission_boundary_attachment.html">tencentcloud_cam_user_permission_boundary_attachment</a>
546+
</li>
544547
<li>
545548
<a href="/docs/providers/tencentcloud/r/cam_user_policy_attachment.html">tencentcloud_cam_user_policy_attachment</a>
546549
</li>

0 commit comments

Comments
 (0)