alibabacloudstack/resource_apsarastack_ascm_resource_group.go (180 lines of code) (raw):
package alibabacloudstack
import (
"fmt"
"log"
"strconv"
"strings"
"time"
"github.com/aliyun/alibaba-cloud-sdk-go/services/ecs"
"github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/connectivity"
"github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/errmsgs"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
)
func resourceAlibabacloudStackAscmResourceGroup() *schema.Resource {
resource := &schema.Resource{
Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Required: true,
ValidateFunc: validation.StringLenBetween(2, 128),
},
"organization_id": {
Type: schema.TypeString,
Optional: true,
Computed: true,
ForceNew: true,
Deprecated: "Field 'organization_id' has been deprecated. Use the organization to which the current user belongs",
},
"rg_id": {
Type: schema.TypeString,
Computed: true,
},
},
}
setResourceFunc(resource, resourceAlibabacloudStackAscmResourceGroupCreate, resourceAlibabacloudStackAscmResourceGroupRead, resourceAlibabacloudStackAscmResourceGroupUpdate, resourceAlibabacloudStackAscmResourceGroupDelete)
return resource
}
func resourceAlibabacloudStackAscmResourceGroupCreate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
ascmService := AscmService{client}
var requestInfo *ecs.Client
name := d.Get("name").(string)
check, err := ascmService.DescribeAscmResourceGroup(name)
if err != nil {
return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, "alibabacloudstack_ascm_resource_group", "RG alreadyExist", errmsgs.AlibabacloudStackSdkGoERROR)
}
var organizationId string
if _, ok:= d.GetOk("organization_id"); ok {
organizationId = d.Get("organization_id").(string)
} else {
organizationId = client.Department
}
if len(check.Data) == 0 {
request := client.NewCommonRequest("POST", "ascm", "2019-05-10", "CreateResourceGroup", "/ascm/auth/resource_group/create_resource_group")
request.QueryParams["ProductName"] = "ascm"
request.QueryParams["resource_group_name"] = name
request.QueryParams["organization_id"] = organizationId
request.Headers["x-acs-content-type"] = "application/json"
request.Headers["Content-Type"] = "application/json"
bresponse, err := client.ProcessCommonRequest(request)
addDebug("CreateResourceGroup", bresponse, request, request.QueryParams)
if err != nil {
errmsg := ""
if bresponse != nil {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_ascm_resource_group", "CreateResourceGroup", errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
if bresponse.GetHttpStatus() != 200 {
errmsg := errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_ascm_resource_group", "CreateResourceGroup", errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug("CreateResourceGroup", bresponse, requestInfo, bresponse.GetHttpContentString())
}
err = resource.Retry(5*time.Minute, func() *resource.RetryError {
check, err = ascmService.DescribeAscmResourceGroup(name)
if err != nil {
return resource.NonRetryableError(err)
}
return resource.RetryableError(err)
})
d.SetId(check.Data[0].ResourceGroupName + COLON_SEPARATED + fmt.Sprint(check.Data[0].ID))
return nil
}
func resourceAlibabacloudStackAscmResourceGroupUpdate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
ascmService := AscmService{client}
name := d.Get("name").(string)
attributeUpdate := false
check, err := ascmService.DescribeAscmResourceGroup(d.Id())
did := strings.Split(d.Id(), COLON_SEPARATED)
if err != nil {
return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, d.Id(), "IsResourceGroupExist", errmsgs.AlibabacloudStackSdkGoERROR)
}
if d.HasChange("name") {
if v, ok := d.GetOk("name"); ok {
name = v.(string)
}
check.Data[0].ResourceGroupName = name
attributeUpdate = true
} else {
if v, ok := d.GetOk("name"); ok {
name = v.(string)
}
check.Data[0].ResourceGroupName = name
}
if attributeUpdate {
request := client.NewCommonRequest("POST", "ascm", "2019-05-10", "UpdateResourceGroup", "/ascm/auth/resource_group/update_resource_group")
request.QueryParams["resourceGroupName"] = name
request.QueryParams["id"] = did[1]
request.Headers["x-acs-content-type"] = "application/json"
request.Headers["Content-Type"] = "application/json"
bresponse, err := client.ProcessCommonRequest(request)
log.Printf(" response of raw UpdateResourceGroup : %s", bresponse)
if err != nil {
errmsg := ""
if bresponse != nil {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_ascm_resource_group", "UpdateResourceGroup", errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), bresponse, request)
}
d.SetId(name + COLON_SEPARATED + fmt.Sprint(check.Data[0].ID))
return nil
}
func resourceAlibabacloudStackAscmResourceGroupRead(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
ascmService := AscmService{client}
object, err := ascmService.DescribeAscmResourceGroup(d.Id())
did := strings.Split(d.Id(), COLON_SEPARATED)
if err != nil {
if errmsgs.NotFoundError(err) {
d.SetId("")
return nil
}
return errmsgs.WrapError(err)
}
if len(object.Data) == 0 {
d.SetId("")
return nil
}
d.Set("name", did[0])
d.Set("rg_id", did[1])
d.Set("organization_id", strconv.Itoa(object.Data[0].OrganizationID))
return nil
}
func resourceAlibabacloudStackAscmResourceGroupDelete(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
ascmService := AscmService{client}
var requestInfo *ecs.Client
check, err := ascmService.DescribeAscmResourceGroup(d.Id())
did := strings.Split(d.Id(), COLON_SEPARATED)
if err != nil {
return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, d.Id(), "IsResourceGroupExist", errmsgs.AlibabacloudStackSdkGoERROR)
}
addDebug("IsResourceGroupExist", check, requestInfo, map[string]string{"resourceGroupName": did[0]})
err = resource.Retry(1*time.Minute, func() *resource.RetryError {
request := client.NewCommonRequest("POST", "ascm", "2019-05-10", "RemoveResourceGroup", "/ascm/auth/resource_group/delete_resource_group")
request.QueryParams["resourceGroupName"] = did[0]
request.Headers["x-acs-content-type"] = "application/json"
request.Headers["Content-Type"] = "application/json"
bresponse, err := client.ProcessCommonRequest(request)
if err != nil {
errmsg := ""
if bresponse != nil {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
return resource.RetryableError(errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_ascm_resource_group", "RemoveResourceGroup", errmsgs.AlibabacloudStackSdkGoERROR, errmsg))
}
log.Printf(" response of raw RemoveResourceGroup : %s", bresponse)
_, err = ascmService.DescribeAscmResourceGroup(d.Id())
if err != nil {
return resource.NonRetryableError(err)
}
return nil
})
return nil
}