diff --git a/.changelog/2852.txt b/.changelog/2852.txt new file mode 100644 index 0000000000..10857a87bb --- /dev/null +++ b/.changelog/2852.txt @@ -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 +``` diff --git a/tencentcloud/services/tco/resource_tc_organization_org_member.go b/tencentcloud/services/tco/resource_tc_organization_org_member.go index 9ef29a5986..34c8981e30 100644 --- a/tencentcloud/services/tco/resource_tc_organization_org_member.go +++ b/tencentcloud/services/tco/resource_tc_organization_org_member.go @@ -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" @@ -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.", + }, }, } } @@ -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 { @@ -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 } @@ -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() @@ -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) } diff --git a/tencentcloud/services/tco/resource_tc_organization_org_member_test.go b/tencentcloud/services/tco/resource_tc_organization_org_member_test.go index 38319a678a..28bfc467b1 100644 --- a/tencentcloud/services/tco/resource_tc_organization_org_member_test.go +++ b/tencentcloud/services/tco/resource_tc_organization_org_member_test.go @@ -12,7 +12,7 @@ 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{ @@ -20,20 +20,23 @@ func TestAccTencentCloudOrganizationOrgMemberResource_basic(t *testing.T) { 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"), ), }, { @@ -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" + } } ` diff --git a/tencentcloud/services/tco/resource_tc_organization_org_node.go b/tencentcloud/services/tco/resource_tc_organization_org_node.go index 427da5d413..bf4571531f 100644 --- a/tencentcloud/services/tco/resource_tc_organization_org_node.go +++ b/tencentcloud/services/tco/resource_tc_organization_org_node.go @@ -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" @@ -53,6 +54,11 @@ func ResourceTencentCloudOrganizationOrgNode() *schema.Resource { Computed: true, Description: "Node update time.", }, + "tags": { + Type: schema.TypeMap, + Optional: true, + Description: "Tag description list.", + }, }, } } @@ -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 { @@ -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 } @@ -156,12 +180,14 @@ 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.") } @@ -169,31 +195,45 @@ func resourceTencentCloudOrganizationOrgNodeUpdate(d *schema.ResourceData, meta 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) } diff --git a/tencentcloud/services/tco/resource_tc_organization_org_node_test.go b/tencentcloud/services/tco/resource_tc_organization_org_node_test.go index 25b78ed27b..325d778316 100644 --- a/tencentcloud/services/tco/resource_tc_organization_org_node_test.go +++ b/tencentcloud/services/tco/resource_tc_organization_org_node_test.go @@ -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"), ), }, { @@ -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" + } } ` diff --git a/website/docs/r/organization_org_member.html.markdown b/website/docs/r/organization_org_member.html.markdown index 4a63884945..48235f1927 100644 --- a/website/docs/r/organization_org_member.html.markdown +++ b/website/docs/r/organization_org_member.html.markdown @@ -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 diff --git a/website/docs/r/organization_org_node.html.markdown b/website/docs/r/organization_org_node.html.markdown index f0c02a7bc0..fcd23ea094 100644 --- a/website/docs/r/organization_org_node.html.markdown +++ b/website/docs/r/organization_org_node.html.markdown @@ -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