Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .changelog/3469.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:new-resource
tencentcloud_cam_message_receiver
```
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ require (
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/apm v1.0.825
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/as v1.1.4
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/bi v1.0.824
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cam v1.0.1071
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cam v1.1.27
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cat v1.0.825
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cbs v1.1.0
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdb v1.1.27
Expand Down
4 changes: 4 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -835,6 +835,8 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/billing v1.1.0 h1:tfTh+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/billing v1.1.0/go.mod h1:OKowLuHQjXN5pk3KnYnbmZLQucfBUUEpqWsa/3Cl+jY=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cam v1.0.1071 h1:2CeivXYc7PtD2kgZEJXk9/SDQA9dzLejH5FmNzAW3QU=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cam v1.0.1071/go.mod h1:UAjX3Vq52SQLKTe6o2HyGA/841Rnc+f4ZRATEsFHJDM=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cam v1.1.27 h1:Jo/5JV8oiPbXKXQg2xv3ZeKxLst/xXl3nWUgXalq9eg=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cam v1.1.27/go.mod h1:b+R+rbsbjSNyoBSD/xNkxpvOq3flK2Y3cPOYdpV3b0g=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cat v1.0.825 h1:TgO9L1yNPkWeXqrvys/9RL3u958xx9dcTAy4WmaxBnE=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cat v1.0.825/go.mod h1:1yCKeIioX4D0bcIDHs3JCS5lbyzndXh1E8wHyHaCjxY=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cbs v1.1.0 h1:XhA8+gNAkNfLvfogIbQxipIpHeS0cDV0tybiyxLS210=
Expand Down Expand Up @@ -942,6 +944,8 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.30 h1:zUdoy
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.30/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.31 h1:PKa4c2BLYbW5LUOWGNXt20+rV9L8JnLqBXZjnOXsHKQ=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.31/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.27 h1:FG3AiNSNW5tG+mtTSE+dBc5ZhHwlYUW0Z6oSkfAWV0A=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.27/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/controlcenter v1.0.993 h1:WlPgXldQCxt7qi5Xrc6j6zTrsXWzN5BcOGs7Irq7fwQ=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/controlcenter v1.0.993/go.mod h1:Z9U8zNtyuyKhjS0698wqsrG/kLx1TQ5CEixXBwVe7xY=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/csip v1.0.860 h1:F3esKBIT3HW9+7Gt8cVgf8X06VdGIczpgLBUECzSEzU=
Expand Down
1 change: 1 addition & 0 deletions tencentcloud/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -1573,6 +1573,7 @@ func Provider() *schema.Provider {
"tencentcloud_cam_set_policy_version_config": cam.ResourceTencentCloudCamSetPolicyVersionConfig(),
"tencentcloud_cam_user_permission_boundary_attachment": cam.ResourceTencentCloudCamUserPermissionBoundaryAttachment(),
"tencentcloud_cam_role_permission_boundary_attachment": cam.ResourceTencentCloudCamRolePermissionBoundaryAttachment(),
"tencentcloud_cam_message_receiver": cam.ResourceTencentCloudCamMessageReceiver(),
"tencentcloud_organization_quit_organization_operation": tco.ResourceTencentCloudOrganizationQuitOrganizationOperation(),
"tencentcloud_ciam_user_group": ciam.ResourceTencentCloudCiamUserGroup(),
"tencentcloud_ciam_user_store": ciam.ResourceTencentCloudCiamUserStore(),
Expand Down
254 changes: 254 additions & 0 deletions tencentcloud/services/cam/resource_tc_cam_message_receiver.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,254 @@
package cam

import (
"context"
"fmt"
"log"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
camv20190116 "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cam/v20190116"

tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
)

func ResourceTencentCloudCamMessageReceiver() *schema.Resource {
return &schema.Resource{
Create: resourceTencentCloudCamMessageReceiverCreate,
Read: resourceTencentCloudCamMessageReceiverRead,
Delete: resourceTencentCloudCamMessageReceiverDelete,
Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough,
},
Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
Description: "Username of the message recipient.",
},

"remark": {
Type: schema.TypeString,
Optional: true,
ForceNew: true,
Description: "Recipient's notes.",
},

"country_code": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
Description: "The international area code for mobile phone numbers is 86 for domestic areas.",
},

"phone_number": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
Description: "Mobile phone number, for example: 132****2492.",
},

"email": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
Description: "Email address, for example: 57*****@qq.com.",
},

// computed
"uid": {
Type: schema.TypeInt,
Computed: true,
Description: "UID.",
},

"is_receiver_owner": {
Type: schema.TypeInt,
Computed: true,
Description: "Whether it is the primary contact person.",
},

"phone_flag": {
Type: schema.TypeInt,
Computed: true,
Description: "Whether the mobile phone number is verified.",
},

"email_flag": {
Type: schema.TypeInt,
Computed: true,
Description: "Whether the email is verified.",
},

"wechat_flag": {
Type: schema.TypeInt,
Computed: true,
Description: "Whether WeChat is allowed to receive notifications.",
},

"uin": {
Type: schema.TypeInt,
Computed: true,
Description: "Account uin.",
},
},
}
}

func resourceTencentCloudCamMessageReceiverCreate(d *schema.ResourceData, meta interface{}) error {
defer tccommon.LogElapsed("resource.tencentcloud_cam_message_receiver.create")()
defer tccommon.InconsistentCheck(d, meta)()

var (
logId = tccommon.GetLogId(tccommon.ContextNil)
ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
request = camv20190116.NewCreateMessageReceiverRequest()
name string
)

if v, ok := d.GetOk("name"); ok {
request.Name = helper.String(v.(string))
name = v.(string)
}

if v, ok := d.GetOk("remark"); ok {
request.Remark = helper.String(v.(string))
}

if v, ok := d.GetOk("country_code"); ok {
request.CountryCode = helper.String(v.(string))
}

if v, ok := d.GetOk("phone_number"); ok {
request.PhoneNumber = helper.String(v.(string))
}

if v, ok := d.GetOk("email"); ok {
request.Email = helper.String(v.(string))
}

reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCamV20190116Client().CreateMessageReceiverWithContext(ctx, request)
if e != nil {
return tccommon.RetryError(e)
} else {
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
}

if result == nil || result.Response == nil {
return resource.NonRetryableError(fmt.Errorf("Create cam message receiver failed, Response is nil."))
}

return nil
})

if reqErr != nil {
log.Printf("[CRITAL]%s create cam message receiver failed, reason:%+v", logId, reqErr)
return reqErr
}

d.SetId(name)
return resourceTencentCloudCamMessageReceiverRead(d, meta)
}

func resourceTencentCloudCamMessageReceiverRead(d *schema.ResourceData, meta interface{}) error {
defer tccommon.LogElapsed("resource.tencentcloud_cam_message_receiver.read")()
defer tccommon.InconsistentCheck(d, meta)()

var (
logId = tccommon.GetLogId(tccommon.ContextNil)
ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
service = CamService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
name = d.Id()
)

respData, err := service.DescribeCamMessageReceiverById(ctx, name)
if err != nil {
return err
}

if respData == nil {
log.Printf("[WARN]%s resource `tencentcloud_cam_message_receiver` [%s] not found, please check if it has been deleted.\n", logId, d.Id())
d.SetId("")
return nil
}

if respData.Name != nil {
_ = d.Set("name", respData.Name)
}

if respData.Remark != nil {
_ = d.Set("remark", respData.Remark)
}

if respData.CountryCode != nil {
_ = d.Set("country_code", respData.CountryCode)
}

if respData.PhoneNumber != nil {
_ = d.Set("phone_number", respData.PhoneNumber)
}

if respData.Email != nil {
_ = d.Set("email", respData.Email)
}

if respData.Uid != nil {
_ = d.Set("uid", respData.Uid)
}

if respData.IsReceiverOwner != nil {
_ = d.Set("is_receiver_owner", respData.IsReceiverOwner)
}

if respData.PhoneFlag != nil {
_ = d.Set("phone_flag", respData.PhoneFlag)
}

if respData.EmailFlag != nil {
_ = d.Set("email_flag", respData.EmailFlag)
}

if respData.WechatFlag != nil {
_ = d.Set("wechat_flag", respData.WechatFlag)
}

if respData.Uin != nil {
_ = d.Set("uin", respData.Uin)
}

return nil
}

func resourceTencentCloudCamMessageReceiverDelete(d *schema.ResourceData, meta interface{}) error {
defer tccommon.LogElapsed("resource.tencentcloud_cam_message_receiver.delete")()
defer tccommon.InconsistentCheck(d, meta)()

var (
logId = tccommon.GetLogId(tccommon.ContextNil)
ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
request = camv20190116.NewDeleteMessageReceiverRequest()
name = d.Id()
)

request.Name = &name
reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCamV20190116Client().DeleteMessageReceiverWithContext(ctx, request)
if e != nil {
return tccommon.RetryError(e)
} else {
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
}

return nil
})

if reqErr != nil {
log.Printf("[CRITAL]%s delete cam message receiver failed, reason:%+v", logId, reqErr)
return reqErr
}

return nil
}
27 changes: 27 additions & 0 deletions tencentcloud/services/cam/resource_tc_cam_message_receiver.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
Provides a resource to create a CAM message receiver

~> **NOTE:** For security reasons, the CAM will return the `email` and `phone_number` parameter values in encrypted form. Please use the `ignore_changes` function in Terraform's `lifecycle` to include these two parameters.

Example Usage

```hcl
resource "tencentcloud_cam_message_receiver" "example" {
name = "tf-example"
remark = "remark."
country_code = "86"
phone_number = "18123456789"
email = "demo@qq.com"

lifecycle {
ignore_changes = [ email, phone_number ]
}
}
```

Import

CAM message receiver can be imported using the id, e.g.

```
terraform import tencentcloud_cam_message_receiver.example tf-example
```
51 changes: 51 additions & 0 deletions tencentcloud/services/cam/resource_tc_cam_message_receiver_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package cam_test

import (
"testing"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"

tcacctest "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/acctest"
)

func TestAccTencentCloudCamMessageReceiverResource_basic(t *testing.T) {
t.Parallel()
resource.Test(t, resource.TestCase{
PreCheck: func() {
tcacctest.AccPreCheck(t)
},
Providers: tcacctest.AccProviders,
Steps: []resource.TestStep{
{
Config: testAccCamMessageReceiver,
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttrSet("tencentcloud_cam_message_receiver.example", "id"),
resource.TestCheckResourceAttrSet("tencentcloud_cam_message_receiver.example", "name"),
resource.TestCheckResourceAttrSet("tencentcloud_cam_message_receiver.example", "remark"),
resource.TestCheckResourceAttrSet("tencentcloud_cam_message_receiver.example", "country_code"),
resource.TestCheckResourceAttrSet("tencentcloud_cam_message_receiver.example", "phone_number"),
resource.TestCheckResourceAttrSet("tencentcloud_cam_message_receiver.example", "email"),
),
},
{
ResourceName: "tencentcloud_cam_message_receiver.example",
ImportState: true,
ImportStateVerify: true,
},
},
})
}

const testAccCamMessageReceiver = `
resource "tencentcloud_cam_message_receiver" "example" {
name = "tf-example"
remark = "remark."
country_code = "86"
phone_number = "18123456789"
email = "demo@qq.com"

lifecycle {
ignore_changes = [ email, phone_number ]
}
}
`
Loading
Loading