alicloud/resource_alicloud_eflo_node.go (333 lines of code) (raw):
// Package alicloud. This file is generated automatically. Please do not modify it manually, thank you!
package alicloud
import (
"fmt"
"log"
"time"
"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"
)
func resourceAliCloudEfloNode() *schema.Resource {
return &schema.Resource{
Create: resourceAliCloudEfloNodeCreate,
Read: resourceAliCloudEfloNodeRead,
Update: resourceAliCloudEfloNodeUpdate,
Delete: resourceAliCloudEfloNodeDelete,
Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough,
},
Timeouts: &schema.ResourceTimeout{
Create: schema.DefaultTimeout(5 * time.Minute),
Update: schema.DefaultTimeout(5 * time.Minute),
Delete: schema.DefaultTimeout(5 * time.Minute),
},
Schema: map[string]*schema.Schema{
"billing_cycle": {
Type: schema.TypeString,
Optional: true,
},
"classify": {
Type: schema.TypeString,
Optional: true,
},
"computing_server": {
Type: schema.TypeString,
Optional: true,
},
"create_time": {
Type: schema.TypeString,
Computed: true,
},
"discount_level": {
Type: schema.TypeString,
Optional: true,
},
"hpn_zone": {
Type: schema.TypeString,
Optional: true,
},
"payment_ratio": {
Type: schema.TypeString,
Optional: true,
},
"period": {
Type: schema.TypeInt,
Optional: true,
},
"product_form": {
Type: schema.TypeString,
Optional: true,
},
"renew_period": {
Type: schema.TypeInt,
Optional: true,
},
"renewal_status": {
Type: schema.TypeString,
Optional: true,
},
"resource_group_id": {
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"server_arch": {
Type: schema.TypeString,
Optional: true,
},
"stage_num": {
Type: schema.TypeString,
Optional: true,
},
"status": {
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"tags": tagsSchema(),
"zone": {
Type: schema.TypeString,
Optional: true,
},
},
}
}
func resourceAliCloudEfloNodeCreate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AliyunClient)
action := "CreateInstance"
var request map[string]interface{}
var response map[string]interface{}
query := make(map[string]interface{})
var err error
request = make(map[string]interface{})
request["ClientToken"] = buildClientToken(action)
parameterMapList := make([]map[string]interface{}, 0)
if v, ok := d.GetOk("server_arch"); ok {
parameterMapList = append(parameterMapList, map[string]interface{}{
"Code": "ServerArch",
"Value": v,
})
}
if v, ok := d.GetOk("hpn_zone"); ok {
parameterMapList = append(parameterMapList, map[string]interface{}{
"Code": "HpnZone",
"Value": v,
})
}
if v, ok := d.GetOk("stage_num"); ok {
parameterMapList = append(parameterMapList, map[string]interface{}{
"Code": "StageNum",
"Value": v,
})
}
if v, ok := d.GetOk("payment_ratio"); ok {
parameterMapList = append(parameterMapList, map[string]interface{}{
"Code": "PaymentRatio",
"Value": v,
})
}
parameterMapList = append(parameterMapList, map[string]interface{}{
"Code": "RegionId",
"Value": client.RegionId,
})
if v, ok := d.GetOk("classify"); ok {
parameterMapList = append(parameterMapList, map[string]interface{}{
"Code": "Classify",
"Value": v,
})
}
if v, ok := d.GetOk("discount_level"); ok {
parameterMapList = append(parameterMapList, map[string]interface{}{
"Code": "discountlevel",
"Value": v,
})
}
if v, ok := d.GetOk("billing_cycle"); ok {
parameterMapList = append(parameterMapList, map[string]interface{}{
"Code": "BillingCycle",
"Value": v,
})
}
if v, ok := d.GetOk("computing_server"); ok {
parameterMapList = append(parameterMapList, map[string]interface{}{
"Code": "computingserver",
"Value": v,
})
}
if v, ok := d.GetOk("zone"); ok {
parameterMapList = append(parameterMapList, map[string]interface{}{
"Code": "Zone",
"Value": v,
})
}
if v, ok := d.GetOk("product_form"); ok {
parameterMapList = append(parameterMapList, map[string]interface{}{
"Code": "ProductForm",
"Value": v,
})
}
request["Parameter"] = parameterMapList
request["SubscriptionType"] = "Subscription"
if v, ok := d.GetOk("renewal_status"); ok {
request["RenewalStatus"] = v
}
if v, ok := d.GetOkExists("period"); ok {
request["Period"] = v
}
if v, ok := d.GetOkExists("renew_period"); ok {
request["RenewPeriod"] = v
}
var endpoint string
request["ProductCode"] = "bccluster"
request["ProductType"] = "bccluster_eflocomputing_public_cn"
if client.IsInternationalAccount() {
request["ProductType"] = "bccluster_eflocomputing_public_intl"
}
wait := incrementalWait(3*time.Second, 5*time.Second)
err = resource.Retry(d.Timeout(schema.TimeoutCreate), func() *resource.RetryError {
response, err = client.RpcPostWithEndpoint("BssOpenApi", "2017-12-14", action, query, request, true, endpoint)
if err != nil {
if NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
if !client.IsInternationalAccount() && IsExpectedErrors(err, []string{"NotApplicable"}) {
request["ProductCode"] = "bccluster"
request["ProductType"] = "bccluster_eflocomputing_public_intl"
endpoint = connectivity.BssOpenAPIEndpointInternational
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
return nil
})
addDebug(action, response, request)
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, "alicloud_eflo_node", action, AlibabaCloudSdkGoERROR)
}
id, _ := jsonpath.Get("$.Data.InstanceId", response)
d.SetId(fmt.Sprint(id))
efloServiceV2 := EfloServiceV2{client}
stateConf := BuildStateConf([]string{}, []string{"#CHECKSET"}, d.Timeout(schema.TimeoutCreate), 5*time.Second, efloServiceV2.EfloNodeStateRefreshFunc(d.Id(), "#$.NodeId", []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}
return resourceAliCloudEfloNodeUpdate(d, meta)
}
func resourceAliCloudEfloNodeRead(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AliyunClient)
efloServiceV2 := EfloServiceV2{client}
objectRaw, err := efloServiceV2.DescribeEfloNode(d.Id())
if err != nil {
if !d.IsNewResource() && NotFoundError(err) {
log.Printf("[DEBUG] Resource alicloud_eflo_node DescribeEfloNode Failed!!! %s", err)
d.SetId("")
return nil
}
return WrapError(err)
}
d.Set("create_time", objectRaw["CreateTime"])
d.Set("resource_group_id", objectRaw["ResourceGroupId"])
d.Set("status", objectRaw["OperatingState"])
objectRaw, err = efloServiceV2.DescribeNodeListTagResources(d.Id())
if err != nil && !NotFoundError(err) {
return WrapError(err)
}
tagsMaps, _ := jsonpath.Get("$.TagResources.TagResource", objectRaw)
d.Set("tags", tagsToMap(tagsMaps))
return nil
}
func resourceAliCloudEfloNodeUpdate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AliyunClient)
var request map[string]interface{}
var response map[string]interface{}
var query map[string]interface{}
update := false
var err error
action := "ChangeResourceGroup"
request = make(map[string]interface{})
query = make(map[string]interface{})
request["ResourceId"] = d.Id()
request["ResourceRegionId"] = client.RegionId
if _, ok := d.GetOk("resource_group_id"); ok && d.HasChange("resource_group_id") {
update = true
}
request["ResourceGroupId"] = d.Get("resource_group_id")
request["ResourceType"] = "Node"
if update {
wait := incrementalWait(3*time.Second, 5*time.Second)
err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
response, err = client.RpcPost("eflo-controller", "2022-12-15", action, query, request, true)
if err != nil {
if IsExpectedErrors(err, []string{"ResourceNotFound"}) || 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)
}
}
if d.HasChange("tags") {
efloServiceV2 := EfloServiceV2{client}
if err := efloServiceV2.SetResourceTags(d, "Node"); err != nil {
return WrapError(err)
}
}
return resourceAliCloudEfloNodeRead(d, meta)
}
func resourceAliCloudEfloNodeDelete(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AliyunClient)
action := "RefundInstance"
var request map[string]interface{}
var response map[string]interface{}
query := make(map[string]interface{})
var err error
request = make(map[string]interface{})
request["InstanceId"] = d.Id()
request["ClientToken"] = buildClientToken(action)
request["ImmediatelyRelease"] = "1"
var endpoint string
request["ProductCode"] = "bccluster"
request["ProductType"] = "bccluster_eflocomputing_public_cn"
if client.IsInternationalAccount() {
request["ProductType"] = "bccluster_eflocomputing_public_intl"
}
wait := incrementalWait(3*time.Second, 5*time.Second)
err = resource.Retry(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError {
response, err = client.RpcPostWithEndpoint("BssOpenApi", "2017-12-14", action, query, request, true, endpoint)
request["ClientToken"] = buildClientToken(action)
if err != nil {
if NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
if !client.IsInternationalAccount() && IsExpectedErrors(err, []string{"NotApplicable"}) {
request["ProductCode"] = "bccluster"
request["ProductType"] = "bccluster_eflocomputing_public_intl"
endpoint = connectivity.BssOpenAPIEndpointInternational
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
return nil
})
addDebug(action, response, request)
if err != nil {
if IsExpectedErrors(err, []string{"RESOURCE_NOT_FOUND"}) || NotFoundError(err) {
return nil
}
return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
}
efloServiceV2 := EfloServiceV2{client}
stateConf := BuildStateConf([]string{}, []string{}, d.Timeout(schema.TimeoutDelete), 5*time.Second, efloServiceV2.EfloNodeStateRefreshFunc(d.Id(), "$.NodeId", []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}
return nil
}