diff --git a/.changelog/2521.txt b/.changelog/2521.txt new file mode 100644 index 0000000000..9ed10205b3 --- /dev/null +++ b/.changelog/2521.txt @@ -0,0 +1,7 @@ +```release-note:new-resource +tencentcloud_organization_org_share_unit +``` + +```release-note:new-resource +tencentcloud_organization_org_share_unit_member +``` diff --git a/tencentcloud/provider.go b/tencentcloud/provider.go index e27c8cc0d9..62f72bd067 100644 --- a/tencentcloud/provider.go +++ b/tencentcloud/provider.go @@ -1945,6 +1945,8 @@ func Provider() *schema.Provider { "tencentcloud_vpc_peer_connect_manager": vpc.ResourceTencentCloudVpcPeerConnectManager(), "tencentcloud_vpc_peer_connect_accept_operation": vpc.ResourceTencentCloudVpcPeerConnectAcceptOperation(), "tencentcloud_vpc_peer_connect_reject_operation": vpc.ResourceTencentCloudVpcPeerConnectRejectOperation(), + "tencentcloud_organization_org_share_unit_member": tco.ResourceTencentCloudOrganizationOrgShareUnitMember(), + "tencentcloud_organization_org_share_unit": tco.ResourceTencentCloudOrganizationOrgShareUnit(), }, ConfigureFunc: providerConfigure, diff --git a/tencentcloud/provider.md b/tencentcloud/provider.md index f62b6a14d3..ac60bf447f 100644 --- a/tencentcloud/provider.md +++ b/tencentcloud/provider.md @@ -1641,6 +1641,8 @@ Tencent Cloud Organization (TCO) tencentcloud_organization_org_member_policy_attachment tencentcloud_organization_policy_sub_account_attachment tencentcloud_organization_quit_organization_operation + tencentcloud_organization_org_share_unit + tencentcloud_organization_org_share_unit_member TDSQL-C for PostgreSQL(TDCPG) Data Source diff --git a/tencentcloud/services/tco/resource_tc_organization_org_share_unit.go b/tencentcloud/services/tco/resource_tc_organization_org_share_unit.go new file mode 100644 index 0000000000..2620392be7 --- /dev/null +++ b/tencentcloud/services/tco/resource_tc_organization_org_share_unit.go @@ -0,0 +1,220 @@ +package tco + +import ( + "context" + "fmt" + "log" + "strings" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + organization "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/organization/v20210331" + + tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common" + "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper" +) + +func ResourceTencentCloudOrganizationOrgShareUnit() *schema.Resource { + return &schema.Resource{ + Create: resourceTencentCloudOrganizationOrgShareUnitCreate, + Read: resourceTencentCloudOrganizationOrgShareUnitRead, + Update: resourceTencentCloudOrganizationOrgShareUnitUpdate, + Delete: resourceTencentCloudOrganizationOrgShareUnitDelete, + Importer: &schema.ResourceImporter{ + State: schema.ImportStatePassthrough, + }, + Schema: map[string]*schema.Schema{ + "name": { + Required: true, + Type: schema.TypeString, + Description: "Shared unit name. It only supports a combination of uppercase and lowercase letters, numbers, -, and _, with a length of 3-128 characters.", + }, + + "area": { + Required: true, + Type: schema.TypeString, + Description: "Shared unit region. The regions that support sharing can be obtained through the DescribeShareAreas interface.", + }, + + "description": { + Optional: true, + Type: schema.TypeString, + Description: "Shared unit description. Up to 128 characters.", + }, + + "unit_id": { + Computed: true, + Type: schema.TypeString, + Description: "Shared unit region. The regions that support sharing can be obtained through the DescribeShareAreas interface.", + }, + }, + } +} + +func resourceTencentCloudOrganizationOrgShareUnitCreate(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_organization_org_share_unit.create")() + defer tccommon.InconsistentCheck(d, meta)() + + logId := tccommon.GetLogId(tccommon.ContextNil) + + var ( + request = organization.NewAddShareUnitRequest() + response = organization.NewAddShareUnitResponse() + unitId string + area string + ) + if v, ok := d.GetOk("name"); ok { + request.Name = helper.String(v.(string)) + } + + if v, ok := d.GetOk("area"); ok { + request.Area = helper.String(v.(string)) + area = v.(string) + } + + if v, ok := d.GetOk("description"); ok { + request.Description = helper.String(v.(string)) + } + + err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseOrganizationClient().AddShareUnit(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()) + } + response = result + return nil + }) + if err != nil { + log.Printf("[CRITAL]%s create organization orgShareUnit failed, reason:%+v", logId, err) + return err + } + + unitId = *response.Response.UnitId + d.SetId(area + tccommon.FILED_SP + unitId) + + return resourceTencentCloudOrganizationOrgShareUnitRead(d, meta) +} + +func resourceTencentCloudOrganizationOrgShareUnitRead(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_organization_org_share_unit.read")() + defer tccommon.InconsistentCheck(d, meta)() + + logId := tccommon.GetLogId(tccommon.ContextNil) + + ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + + service := OrganizationService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + + split := strings.Split(d.Id(), tccommon.FILED_SP) + if len(split) != 2 { + return fmt.Errorf("id is broken,%s", d.Id()) + } + area := split[0] + unitId := split[1] + orgShareUnit, err := service.DescribeOrganizationOrgShareUnitById(ctx, area, unitId) + if err != nil { + return err + } + + if orgShareUnit == nil { + d.SetId("") + log.Printf("[WARN]%s resource `OrganizationOrgShareUnit` [%s] not found, please check if it has been deleted.\n", logId, d.Id()) + return nil + } + + if orgShareUnit.Name != nil { + _ = d.Set("name", orgShareUnit.Name) + } + + if orgShareUnit.Area != nil { + _ = d.Set("area", orgShareUnit.Area) + } + + if orgShareUnit.UnitId != nil { + _ = d.Set("unit_id", orgShareUnit.UnitId) + } + + if orgShareUnit.Description != nil { + _ = d.Set("description", orgShareUnit.Description) + } + + return nil +} + +func resourceTencentCloudOrganizationOrgShareUnitUpdate(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_organization_org_share_unit.update")() + defer tccommon.InconsistentCheck(d, meta)() + + logId := tccommon.GetLogId(tccommon.ContextNil) + + request := organization.NewUpdateShareUnitRequest() + + split := strings.Split(d.Id(), tccommon.FILED_SP) + if len(split) != 2 { + return fmt.Errorf("id is broken,%s", d.Id()) + } + unitId := split[1] + request.UnitId = &unitId + immutableArgs := []string{"area", "unit_id"} + for _, v := range immutableArgs { + if d.HasChange(v) { + return fmt.Errorf("argument `%s` cannot be changed", v) + } + } + + needChange := false + mutableArgs := []string{"name", "description"} + for _, v := range mutableArgs { + if d.HasChange(v) { + needChange = true + break + } + } + + if needChange { + if v, ok := d.GetOk("name"); ok { + request.Name = helper.String(v.(string)) + } + if v, ok := d.GetOk("description"); ok { + request.Description = helper.String(v.(string)) + } + + err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseOrganizationClient().UpdateShareUnit(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 update organization orgShareUnit failed, reason:%+v", logId, err) + return err + } + + } + return resourceTencentCloudOrganizationOrgShareUnitRead(d, meta) +} + +func resourceTencentCloudOrganizationOrgShareUnitDelete(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_organization_org_share_unit.delete")() + defer tccommon.InconsistentCheck(d, meta)() + + logId := tccommon.GetLogId(tccommon.ContextNil) + ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + + service := OrganizationService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + split := strings.Split(d.Id(), tccommon.FILED_SP) + if len(split) != 2 { + return fmt.Errorf("id is broken,%s", d.Id()) + } + unitId := split[1] + if err := service.DeleteOrganizationOrgShareUnitById(ctx, unitId); err != nil { + return err + } + + return nil +} diff --git a/tencentcloud/services/tco/resource_tc_organization_org_share_unit.md b/tencentcloud/services/tco/resource_tc_organization_org_share_unit.md new file mode 100644 index 0000000000..6bad5306d8 --- /dev/null +++ b/tencentcloud/services/tco/resource_tc_organization_org_share_unit.md @@ -0,0 +1,19 @@ +Provides a resource to create a organization org_share_unit + +Example Usage + +```hcl +resource "tencentcloud_organization_org_share_unit" "org_share_unit" { + name = "iac-test" + area = "ap-guangzhou" + description = "iac-test" +} +``` + +Import + +organization org_share_unit can be imported using the id, e.g. + +``` +terraform import tencentcloud_organization_org_share_unit.org_share_unit area#unit_id +``` diff --git a/tencentcloud/services/tco/resource_tc_organization_org_share_unit_member.go b/tencentcloud/services/tco/resource_tc_organization_org_share_unit_member.go new file mode 100644 index 0000000000..ba45a60ef3 --- /dev/null +++ b/tencentcloud/services/tco/resource_tc_organization_org_share_unit_member.go @@ -0,0 +1,169 @@ +package tco + +import ( + "context" + "fmt" + "log" + "strings" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + organization "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/organization/v20210331" + + tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common" + "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper" +) + +func ResourceTencentCloudOrganizationOrgShareUnitMember() *schema.Resource { + return &schema.Resource{ + Create: resourceTencentCloudOrganizationOrgShareUnitMemberCreate, + Read: resourceTencentCloudOrganizationOrgShareUnitMemberRead, + Delete: resourceTencentCloudOrganizationOrgShareUnitMemberDelete, + Importer: &schema.ResourceImporter{ + State: schema.ImportStatePassthrough, + }, + Schema: map[string]*schema.Schema{ + "unit_id": { + Required: true, + ForceNew: true, + Type: schema.TypeString, + Description: "Shared unit ID.", + }, + + "area": { + Required: true, + ForceNew: true, + Type: schema.TypeString, + Description: "Shared unit region.", + }, + + "members": { + Required: true, + ForceNew: true, + Type: schema.TypeList, + MaxItems: 10, + Description: "Shared member list. Up to 10 items.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "share_member_uin": { + Type: schema.TypeInt, + Required: true, + Description: "Member uin.", + }, + }, + }, + }, + }, + } +} + +func resourceTencentCloudOrganizationOrgShareUnitMemberCreate(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_organization_org_share_unit_member.create")() + defer tccommon.InconsistentCheck(d, meta)() + + logId := tccommon.GetLogId(tccommon.ContextNil) + + var ( + request = organization.NewAddShareUnitMembersRequest() + unitId string + area string + shareMemberUin []string + ) + if v, ok := d.GetOk("unit_id"); ok { + unitId = v.(string) + request.UnitId = helper.String(v.(string)) + } + + if v, ok := d.GetOk("area"); ok { + area = v.(string) + request.Area = helper.String(v.(string)) + } + + if v, ok := d.GetOk("members"); ok { + for _, item := range v.([]interface{}) { + dMap := item.(map[string]interface{}) + shareMember := organization.ShareMember{} + if v, ok := dMap["share_member_uin"]; ok { + shareMemberUin = append(shareMemberUin, helper.IntToStr(v.(int))) + shareMember.ShareMemberUin = helper.IntInt64(v.(int)) + } + request.Members = append(request.Members, &shareMember) + } + } + + err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseOrganizationClient().AddShareUnitMembers(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 orgShareUnitMember failed, reason:%+v", logId, err) + return err + } + shareMemberUins := strings.Join(shareMemberUin, tccommon.COMMA_SP) + d.SetId(strings.Join(append([]string{area, unitId, shareMemberUins}), tccommon.FILED_SP)) + + return resourceTencentCloudOrganizationOrgShareUnitMemberRead(d, meta) +} + +func resourceTencentCloudOrganizationOrgShareUnitMemberRead(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_organization_org_share_unit_member.read")() + defer tccommon.InconsistentCheck(d, meta)() + + logId := tccommon.GetLogId(tccommon.ContextNil) + + ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + + service := OrganizationService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + + idSplit := strings.Split(d.Id(), tccommon.FILED_SP) + + if len(idSplit) != 3 { + return fmt.Errorf("id is broken,%s", d.Id()) + } + area := idSplit[0] + unitId := idSplit[1] + shareMemberUin := idSplit[2] + + orgShareUnitMember, err := service.DescribeOrganizationOrgShareUnitMemberById(ctx, unitId, area, shareMemberUin) + if err != nil { + return err + } + + if len(orgShareUnitMember) < 1 { + d.SetId("") + log.Printf("[WARN]%s resource `OrganizationOrgShareUnitMember` [%s] not found, please check if it has been deleted.\n", logId, d.Id()) + return nil + } + + _ = d.Set("unit_id", unitId) + return nil +} + +func resourceTencentCloudOrganizationOrgShareUnitMemberDelete(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_organization_org_share_unit_member.delete")() + defer tccommon.InconsistentCheck(d, meta)() + + logId := tccommon.GetLogId(tccommon.ContextNil) + ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + + service := OrganizationService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + idSplit := strings.Split(d.Id(), tccommon.FILED_SP) + + if len(idSplit) != 3 { + return fmt.Errorf("id is broken,%s", d.Id()) + } + area := idSplit[0] + unitId := idSplit[1] + shareMemberUin := idSplit[2] + + if err := service.DeleteOrganizationOrgShareUnitMemberById(ctx, unitId, area, shareMemberUin); err != nil { + return err + } + + return nil +} diff --git a/tencentcloud/services/tco/resource_tc_organization_org_share_unit_member.md b/tencentcloud/services/tco/resource_tc_organization_org_share_unit_member.md new file mode 100644 index 0000000000..b162810e1a --- /dev/null +++ b/tencentcloud/services/tco/resource_tc_organization_org_share_unit_member.md @@ -0,0 +1,18 @@ +Provides a resource to create a organization org_share_unit_member + +Example Usage + +```hcl +resource "tencentcloud_organization_org_share_unit" "org_share_unit" { + name = "iac-test" + area = "ap-guangzhou" + description = "iac-test" +} +resource "tencentcloud_organization_org_share_unit_member" "org_share_unit_member" { + unit_id = tencentcloud_organization_org_share_unit.org_share_unit.unit_id + area = tencentcloud_organization_org_share_unit.org_share_unit.area + members { + share_member_uin=100035309479 + } +} +``` diff --git a/tencentcloud/services/tco/resource_tc_organization_org_share_unit_member_test.go b/tencentcloud/services/tco/resource_tc_organization_org_share_unit_member_test.go new file mode 100644 index 0000000000..64517c8c1a --- /dev/null +++ b/tencentcloud/services/tco/resource_tc_organization_org_share_unit_member_test.go @@ -0,0 +1,45 @@ +package tco_test + +import ( + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + + tcacctest "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/acctest" +) + +func TestAccTencentCloudOrganizationOrgShareUnitMemberResource_basic(t *testing.T) { + t.Parallel() + resource.Test(t, resource.TestCase{ + PreCheck: func() { + tcacctest.AccPreCheck(t) + }, + Providers: tcacctest.AccProviders, + Steps: []resource.TestStep{ + { + Config: testAccOrganizationOrgShareUnitMember, + Check: resource.ComposeTestCheckFunc(resource.TestCheckResourceAttrSet("tencentcloud_organization_org_share_unit_member.org_share_unit_member", "id"), + resource.TestCheckResourceAttrSet("tencentcloud_organization_org_share_unit_member.org_share_unit_member", "unit_id"), + resource.TestCheckResourceAttrSet("tencentcloud_organization_org_share_unit_member.org_share_unit_member", "area"), + resource.TestCheckResourceAttrSet("tencentcloud_organization_org_share_unit_member.org_share_unit_member", "members.#"), + ), + }, + }, + }) +} + +const testAccOrganizationOrgShareUnitMember = ` +resource "tencentcloud_organization_org_share_unit" "org_share_unit" { + name = "iac-test" + area = "ap-guangzhou" + description = "iac-test" +} +resource "tencentcloud_organization_org_share_unit_member" "org_share_unit_member" { + unit_id = tencentcloud_organization_org_share_unit.org_share_unit.unit_id + area = tencentcloud_organization_org_share_unit.org_share_unit.area + members { + share_member_uin=100035309479 + } +} + +` diff --git a/tencentcloud/services/tco/resource_tc_organization_org_share_unit_test.go b/tencentcloud/services/tco/resource_tc_organization_org_share_unit_test.go new file mode 100644 index 0000000000..db8cab12f8 --- /dev/null +++ b/tencentcloud/services/tco/resource_tc_organization_org_share_unit_test.go @@ -0,0 +1,60 @@ +package tco_test + +import ( + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + + tcacctest "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/acctest" +) + +func TestAccTencentCloudOrganizationOrgShareUnitResource_basic(t *testing.T) { + t.Parallel() + resource.Test(t, resource.TestCase{ + PreCheck: func() { + tcacctest.AccPreCheck(t) + }, + Providers: tcacctest.AccProviders, + Steps: []resource.TestStep{ + { + Config: testAccOrganizationOrgShareUnit, + Check: resource.ComposeTestCheckFunc(resource.TestCheckResourceAttrSet("tencentcloud_organization_org_share_unit.org_share_unit", "id"), + resource.TestCheckResourceAttr("tencentcloud_organization_org_share_unit.org_share_unit", "name", "iac-test"), + resource.TestCheckResourceAttr("tencentcloud_organization_org_share_unit.org_share_unit", "area", "ap-guangzhou"), + resource.TestCheckResourceAttr("tencentcloud_organization_org_share_unit.org_share_unit", "description", "iac-test"), + ), + }, + { + Config: testAccOrganizationOrgShareUnitUpdate, + Check: resource.ComposeTestCheckFunc(resource.TestCheckResourceAttrSet("tencentcloud_organization_org_share_unit.org_share_unit", "id"), + resource.TestCheckResourceAttr("tencentcloud_organization_org_share_unit.org_share_unit", "name", "iac-test-1"), + resource.TestCheckResourceAttr("tencentcloud_organization_org_share_unit.org_share_unit", "area", "ap-guangzhou"), + resource.TestCheckResourceAttr("tencentcloud_organization_org_share_unit.org_share_unit", "description", "iac-test")), + }, + { + ResourceName: "tencentcloud_organization_org_share_unit.org_share_unit", + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + +const testAccOrganizationOrgShareUnit = ` + +resource "tencentcloud_organization_org_share_unit" "org_share_unit" { + name = "iac-test" + area = "ap-guangzhou" + description = "iac-test" +} + +` +const testAccOrganizationOrgShareUnitUpdate = ` + +resource "tencentcloud_organization_org_share_unit" "org_share_unit" { + name = "iac-test-1" + area = "ap-guangzhou" + description = "iac-test" +} + +` diff --git a/tencentcloud/services/tco/service_tencentcloud_organization.go b/tencentcloud/services/tco/service_tencentcloud_organization.go index bc38224f27..c57bbb7d7e 100644 --- a/tencentcloud/services/tco/service_tencentcloud_organization.go +++ b/tencentcloud/services/tco/service_tencentcloud_organization.go @@ -2,7 +2,9 @@ package tco import ( "context" + "fmt" "log" + "strings" tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common" @@ -770,6 +772,154 @@ func (me *OrganizationService) DescribeOrganizationMembersByFilter(ctx context.C return } +func (me *OrganizationService) DescribeOrganizationOrgShareUnitById(ctx context.Context, area, unitId string) (orgShareUnit *organization.ManagerShareUnit, errRet error) { + logId := tccommon.GetLogId(ctx) + + request := organization.NewDescribeShareUnitsRequest() + request.SearchKey = &unitId + request.Area = &area + request.Limit = helper.IntUint64(20) + request.Offset = helper.IntUint64(0) + + defer func() { + if errRet != nil { + log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, request.GetAction(), request.ToJsonString(), errRet.Error()) + } + }() + + ratelimit.Check(request.GetAction()) + + response, err := me.client.UseOrganizationClient().DescribeShareUnits(request) + if err != nil { + errRet = err + return + } + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), response.ToJsonString()) + + if response == nil || len(response.Response.Items) < 1 { + return + } + + orgShareUnit = response.Response.Items[0] + return +} + +func (me *OrganizationService) DeleteOrganizationOrgShareUnitById(ctx context.Context, unitId string) (errRet error) { + logId := tccommon.GetLogId(ctx) + + request := organization.NewDeleteShareUnitRequest() + request.UnitId = &unitId + + defer func() { + if errRet != nil { + log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, request.GetAction(), request.ToJsonString(), errRet.Error()) + } + }() + + ratelimit.Check(request.GetAction()) + + response, err := me.client.UseOrganizationClient().DeleteShareUnit(request) + if err != nil { + errRet = err + return + } + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), response.ToJsonString()) + + return +} + +func (me *OrganizationService) DescribeOrganizationOrgShareUnitMemberById(ctx context.Context, unitId, area, shareMemberUins string) (orgShareUnitMembers []*organization.ShareUnitMember, errRet error) { + logId := tccommon.GetLogId(ctx) + + request := organization.NewDescribeShareUnitMembersRequest() + request.UnitId = &unitId + request.Area = &area + + defer func() { + if errRet != nil { + log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, request.GetAction(), request.ToJsonString(), errRet.Error()) + } + }() + ratelimit.Check(request.GetAction()) + var ( + offset uint64 = 0 + limit uint64 = 10 + ) + var tmp []*organization.ShareUnitMember + for { + request.Offset = &offset + request.Limit = &limit + response, err := me.client.UseOrganizationClient().DescribeShareUnitMembers(request) + if err != nil { + errRet = err + return + } + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), response.ToJsonString()) + + if response == nil || len(response.Response.Items) < 1 { + break + } + tmp = append(tmp, response.Response.Items...) + if len(response.Response.Items) < int(limit) { + break + } + + offset += limit + } + + memberIdMap := make(map[string]struct{}) + + for _, item := range tmp { + memberIdMap[helper.Int64ToStr(*item.ShareMemberUin)] = struct{}{} + } + + split := strings.Split(shareMemberUins, tccommon.COMMA_SP) + if len(split) < 1 { + errRet = fmt.Errorf("shareMemberUins is broken, %s", shareMemberUins) + return + } + for _, v := range split { + if _, ok := memberIdMap[v]; !ok { + return + } + } + orgShareUnitMembers = tmp + return +} + +func (me *OrganizationService) DeleteOrganizationOrgShareUnitMemberById(ctx context.Context, unitId, area, shareMemberUins string) (errRet error) { + logId := tccommon.GetLogId(ctx) + + request := organization.NewDeleteShareUnitMembersRequest() + request.UnitId = &unitId + request.Area = &area + split := strings.Split(shareMemberUins, tccommon.COMMA_SP) + if len(split) < 1 { + errRet = fmt.Errorf("shareMemberUins is broken, %s", shareMemberUins) + return + } + for _, v := range split { + request.Members = append(request.Members, &organization.ShareMember{ShareMemberUin: helper.StrToInt64Point(v)}) + } + + defer func() { + if errRet != nil { + log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, request.GetAction(), request.ToJsonString(), errRet.Error()) + } + }() + + ratelimit.Check(request.GetAction()) + + response, err := me.client.UseOrganizationClient().DeleteShareUnitMembers(request) + if err != nil { + errRet = err + return + } + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), response.ToJsonString()) + + return +} + func (me *OrganizationService) DescribeOrganizationOrgShareAreaByFilter(ctx context.Context, param map[string]interface{}) (orgShareArea []*organization.ShareArea, errRet error) { var ( logId = tccommon.GetLogId(ctx) diff --git a/website/docs/r/organization_org_share_unit.html.markdown b/website/docs/r/organization_org_share_unit.html.markdown new file mode 100644 index 0000000000..111b2091ed --- /dev/null +++ b/website/docs/r/organization_org_share_unit.html.markdown @@ -0,0 +1,47 @@ +--- +subcategory: "Tencent Cloud Organization (TCO)" +layout: "tencentcloud" +page_title: "TencentCloud: tencentcloud_organization_org_share_unit" +sidebar_current: "docs-tencentcloud-resource-organization_org_share_unit" +description: |- + Provides a resource to create a organization org_share_unit +--- + +# tencentcloud_organization_org_share_unit + +Provides a resource to create a organization org_share_unit + +## Example Usage + +```hcl +resource "tencentcloud_organization_org_share_unit" "org_share_unit" { + name = "iac-test" + area = "ap-guangzhou" + description = "iac-test" +} +``` + +## Argument Reference + +The following arguments are supported: + +* `area` - (Required, String) Shared unit region. The regions that support sharing can be obtained through the DescribeShareAreas interface. +* `name` - (Required, String) Shared unit name. It only supports a combination of uppercase and lowercase letters, numbers, -, and _, with a length of 3-128 characters. +* `description` - (Optional, String) Shared unit description. Up to 128 characters. + +## Attributes Reference + +In addition to all arguments above, the following attributes are exported: + +* `id` - ID of the resource. +* `unit_id` - Shared unit region. The regions that support sharing can be obtained through the DescribeShareAreas interface. + + +## Import + +organization org_share_unit can be imported using the id, e.g. + +``` +terraform import tencentcloud_organization_org_share_unit.org_share_unit area#unit_id +``` + diff --git a/website/docs/r/organization_org_share_unit_member.html.markdown b/website/docs/r/organization_org_share_unit_member.html.markdown new file mode 100644 index 0000000000..8ff3b7aace --- /dev/null +++ b/website/docs/r/organization_org_share_unit_member.html.markdown @@ -0,0 +1,50 @@ +--- +subcategory: "Tencent Cloud Organization (TCO)" +layout: "tencentcloud" +page_title: "TencentCloud: tencentcloud_organization_org_share_unit_member" +sidebar_current: "docs-tencentcloud-resource-organization_org_share_unit_member" +description: |- + Provides a resource to create a organization org_share_unit_member +--- + +# tencentcloud_organization_org_share_unit_member + +Provides a resource to create a organization org_share_unit_member + +## Example Usage + +```hcl +resource "tencentcloud_organization_org_share_unit" "org_share_unit" { + name = "iac-test" + area = "ap-guangzhou" + description = "iac-test" +} +resource "tencentcloud_organization_org_share_unit_member" "org_share_unit_member" { + unit_id = tencentcloud_organization_org_share_unit.org_share_unit.unit_id + area = tencentcloud_organization_org_share_unit.org_share_unit.area + members { + share_member_uin = 100035309479 + } +} +``` + +## Argument Reference + +The following arguments are supported: + +* `area` - (Required, String, ForceNew) Shared unit region. +* `members` - (Required, List, ForceNew) Shared member list. Up to 10 items. +* `unit_id` - (Required, String, ForceNew) Shared unit ID. + +The `members` object supports the following: + +* `share_member_uin` - (Required, Int) Member uin. + +## Attributes Reference + +In addition to all arguments above, the following attributes are exported: + +* `id` - ID of the resource. + + + diff --git a/website/tencentcloud.erb b/website/tencentcloud.erb index 35c78deb92..4441878196 100644 --- a/website/tencentcloud.erb +++ b/website/tencentcloud.erb @@ -4296,6 +4296,12 @@