Skip to content

Commit 61be0e2

Browse files
author
WeiMengXS
committed
feat: resource mfaFlag
1 parent bfbb904 commit 61be0e2

8 files changed

+408
-2
lines changed

tencentcloud/provider.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,7 @@ Cloud Access Management(CAM)
234234
tencentcloud_cam_role_sso
235235
tencentcloud_cam_service_linked_role
236236
tencentcloud_cam_user_saml_config
237+
tencentcloud_cam_mfa_flag
237238
238239
Customer Identity and Access Management(CIAM)
239240
Resource
@@ -3036,6 +3037,7 @@ func Provider() *schema.Provider {
30363037
"tencentcloud_dlc_user": resourceTencentCloudDlcUser(),
30373038
"tencentcloud_wedata_rule_template": resourceTencentCloudWedataRuleTemplate(),
30383039
"tencentcloud_ssl_commit_certificate_information": resourceTencentCloudSslCommitCertificateInformation(),
3040+
"tencentcloud_cam_mfa_flag": resourceTencentCloudCamMfaFlag(),
30393041
},
30403042

30413043
ConfigureFunc: providerConfigure,
Lines changed: 254 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,254 @@
1+
/*
2+
Provides a resource to create a cam mfa_flag
3+
4+
Example Usage
5+
6+
```hcl
7+
resource "tencentcloud_cam_mfa_flag" "mfa_flag" {
8+
op_uin = 20003xxxxxxx
9+
login_flag {
10+
phone = 0
11+
stoken = 1
12+
wechat = 0
13+
14+
}
15+
action_flag {
16+
phone = 0
17+
stoken = 1
18+
wechat = 0
19+
}
20+
}
21+
```
22+
23+
Import
24+
25+
cam mfa_flag can be imported using the id, e.g.
26+
27+
```
28+
terraform import tencentcloud_cam_mfa_flag.mfa_flag mfa_flag_id
29+
```
30+
*/
31+
package tencentcloud
32+
33+
import (
34+
"context"
35+
"log"
36+
"strconv"
37+
38+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
39+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
40+
cam "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cam/v20190116"
41+
"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common"
42+
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
43+
)
44+
45+
func resourceTencentCloudCamMfaFlag() *schema.Resource {
46+
return &schema.Resource{
47+
Create: resourceTencentCloudCamMfaFlagCreate,
48+
Read: resourceTencentCloudCamMfaFlagRead,
49+
Update: resourceTencentCloudCamMfaFlagUpdate,
50+
Delete: resourceTencentCloudCamMfaFlagDelete,
51+
Importer: &schema.ResourceImporter{
52+
State: schema.ImportStatePassthrough,
53+
},
54+
Schema: map[string]*schema.Schema{
55+
"op_uin": {
56+
Required: true,
57+
Type: schema.TypeInt,
58+
Description: "Operate uin.",
59+
},
60+
61+
"login_flag": {
62+
Optional: true,
63+
Type: schema.TypeList,
64+
MaxItems: 1,
65+
Description: "Login flag setting.",
66+
Elem: &schema.Resource{
67+
Schema: map[string]*schema.Schema{
68+
"phone": {
69+
Type: schema.TypeInt,
70+
Optional: true,
71+
Description: "Phone.",
72+
},
73+
"stoken": {
74+
Type: schema.TypeInt,
75+
Optional: true,
76+
Description: "Soft token.",
77+
},
78+
"wechat": {
79+
Type: schema.TypeInt,
80+
Optional: true,
81+
Description: "Wechat.",
82+
},
83+
},
84+
},
85+
},
86+
87+
"action_flag": {
88+
Optional: true,
89+
Type: schema.TypeList,
90+
MaxItems: 1,
91+
Description: "Action flag setting.",
92+
Elem: &schema.Resource{
93+
Schema: map[string]*schema.Schema{
94+
"phone": {
95+
Type: schema.TypeInt,
96+
Optional: true,
97+
Description: "Phone.",
98+
},
99+
"stoken": {
100+
Type: schema.TypeInt,
101+
Optional: true,
102+
Description: "Soft token.",
103+
},
104+
"wechat": {
105+
Type: schema.TypeInt,
106+
Optional: true,
107+
Description: "Wechat.",
108+
},
109+
},
110+
},
111+
},
112+
},
113+
}
114+
}
115+
116+
func resourceTencentCloudCamMfaFlagCreate(d *schema.ResourceData, meta interface{}) error {
117+
defer logElapsed("resource.tencentcloud_cam_mfa_flag.create")()
118+
defer inconsistentCheck(d, meta)()
119+
var opUin int
120+
121+
if v, ok := d.GetOk("op_uin"); ok {
122+
opUin = v.(int)
123+
}
124+
d.SetId(strconv.Itoa(opUin))
125+
return resourceTencentCloudCamMfaFlagUpdate(d, meta)
126+
}
127+
128+
func resourceTencentCloudCamMfaFlagRead(d *schema.ResourceData, meta interface{}) error {
129+
defer logElapsed("resource.tencentcloud_cam_mfa_flag.read")()
130+
defer inconsistentCheck(d, meta)()
131+
132+
logId := getLogId(contextNil)
133+
134+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
135+
136+
service := CamService{client: meta.(*TencentCloudClient).apiV3Conn}
137+
138+
loginFlag, actionFlag, err := service.DescribeCamMfaFlagById(ctx)
139+
if err != nil {
140+
return err
141+
}
142+
143+
if loginFlag == nil && actionFlag == nil {
144+
log.Printf("[WARN]%s resource `CamMfaFlag` not found, please check if it has been deleted.\n", logId)
145+
return nil
146+
}
147+
148+
if loginFlag != nil {
149+
loginFlagMap := map[string]interface{}{}
150+
151+
if loginFlag.Phone != nil {
152+
loginFlagMap["phone"] = loginFlag.Phone
153+
}
154+
155+
if loginFlag.Stoken != nil {
156+
loginFlagMap["stoken"] = loginFlag.Stoken
157+
}
158+
159+
if loginFlag.Wechat != nil {
160+
loginFlagMap["wechat"] = loginFlag.Wechat
161+
}
162+
163+
_ = d.Set("login_flag", []interface{}{loginFlagMap})
164+
}
165+
166+
if actionFlag != nil {
167+
actionFlagMap := map[string]interface{}{}
168+
169+
if actionFlag.Phone != nil {
170+
actionFlagMap["phone"] = actionFlag.Phone
171+
}
172+
173+
if actionFlag.Stoken != nil {
174+
actionFlagMap["stoken"] = actionFlag.Stoken
175+
}
176+
177+
if actionFlag.Wechat != nil {
178+
actionFlagMap["wechat"] = actionFlag.Wechat
179+
}
180+
181+
_ = d.Set("action_flag", []interface{}{actionFlagMap})
182+
}
183+
184+
return nil
185+
}
186+
187+
func resourceTencentCloudCamMfaFlagUpdate(d *schema.ResourceData, meta interface{}) error {
188+
defer logElapsed("resource.tencentcloud_cam_mfa_flag.update")()
189+
defer inconsistentCheck(d, meta)()
190+
191+
logId := getLogId(contextNil)
192+
opUin := d.Id()
193+
request := cam.NewSetMfaFlagRequest()
194+
uin, err := strconv.Atoi(opUin)
195+
if err != nil {
196+
return err
197+
}
198+
request.OpUin = common.Uint64Ptr(uint64(uin))
199+
200+
if d.HasChange("login_flag") {
201+
if dMap, ok := helper.InterfacesHeadMap(d, "login_flag"); ok {
202+
loginActionMfaFlag := cam.LoginActionMfaFlag{}
203+
if v, ok := dMap["phone"]; ok {
204+
loginActionMfaFlag.Phone = helper.IntUint64(v.(int))
205+
}
206+
if v, ok := dMap["stoken"]; ok {
207+
loginActionMfaFlag.Stoken = helper.IntUint64(v.(int))
208+
}
209+
if v, ok := dMap["wechat"]; ok {
210+
loginActionMfaFlag.Wechat = helper.IntUint64(v.(int))
211+
}
212+
request.LoginFlag = &loginActionMfaFlag
213+
}
214+
}
215+
216+
if d.HasChange("action_flag") {
217+
if dMap, ok := helper.InterfacesHeadMap(d, "action_flag"); ok {
218+
loginActionMfaFlag := cam.LoginActionMfaFlag{}
219+
if v, ok := dMap["phone"]; ok {
220+
loginActionMfaFlag.Phone = helper.IntUint64(v.(int))
221+
}
222+
if v, ok := dMap["stoken"]; ok {
223+
loginActionMfaFlag.Stoken = helper.IntUint64(v.(int))
224+
}
225+
if v, ok := dMap["wechat"]; ok {
226+
loginActionMfaFlag.Wechat = helper.IntUint64(v.(int))
227+
}
228+
request.ActionFlag = &loginActionMfaFlag
229+
}
230+
}
231+
232+
err = resource.Retry(writeRetryTimeout, func() *resource.RetryError {
233+
result, e := meta.(*TencentCloudClient).apiV3Conn.UseCamClient().SetMfaFlag(request)
234+
if e != nil {
235+
return retryError(e)
236+
} else {
237+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
238+
}
239+
return nil
240+
})
241+
if err != nil {
242+
log.Printf("[CRITAL]%s update cam mfaFlag failed, reason:%+v", logId, err)
243+
return err
244+
}
245+
246+
return resourceTencentCloudCamMfaFlagRead(d, meta)
247+
}
248+
249+
func resourceTencentCloudCamMfaFlagDelete(d *schema.ResourceData, meta interface{}) error {
250+
defer logElapsed("resource.tencentcloud_cam_mfa_flag.delete")()
251+
defer inconsistentCheck(d, meta)()
252+
253+
return nil
254+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package tencentcloud
2+
3+
import (
4+
"testing"
5+
6+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
7+
)
8+
9+
func TestAccTencentCloudCamMfaFlagResource_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: testAccCamMfaFlag,
19+
Check: resource.ComposeTestCheckFunc(resource.TestCheckResourceAttrSet("tencentcloud_cam_mfa_flag.mfa_flag", "id")),
20+
},
21+
{
22+
ResourceName: "tencentcloud_cam_mfa_flag.mfa_flag",
23+
ImportState: true,
24+
ImportStateVerify: true,
25+
},
26+
},
27+
})
28+
}
29+
30+
const testAccCamMfaFlag = `
31+
data "tencentcloud_user_info" "info"{}
32+
33+
resource "tencentcloud_cam_mfa_flag" "mfa_flag" {
34+
op_uin = data.tencentcloud_user_info.info.uin
35+
login_flag {
36+
phone = 0
37+
stoken = 1
38+
wechat = 0
39+
40+
}
41+
action_flag {
42+
phone = 0
43+
stoken = 1
44+
wechat = 0
45+
}
46+
}
47+
48+
`

