alibabacloudstack/resource_apsarastack_ecs_dedicatedhost.go (399 lines of code) (raw):
package alibabacloudstack
import (
"fmt"
"log"
"time"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
"github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/connectivity"
"github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/errmsgs"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
)
func resourceAlibabacloudStackEcsDedicatedHost() *schema.Resource {
resource := &schema.Resource{
Timeouts: &schema.ResourceTimeout{
Create: schema.DefaultTimeout(11 * time.Minute),
Delete: schema.DefaultTimeout(1 * time.Minute),
Update: schema.DefaultTimeout(11 * time.Minute),
},
Schema: map[string]*schema.Schema{
"action_on_maintenance": {
Type: schema.TypeString,
Optional: true,
ValidateFunc: validation.StringInSlice([]string{"Stop", "Migrate"}, false),
Default: "Stop",
},
"auto_placement": {
Type: schema.TypeString,
Optional: true,
ValidateFunc: validation.StringInSlice([]string{"off", "on"}, false),
Default: "on",
},
"auto_release_time": {
Type: schema.TypeString,
Optional: true,
},
"auto_renew": {
Type: schema.TypeBool,
Optional: true,
},
"auto_renew_period": {
Type: schema.TypeInt,
Optional: true,
},
"cpu_over_commit_ratio": {
Type: schema.TypeFloat,
Optional: true,
},
"dedicated_host_cluster_id": {
Type: schema.TypeString,
Optional: true,
},
"dedicated_host_name": {
Type: schema.TypeString,
Optional: true,
},
"dedicated_host_type": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
},
"description": {
Type: schema.TypeString,
Optional: true,
},
"detail_fee": {
Type: schema.TypeBool,
Optional: true,
Default: false,
},
"dry_run": {
Type: schema.TypeBool,
Optional: true,
Default: false,
},
"expired_time": {
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"min_quantity": {
Type: schema.TypeInt,
Optional: true,
},
"network_attributes": {
Type: schema.TypeSet,
Optional: true,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"udp_timeout": {
Type: schema.TypeInt,
Optional: true,
},
"slb_udp_timeout": {
Type: schema.TypeInt,
Optional: true,
},
},
},
},
"payment_type": {
Type: schema.TypeString,
Optional: true,
ValidateFunc: validation.StringInSlice([]string{"PostPaid", "PrePaid"}, false),
Default: "PostPaid",
},
"resource_group_id": {
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"sale_cycle": {
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"status": {
Type: schema.TypeString,
Computed: true,
},
"tags": tagsSchema(),
"zone_id": {
Type: schema.TypeString,
Optional: true,
Computed: true,
ForceNew: true,
},
},
}
setResourceFunc(resource, resourceAlibabacloudStackEcsDedicatedHostCreate, resourceAlibabacloudStackEcsDedicatedHostRead, resourceAlibabacloudStackEcsDedicatedHostUpdate, resourceAlibabacloudStackEcsDedicatedHostDelete)
return resource
}
func resourceAlibabacloudStackEcsDedicatedHostCreate(d *schema.ResourceData, meta interface{}) (err error) {
client := meta.(*connectivity.AlibabacloudStackClient)
ecsService := EcsService{client}
var response map[string]interface{}
action := "AllocateDedicatedHosts"
request := make(map[string]interface{})
if v, ok := d.GetOk("action_on_maintenance"); ok {
request["ActionOnMaintenance"] = v
}
if v, ok := d.GetOk("auto_placement"); ok {
request["AutoPlacement"] = v
}
if v, ok := d.GetOk("auto_release_time"); ok {
request["AutoReleaseTime"] = v
}
if v, ok := d.GetOkExists("auto_renew"); ok {
request["AutoRenew"] = v
}
if v, ok := d.GetOk("auto_renew_period"); ok {
request["AutoRenewPeriod"] = v
}
if v, ok := d.GetOk("cpu_over_commit_ratio"); ok {
request["CpuOverCommitRatio"] = v
}
if v, ok := d.GetOk("dedicated_host_cluster_id"); ok {
request["DedicatedHostClusterId"] = v
}
if v, ok := d.GetOk("dedicated_host_name"); ok {
request["DedicatedHostName"] = v
}
request["DedicatedHostType"] = d.Get("dedicated_host_type")
if v, ok := d.GetOk("description"); ok {
request["Description"] = v
}
if v, ok := d.GetOk("expired_time"); ok {
request["Period"] = v
}
if v, ok := d.GetOk("min_quantity"); ok {
request["MinQuantity"] = v
}
if v, ok := d.GetOk("network_attributes"); ok {
networkAttributesMap := make(map[string]interface{})
for _, networkAttributes := range v.(*schema.Set).List() {
networkAttributesArg := networkAttributes.(map[string]interface{})
networkAttributesMap["SlbUdpTimeout"] = requests.NewInteger(networkAttributesArg["slb_udp_timeout"].(int))
networkAttributesMap["UdpTimeout"] = requests.NewInteger(networkAttributesArg["udp_timeout"].(int))
}
request["NetworkAttributes"] = networkAttributesMap
}
if v, ok := d.GetOk("payment_type"); ok {
request["ChargeType"] = v
}
request["Quantity"] = 1
if v, ok := d.GetOk("resource_group_id"); ok {
request["ResourceGroupId"] = v
}
if v, ok := d.GetOk("sale_cycle"); ok {
request["PeriodUnit"] = v
}
if v, ok := d.GetOk("tags"); ok {
count := 1
for key, value := range v.(map[string]interface{}) {
request[fmt.Sprintf("Tag.%d.Key", count)] = key
request[fmt.Sprintf("Tag.%d.Value", count)] = value
count++
}
}
if v, ok := d.GetOk("zone_id"); ok {
request["ZoneId"] = v
}
response, err = client.DoTeaRequest("POST", "Ecs", "2014-05-26", action, "", nil, nil, request)
if err != nil {
return err
}
responseDedicatedHostIdSets := response["DedicatedHostIdSets"].(map[string]interface{})
d.SetId(fmt.Sprint(responseDedicatedHostIdSets["DedicatedHostId"].([]interface{})[0]))
stateConf := BuildStateConf([]string{}, []string{"Available"}, d.Timeout(schema.TimeoutCreate), 15*time.Second, ecsService.EcsDedicatedHostStateRefreshFunc(d.Id(), []string{"PermanentFailure"}))
if _, err := stateConf.WaitForState(); err != nil {
return errmsgs.WrapErrorf(err, errmsgs.IdMsg, d.Id())
}
return nil
}
func resourceAlibabacloudStackEcsDedicatedHostRead(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
ecsService := EcsService{client}
object, err := ecsService.DescribeEcsDedicatedHost(d.Id())
if err != nil {
if errmsgs.NotFoundError(err) {
log.Printf("[DEBUG] Resource alibabacloudstack_ecs_dedicated_host ecsService.DescribeEcsDedicatedHost Failed!!! %s", err)
d.SetId("")
return nil
}
return errmsgs.WrapError(err)
}
d.Set("action_on_maintenance", object.ActionOnMaintenance)
d.Set("auto_placement", object.AutoPlacement)
d.Set("auto_release_time", object.AutoReleaseTime)
d.Set("cpu_over_commit_ratio", object.CpuOverCommitRatio)
d.Set("dedicated_host_name", object.DedicatedHostName)
d.Set("dedicated_host_type", object.DedicatedHostType)
d.Set("description", object.Description)
d.Set("expired_time", object.ExpiredTime)
d.Set("network_attributes", object.NetworkAttributes)
d.Set("payment_type", object.ChargeType)
d.Set("resource_group_id", object.ResourceGroupId)
d.Set("sale_cycle", object.SaleCycle)
d.Set("status", object.Status)
d.Set("tags", object.Tags)
d.Set("zone_id", object.ZoneId)
return nil
}
func resourceAlibabacloudStackEcsDedicatedHostUpdate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
ecsService := EcsService{client}
d.Partial(true)
if !d.IsNewResource() && d.HasChange("tags") {
if err := ecsService.SetResourceTags(d, "ddh"); err != nil {
return errmsgs.WrapError(err)
}
//d.SetPartial("tags")
}
if !d.IsNewResource() && d.HasChange("auto_release_time") {
request := map[string]interface{}{
"DedicatedHostId": d.Id(),
}
request["AutoReleaseTime"] = d.Get("auto_release_time")
action := "ModifyDedicatedHostAutoReleaseTime"
_, err := client.DoTeaRequest("POST", "Ecs", "2014-05-26", action, "", nil, nil, request)
if err != nil {
return err
}
stateConf := BuildStateConf([]string{}, []string{"Available"}, d.Timeout(schema.TimeoutUpdate), 5*time.Second, ecsService.EcsDedicatedHostStateRefreshFunc(d.Id(), []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return errmsgs.WrapErrorf(err, errmsgs.IdMsg, d.Id())
}
//d.SetPartial("auto_release_time")
}
if !d.IsNewResource() && d.HasChange("resource_group_id") {
request := map[string]interface{}{
"ResourceId": d.Id(),
"ResourceType": "ddh",
"ResourceGroupId": d.Get("resource_group_id"),
}
action := "JoinResourceGroup"
_, err := client.DoTeaRequest("POST", "Ecs", "2014-05-26", action, "", nil, nil, request)
if err != nil {
return err
}
stateConf := BuildStateConf([]string{}, []string{"Available"}, d.Timeout(schema.TimeoutUpdate), 5*time.Second, ecsService.EcsDedicatedHostStateRefreshFunc(d.Id(), []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return errmsgs.WrapErrorf(err, errmsgs.IdMsg, d.Id())
}
//d.SetPartial("resource_group_id")
}
update := false
request := map[string]interface{}{
"DedicatedHostIds": convertListToJsonString(convertListStringToListInterface([]string{d.Id()})),
}
if !d.IsNewResource() && d.HasChange("expired_time") {
update = true
request["Period"] = d.Get("expired_time")
}
if !d.IsNewResource() && d.HasChange("sale_cycle") {
update = true
request["PeriodUnit"] = d.Get("sale_cycle")
}
if update {
action := "RenewDedicatedHosts"
_, err := client.DoTeaRequest("POST", "Ecs", "2014-05-26", action, "", nil, nil, request)
if err != nil {
return err
}
stateConf := BuildStateConf([]string{}, []string{"Available"}, d.Timeout(schema.TimeoutUpdate), 5*time.Second, ecsService.EcsDedicatedHostStateRefreshFunc(d.Id(), []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return errmsgs.WrapErrorf(err, errmsgs.IdMsg, d.Id())
}
//d.SetPartial("expired_time")
//d.SetPartial("sale_cycle")
}
update = false
modifyDedicatedHostsChargeTypeReq := map[string]interface{}{
"DedicatedHostIds": convertListToJsonString(convertListStringToListInterface([]string{d.Id()})),
"AutoPay": true,
"Period": d.Get("expired_time"),
}
if !d.IsNewResource() && d.HasChange("payment_type") {
update = true
modifyDedicatedHostsChargeTypeReq["DedicatedHostChargeType"] = d.Get("payment_type")
}
modifyDedicatedHostsChargeTypeReq["PeriodUnit"] = d.Get("sale_cycle")
if update {
if _, ok := d.GetOkExists("detail_fee"); ok {
modifyDedicatedHostsChargeTypeReq["DetailFee"] = d.Get("detail_fee")
}
if _, ok := d.GetOkExists("dry_run"); ok {
modifyDedicatedHostsChargeTypeReq["DryRun"] = d.Get("dry_run")
}
action := "ModifyDedicatedHostsChargeType"
_, err := client.DoTeaRequest("POST", "Ecs", "2014-05-26", action, "", nil, nil, modifyDedicatedHostsChargeTypeReq)
if err != nil {
return err
}
stateConf := BuildStateConf([]string{}, []string{"Available"}, d.Timeout(schema.TimeoutUpdate), 10*time.Second, ecsService.EcsDedicatedHostStateRefreshFunc(d.Id(), []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return errmsgs.WrapErrorf(err, errmsgs.IdMsg, d.Id())
}
// d.SetPartial("detail_fee")
// d.SetPartial("dry_run")
// d.SetPartial("expired_time")
// d.SetPartial("payment_type")
// d.SetPartial("sale_cycle")
}
update = false
modifyDedicatedHostAttributeReq := map[string]interface{}{
"DedicatedHostId": d.Id(),
}
if !d.IsNewResource() && d.HasChange("action_on_maintenance") {
update = true
modifyDedicatedHostAttributeReq["ActionOnMaintenance"] = d.Get("action_on_maintenance")
}
if !d.IsNewResource() && d.HasChange("auto_placement") {
update = true
modifyDedicatedHostAttributeReq["AutoPlacement"] = d.Get("auto_placement")
}
if !d.IsNewResource() && d.HasChange("cpu_over_commit_ratio") {
update = true
modifyDedicatedHostAttributeReq["CpuOverCommitRatio"] = d.Get("cpu_over_commit_ratio")
}
if !d.IsNewResource() && d.HasChange("dedicated_host_name") {
update = true
modifyDedicatedHostAttributeReq["DedicatedHostName"] = d.Get("dedicated_host_name")
}
if !d.IsNewResource() && d.HasChange("description") {
update = true
modifyDedicatedHostAttributeReq["Description"] = d.Get("description")
}
if !d.IsNewResource() && d.HasChange("network_attributes") {
update = true
if d.Get("network_attributes") != nil {
networkAttributesMap := make(map[string]interface{})
for _, networkAttributes := range d.Get("network_attributes").(*schema.Set).List() {
networkAttributesArg := networkAttributes.(map[string]interface{})
networkAttributesMap["SlbUdpTimeout"] = requests.NewInteger(networkAttributesArg["slb_udp_timeout"].(int))
networkAttributesMap["UdpTimeout"] = requests.NewInteger(networkAttributesArg["udp_timeout"].(int))
}
modifyDedicatedHostAttributeReq["NetworkAttributes"] = networkAttributesMap
}
}
if update {
if _, ok := d.GetOk("dedicated_host_cluster_id"); ok {
modifyDedicatedHostAttributeReq["DedicatedHostClusterId"] = d.Get("dedicated_host_cluster_id")
}
action := "ModifyDedicatedHostAttribute"
_, err := client.DoTeaRequest("POST", "Ecs", "2014-05-26", action, "", nil, nil, modifyDedicatedHostAttributeReq)
if err != nil {
return err
}
stateConf := BuildStateConf([]string{}, []string{"Available"}, d.Timeout(schema.TimeoutUpdate), 5*time.Second, ecsService.EcsDedicatedHostStateRefreshFunc(d.Id(), []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return errmsgs.WrapErrorf(err, errmsgs.IdMsg, d.Id())
}
// d.SetPartial("action_on_maintenance")
// d.SetPartial("auto_placement")
// d.SetPartial("cpu_over_commit_ratio")
// d.SetPartial("dedicated_host_cluster_id")
// d.SetPartial("dedicated_host_name")
// d.SetPartial("description")
// d.SetPartial("network_attributes")
}
d.Partial(false)
return nil
}
func resourceAlibabacloudStackEcsDedicatedHostDelete(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
action := "ReleaseDedicatedHost"
request := map[string]interface{}{
"DedicatedHostId": d.Id(),
}
_, err := client.DoTeaRequest("POST", "Ecs", "2014-05-26", action, "", nil, nil, request)
if err != nil {
return err
}
return nil
}