Skip to content

Commit cbf39e7

Browse files
tongyimingmikatong
andauthored
Feat/role sso (#1068)
* feat: support role sso * feat: update vendor * feat: update doc Co-authored-by: mikatong <[email protected]>
1 parent 7f5fc0c commit cbf39e7

File tree

12 files changed

+1124
-5
lines changed

12 files changed

+1124
-5
lines changed

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ require (
2222
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/api v1.0.285
2323
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/apigateway v1.0.199
2424
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/as v1.0.363
25-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cam v1.0.389
25+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cam v1.0.409
2626
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cbs v1.0.199
2727
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdb v1.0.199
2828
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdn v1.0.199
@@ -31,7 +31,7 @@ require (
3131
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.0.283
3232
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cloudaudit v1.0.199
3333
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cls v1.0.377
34-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.406
34+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.409
3535
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.385
3636
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.359
3737
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dayu v1.0.335

go.sum

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,8 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/as v1.0.363 h1:Js8YGmBR
456456
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/as v1.0.363/go.mod h1:ic2rqJIJObd0d/VnIHwQWdwZQe8oWSEOzG1lcx8TG0M=
457457
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cam v1.0.389 h1:onXh7FnJW1/SKe8wnk2Eje2hwURZE9kLjywAEsWjQ3Q=
458458
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cam v1.0.389/go.mod h1:tE7rJIMfrxsp1/j69qs2/0rbY028MeLUF4kyP+oYmNA=
459+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cam v1.0.409 h1:ToZpNh78SVdKakkeR9YV1a65tjtC4NJl+hrJqTuhO3g=
460+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cam v1.0.409/go.mod h1:U24yUxCDruJLayOsP/onO2E/7+9ljeNsNO+phu+PeiM=
459461
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cbs v1.0.199 h1:MkIdFgEGF+baYAU9Z/PUmudfuamCGtLsedQpopwyHNU=
460462
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cbs v1.0.199/go.mod h1:PTp058qpOV//RukBVdYQT962rZg71lIt6eHLK1zdvEc=
461463
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdb v1.0.199 h1:7ReZOKl95X+9SkPPtrAoUt4ZPJSIjiSxq4g/M54JmtU=
@@ -488,6 +490,8 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.403 h1:61iP
488490
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.403/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
489491
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.406 h1:XUBVoGGSfxAIpH75WOsBc2ypwHg003vv0ditaRTvKbE=
490492
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.406/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
493+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.409 h1:/klI8+1mbCIaRbJRjZHLQzXPJb//rlENFUWIEiShTXg=
494+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.409/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
491495
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.385 h1:8bwloRxRwSADSK48KxaUeO9JHmmgniNGJbA7Or/HUEk=
492496
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.385/go.mod h1:PMxA0L4o8Fbx/6+ju1cAMAU7x2bV4C6e/LTqVe745yM=
493497
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.359 h1:cNKqelPgUxrJkLY0Azd2QHr/UMYOPPnmqs88clt2akk=

tencentcloud/provider.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ Cloud Access Management(CAM)
167167
tencentcloud_cam_group_membership
168168
tencentcloud_cam_saml_provider
169169
tencentcloud_cam_oidc_sso
170+
tencentcloud_cam_role_sso
170171
171172
Cloud Block Storage(CBS)
172173
Data Source
@@ -1016,6 +1017,7 @@ func Provider() terraform.ResourceProvider {
10161017
"tencentcloud_cam_group_policy_attachment": resourceTencentCloudCamGroupPolicyAttachment(),
10171018
"tencentcloud_cam_group": resourceTencentCloudCamGroup(),
10181019
"tencentcloud_cam_oidc_sso": resourceTencentCloudCamOIDCSSO(),
1020+
"tencentcloud_cam_role_sso": resourceTencentCloudCamRoleSSO(),
10191021
"tencentcloud_cam_group_membership": resourceTencentCloudCamGroupMembership(),
10201022
"tencentcloud_cam_saml_provider": resourceTencentCloudCamSAMLProvider(),
10211023
"tencentcloud_scf_function": resourceTencentCloudScfFunction(),
Lines changed: 195 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,195 @@
1+
/*
2+
Provides a resource to create a CAM-ROLE-SSO (Only support OIDC).
3+
4+
Example Usage
5+
6+
```hcl
7+
resource "tencentcloud_cam_role_sso" "foo" {
8+
name="test"
9+
identity_url="https://login.microsoftonline.com/.../v2.0"
10+
identity_key="..."
11+
client_ids=["..."]
12+
description="this is a description"
13+
}
14+
```
15+
16+
Import
17+
18+
CAM-ROLE-SSO can be imported using the `name`, e.g.
19+
20+
```
21+
$ terraform import tencentcloud_cam_role_sso.foo "test"
22+
```
23+
*/
24+
package tencentcloud
25+
26+
import (
27+
"fmt"
28+
"log"
29+
30+
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
31+
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
32+
cam "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cam/v20190116"
33+
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
34+
)
35+
36+
func resourceTencentCloudCamRoleSSO() *schema.Resource {
37+
return &schema.Resource{
38+
Create: resourceTencentCloudCamRoleSSOCreate,
39+
Read: resourceTencentCloudCamRoleSSORead,
40+
Update: resourceTencentCloudCamRoleSSOUpdate,
41+
Delete: resourceTencentCloudCamRoleSSODelete,
42+
Importer: &schema.ResourceImporter{
43+
State: schema.ImportStatePassthrough,
44+
},
45+
46+
Schema: map[string]*schema.Schema{
47+
"name": {
48+
Type: schema.TypeString,
49+
Required: true,
50+
Description: "The name of resource.",
51+
},
52+
"identity_url": {
53+
Type: schema.TypeString,
54+
Required: true,
55+
Description: "Identity provider URL.",
56+
},
57+
"identity_key": {
58+
Type: schema.TypeString,
59+
Required: true,
60+
Description: "Sign the public key.",
61+
},
62+
"client_ids": {
63+
Type: schema.TypeSet,
64+
Required: true,
65+
Elem: &schema.Schema{Type: schema.TypeString},
66+
Description: "Client ids.",
67+
},
68+
"description": {
69+
Type: schema.TypeString,
70+
Optional: true,
71+
Description: "The description of resource.",
72+
},
73+
},
74+
}
75+
}
76+
77+
func resourceTencentCloudCamRoleSSOCreate(d *schema.ResourceData, meta interface{}) error {
78+
defer logElapsed("resource.tencentcloud_cam_role_sso.create")()
79+
80+
logId := getLogId(contextNil)
81+
82+
request := cam.NewCreateOIDCConfigRequest()
83+
request.Name = helper.String(d.Get("name").(string))
84+
request.IdentityUrl = helper.String(d.Get("identity_url").(string))
85+
request.IdentityKey = helper.String(d.Get("identity_key").(string))
86+
request.Description = helper.String(d.Get("description").(string))
87+
request.ClientId = helper.InterfacesStringsPoint(d.Get("client_ids").(*schema.Set).List())
88+
89+
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
90+
result, e := meta.(*TencentCloudClient).apiV3Conn.UseCamClient().CreateOIDCConfig(request)
91+
if e != nil {
92+
log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n",
93+
logId, request.GetAction(), request.ToJsonString(), e.Error())
94+
return retryError(e)
95+
} else {
96+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n",
97+
logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
98+
}
99+
return nil
100+
})
101+
if err != nil {
102+
log.Printf("[CRITAL]%s create CAM role SSO failed, reason:%s\n", logId, err.Error())
103+
return err
104+
}
105+
d.SetId(d.Get("name").(string))
106+
return resourceTencentCloudCamRoleSSORead(d, meta)
107+
}
108+
109+
func resourceTencentCloudCamRoleSSORead(d *schema.ResourceData, meta interface{}) error {
110+
defer logElapsed("resource.tencentcloud_cam_role_sso.read")()
111+
112+
logId := getLogId(contextNil)
113+
request := cam.NewDescribeOIDCConfigRequest()
114+
request.Name = helper.String(d.Id())
115+
var response *cam.DescribeOIDCConfigResponse
116+
err := resource.Retry(readRetryTimeout, func() *resource.RetryError {
117+
result, e := meta.(*TencentCloudClient).apiV3Conn.UseCamClient().DescribeOIDCConfig(request)
118+
if e != nil {
119+
return retryError(e)
120+
}
121+
response = result
122+
return nil
123+
})
124+
if err != nil {
125+
log.Printf("[CRITAL]%s read CAM role SSO failed, reason:%s\n", logId, err.Error())
126+
return err
127+
}
128+
129+
if response.Response == nil {
130+
d.SetId("")
131+
return nil
132+
}
133+
134+
_ = d.Set("identity_key", *response.Response.IdentityKey)
135+
_ = d.Set("identity_url", *response.Response.IdentityUrl)
136+
_ = d.Set("name", *response.Response.Name)
137+
_ = d.Set("description", *response.Response.Description)
138+
clientIds := make([]string, 0)
139+
for _, clientId := range response.Response.ClientId {
140+
clientIds = append(clientIds, *clientId)
141+
}
142+
_ = d.Set("client_ids", clientIds)
143+
144+
return nil
145+
}
146+
147+
func resourceTencentCloudCamRoleSSOUpdate(d *schema.ResourceData, meta interface{}) error {
148+
defer logElapsed("resource.tencentcloud_cam_role_sso.update")()
149+
logId := getLogId(contextNil)
150+
request := cam.NewUpdateOIDCConfigRequest()
151+
if d.HasChange("name") {
152+
return fmt.Errorf("not support change name")
153+
}
154+
request.Name = helper.String(d.Id())
155+
if d.HasChange("identity_url") || d.HasChange("identity_key") || d.HasChange("description") || d.HasChange("client_ids") {
156+
request.IdentityKey = helper.String(d.Get("identity_key").(string))
157+
request.IdentityUrl = helper.String(d.Get("identity_url").(string))
158+
request.Description = helper.String(d.Get("description").(string))
159+
request.ClientId = helper.InterfacesStringsPoint(d.Get("client_ids").(*schema.Set).List())
160+
}
161+
162+
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
163+
_, e := meta.(*TencentCloudClient).apiV3Conn.UseCamClient().UpdateOIDCConfig(request)
164+
if e != nil {
165+
return retryError(e)
166+
}
167+
return nil
168+
})
169+
if err != nil {
170+
log.Printf("[CRITAL]%s update CAM Role SSO failed, reason:%s\n", logId, err.Error())
171+
return err
172+
}
173+
174+
return resourceTencentCloudCamRoleSSORead(d, meta)
175+
}
176+
177+
func resourceTencentCloudCamRoleSSODelete(d *schema.ResourceData, meta interface{}) error {
178+
defer logElapsed("resource.tencentcloud_cam_role_sso.delete")()
179+
logId := getLogId(contextNil)
180+
request := cam.NewDeleteOIDCConfigRequest()
181+
name := d.Id()
182+
request.Name = helper.String(name)
183+
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
184+
_, e := meta.(*TencentCloudClient).apiV3Conn.UseCamClient().DeleteOIDCConfig(request)
185+
if e != nil {
186+
return retryError(e)
187+
}
188+
return nil
189+
})
190+
if err != nil {
191+
log.Printf("[CRITAL]%s disable cam sso failed, reason:%s\n", logId, err.Error())
192+
return err
193+
}
194+
return nil
195+
}

tencentcloud/resource_tc_cam_role_sso_test.go

Lines changed: 114 additions & 0 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)