Skip to content

feat(tco): [119841102] tco node and member support tag #2852

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Sep 27, 2024
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
7 changes: 7 additions & 0 deletions .changelog/2852.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
```release-note:enhancement
resource/tencentcloud_organization_org_node: support `tags` params
```

```release-note:enhancement
resource/tencentcloud_organization_org_member: support `tags` params
```
37 changes: 37 additions & 0 deletions tencentcloud/services/tco/resource_tc_organization_org_member.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"log"

tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
svctag "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/services/tag"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
Expand Down Expand Up @@ -130,6 +131,11 @@ func ResourceTencentCloudOrganizationOrgMember() *schema.Resource {
Computed: true,
Description: "The member name which is payment account on behalf.",
},
"tags": {
Type: schema.TypeMap,
Optional: true,
Description: "Tag description list.",
},
},
}
}
Expand Down Expand Up @@ -179,6 +185,17 @@ func resourceTencentCloudOrganizationOrgMemberCreate(d *schema.ResourceData, met
request.PayUin = helper.String(v.(string))
}

if tags := helper.GetTags(d, "tags"); len(tags) > 0 {
for k, v := range tags {
tmpKey := k
tmpValue := v
request.Tags = append(request.Tags, &organization.Tag{
TagKey: &tmpKey,
TagValue: &tmpValue,
})
}
}

err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseOrganizationClient().CreateOrganizationMember(request)
if e != nil {
Expand Down Expand Up @@ -298,6 +315,14 @@ func resourceTencentCloudOrganizationOrgMemberRead(d *schema.ResourceData, meta
_ = d.Set("pay_name", orgMember.PayName)
}

if len(orgMember.Tags) != 0 {
tags := make(map[string]string, len(orgMember.Tags))
for _, tag := range orgMember.Tags {
tags[*tag.TagKey] = *tag.TagValue
}
_ = d.Set("tags", tags)
}

return nil
}

Expand All @@ -306,6 +331,7 @@ func resourceTencentCloudOrganizationOrgMemberUpdate(d *schema.ResourceData, met
defer tccommon.InconsistentCheck(d, meta)()

logId := tccommon.GetLogId(tccommon.ContextNil)
ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId)

request := organization.NewMoveOrganizationNodeMembersRequest()
updateRequest := organization.NewUpdateOrganizationMemberRequest()
Expand Down Expand Up @@ -402,6 +428,17 @@ func resourceTencentCloudOrganizationOrgMemberUpdate(d *schema.ResourceData, met
log.Printf("[CRITAL]%s update organization orgMember failed, reason:%+v", logId, UpdateErr)
return UpdateErr
}

