alicloud/service_alicloud_ens_v2.go (948 lines of code) (raw):

package alicloud import ( "fmt" "strings" "time" "github.com/PaesslerAG/jsonpath" "github.com/aliyun/terraform-provider-alicloud/alicloud/connectivity" "github.com/blues/jsonata-go" "github.com/hashicorp/terraform-plugin-sdk/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" ) type EnsServiceV2 struct { client *connectivity.AliyunClient } // DescribeEnsInstance <<< Encapsulated get interface for Ens Instance. func (s *EnsServiceV2) DescribeEnsInstance(id string) (object map[string]interface{}, err error) { client := s.client var request map[string]interface{} var response map[string]interface{} var query map[string]interface{} action := "DescribeInstances" request = make(map[string]interface{}) query = make(map[string]interface{}) query["InstanceId"] = id wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(1*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Ens", "2017-11-10", action, query, request, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } addDebug(action, response, request) return nil }) if err != nil { addDebug(action, response, request) return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$.Instances.Instance[*]", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.Instances.Instance[*]", response) } if len(v.([]interface{})) == 0 { return object, WrapErrorf(NotFoundErr("Instance", id), NotFoundMsg, response) } return v.([]interface{})[0].(map[string]interface{}), nil } func (s *EnsServiceV2) DescribeListTagResources(id string) (object map[string]interface{}, err error) { client := s.client var request map[string]interface{} var response map[string]interface{} var query map[string]interface{} action := "ListTagResources" request = make(map[string]interface{}) query = make(map[string]interface{}) request["ResourceId.1"] = id request["ResourceType"] = "instance" wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(1*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Ens", "2017-11-10", action, query, request, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } addDebug(action, response, request) return nil }) if err != nil { addDebug(action, response, request) return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } return response, nil } func (s *EnsServiceV2) EnsInstanceStateRefreshFunc(id string, field string, failStates []string) resource.StateRefreshFunc { return func() (interface{}, string, error) { object, err := s.DescribeEnsInstance(id) if err != nil { if NotFoundError(err) { return nil, "", nil } return nil, "", WrapError(err) } v, err := jsonpath.Get(field, object) currentStatus := fmt.Sprint(v) if field == "$.SystemDisk.Size" { e := jsonata.MustCompile("$.SystemDisk.Size/1024") v, _ = e.Eval(object) currentStatus = fmt.Sprint(v) } if field == "InstanceResourceType" { currentStatus = fmt.Sprint(convertEnsInstanceInstancesInstanceInstanceResourceTypeResponse(v)) } for _, failState := range failStates { if currentStatus == failState { return object, currentStatus, WrapError(Error(FailedToReachTargetStatus, currentStatus)) } } return object, currentStatus, nil } } // DescribeEnsInstance >>> Encapsulated. // DescribeEnsDisk <<< Encapsulated get interface for Ens Disk. func (s *EnsServiceV2) DescribeEnsDisk(id string) (object map[string]interface{}, err error) { client := s.client var request map[string]interface{} var response map[string]interface{} var query map[string]interface{} request = make(map[string]interface{}) query = make(map[string]interface{}) request["DiskId"] = id action := "DescribeDisks" wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(1*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Ens", "2017-11-10", action, query, request, 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 object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$.Disks.Disks[*]", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.Disks.Disks[*]", response) } if len(v.([]interface{})) == 0 { return object, WrapErrorf(NotFoundErr("Disk", id), NotFoundMsg, response) } return v.([]interface{})[0].(map[string]interface{}), nil } func (s *EnsServiceV2) DescribeDiskListTagResources(id string) (object map[string]interface{}, err error) { client := s.client var request map[string]interface{} var response map[string]interface{} var query map[string]interface{} request = make(map[string]interface{}) query = make(map[string]interface{}) request["ResourceId.1"] = id request["ResourceType"] = "disk" action := "ListTagResources" wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(1*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Ens", "2017-11-10", action, query, request, 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 object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } return response, nil } func (s *EnsServiceV2) EnsDiskStateRefreshFunc(id string, field string, failStates []string) resource.StateRefreshFunc { return func() (interface{}, string, error) { object, err := s.DescribeEnsDisk(id) if err != nil { if NotFoundError(err) { return nil, "", nil } return nil, "", WrapError(err) } v, err := jsonpath.Get(field, object) currentStatus := fmt.Sprint(v) if field == "$.Size" { e := jsonata.MustCompile("$number($.Size & '') / 1024") v, _ = e.Eval(object) currentStatus = fmt.Sprint(v) } if strings.HasPrefix(field, "#") { v, _ := jsonpath.Get(strings.TrimPrefix(field, "#"), object) if v != nil { currentStatus = "#CHECKSET" } } for _, failState := range failStates { if currentStatus == failState { return object, currentStatus, WrapError(Error(FailedToReachTargetStatus, currentStatus)) } } return object, currentStatus, nil } } // DescribeEnsDisk >>> Encapsulated. // DescribeEnsSnapshot <<< Encapsulated get interface for Ens Snapshot. func (s *EnsServiceV2) DescribeEnsSnapshot(id string) (object map[string]interface{}, err error) { client := s.client var request map[string]interface{} var response map[string]interface{} var query map[string]interface{} action := "DescribeSnapshots" request = make(map[string]interface{}) query = make(map[string]interface{}) query["SnapshotId"] = id wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(1*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Ens", "2017-11-10", action, query, request, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } addDebug(action, response, request) return nil }) if err != nil { return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$.Snapshots[*]", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.Snapshots[*]", response) } if len(v.([]interface{})) == 0 { return object, WrapErrorf(NotFoundErr("Snapshot", id), NotFoundMsg, response) } return v.([]interface{})[0].(map[string]interface{}), nil } func (s *EnsServiceV2) EnsSnapshotStateRefreshFunc(id string, field string, failStates []string) resource.StateRefreshFunc { return func() (interface{}, string, error) { object, err := s.DescribeEnsSnapshot(id) if err != nil { if NotFoundError(err) { return nil, "", nil } return nil, "", WrapError(err) } v, err := jsonpath.Get(field, object) currentStatus := fmt.Sprint(v) for _, failState := range failStates { if currentStatus == failState { return object, currentStatus, WrapError(Error(FailedToReachTargetStatus, currentStatus)) } } return object, currentStatus, nil } } // DescribeEnsSnapshot >>> Encapsulated. // DescribeEnsNetwork <<< Encapsulated get interface for Ens Network. func (s *EnsServiceV2) DescribeEnsNetwork(id string) (object map[string]interface{}, err error) { client := s.client var request map[string]interface{} var response map[string]interface{} var query map[string]interface{} action := "DescribeNetworks" request = make(map[string]interface{}) query = make(map[string]interface{}) query["NetworkId"] = id wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(1*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Ens", "2017-11-10", action, query, request, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } addDebug(action, response, request) return nil }) if err != nil { return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$.Networks.Network[*]", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.Networks.Network[*]", response) } if len(v.([]interface{})) == 0 { return object, WrapErrorf(NotFoundErr("Network", id), NotFoundMsg, response) } return v.([]interface{})[0].(map[string]interface{}), nil } func (s *EnsServiceV2) EnsNetworkStateRefreshFunc(id string, field string, failStates []string) resource.StateRefreshFunc { return func() (interface{}, string, error) { object, err := s.DescribeEnsNetwork(id) if err != nil { if NotFoundError(err) { return nil, "", nil } return nil, "", WrapError(err) } v, err := jsonpath.Get(field, object) currentStatus := fmt.Sprint(v) for _, failState := range failStates { if currentStatus == failState { return object, currentStatus, WrapError(Error(FailedToReachTargetStatus, currentStatus)) } } return object, currentStatus, nil } } // DescribeEnsNetwork >>> Encapsulated. // DescribeEnsEip <<< Encapsulated get interface for Ens Eip. func (s *EnsServiceV2) DescribeEnsEip(id string) (object map[string]interface{}, err error) { client := s.client var request map[string]interface{} var response map[string]interface{} var query map[string]interface{} request = make(map[string]interface{}) query = make(map[string]interface{}) request["AllocationId"] = id action := "DescribeEnsEipAddresses" wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(1*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Ens", "2017-11-10", action, query, request, 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 object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$.EipAddresses.EipAddress[*]", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.EipAddresses.EipAddress[*]", response) } if len(v.([]interface{})) == 0 { return object, WrapErrorf(NotFoundErr("Eip", id), NotFoundMsg, response) } return v.([]interface{})[0].(map[string]interface{}), nil } func (s *EnsServiceV2) EnsEipStateRefreshFunc(id string, field string, failStates []string) resource.StateRefreshFunc { return func() (interface{}, string, error) { object, err := s.DescribeEnsEip(id) if err != nil { if NotFoundError(err) { return nil, "", nil } return nil, "", WrapError(err) } v, err := jsonpath.Get(field, object) currentStatus := fmt.Sprint(v) if strings.HasPrefix(field, "#") { v, _ := jsonpath.Get(strings.TrimPrefix(field, "#"), object) if v != nil { currentStatus = "#CHECKSET" } } for _, failState := range failStates { if currentStatus == failState { return object, currentStatus, WrapError(Error(FailedToReachTargetStatus, currentStatus)) } } return object, currentStatus, nil } } // DescribeEnsEip >>> Encapsulated. // DescribeEnsLoadBalancer <<< Encapsulated get interface for Ens LoadBalancer. func (s *EnsServiceV2) DescribeEnsLoadBalancer(id string) (object map[string]interface{}, err error) { client := s.client var request map[string]interface{} var response map[string]interface{} var query map[string]interface{} action := "DescribeLoadBalancerAttribute" request = make(map[string]interface{}) query = make(map[string]interface{}) query["LoadBalancerId"] = id wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(1*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Ens", "2017-11-10", action, query, request, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } addDebug(action, response, request) return nil }) if err != nil { addDebug(action, response, request) return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } currentStatus := response["LoadBalancerId"] if currentStatus == nil { return object, WrapErrorf(NotFoundErr("LoadBalancer", id), NotFoundMsg, response) } return response, nil } func (s *EnsServiceV2) EnsLoadBalancerStateRefreshFunc(id string, field string, failStates []string) resource.StateRefreshFunc { return func() (interface{}, string, error) { object, err := s.DescribeEnsLoadBalancer(id) if err != nil { if NotFoundError(err) { return nil, "", nil } return nil, "", WrapError(err) } v, err := jsonpath.Get(field, object) currentStatus := fmt.Sprint(v) for _, failState := range failStates { if currentStatus == failState { return object, currentStatus, WrapError(Error(FailedToReachTargetStatus, currentStatus)) } } return object, currentStatus, nil } } // DescribeEnsLoadBalancer >>> Encapsulated. // DescribeEnsVswitch <<< Encapsulated get interface for Ens Vswitch. func (s *EnsServiceV2) DescribeEnsVswitch(id string) (object map[string]interface{}, err error) { client := s.client var request map[string]interface{} var response map[string]interface{} var query map[string]interface{} request = make(map[string]interface{}) query = make(map[string]interface{}) request["VSwitchId"] = id action := "DescribeVSwitchAttributes" wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(1*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Ens", "2017-11-10", action, query, request, 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 { if IsExpectedErrors(err, []string{"InvalidVSwitchId.NotFound"}) { return object, WrapErrorf(NotFoundErr("Vswitch", id), NotFoundMsg, response) } return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } return response, nil } func (s *EnsServiceV2) EnsVswitchStateRefreshFunc(id string, field string, failStates []string) resource.StateRefreshFunc { return func() (interface{}, string, error) { object, err := s.DescribeEnsVswitch(id) if err != nil { if NotFoundError(err) { return nil, "", nil } return nil, "", WrapError(err) } v, err := jsonpath.Get(field, object) currentStatus := fmt.Sprint(v) if strings.HasPrefix(field, "#") { v, _ := jsonpath.Get(strings.TrimPrefix(field, "#"), object) if v != nil { currentStatus = "#CHECKSET" } } for _, failState := range failStates { if currentStatus == failState { return object, currentStatus, WrapError(Error(FailedToReachTargetStatus, currentStatus)) } } return object, currentStatus, nil } } // DescribeEnsVswitch >>> Encapsulated. // DescribeEnsSecurityGroup <<< Encapsulated get interface for Ens SecurityGroup. func (s *EnsServiceV2) DescribeEnsSecurityGroup(id string) (object map[string]interface{}, err error) { client := s.client var request map[string]interface{} var response map[string]interface{} var query map[string]interface{} action := "DescribeSecurityGroupAttribute" request = make(map[string]interface{}) query = make(map[string]interface{}) query["SecurityGroupId"] = id wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(1*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Ens", "2017-11-10", action, query, request, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } addDebug(action, response, request) return nil }) if err != nil { if IsExpectedErrors(err, []string{"ens.interface.error"}) { return object, WrapErrorf(NotFoundErr("SecurityGroup", id), NotFoundMsg, response) } return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } return response, nil } func (s *EnsServiceV2) EnsSecurityGroupStateRefreshFunc(id string, field string, failStates []string) resource.StateRefreshFunc { return func() (interface{}, string, error) { object, err := s.DescribeEnsSecurityGroup(id) if err != nil { if NotFoundError(err) { return nil, "", nil } return nil, "", WrapError(err) } v, err := jsonpath.Get(field, object) currentStatus := fmt.Sprint(v) for _, failState := range failStates { if currentStatus == failState { return object, currentStatus, WrapError(Error(FailedToReachTargetStatus, currentStatus)) } } return object, currentStatus, nil } } // DescribeEnsSecurityGroup >>> Encapsulated. // DescribeEnsImage <<< Encapsulated get interface for Ens Image. func (s *EnsServiceV2) DescribeEnsImage(id string) (object map[string]interface{}, err error) { client := s.client var request map[string]interface{} var response map[string]interface{} var query map[string]interface{} request = make(map[string]interface{}) query = make(map[string]interface{}) request["ImageId"] = id action := "DescribeSelfImages" wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(1*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Ens", "2017-11-10", action, query, request, 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 object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$.Images.Image[*]", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.Images.Image[*]", response) } if len(v.([]interface{})) == 0 { return object, WrapErrorf(NotFoundErr("Image", id), NotFoundMsg, response) } return v.([]interface{})[0].(map[string]interface{}), nil } func (s *EnsServiceV2) EnsImageStateRefreshFunc(id string, field string, failStates []string) resource.StateRefreshFunc { return func() (interface{}, string, error) { object, err := s.DescribeEnsImage(id) if err != nil { if NotFoundError(err) { return nil, "", nil } return nil, "", WrapError(err) } v, err := jsonpath.Get(field, object) currentStatus := fmt.Sprint(v) if strings.HasPrefix(field, "#") { v, _ := jsonpath.Get(strings.TrimPrefix(field, "#"), object) if v != nil { currentStatus = "#CHECKSET" } } for _, failState := range failStates { if currentStatus == failState { return object, currentStatus, WrapError(Error(FailedToReachTargetStatus, currentStatus)) } } return object, currentStatus, nil } } // DescribeEnsImage >>> Encapsulated. // DescribeEnsDiskInstanceAttachment <<< Encapsulated get interface for Ens DiskInstanceAttachment. func (s *EnsServiceV2) DescribeEnsDiskInstanceAttachment(id string) (object map[string]interface{}, err error) { client := s.client var request map[string]interface{} var response map[string]interface{} var query map[string]interface{} parts := strings.Split(id, ":") if len(parts) != 2 { err = WrapError(fmt.Errorf("invalid Resource Id %s. Expected parts' length %d, got %d", id, 2, len(parts))) } action := "DescribeDisks" request = make(map[string]interface{}) query = make(map[string]interface{}) query["DiskId"] = parts[0] query["InstanceId"] = parts[1] wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(1*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Ens", "2017-11-10", action, query, request, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } addDebug(action, response, request) return nil }) if err != nil { addDebug(action, response, request) return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$.Disks.Disks[*]", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.Disks.Disks[*]", response) } if len(v.([]interface{})) == 0 { return object, WrapErrorf(NotFoundErr("DiskInstanceAttachment", id), NotFoundMsg, response) } return v.([]interface{})[0].(map[string]interface{}), nil } func (s *EnsServiceV2) EnsDiskInstanceAttachmentStateRefreshFunc(id string, field string, failStates []string) resource.StateRefreshFunc { return func() (interface{}, string, error) { object, err := s.DescribeEnsDiskInstanceAttachment(id) if err != nil { if NotFoundError(err) { return nil, "", nil } return nil, "", WrapError(err) } v, err := jsonpath.Get(field, object) currentStatus := fmt.Sprint(v) for _, failState := range failStates { if currentStatus == failState { return object, currentStatus, WrapError(Error(FailedToReachTargetStatus, currentStatus)) } } return object, currentStatus, nil } } // DescribeEnsDiskInstanceAttachment >>> Encapsulated. // DescribeEnsInstanceSecurityGroupAttachment <<< Encapsulated get interface for Ens InstanceSecurityGroupAttachment. func (s *EnsServiceV2) DescribeEnsInstanceSecurityGroupAttachment(id string) (object map[string]interface{}, err error) { client := s.client var request map[string]interface{} var response map[string]interface{} var query map[string]interface{} parts := strings.Split(id, ":") if len(parts) != 2 { err = WrapError(fmt.Errorf("invalid Resource Id %s. Expected parts' length %d, got %d", id, 2, len(parts))) } action := "DescribeInstances" request = make(map[string]interface{}) query = make(map[string]interface{}) query["InstanceId"] = parts[0] query["SecurityGroupId"] = parts[1] wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(1*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Ens", "2017-11-10", action, query, request, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } addDebug(action, response, request) return nil }) if err != nil { addDebug(action, response, request) return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$.Instances.Instance[*]", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.Instances.Instance[*]", response) } if len(v.([]interface{})) == 0 { return object, WrapErrorf(NotFoundErr("InstanceSecurityGroupAttachment", id), NotFoundMsg, response) } return v.([]interface{})[0].(map[string]interface{}), nil } func (s *EnsServiceV2) EnsInstanceSecurityGroupAttachmentStateRefreshFunc(id string, field string, failStates []string) resource.StateRefreshFunc { return func() (interface{}, string, error) { object, err := s.DescribeEnsInstanceSecurityGroupAttachment(id) if err != nil { if NotFoundError(err) { return nil, "", nil } return nil, "", WrapError(err) } v, err := jsonpath.Get(field, object) currentStatus := fmt.Sprint(v) for _, failState := range failStates { if currentStatus == failState { return object, currentStatus, WrapError(Error(FailedToReachTargetStatus, currentStatus)) } } return object, currentStatus, nil } } // DescribeEnsInstanceSecurityGroupAttachment >>> Encapsulated. // DescribeEnsEipInstanceAttachment <<< Encapsulated get interface for Ens EipInstanceAttachment. func (s *EnsServiceV2) DescribeEnsEipInstanceAttachment(id string) (object map[string]interface{}, err error) { client := s.client var request map[string]interface{} var response map[string]interface{} var query map[string]interface{} parts := strings.Split(id, ":") if len(parts) != 3 { err = WrapError(fmt.Errorf("invalid Resource Id %s. Expected parts' length %d, got %d", id, 3, len(parts))) } action := "DescribeEnsEipAddresses" request = make(map[string]interface{}) query = make(map[string]interface{}) query["AllocationId"] = parts[0] query["AssociatedInstanceId"] = parts[1] wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(1*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Ens", "2017-11-10", action, query, request, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } addDebug(action, response, request) return nil }) if err != nil { addDebug(action, response, request) return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$.EipAddresses.EipAddress[*]", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.EipAddresses.EipAddress[*]", response) } if len(v.([]interface{})) == 0 { return object, WrapErrorf(NotFoundErr("EipInstanceAttachment", id), NotFoundMsg, response) } result, _ := v.([]interface{}) for _, v := range result { item := v.(map[string]interface{}) if item["AllocationId"] != parts[0] { continue } if item["InstanceId"] != parts[1] { continue } if item["InstanceType"] != parts[2] { continue } return item, nil } return object, WrapErrorf(NotFoundErr("EipInstanceAttachment", id), NotFoundMsg, response) } func (s *EnsServiceV2) EnsEipInstanceAttachmentStateRefreshFunc(id string, field string, failStates []string) resource.StateRefreshFunc { return func() (interface{}, string, error) { object, err := s.DescribeEnsEipInstanceAttachment(id) if err != nil { if NotFoundError(err) { return nil, "", nil } return nil, "", WrapError(err) } v, err := jsonpath.Get(field, object) currentStatus := fmt.Sprint(v) for _, failState := range failStates { if currentStatus == failState { return object, currentStatus, WrapError(Error(FailedToReachTargetStatus, currentStatus)) } } return object, currentStatus, nil } } // DescribeEnsEipInstanceAttachment >>> Encapsulated. // DescribeEnsNatGateway <<< Encapsulated get interface for Ens NatGateway. func (s *EnsServiceV2) DescribeEnsNatGateway(id string) (object map[string]interface{}, err error) { client := s.client var request map[string]interface{} var response map[string]interface{} var query map[string]interface{} action := "DescribeNatGateways" request = make(map[string]interface{}) query = make(map[string]interface{}) query["NatGatewayId"] = id wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(1*time.Minute, func() *resource.RetryError { response, err = client.RpcGet("Ens", "2017-11-10", action, query, request) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } addDebug(action, response, request) return nil }) if err != nil { addDebug(action, response, request) return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$.NatGateways[*]", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.NatGateways[*]", response) } if len(v.([]interface{})) == 0 { return object, WrapErrorf(NotFoundErr("NatGateway", id), NotFoundMsg, response) } return v.([]interface{})[0].(map[string]interface{}), nil } func (s *EnsServiceV2) EnsNatGatewayStateRefreshFunc(id string, field string, failStates []string) resource.StateRefreshFunc { return func() (interface{}, string, error) { object, err := s.DescribeEnsNatGateway(id) if err != nil { if NotFoundError(err) { return object, "", nil } return nil, "", WrapError(err) } v, err := jsonpath.Get(field, object) currentStatus := fmt.Sprint(v) for _, failState := range failStates { if currentStatus == failState { return object, currentStatus, WrapError(Error(FailedToReachTargetStatus, currentStatus)) } } return object, currentStatus, nil } } // DescribeEnsNatGateway >>> Encapsulated. // DescribeEnsKeyPair <<< Encapsulated get interface for Ens KeyPair. func (s *EnsServiceV2) DescribeEnsKeyPair(id string) (object map[string]interface{}, err error) { client := s.client var request map[string]interface{} var response map[string]interface{} var query map[string]interface{} action := "DescribeKeyPairs" request = make(map[string]interface{}) query = make(map[string]interface{}) query["KeyPairId"] = id wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(1*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Ens", "2017-11-10", action, query, request, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } addDebug(action, response, request) return nil }) if err != nil { addDebug(action, response, request) return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$.KeyPairs.KeyPair[*]", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.KeyPairs.KeyPair[*]", response) } if len(v.([]interface{})) == 0 { return object, WrapErrorf(NotFoundErr("KeyPair", id), NotFoundMsg, response) } return v.([]interface{})[0].(map[string]interface{}), nil } func (s *EnsServiceV2) EnsKeyPairStateRefreshFunc(id string, field string, failStates []string) resource.StateRefreshFunc { return func() (interface{}, string, error) { object, err := s.DescribeEnsKeyPair(id) if err != nil { if NotFoundError(err) { return object, "", nil } return nil, "", WrapError(err) } v, err := jsonpath.Get(field, object) currentStatus := fmt.Sprint(v) for _, failState := range failStates { if currentStatus == failState { return object, currentStatus, WrapError(Error(FailedToReachTargetStatus, currentStatus)) } } return object, currentStatus, nil } } // DescribeEnsKeyPair >>> Encapsulated. // SetResourceTags <<< Encapsulated tag function for Ens. func (s *EnsServiceV2) SetResourceTags(d *schema.ResourceData, resourceType string) error { if d.HasChange("tags") { var action string var err error client := s.client var request map[string]interface{} var response map[string]interface{} query := make(map[string]interface{}) added, removed := parsingTags(d) removedTagKeys := make([]string, 0) for _, v := range removed { if !ignoredTags(v, "") { removedTagKeys = append(removedTagKeys, v) } } if len(removedTagKeys) > 0 { action = "UntagResources" request = make(map[string]interface{}) query = make(map[string]interface{}) request["ResourceId.1"] = d.Id() request["ResourceType"] = resourceType for i, key := range removedTagKeys { request[fmt.Sprintf("TagKey.%d", i+1)] = key } wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError { response, err = client.RpcPost("Ens", "2017-11-10", action, query, request, 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) } } if len(added) > 0 { action = "TagResources" request = make(map[string]interface{}) query = make(map[string]interface{}) request["ResourceId.1"] = d.Id() request["ResourceType"] = resourceType count := 1 for key, value := range added { request[fmt.Sprintf("Tag.%d.Key", count)] = key request[fmt.Sprintf("Tag.%d.Value", count)] = value count++ } wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError { response, err = client.RpcPost("Ens", "2017-11-10", action, query, request, 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 nil } // SetResourceTags >>> tag function encapsulated.