alicloud/resource_alicloud_max_compute_quota.go (300 lines of code) (raw):
package alicloud
import (
"fmt"
"github.com/PaesslerAG/jsonpath"
"github.com/aliyun/terraform-provider-alicloud/alicloud/connectivity"
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
"log"
"time"
)
func resourceAliCloudMaxComputeQuota() *schema.Resource {
return &schema.Resource{
Create: resourceAliCloudMaxComputeQuotaCreate,
Read: resourceAliCloudMaxComputeQuotaRead,
Update: resourceAliCloudMaxComputeQuotaUpdate,
Delete: resourceAliCloudMaxComputeQuotaDelete,
Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough,
},
Timeouts: &schema.ResourceTimeout{
Create: schema.DefaultTimeout(31 * time.Minute),
Update: schema.DefaultTimeout(5 * time.Minute),
Delete: schema.DefaultTimeout(5 * time.Minute),
},
Schema: map[string]*schema.Schema{
"commodity_code": {
Type: schema.TypeString,
Required: true,
},
"commodity_data": {
Type: schema.TypeString,
Optional: true,
},
"part_nick_name": {
Type: schema.TypeString,
Optional: true,
},
"payment_type": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
ValidateFunc: StringInSlice([]string{"PayAsYouGo", "Subscription"}, false),
},
"sub_quota_info_list": {
Type: schema.TypeSet,
Optional: true,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"type": {
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"parameter": {
Type: schema.TypeList,
Optional: true,
Computed: true,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"force_reserved_min": {
Type: schema.TypeBool,
Optional: true,
Computed: true,
},
"single_job_cu_limit": {
Type: schema.TypeInt,
Optional: true,
Computed: true,
},
"enable_priority": {
Type: schema.TypeBool,
Optional: true,
Computed: true,
},
"min_cu": {
Type: schema.TypeInt,
Required: true,
},
"scheduler_type": {
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"max_cu": {
Type: schema.TypeInt,
Required: true,
},
},
},
},
"nick_name": {
Type: schema.TypeString,
Required: true,
},
},
},
},
},
}
}
func resourceAliCloudMaxComputeQuotaCreate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AliyunClient)
action := fmt.Sprintf("/api/v1/quotas")
var request map[string]interface{}
var response map[string]interface{}
query := make(map[string]*string)
body := make(map[string]interface{})
var err error
request = make(map[string]interface{})
if v, ok := d.GetOk("payment_type"); ok {
query["chargeType"] = StringPointer(v.(string))
}
if v, ok := d.GetOk("commodity_code"); ok {
query["commodityCode"] = StringPointer(v.(string))
}
if v, ok := d.GetOk("commodity_data"); ok {
query["commodityData"] = StringPointer(v.(string))
}
if v, ok := d.GetOk("part_nick_name"); ok {
query["partNickName"] = StringPointer(v.(string))
}
body = request
wait := incrementalWait(3*time.Second, 5*time.Second)
err = resource.Retry(d.Timeout(schema.TimeoutCreate), func() *resource.RetryError {
response, err = client.RoaPost("MaxCompute", "2022-01-04", action, query, nil, body, true)
if err != nil {
if NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
return nil
})
addDebug(action, response, request)
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, "alicloud_max_compute_quota", action, AlibabaCloudSdkGoERROR)
}
id, _ := jsonpath.Get("$.data.nickName", response)
if id == nil {
return WrapErrorf(err, DefaultErrorMsg, "alicloud_max_compute_quota", action, AlibabaCloudSdkGoERROR, response)
}
d.SetId(fmt.Sprint(id))
maxComputeServiceV2 := MaxComputeServiceV2{client}
stateConf := BuildStateConf([]string{}, []string{fmt.Sprint(id)}, d.Timeout(schema.TimeoutCreate), 30*time.Second, maxComputeServiceV2.MaxComputeQuotaStateRefreshFunc(d.Id(), "$.nickName", []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}
return resourceAliCloudMaxComputeQuotaUpdate(d, meta)
}
func resourceAliCloudMaxComputeQuotaRead(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AliyunClient)
maxComputeServiceV2 := MaxComputeServiceV2{client}
objectRaw, err := maxComputeServiceV2.DescribeMaxComputeQuota(d.Id())
if err != nil {
if !d.IsNewResource() && NotFoundError(err) {
log.Printf("[DEBUG] Resource alicloud_max_compute_quota DescribeMaxComputeQuota Failed!!! %s", err)
d.SetId("")
return nil
}
return WrapError(err)
}
billingPolicyRawObj, _ := jsonpath.Get("$.billingPolicy", objectRaw)
billingPolicyRaw := make(map[string]interface{})
if billingPolicyRawObj != nil {
billingPolicyRaw = billingPolicyRawObj.(map[string]interface{})
}
d.Set("payment_type", convertMaxComputeQuotabillingPolicybillingMethodResponse(billingPolicyRaw["billingMethod"]))
subQuotaInfoListRaw := objectRaw["subQuotaInfoList"]
subQuotaInfoListMaps := make([]map[string]interface{}, 0)
if subQuotaInfoListRaw != nil {
for _, subQuotaInfoListChildRaw := range subQuotaInfoListRaw.([]interface{}) {
subQuotaInfoListMap := make(map[string]interface{})
subQuotaInfoListChildRaw := subQuotaInfoListChildRaw.(map[string]interface{})
subQuotaInfoListMap["nick_name"] = subQuotaInfoListChildRaw["nickName"]
subQuotaInfoListMap["type"] = subQuotaInfoListChildRaw["type"]
parameterMaps := make([]map[string]interface{}, 0)
parameterMap := make(map[string]interface{})
parameterRaw := make(map[string]interface{})
if subQuotaInfoListChildRaw["parameter"] != nil {
parameterRaw = subQuotaInfoListChildRaw["parameter"].(map[string]interface{})
}
if len(parameterRaw) > 0 {
parameterMap["enable_priority"] = parameterRaw["enablePriority"]
parameterMap["force_reserved_min"] = parameterRaw["forceReservedMin"]
parameterMap["max_cu"] = parameterRaw["maxCU"]
parameterMap["min_cu"] = parameterRaw["minCU"]
parameterMap["scheduler_type"] = parameterRaw["schedulerType"]
parameterMap["single_job_cu_limit"] = parameterRaw["singleJobCULimit"]
parameterMaps = append(parameterMaps, parameterMap)
}
subQuotaInfoListMap["parameter"] = parameterMaps
subQuotaInfoListMaps = append(subQuotaInfoListMaps, subQuotaInfoListMap)
}
}
if err := d.Set("sub_quota_info_list", subQuotaInfoListMaps); err != nil {
return err
}
objectRaw, err = maxComputeServiceV2.DescribeQuotaListTagResources(d.Id())
if err != nil && !NotFoundError(err) {
return WrapError(err)
}
return nil
}
func resourceAliCloudMaxComputeQuotaUpdate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AliyunClient)
var request map[string]interface{}
var response map[string]interface{}
var query map[string]*string
var body map[string]interface{}
update := false
var err error
nickname := d.Id()
action := fmt.Sprintf("/api/v1/quotas/%s/computeSubQuota", nickname)
request = make(map[string]interface{})
query = make(map[string]*string)
header := make(map[string]*string)
body = make(map[string]interface{})
request["nickname"] = d.Id()
if d.HasChange("sub_quota_info_list") {
update = true
}
if v, ok := d.GetOk("sub_quota_info_list"); ok || d.HasChange("sub_quota_info_list") {
subQuotaInfoListMapsArray := make([]interface{}, 0)
for _, dataLoop := range v.(*schema.Set).List() {
dataLoopTmp := dataLoop.(map[string]interface{})
dataLoopMap := make(map[string]interface{})
dataLoopMap["nickName"] = dataLoopTmp["nick_name"]
if !IsNil(dataLoopTmp["parameter"]) {
localData1 := make(map[string]interface{})
minCu, _ := jsonpath.Get("$[0].min_cu", dataLoopTmp["parameter"])
if minCu != nil && minCu != "" {
localData1["minCU"] = minCu
}
singleJobCuLimit, _ := jsonpath.Get("$[0].single_job_cu_limit", dataLoopTmp["parameter"])
if singleJobCuLimit != nil && singleJobCuLimit != "" && singleJobCuLimit.(int) > 0 {
localData1["singleJobCULimit"] = singleJobCuLimit
}
enablePriority1, _ := jsonpath.Get("$[0].enable_priority", dataLoopTmp["parameter"])
if enablePriority1 != nil && enablePriority1 != "" {
localData1["enablePriority"] = enablePriority1
}
maxCu, _ := jsonpath.Get("$[0].max_cu", dataLoopTmp["parameter"])
if maxCu != nil && maxCu != "" {
localData1["maxCU"] = maxCu
}
schedulerType1, _ := jsonpath.Get("$[0].scheduler_type", dataLoopTmp["parameter"])
if schedulerType1 != nil && schedulerType1 != "" {
localData1["schedulerType"] = schedulerType1
}
forceReservedMin1, _ := jsonpath.Get("$[0].force_reserved_min", dataLoopTmp["parameter"])
if forceReservedMin1 != nil && forceReservedMin1 != "" {
localData1["forceReservedMin"] = forceReservedMin1
}
dataLoopMap["parameter"] = localData1
}
if dataLoopTmp["type"] != "" {
dataLoopMap["type"] = dataLoopTmp["type"]
}
subQuotaInfoListMapsArray = append(subQuotaInfoListMapsArray, dataLoopMap)
}
request["subQuotaInfoList"] = subQuotaInfoListMapsArray
}
body = request
if update {
wait := incrementalWait(3*time.Second, 5*time.Second)
err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
response, err = client.RoaPut("MaxCompute", "2022-01-04", action, query, header, body, true)
if err != nil {
if NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
return nil
})
addDebug(action, response, request)
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
}
}
return resourceAliCloudMaxComputeQuotaRead(d, meta)
}
func resourceAliCloudMaxComputeQuotaDelete(d *schema.ResourceData, meta interface{}) error {
log.Printf("[WARN] Cannot destroy resource AliCloud Resource Quota. Terraform will remove this resource from the state file, however resources may remain.")
return nil
}
func convertMaxComputeQuotabillingPolicybillingMethodResponse(source interface{}) interface{} {
source = fmt.Sprint(source)
switch source {
case "payasyougo":
return "PayAsYouGo"
case "subscription":
return "Subscription"
}
return source
}