if d.HasChange("tags") {
tcClient := meta.(tccommon.ProviderMeta).GetAPIV3Conn()
tagService := svctag.NewTagService(tcClient)
oldTags, newTags := d.GetChange("tags")
replaceTags, deleteTags := svctag.DiffTags(oldTags.(map[string]interface{}), newTags.(map[string]interface{}))
resourceName := tccommon.BuildTagResourceName("organization", "member", tcClient.Region, orgMemberId)
if err := tagService.ModifyTags(ctx, resourceName, replaceTags, deleteTags); err != nil {
return err
}
}
return resourceTencentCloudOrganizationOrgMemberRead(d, meta)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,28 +12,31 @@ func TestAccTencentCloudOrganizationOrgMemberResource_basic(t *testing.T) {
t.Parallel()
resource.Test(t, resource.TestCase{
PreCheck: func() {
tcacctest.AccPreCheckCommon(t, tcacctest.ACCOUNT_TYPE_ORGANIZATION)
tcacctest.AccPreCheck(t)
},
Providers: tcacctest.AccProviders,
Steps: []resource.TestStep{
{
Config: testAccOrganizationOrgMember,
Check: resource.ComposeTestCheckFunc(resource.TestCheckResourceAttrSet("tencentcloud_organization_org_member.org_member", "id"),
resource.TestCheckResourceAttr("tencentcloud_organization_org_member.org_member", "name", "tf_example"),
resource.TestCheckResourceAttr("tencentcloud_organization_org_member.org_member", "node_id", "59849"),
resource.TestCheckResourceAttr("tencentcloud_organization_org_member.org_member", "node_id", "2023047"),
resource.TestCheckResourceAttrSet("tencentcloud_organization_org_member.org_member", "permission_ids.#"),
resource.TestCheckResourceAttr("tencentcloud_organization_org_member.org_member", "policy_type", "Financial"),
resource.TestCheckResourceAttr("tencentcloud_organization_org_member.org_member", "remark", "for terraform test"),
resource.TestCheckResourceAttr("tencentcloud_organization_org_member.org_member", "tags.tf-test1", "org_member1"),
resource.TestCheckResourceAttr("tencentcloud_organization_org_member.org_member", "tags.tf-test2", "org_member2"),
),
},
{
Config: testAccOrganizationOrgMemberUpdate,
Check: resource.ComposeTestCheckFunc(resource.TestCheckResourceAttrSet("tencentcloud_organization_org_member.org_member", "id"),
resource.TestCheckResourceAttr("tencentcloud_organization_org_member.org_member", "name", "tf_example_1"),
resource.TestCheckResourceAttr("tencentcloud_organization_org_member.org_member", "node_id", "59849"),
resource.TestCheckResourceAttr("tencentcloud_organization_org_member.org_member", "node_id", "2023047"),
resource.TestCheckResourceAttrSet("tencentcloud_organization_org_member.org_member", "permission_ids.#"),
resource.TestCheckResourceAttr("tencentcloud_organization_org_member.org_member", "policy_type", "Financial"),
resource.TestCheckResourceAttr("tencentcloud_organization_org_member.org_member", "remark", "for terraform test"),
resource.TestCheckResourceAttr("tencentcloud_organization_org_member.org_member", "tags.tf-test1", "org_member_update"),
),
},
{
Expand All @@ -49,29 +52,36 @@ const testAccOrganizationOrgMember = `

resource "tencentcloud_organization_org_member" "org_member" {
name = "tf_example"
node_id = 59849
node_id = 2023047
permission_ids = [
1,
2,
3,
4,
5,
]
policy_type = "Financial"
remark = "for terraform test"
tags = {
"tf-test1" = "org_member1"
"tf-test2" = "org_member2"
}
}
`
const testAccOrganizationOrgMemberUpdate = `

resource "tencentcloud_organization_org_member" "org_member" {
name = "tf_example_1"
node_id = 59849
node_id = 2023047
permission_ids = [
1,
2,
3,
4,
]
policy_type = "Financial"
remark = "for terraform test"
tags = {
"tf-test1" = "org_member_update"
}
}

`
66 changes: 53 additions & 13 deletions tencentcloud/services/tco/resource_tc_organization_org_node.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"log"

tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
svctag "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/services/tag"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
Expand Down Expand Up @@ -53,6 +54,11 @@ func ResourceTencentCloudOrganizationOrgNode() *schema.Resource {
Computed: true,
Description: "Node update time.",
},
"tags": {
Type: schema.TypeMap,
Optional: true,
Description: "Tag description list.",
},
},
}
}
Expand Down Expand Up @@ -83,6 +89,16 @@ func resourceTencentCloudOrganizationOrgNodeCreate(d *schema.ResourceData, meta
request.Remark = helper.String(v.(string))
}

if tags := helper.GetTags(d, "tags"); len(tags) > 0 {
for k, v := range tags {
tmpKey := k
tmpValue := v
request.Tags = append(request.Tags, &organization.Tag{
TagKey: &tmpKey,
TagValue: &tmpValue,
})
}
}
err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseOrganizationClient().AddOrganizationNode(request)
if e != nil {
Expand Down Expand Up @@ -148,6 +164,14 @@ func resourceTencentCloudOrganizationOrgNodeRead(d *schema.ResourceData, meta in
_ = d.Set("update_time", orgNode.UpdateTime)
}

if len(orgNode.Tags) != 0 {
tags := make(map[string]string, len(orgNode.Tags))
for _, tag := range orgNode.Tags {
tags[*tag.TagKey] = *tag.TagValue
}
_ = d.Set("tags", tags)
}

return nil
}

Expand All @@ -156,44 +180,60 @@ func resourceTencentCloudOrganizationOrgNodeUpdate(d *schema.ResourceData, meta
defer tccommon.InconsistentCheck(d, meta)()

logId := tccommon.GetLogId(tccommon.ContextNil)
ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId)
request := organization.NewUpdateOrganizationNodeRequest()

orgNodeId := d.Id()

request.NodeId = helper.StrToUint64Point(orgNodeId)

hasChange := false
if d.HasChange("parent_node_id") {
return fmt.Errorf("`parent_node_id` do not support change now.")
}

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

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

err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseOrganizationClient().UpdateOrganizationNode(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 hasChange {
err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseOrganizationClient().UpdateOrganizationNode(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 err != nil {
log.Printf("[CRITAL]%s create organization orgNode failed, reason:%+v", logId, err)
return err
}
return nil
})

if err != nil {
log.Printf("[CRITAL]%s create organization orgNode failed, reason:%+v", logId, err)
return err
}

if d.HasChange("tags") {
tcClient := meta.(tccommon.ProviderMeta).GetAPIV3Conn()
tagService := svctag.NewTagService(tcClient)
oldTags, newTags := d.GetChange("tags")
replaceTags, deleteTags := svctag.DiffTags(oldTags.(map[string]interface{}), newTags.(map[string]interface{}))
resourceName := tccommon.BuildTagResourceName("organization", "node", tcClient.Region, orgNodeId)
if err := tagService.ModifyTags(ctx, resourceName, replaceTags, deleteTags); err != nil {
return err
}
}
return resourceTencentCloudOrganizationOrgNodeRead(d, meta)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,25 @@ func TestAccTencentCloudOrganizationOrgNode_basic(t *testing.T) {
t.Parallel()

resource.Test(t, resource.TestCase{
PreCheck: func() { tcacctest.AccPreCheckCommon(t, tcacctest.ACCOUNT_TYPE_SMS) },
PreCheck: func() { tcacctest.AccPreCheck(t) },
Providers: tcacctest.AccProviders,
Steps: []resource.TestStep{
{
Config: testAccOrganizationOrgNode,
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttrSet("tencentcloud_organization_org_node.org_node", "id"),
resource.TestCheckResourceAttr("tencentcloud_organization_org_node.org_node", "parent_node_id", "2003721"),
resource.TestCheckResourceAttr("tencentcloud_organization_org_node.org_node", "parent_node_id", "2014254"),
resource.TestCheckResourceAttr("tencentcloud_organization_org_node.org_node", "name", "terraform_test"),
resource.TestCheckResourceAttr("tencentcloud_organization_org_node.org_node", "remark", "for terraform test"),
resource.TestCheckResourceAttr("tencentcloud_organization_org_node.org_node", "tags.tf-test1", "org_node1"),
resource.TestCheckResourceAttr("tencentcloud_organization_org_node.org_node", "tags.tf-test2", "org_node2"),
),
},
{
Config: testAccOrganizationOrgNodeUpdate,
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttrSet("tencentcloud_organization_org_node.org_node", "id"),
resource.TestCheckResourceAttr("tencentcloud_organization_org_node.org_node", "tags.tf-test1", "org_node_update"),
),
},
{
Expand All @@ -37,8 +46,25 @@ const testAccOrganizationOrgNode = `

resource "tencentcloud_organization_org_node" "org_node" {
name = "terraform_test"
parent_node_id = 2003721
parent_node_id = 2014254
remark = "for terraform test"
tags = {
"tf-test1" = "org_node1"
"tf-test2" = "org_node2"
}
}

`

const testAccOrganizationOrgNodeUpdate = `

resource "tencentcloud_organization_org_node" "org_node" {
name = "terraform_test"
parent_node_id = 2014254
remark = "for terraform test"
tags = {
"tf-test1" = "org_node_update"
}
}

`
1 change: 1 addition & 0 deletions website/docs/r/organization_org_member.html.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ The following arguments are supported:
* `pay_uin` - (Optional, String) The uin which is payment account on behalf.When `PermissionIds` contains 7, is required.
* `record_id` - (Optional, Int) Create member record ID.When create failed and needs to be recreated, is required.
* `remark` - (Optional, String) Notes.
* `tags` - (Optional, Map) Tag description list.

## Attributes Reference

Expand Down
1 change: 1 addition & 0 deletions website/docs/r/organization_org_node.html.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ The following arguments are supported:
* `name` - (Required, String) Node name.
* `parent_node_id` - (Required, Int) Parent node ID.
* `remark` - (Optional, String) Notes.
* `tags` - (Optional, Map) Tag description list.

## Attributes Reference

Expand Down
Loading