tencentcloud/resource_tc_ssl_commit_certificate_information.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,13 @@ package tencentcloud
4646

4747
import (
4848
"context"
49+
"log"
50+
4951
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
5052
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
5153
"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors"
5254
ssl "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ssl/v20191205"
5355
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
54-
"log"
5556
)
5657

5758
func resourceTencentCloudSslCommitCertificateInformation() *schema.Resource {

tencentcloud/resource_tc_ssl_commit_certificate_information_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
package tencentcloud
22

33
import (
4-
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
54
"testing"
5+
6+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
67
)
78

89
func TestAccTencentCloudSslCommitCertificateInformationResource_basic(t *testing.T) {

tencentcloud/service_tencentcloud_cam.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1355,3 +1355,32 @@ func (me *CamService) DeleteCamUserSamlConfigById(ctx context.Context) (errRet e
13551355

13561356
return
13571357
}
1358+
1359+
func (me *CamService) DescribeCamMfaFlagById(ctx context.Context) (loginFlag *cam.LoginActionFlag, actionFlag *cam.LoginActionFlag, errRet error) {
1360+
logId := getLogId(ctx)
1361+
1362+
request := cam.NewDescribeSafeAuthFlagRequest()
1363+
1364+
defer func() {
1365+
if errRet != nil {
1366+
log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, request.GetAction(), request.ToJsonString(), errRet.Error())
1367+
}
1368+
}()
1369+
1370+
ratelimit.Check(request.GetAction())
1371+
1372+
response, err := me.client.UseCamClient().DescribeSafeAuthFlag(request)
1373+
if err != nil {
1374+
errRet = err
1375+
return
1376+
}
1377+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
1378+
1379+
if response.Response.ActionFlag == nil && response.Response.LoginFlag == nil {
1380+
return
1381+
}
1382+
1383+
loginFlag = response.Response.LoginFlag
1384+
actionFlag = response.Response.ActionFlag
1385+
return
1386+
}

0 commit comments

Comments
 (0)