alicloud/service_alicloud_vpc.go (2,007 lines of code) (raw):
package alicloud
import (
"strings"
"time"
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
"fmt"
"github.com/PaesslerAG/jsonpath"
"github.com/aliyun/alibaba-cloud-sdk-go/services/vpc"
"github.com/aliyun/terraform-provider-alicloud/alicloud/connectivity"
)
type VpcService struct {
client *connectivity.AliyunClient
}
func (s *VpcService) DescribeNatGateway(id string) (object map[string]interface{}, err error) {
var response map[string]interface{}
client := s.client
action := "DescribeNatGateways"
request := map[string]interface{}{
"RegionId": s.client.RegionId,
"NatGatewayId": id,
}
response, err = client.RpcPost("Vpc", "2016-04-28", action, nil, request, true)
if err != nil {
if IsExpectedErrors(err, []string{"InvalidNatGatewayId.NotFound", "InvalidRegionId.NotFound"}) {
err = WrapErrorf(NotFoundErr("NatGateway", id), NotFoundMsg, ProviderERROR)
return object, err
}
err = WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR)
return object, err
}
addDebug(action, response, request)
v, err := jsonpath.Get("$.NatGateways.NatGateway", response)
if err != nil {
return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.NatGateways.NatGateway", response)
}
if len(v.([]interface{})) < 1 {
return object, WrapErrorf(NotFoundErr("VPC", id), NotFoundWithResponse, response)
} else {
if v.([]interface{})[0].(map[string]interface{})["NatGatewayId"].(string) != id {
return object, WrapErrorf(NotFoundErr("VPC", id), NotFoundWithResponse, response)
}
}
object = v.([]interface{})[0].(map[string]interface{})
return object, nil
}
func (s *VpcService) DescribeVpc(id string) (object map[string]interface{}, err error) {
var response map[string]interface{}
client := s.client
action := "DescribeVpcs"
request := map[string]interface{}{
"RegionId": s.client.RegionId,
"VpcId": id,
}
response, err = client.RpcPost("Vpc", "2016-04-28", action, nil, request, true)
if err != nil {
if IsExpectedErrors(err, []string{"Forbidden.VpcNotFound", "InvalidVpcID.NotFound"}) {
err = WrapErrorf(NotFoundErr("Vpc", id), NotFoundMsg, ProviderERROR)
return object, err
}
err = WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR)
return object, err
}
addDebug(action, response, request)
v, err := jsonpath.Get("$.Vpcs.Vpc", response)
if err != nil {
return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.Vpcs.Vpc", response)
}
if len(v.([]interface{})) < 1 {
return object, WrapErrorf(NotFoundErr("VPC", id), NotFoundWithResponse, response)
} else {
if v.([]interface{})[0].(map[string]interface{})["VpcId"].(string) != id {
return object, WrapErrorf(NotFoundErr("VPC", id), NotFoundWithResponse, response)
}
}
object = v.([]interface{})[0].(map[string]interface{})
return object, nil
}
func (s *VpcService) ListTagResources(id string, resourceType string) (object interface{}, err error) {
client := s.client
action := "ListTagResources"
request := map[string]interface{}{
"RegionId": s.client.RegionId,
"ResourceType": resourceType,
"ResourceId.1": id,
}
tags := make([]interface{}, 0)
var response map[string]interface{}
for {
wait := incrementalWait(3*time.Second, 5*time.Second)
err = resource.Retry(5*time.Minute, func() *resource.RetryError {
response, err := client.RpcPost("Vpc", "2016-04-28", action, nil, request, true)
if err != nil {
if NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
addDebug(action, response, request)
v, err := jsonpath.Get("$.TagResources.TagResource", response)
if err != nil {
return resource.NonRetryableError(WrapErrorf(err, FailedGetAttributeMsg, id, "$.TagResources.TagResource", response))
}
if v != nil {
tags = append(tags, v.([]interface{})...)
}
return nil
})
if err != nil {
err = WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR)
return
}
if response["NextToken"] == nil {
break
}
request["NextToken"] = response["NextToken"]
}
return tags, nil
}
func (s *VpcService) DescribeVSwitch(id string) (v vpc.DescribeVSwitchAttributesResponse, err error) {
request := vpc.CreateDescribeVSwitchAttributesRequest()
request.RegionId = s.client.RegionId
request.VSwitchId = id
invoker := NewInvoker()
err = invoker.Run(func() error {
raw, err := s.client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) {
return vpcClient.DescribeVSwitchAttributes(request)
})
if err != nil {
if IsExpectedErrors(err, []string{"InvalidVswitchID.NotFound"}) {
return WrapErrorf(err, NotFoundMsg, AlibabaCloudSdkGoERROR)
}
return WrapErrorf(err, DefaultErrorMsg, id, request.GetActionName(), AlibabaCloudSdkGoERROR)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
response, _ := raw.(*vpc.DescribeVSwitchAttributesResponse)
if response.VSwitchId != id {
return WrapErrorf(NotFoundErr("vswitch", id), NotFoundMsg, ProviderERROR)
}
v = *response
return nil
})
return
}
func (s *VpcService) DescribeVSwitchWithTeadsl(id string) (object map[string]interface{}, err error) {
client := s.client
action := "DescribeVSwitchAttributes"
request := map[string]interface{}{
"RegionId": s.client.RegionId,
"VSwitchId": id,
}
response, err := client.RpcPost("Vpc", "2016-04-28", action, nil, request, true)
if err != nil {
if IsExpectedErrors(err, []string{"InvalidVswitchID.NotFound"}) {
return nil, WrapErrorf(err, NotFoundMsg, AlibabaCloudSdkGoERROR)
}
return nil, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR)
}
addDebug(action, response, request)
if v, ok := response["VSwitchId"].(string); ok && v != id {
return nil, WrapErrorf(NotFoundErr("vswitch", id), NotFoundMsg, ProviderERROR)
}
return response, nil
}
func (s *VpcService) DescribeForwardEntry(id string) (object map[string]interface{}, err error) {
var response map[string]interface{}
client := s.client
action := "DescribeForwardTableEntries"
parts, err := ParseResourceId(id, 2)
if err != nil {
err = WrapError(err)
return
}
request := map[string]interface{}{
"RegionId": s.client.RegionId,
"ForwardEntryId": parts[1],
"ForwardTableId": parts[0],
}
response, err = client.RpcPost("Vpc", "2016-04-28", action, nil, request, true)
if err != nil {
if IsExpectedErrors(err, []string{"InvalidForwardEntryId.NotFound", "InvalidForwardTableId.NotFound", "InvalidRegionId.NotFound"}) {
err = WrapErrorf(NotFoundErr("ForwardEntry", id), NotFoundMsg, ProviderERROR)
return object, err
}
err = WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR)
return object, err
}
addDebug(action, response, request)
v, err := jsonpath.Get("$.ForwardTableEntries.ForwardTableEntry", response)
if err != nil {
return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.ForwardTableEntries.ForwardTableEntry", response)
}
if len(v.([]interface{})) < 1 {
return object, WrapErrorf(NotFoundErr("VPC", id), NotFoundWithResponse, response)
} else {
if v.([]interface{})[0].(map[string]interface{})["ForwardEntryId"].(string) != parts[1] {
return object, WrapErrorf(NotFoundErr("VPC", id), NotFoundWithResponse, response)
}
}
object = v.([]interface{})[0].(map[string]interface{})
return object, nil
}
func (s *VpcService) QueryRouteTableById(routeTableId string) (rt vpc.RouteTable, err error) {
request := vpc.CreateDescribeRouteTablesRequest()
request.RegionId = s.client.RegionId
request.RouteTableId = routeTableId
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(5*time.Minute, func() *resource.RetryError {
raw, err := s.client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) {
return vpcClient.DescribeRouteTables(request)
})
if err != nil {
if NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
response, _ := raw.(*vpc.DescribeRouteTablesResponse)
if len(response.RouteTables.RouteTable) == 0 ||
response.RouteTables.RouteTable[0].RouteTableId != routeTableId {
return resource.NonRetryableError(WrapErrorf(NotFoundErr("RouteTable", routeTableId), NotFoundMsg, ProviderERROR))
}
rt = response.RouteTables.RouteTable[0]
return nil
})
return
}
func (s *VpcService) DescribeRouteEntry(id string) (*vpc.RouteEntry, error) {
v := &vpc.RouteEntry{}
var raw interface{}
parts, err := ParseResourceId(id, 5)
if err != nil {
return v, WrapError(err)
}
rtId, cidr, nexthop_type, nexthop_id := parts[0], parts[2], parts[3], parts[4]
request := vpc.CreateDescribeRouteTablesRequest()
request.RegionId = s.client.RegionId
request.RouteTableId = rtId
if strings.Contains(cidr, "_") {
cidr = strings.Replace(cidr, "_", ":", -1)
}
for {
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(5*time.Minute, func() *resource.RetryError {
response, err := s.client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) {
return vpcClient.DescribeRouteTables(request)
})
if err != nil {
if NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
raw = response
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
return nil
})
if err != nil {
return v, WrapErrorf(err, DefaultErrorMsg, id, request.GetActionName(), AlibabaCloudSdkGoERROR)
}
response, _ := raw.(*vpc.DescribeRouteTablesResponse)
if len(response.RouteTables.RouteTable) < 1 {
return v, WrapErrorf(NotFoundErr("RouteEntry", id), NotFoundWithResponse, response)
}
for _, table := range response.RouteTables.RouteTable {
for _, entry := range table.RouteEntrys.RouteEntry {
if entry.DestinationCidrBlock == cidr && entry.NextHopType == nexthop_type && entry.InstanceId == nexthop_id {
return &entry, nil
}
}
}
if len(response.RouteTables.RouteTable) < PageSizeLarge {
break
}
if page, err := getNextpageNumber(request.PageNumber); err != nil {
return v, WrapError(err)
} else {
request.PageNumber = page
}
}
return v, WrapErrorf(NotFoundErr("RouteEntry", id), NotFoundMsg, ProviderERROR)
}
func (s *VpcService) DescribeRouterInterface(id, regionId string) (ri vpc.RouterInterfaceType, err error) {
request := vpc.CreateDescribeRouterInterfacesRequest()
request.RegionId = regionId
values := []string{id}
filter := []vpc.DescribeRouterInterfacesFilter{
{
Key: "RouterInterfaceId",
Value: &values,
},
}
request.Filter = &filter
invoker := NewInvoker()
err = invoker.Run(func() error {
raw, err := s.client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) {
return vpcClient.DescribeRouterInterfaces(request)
})
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, id, request.GetActionName(), AlibabaCloudSdkGoERROR)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
response, _ := raw.(*vpc.DescribeRouterInterfacesResponse)
if len(response.RouterInterfaceSet.RouterInterfaceType) <= 0 ||
response.RouterInterfaceSet.RouterInterfaceType[0].RouterInterfaceId != id {
return WrapErrorf(NotFoundErr("RouterInterface", id), NotFoundMsg, ProviderERROR)
}
ri = response.RouterInterfaceSet.RouterInterfaceType[0]
return nil
})
return
}
func (s *VpcService) DescribeRouterInterfaceConnection(id, regionId string) (ri vpc.RouterInterfaceType, err error) {
ri, err = s.DescribeRouterInterface(id, regionId)
if err != nil {
return ri, WrapError(err)
}
if ri.OppositeInterfaceId == "" || ri.OppositeRouterType == "" ||
ri.OppositeRouterId == "" || ri.OppositeInterfaceOwnerId == "" {
return ri, WrapErrorf(NotFoundErr("RouterInterface", id), NotFoundMsg, ProviderERROR)
}
return ri, nil
}
func (s *VpcService) DescribeCenInstanceGrant(id string) (rule vpc.CbnGrantRule, err error) {
request := vpc.CreateDescribeGrantRulesToCenRequest()
parts, err := ParseResourceId(id, 3)
if err != nil {
return rule, WrapError(err)
}
cenId := parts[0]
instanceId := parts[1]
instanceType, err := GetCenChildInstanceType(instanceId)
if err != nil {
return rule, WrapError(err)
}
request.RegionId = s.client.RegionId
request.InstanceId = instanceId
request.InstanceType = instanceType
invoker := NewInvoker()
err = invoker.Run(func() error {
raw, err := s.client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) {
return vpcClient.DescribeGrantRulesToCen(request)
})
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, id, request.GetActionName(), AlibabaCloudSdkGoERROR)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
response, _ := raw.(*vpc.DescribeGrantRulesToCenResponse)
ruleList := response.CenGrantRules.CbnGrantRule
if len(ruleList) <= 0 {
return WrapErrorf(NotFoundErr("GrantRules", id), NotFoundMsg, ProviderERROR)
}
for ruleNum := 0; ruleNum <= len(response.CenGrantRules.CbnGrantRule)-1; ruleNum++ {
if ruleList[ruleNum].CenInstanceId == cenId {
rule = ruleList[ruleNum]
return nil
}
}
return WrapErrorf(NotFoundErr("GrantRules", id), NotFoundMsg, ProviderERROR)
})
return
}
func (s *VpcService) WaitForCenInstanceGrant(id string, status Status, timeout int) error {
deadline := time.Now().Add(time.Duration(timeout) * time.Second)
parts, err := ParseResourceId(id, 3)
if err != nil {
return WrapError(err)
}
instanceId := parts[1]
ownerId := parts[2]
for {
object, err := s.DescribeCenInstanceGrant(id)
if err != nil {
if NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return WrapError(err)
}
}
if object.CenInstanceId == instanceId && fmt.Sprint(object.CenOwnerId) == ownerId && status != Deleted {
break
}
if time.Now().After(deadline) {
return WrapErrorf(err, WaitTimeoutMsg, id, GetFunc(1), timeout, object.CenInstanceId, instanceId, ProviderERROR)
}
time.Sleep(DefaultIntervalShort * time.Second)
}
return nil
}
func (s *VpcService) DescribeRouteTable(id string) (object map[string]interface{}, err error) {
var response map[string]interface{}
client := s.client
action := "DescribeRouteTableList"
request := map[string]interface{}{
"RegionId": s.client.RegionId,
"RouteTableId": id,
}
response, err = client.RpcPost("Vpc", "2016-04-28", action, nil, request, true)
if err != nil {
err = WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR)
return
}
addDebug(action, response, request)
v, err := jsonpath.Get("$.RouterTableList.RouterTableListType", response)
if err != nil {
return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.RouterTableList.RouterTableListType", response)
}
if len(v.([]interface{})) < 1 {
return object, WrapErrorf(NotFoundErr("VPC", id), NotFoundWithResponse, response)
} else {
if v.([]interface{})[0].(map[string]interface{})["RouteTableId"].(string) != id {
return object, WrapErrorf(NotFoundErr("VPC", id), NotFoundWithResponse, response)
}
}
object = v.([]interface{})[0].(map[string]interface{})
return object, nil
}
func (s *VpcService) DescribeRouteTableAttachment(id string) (v map[string]interface{}, err error) {
parts, err := ParseResourceId(id, 2)
if err != nil {
return v, WrapError(err)
}
invoker := NewInvoker()
routeTableId := parts[0]
vSwitchId := parts[1]
err = invoker.Run(func() error {
object, err := s.DescribeRouteTable(routeTableId)
if err != nil {
return WrapError(err)
}
if val, ok := object["VSwitchIds"].(map[string]interface{}); ok {
if vs, ok := val["VSwitchId"]; ok {
for _, id := range vs.([]interface{}) {
if fmt.Sprint(id) == vSwitchId {
v = object
return nil
}
}
}
}
return WrapErrorf(NotFoundErr("RouteTableAttachment", id), NotFoundMsg, ProviderERROR)
})
return v, WrapError(err)
}
func (s *VpcService) WaitForRouteEntry(id string, status Status, timeout int) error {
deadline := time.Now().Add(time.Duration(timeout) * time.Second)
for {
object, err := s.DescribeRouteEntry(id)
if err != nil {
if NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return WrapError(err)
}
}
if object.Status == string(status) {
return nil
}
if time.Now().After(deadline) {
return WrapErrorf(err, WaitTimeoutMsg, id, GetFunc(1), timeout, object.Status, status, ProviderERROR)
}
time.Sleep(DefaultIntervalShort * time.Second)
}
}
func (s *VpcService) WaitForAllRouteEntriesAvailable(routeTableId string, timeout int) error {
deadline := time.Now().Add(time.Duration(timeout) * time.Second)
for {
table, err := s.QueryRouteTableById(routeTableId)
if err != nil {
return WrapError(err)
}
success := true
for _, routeEntry := range table.RouteEntrys.RouteEntry {
if routeEntry.Status != string(Available) {
success = false
break
}
}
if success {
break
}
if time.Now().After(deadline) {
return WrapErrorf(err, WaitTimeoutMsg, routeTableId, GetFunc(1), timeout, Available, Null, ProviderERROR)
}
time.Sleep(DefaultIntervalShort * time.Second)
}
return nil
}
func (s *VpcService) WaitForRouterInterface(id, regionId string, status Status, timeout int) error {
deadline := time.Now().Add(time.Duration(timeout) * time.Second)
for {
object, err := s.DescribeRouterInterface(id, regionId)
if err != nil {
if NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return WrapError(err)
}
}
if object.Status == string(status) {
return nil
}
if time.Now().After(deadline) {
return WrapErrorf(err, WaitTimeoutMsg, id, GetFunc(1), timeout, object.Status, string(status), ProviderERROR)
}
time.Sleep(DefaultIntervalShort * time.Second)
}
}
func (s *VpcService) WaitForRouterInterfaceConnection(id, regionId string, status Status, timeout int) error {
deadline := time.Now().Add(time.Duration(timeout) * time.Second)
for {
object, err := s.DescribeRouterInterfaceConnection(id, regionId)
if err != nil {
if NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return WrapError(err)
}
}
if object.Status == string(status) {
return nil
}
if time.Now().After(deadline) {
return WrapErrorf(err, WaitTimeoutMsg, id, GetFunc(1), timeout, object.Status, string(status), ProviderERROR)
}
time.Sleep(DefaultIntervalShort * time.Second)
}
}
func (s *VpcService) DeactivateRouterInterface(interfaceId string) error {
request := vpc.CreateDeactivateRouterInterfaceRequest()
request.RegionId = s.client.RegionId
request.RouterInterfaceId = interfaceId
raw, err := s.client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) {
return vpcClient.DeactivateRouterInterface(request)
})
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, "RouterInterface", request.GetActionName(), AlibabaCloudSdkGoERROR)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
return nil
}
func (s *VpcService) ActivateRouterInterface(interfaceId string) error {
request := vpc.CreateActivateRouterInterfaceRequest()
request.RegionId = s.client.RegionId
request.RouterInterfaceId = interfaceId
raw, err := s.client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) {
return vpcClient.ActivateRouterInterface(request)
})
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, "RouterInterface", request.GetActionName(), AlibabaCloudSdkGoERROR)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
return nil
}
func (s *VpcService) DescribeNetworkAcl(id string) (object map[string]interface{}, err error) {
var response map[string]interface{}
client := s.client
action := "DescribeNetworkAclAttributes"
request := map[string]interface{}{
"RegionId": s.client.RegionId,
"NetworkAclId": id,
}
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(5*time.Minute, func() *resource.RetryError {
response, err = client.RpcPost("Vpc", "2016-04-28", action, nil, 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{"InvalidNetworkAcl.NotFound"}) {
return object, WrapErrorf(NotFoundErr("VPC:NetworkAcl", id), NotFoundMsg, ProviderERROR, fmt.Sprint(response["RequestId"]))
}
return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR)
}
v, err := jsonpath.Get("$.NetworkAclAttribute", response)
if err != nil {
return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.NetworkAclAttribute", response)
}
object = v.(map[string]interface{})
return object, nil
}
func (s *VpcService) DescribeNetworkAclAttachment(id string, resource []vpc.Resource) (err error) {
invoker := NewInvoker()
return invoker.Run(func() error {
object, err := s.DescribeNetworkAcl(id)
if err != nil {
return WrapError(err)
}
resources, _ := object["Resources"].(map[string]interface{})["Resource"].([]interface{})
if len(resources) < 1 {
return WrapErrorf(NotFoundErr("Network Acl Attachment", id), NotFoundMsg, ProviderERROR)
}
success := true
for _, source := range resources {
success = false
for _, res := range resource {
item := source.(map[string]interface{})
if fmt.Sprint(item["ResourceId"]) == res.ResourceId {
success = true
}
}
if success == false {
return WrapErrorf(NotFoundErr("Network Acl Attachment", id), NotFoundMsg, ProviderERROR)
}
}
return nil
})
}
func (s *VpcService) WaitForNetworkAcl(networkAclId string, status Status, timeout int) error {
deadline := time.Now().Add(time.Duration(timeout) * time.Second)
for {
object, err := s.DescribeNetworkAcl(networkAclId)
if err != nil {
if NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return WrapError(err)
}
}
success := true
resources, _ := object["Resources"].(map[string]interface{})["Resource"].([]interface{})
// Check Acl's binding resources
for _, res := range resources {
item := res.(map[string]interface{})
if fmt.Sprint(item["Status"]) != string(BINDED) {
success = false
}
}
if fmt.Sprint(object["Status"]) == string(status) && success == true {
return nil
}
if time.Now().After(deadline) {
return WrapErrorf(err, WaitTimeoutMsg, networkAclId, GetFunc(1), timeout, fmt.Sprint(object["Status"]), string(status), ProviderERROR)
}
time.Sleep(DefaultIntervalShort * time.Second)
}
}
func (s *VpcService) WaitForNetworkAclAttachment(id string, resource []vpc.Resource, status Status, timeout int) error {
deadline := time.Now().Add(time.Duration(timeout) * time.Second)
for {
err := s.DescribeNetworkAclAttachment(id, resource)
if err != nil {
if NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return WrapError(err)
}
}
object, err := s.DescribeNetworkAcl(id)
success := true
resources, _ := object["Resources"].(map[string]interface{})["Resource"].([]interface{})
// Check Acl's binding resources
for _, res := range resources {
item := res.(map[string]interface{})
if fmt.Sprint(item["Status"]) != string(BINDED) {
success = false
}
}
if fmt.Sprint(object["Status"]) == string(status) && success == true {
return nil
}
if time.Now().After(deadline) {
return WrapErrorf(err, WaitTimeoutMsg, id, GetFunc(1), timeout, fmt.Sprint(object["Status"]), string(status), ProviderERROR)
}
time.Sleep(DefaultIntervalShort * time.Second)
}
}
func (s *VpcService) DescribeRouteTableList(id string) (object map[string]interface{}, err error) {
var response map[string]interface{}
client := s.client
action := "DescribeRouteTableList"
request := map[string]interface{}{
"RegionId": s.client.RegionId,
"VpcId": id,
"PageSize": PageSizeLarge,
"PageNumber": 1,
}
for {
wait := incrementalWait(3*time.Second, 5*time.Second)
err := resource.Retry(5*time.Minute, func() *resource.RetryError {
response, err = client.RpcPost("Vpc", "2016-04-28", action, nil, request, true)
if err != nil {
if NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
resource.NonRetryableError(err)
}
addDebug(action, response, request)
return nil
})
if err != nil {
return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR)
}
v, err := jsonpath.Get("$.RouterTableList.RouterTableListType", response)
if err != nil {
return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.RouterTableList.RouterTableListType", response)
}
result, _ := v.([]interface{})
for _, v := range result {
item := v.(map[string]interface{})
if item["RouteTableType"] == "System" {
object = item
return object, nil
}
}
if len(result) < PageSizeLarge {
break
}
request["PageNumber"] = request["PageNumber"].(int) + 1
}
return object, nil
}
func (s *VpcService) DescribeVswitch(id string) (object map[string]interface{}, err error) {
var response map[string]interface{}
client := s.client
action := "DescribeVSwitchAttributes"
request := map[string]interface{}{
"RegionId": s.client.RegionId,
"VSwitchId": id,
}
response, err = client.RpcPost("Vpc", "2016-04-28", action, nil, request, true)
if err != nil {
if IsExpectedErrors(err, []string{"InvalidVSwitchId.NotFound", "InvalidVswitchID.NotFound"}) {
err = WrapErrorf(NotFoundErr("Vswitch", id), NotFoundWithError, err)
return object, err
}
err = WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR)
return object, err
}
addDebug(action, response, request)
v, err := jsonpath.Get("$", response)
if err != nil {
return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$", response)
}
object = v.(map[string]interface{})
if fmt.Sprint(object["VSwitchId"]) != id {
return object, WrapErrorf(NotFoundErr("vswitch", id), NotFoundWithResponse, response)
}
return object, nil
}
func (s *VpcService) ForwardEntryStateRefreshFunc(id string, failStates []string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
object, err := s.DescribeForwardEntry(id)
if err != nil {
if NotFoundError(err) {
// Set this to nil as if we didn't find anything.
return nil, "", nil
}
return nil, "", WrapError(err)
}
for _, failState := range failStates {
if object["Status"].(string) == failState {
return object, object["Status"].(string), WrapError(Error(FailedToReachTargetStatus, object["Status"].(string)))
}
}
return object, object["Status"].(string), nil
}
}
func (s *VpcService) DescribeHavip(id string) (object map[string]interface{}, err error) {
var response map[string]interface{}
client := s.client
action := "DescribeHaVips"
request := map[string]interface{}{
"RegionId": s.client.RegionId,
"PageNumber": 1,
"PageSize": 20,
}
for {
response, err = client.RpcPost("Vpc", "2016-04-28", action, nil, request, true)
if err != nil {
if IsExpectedErrors(err, []string{"InvalidFilterKey.ValueNotSupported", "InvalidHaVipId.NotFound", "InvalidRegionId.NotFound"}) {
err = WrapErrorf(NotFoundErr("Havip", id), NotFoundMsg, ProviderERROR)
return object, err
}
err = WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR)
return object, err
}
addDebug(action, response, request)
v, err := jsonpath.Get("$.HaVips.HaVip", response)
if err != nil {
return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.HaVips.HaVip", response)
}
result, _ := v.([]interface{})
if len(result) < 1 {
return object, WrapErrorf(NotFoundErr("VPC", id), NotFoundWithResponse, response)
}
for _, v := range result {
if v.(map[string]interface{})["HaVipId"].(string) == id {
return v.(map[string]interface{}), nil
}
}
if len(result) < request["PageSize"].(int) {
break
}
request["PageNumber"] = request["PageNumber"].(int) + 1
}
return object, WrapErrorf(NotFoundErr("VPC", id), NotFoundWithResponse, response)
}
func (s *VpcService) HavipStateRefreshFunc(id string, failStates []string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
object, err := s.DescribeHavip(id)
if err != nil {
if NotFoundError(err) {
// Set this to nil as if we didn't find anything.
return nil, "", nil
}
return nil, "", WrapError(err)
}
for _, failState := range failStates {
if object["Status"].(string) == failState {
return object, object["Status"].(string), WrapError(Error(FailedToReachTargetStatus, object["Status"].(string)))
}
}
return object, object["Status"].(string), nil
}
}
func (s *VpcService) NatGatewayStateRefreshFunc(id string, failStates []string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
object, err := s.DescribeNatGateway(id)
if err != nil {
if NotFoundError(err) {
// Set this to nil as if we didn't find anything.
return nil, "", nil
}
return nil, "", WrapError(err)
}
for _, failState := range failStates {
if object["Status"].(string) == failState {
return object, object["Status"].(string), WrapError(Error(FailedToReachTargetStatus, object["Status"].(string)))
}
}
return object, object["Status"].(string), nil
}
}
func (s *VpcService) NetworkAclStateRefreshFunc(id string, failStates []string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
object, err := s.DescribeNetworkAcl(id)
if err != nil {
if NotFoundError(err) {
// Set this to nil as if we didn't find anything.
return nil, "", nil
}
return nil, "", WrapError(err)
}
for _, failState := range failStates {
if fmt.Sprint(object["Status"]) == failState {
return object, fmt.Sprint(object["Status"]), WrapError(Error(FailedToReachTargetStatus, fmt.Sprint(object["Status"])))
}
}
return object, fmt.Sprint(object["Status"]), nil
}
}
func (s *VpcService) DeleteAclResources(id string) (object map[string]interface{}, err error) {
acl, err := s.DescribeNetworkAcl(id)
if err != nil {
return object, WrapError(err)
}
deleteResources := make([]map[string]interface{}, 0)
res, err := jsonpath.Get("$.Resources.Resource", acl)
if err != nil {
return object, WrapError(err)
}
resources, _ := res.([]interface{})
if resources != nil && len(resources) < 1 {
return object, nil
}
for _, val := range resources {
item, _ := val.(map[string]interface{})
if item["Status"] == "UNBINDING" {
continue
}
deleteResources = append(deleteResources, map[string]interface{}{
"ResourceId": item["ResourceId"],
"ResourceType": item["ResourceType"],
})
}
if len(deleteResources) == 0 {
return nil, nil
}
var response map[string]interface{}
request := map[string]interface{}{
"NetworkAclId": id,
"Resource": deleteResources,
"RegionId": s.client.RegionId,
}
action := "UnassociateNetworkAcl"
client := s.client
request["ClientToken"] = buildClientToken("UnassociateNetworkAcl")
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(10*time.Minute, func() *resource.RetryError {
response, err = client.RpcPost("Vpc", "2016-04-28", action, nil, request, true)
if err != nil {
if IsExpectedErrors(err, []string{"IncorrectStatus.Vpc", "OperationConflict", "IncorrectStatus", "ServiceUnavailable", "LastTokenProcessing", "SystemBusy", "ResourceStatus.Error"}) || NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
return nil
})
addDebug(action, response, request)
if err != nil {
if IsExpectedErrors(err, []string{"InvalidResource.NotBinding"}) {
return object, nil
}
return response, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR)
}
stateConf := BuildStateConf([]string{}, []string{"Available"}, 10*time.Minute, 5*time.Second, s.NetworkAclStateRefreshFunc(id, []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return response, WrapErrorf(err, IdMsg, id)
}
return object, nil
}
func (s *VpcService) DescribeExpressConnectPhysicalConnection(id string) (object map[string]interface{}, err error) {
var response map[string]interface{}
action := "DescribePhysicalConnections"
client := s.client
request := map[string]interface{}{
"RegionId": s.client.RegionId,
"PageSize": PageSizeLarge,
"PageNumber": 1,
}
filterMapList := make([]map[string]interface{}, 0)
filterMapList = append(filterMapList, map[string]interface{}{
"Key": "PhysicalConnectionId",
"Value": []string{id},
})
request["Filter"] = filterMapList
idExist := false
for {
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(5*time.Minute, func() *resource.RetryError {
response, err = client.RpcPost("Vpc", "2016-04-28", action, nil, 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)
}
resp, err := jsonpath.Get("$.PhysicalConnectionSet.PhysicalConnectionType", response)
if err != nil {
return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.PhysicalConnectionSet.PhysicalConnectionType", response)
}
if v, ok := resp.([]interface{}); !ok || len(v) < 1 {
return object, WrapErrorf(NotFoundErr("ExpressConnect:PhysicalConnection", id), NotFoundWithResponse, response)
}
for _, v := range resp.([]interface{}) {
if fmt.Sprint(v.(map[string]interface{})["PhysicalConnectionId"]) == id {
idExist = true
return v.(map[string]interface{}), nil
}
}
if len(resp.([]interface{})) < request["PageSize"].(int) {
break
}
request["PageNumber"] = request["PageNumber"].(int) + 1
}
if !idExist {
return object, WrapErrorf(NotFoundErr("ExpressConnect:PhysicalConnection", id), NotFoundWithResponse, response)
}
return object, nil
}
func (s *VpcService) ExpressConnectPhysicalConnectionStateRefreshFunc(id string, failStates []string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
object, err := s.DescribeExpressConnectPhysicalConnection(id)
if err != nil {
if NotFoundError(err) {
// Set this to nil as if we didn't find anything.
return nil, "", nil
}
return nil, "", WrapError(err)
}
for _, failState := range failStates {
if fmt.Sprint(object["Status"]) == failState {
return object, fmt.Sprint(object["Status"]), WrapError(Error(FailedToReachTargetStatus, fmt.Sprint(object["Status"])))
}
}
return object, fmt.Sprint(object["Status"]), nil
}
}
func (s *VpcService) DescribeExpressConnectVirtualBorderRouter(id string, includeCrossAccountVbr bool) (object map[string]interface{}, err error) {
var response map[string]interface{}
client := s.client
action := "DescribeVirtualBorderRouters"
request := map[string]interface{}{
"RegionId": s.client.RegionId,
"PageNumber": 1,
"PageSize": 50,
"IncludeCrossAccountVbr": includeCrossAccountVbr,
}
idExist := false
for {
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(5*time.Minute, func() *resource.RetryError {
response, err = client.RpcPost("Vpc", "2016-04-28", action, nil, 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("$.VirtualBorderRouterSet.VirtualBorderRouterType", response)
if err != nil {
return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.VirtualBorderRouterSet.VirtualBorderRouterType", response)
}
if len(v.([]interface{})) < 1 {
return object, WrapErrorf(NotFoundErr("ExpressConnect", id), NotFoundWithResponse, response)
}
for _, v := range v.([]interface{}) {
if fmt.Sprint(v.(map[string]interface{})["VbrId"]) == id {
idExist = true
return v.(map[string]interface{}), nil
}
}
if len(v.([]interface{})) < request["PageSize"].(int) {
break
}
request["PageNumber"] = request["PageNumber"].(int) + 1
}
if !idExist {
return object, WrapErrorf(NotFoundErr("ExpressConnect", id), NotFoundWithResponse, response)
}
return
}
func (s *VpcService) ExpressConnectVirtualBorderRouterStateRefreshFunc(id string, includeCrossAccountVbr bool, failStates []string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
object, err := s.DescribeExpressConnectVirtualBorderRouter(id, includeCrossAccountVbr)
if err != nil {
if NotFoundError(err) {
// Set this to nil as if we didn't find anything.
return nil, "", nil
}
return nil, "", WrapError(err)
}
for _, failState := range failStates {
if fmt.Sprint(object["Status"]) == failState {
return object, fmt.Sprint(object["Status"]), WrapError(Error(FailedToReachTargetStatus, fmt.Sprint(object["Status"])))
}
}
return object, fmt.Sprint(object["Status"]), nil
}
}
func (s *VpcService) DescribeVpcDhcpOptionsSet(id string) (object map[string]interface{}, err error) {
var response map[string]interface{}
client := s.client
action := "GetDhcpOptionsSet"
request := map[string]interface{}{
"RegionId": s.client.RegionId,
"DhcpOptionsSetId": id,
}
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(5*time.Minute, func() *resource.RetryError {
response, err = client.RpcPost("Vpc", "2016-04-28", action, nil, 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{"InvalidRegionId.NotFound"}) {
return object, WrapErrorf(NotFoundErr("VPC:DhcpOptionsSet", id), NotFoundMsg, ProviderERROR, fmt.Sprint(response["RequestId"]))
}
return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR)
}
v, err := jsonpath.Get("$", response)
if err != nil {
return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$", response)
}
object = v.(map[string]interface{})
if _, ok := object["DhcpOptionsSetId"]; !ok {
return object, WrapErrorf(NotFoundErr("VPC:DhcpOptionsSet", id), NotFoundMsg, ProviderERROR, fmt.Sprint(response["RequestId"]))
}
return object, nil
}
func (s *VpcService) VpcDhcpOptionsSetStateRefreshFunc(id string, failStates []string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
object, err := s.DescribeVpcDhcpOptionsSet(id)
if err != nil {
if NotFoundError(err) {
// Set this to nil as if we didn't find anything.
return nil, "", nil
}
return nil, "", WrapError(err)
}
for _, failState := range failStates {
if fmt.Sprint(object["Status"]) == failState {
return object, fmt.Sprint(object["Status"]), WrapError(Error(FailedToReachTargetStatus, fmt.Sprint(object["Status"])))
}
}
return object, fmt.Sprint(object["Status"]), nil
}
}
func (s *VpcService) DescribeVpcDhcpOptionsSetAttachment(id string) (object map[string]interface{}, err error) {
parts, err := ParseResourceId(id, 2)
if err != nil {
return object, WrapError(err)
}
object, err = s.DescribeVpcDhcpOptionsSet(parts[1])
if err != nil {
return object, WrapError(err)
}
return object, nil
}
func (s *VpcService) DescribeVpcDhcpOptionsSetAttachmentStateRefreshFunc(id string, failStates []string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
parts, err := ParseResourceId(id, 2)
if err != nil {
return nil, "", WrapError(err)
}
object, err := s.DescribeVpcDhcpOptionsSetAttachment(id)
if err != nil {
if NotFoundError(err) {
// Set this to nil as if we didn't find anything.
return nil, "", nil
}
return nil, "", WrapError(err)
}
status := ""
if associateVpcsList, ok := object["AssociateVpcs"]; ok {
for _, associateVpcsListItem := range associateVpcsList.([]interface{}) {
if associateVpcsListItem != nil {
associateVpcsListItemMap, ok := associateVpcsListItem.(map[string]interface{})
if ok && associateVpcsListItemMap["VpcId"] == parts[0] {
status = associateVpcsListItemMap["AssociateStatus"].(string)
break
}
}
}
}
for _, failState := range failStates {
if status == failState {
return object, fmt.Sprint(object["AssociateStatus"]), WrapError(Error(FailedToReachTargetStatus, status))
}
}
return object, status, nil
}
}
func (s *VpcService) DescribeVpcNatIpCidr(id string) (object map[string]interface{}, err error) {
var response map[string]interface{}
client := s.client
action := "ListNatIpCidrs"
parts, err := ParseResourceId(id, 2)
if err != nil {
err = WrapError(err)
return
}
request := map[string]interface{}{
"RegionId": s.client.RegionId,
"NatGatewayId": parts[0],
"NatIpCidr": parts[1],
}
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(5*time.Minute, func() *resource.RetryError {
request["ClientToken"] = buildClientToken("ListNatIpCidrs")
response, err = client.RpcPost("Vpc", "2016-04-28", action, nil, 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("$.NatIpCidrs", response)
if err != nil {
return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.NatIpCidrs", response)
}
if len(v.([]interface{})) < 1 {
return object, WrapErrorf(NotFoundErr("VPC", id), NotFoundWithResponse, response)
} else {
if fmt.Sprint(v.([]interface{})[0].(map[string]interface{})["NatIpCidr"]) != parts[1] {
return object, WrapErrorf(NotFoundErr("VPC", id), NotFoundWithResponse, response)
}
}
object = v.([]interface{})[0].(map[string]interface{})
return object, nil
}
func (s *VpcService) DescribeVpcNatIp(id string) (object map[string]interface{}, err error) {
var response map[string]interface{}
client := s.client
parts, err := ParseResourceId(id, 2)
if err != nil {
return nil, WrapError(err)
}
action := "ListNatIps"
request := map[string]interface{}{
"RegionId": s.client.RegionId,
"NatGatewayId": parts[0],
"NatIpIds": []string{parts[1]},
}
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(5*time.Minute, func() *resource.RetryError {
request["ClientToken"] = buildClientToken("ListNatIps")
response, err = client.RpcPost("Vpc", "2016-04-28", action, nil, 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("$.NatIps", response)
if err != nil {
return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.NatIps", response)
}
if len(v.([]interface{})) < 1 {
return object, WrapErrorf(NotFoundErr("VPC", id), NotFoundWithResponse, response)
} else {
if fmt.Sprint(v.([]interface{})[0].(map[string]interface{})["NatIpId"]) != parts[1] {
return object, WrapErrorf(NotFoundErr("VPC", id), NotFoundWithResponse, response)
}
}
object = v.([]interface{})[0].(map[string]interface{})
return object, nil
}
func (s *VpcService) VpcNatIpStateRefreshFunc(id string, failStates []string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
object, err := s.DescribeVpcNatIp(id)
if err != nil {
if NotFoundError(err) {
// Set this to nil as if we didn't find anything.
return nil, "", nil
}
return nil, "", WrapError(err)
}
for _, failState := range failStates {
if fmt.Sprint(object["NatIpStatus"]) == failState {
return object, fmt.Sprint(object["NatIpStatus"]), WrapError(Error(FailedToReachTargetStatus, fmt.Sprint(object["NatIpStatus"])))
}
}
return object, fmt.Sprint(object["NatIpStatus"]), nil
}
}
func (s *VpcService) DescribeVpcBgpGroup(id string) (object map[string]interface{}, err error) {
var response map[string]interface{}
client := s.client
action := "DescribeBgpGroups"
request := map[string]interface{}{
"RegionId": s.client.RegionId,
"BgpGroupId": id,
}
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(5*time.Minute, func() *resource.RetryError {
response, err = client.RpcPost("Vpc", "2016-04-28", action, nil, 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("$.BgpGroups.BgpGroup", response)
if err != nil {
return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.BgpGroups.BgpGroup", response)
}
if len(v.([]interface{})) < 1 {
return object, WrapErrorf(NotFoundErr("VPC", id), NotFoundWithResponse, response)
} else {
if fmt.Sprint(v.([]interface{})[0].(map[string]interface{})["BgpGroupId"]) != id {
return object, WrapErrorf(NotFoundErr("VPC", id), NotFoundWithResponse, response)
}
}
object = v.([]interface{})[0].(map[string]interface{})
return object, nil
}
func (s *VpcService) VpcBgpGroupStateRefreshFunc(id string, failStates []string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
object, err := s.DescribeVpcBgpGroup(id)
if err != nil {
if NotFoundError(err) {
// Set this to nil as if we didn't find anything.
return nil, "", nil
}
return nil, "", WrapError(err)
}
for _, failState := range failStates {
if fmt.Sprint(object["Status"]) == failState {
return object, fmt.Sprint(object["Status"]), WrapError(Error(FailedToReachTargetStatus, fmt.Sprint(object["Status"])))
}
}
return object, fmt.Sprint(object["Status"]), nil
}
}
func (s *VpcService) DescribeVpcVbrHa(id string) (object map[string]interface{}, err error) {
var response map[string]interface{}
client := s.client
action := "DescribeVbrHa"
request := map[string]interface{}{
"RegionId": s.client.RegionId,
"VbrHaId": id,
}
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(5*time.Minute, func() *resource.RetryError {
request["ClientToken"] = buildClientToken("DescribeVbrHa")
response, err = client.RpcPost("Vpc", "2016-04-28", action, nil, 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("$", response)
if err != nil {
return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$", response)
}
object = v.(map[string]interface{})
if vbrHaId, ok := object["VbrHaId"]; !ok || fmt.Sprint(vbrHaId) == "" {
return object, WrapErrorf(NotFoundErr("VPC", id), NotFoundWithResponse, response)
}
return object, nil
}
func (s *VpcService) VpcVbrHaStateRefreshFunc(id string, failStates []string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
object, err := s.DescribeVpcVbrHa(id)
if err != nil {
if NotFoundError(err) {
// Set this to nil as if we didn't find anything.
return nil, "", nil
}
return nil, "", WrapError(err)
}
for _, failState := range failStates {
if fmt.Sprint(object["Status"]) == failState {
return object, fmt.Sprint(object["Status"]), WrapError(Error(FailedToReachTargetStatus, fmt.Sprint(object["Status"])))
}
}
return object, fmt.Sprint(object["Status"]), nil
}
}
func (s *VpcService) DescribeVpcBgpNetwork(id string) (object map[string]interface{}, err error) {
var response map[string]interface{}
client := s.client
action := "DescribeBgpNetworks"
parts, err := ParseResourceId(id, 2)
if err != nil {
err = WrapError(err)
return
}
request := map[string]interface{}{
"RegionId": s.client.RegionId,
"RouterId": parts[0],
"PageNumber": 1,
"PageSize": PageSizeMedium,
}
idExist := false
for {
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(5*time.Minute, func() *resource.RetryError {
response, err = client.RpcPost("Vpc", "2016-04-28", action, nil, 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("$.BgpNetworks.BgpNetwork", response)
if err != nil {
return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.BgpNetworks.BgpNetwork", response)
}
if len(v.([]interface{})) < 1 {
return object, WrapErrorf(NotFoundErr("VPC", id), NotFoundWithResponse, response)
}
for _, v := range v.([]interface{}) {
if fmt.Sprint(v.(map[string]interface{})["DstCidrBlock"]) == parts[1] {
idExist = true
return v.(map[string]interface{}), nil
}
}
if len(v.([]interface{})) < request["PageSize"].(int) {
break
}
request["PageNumber"] = request["PageNumber"].(int) + 1
}
if !idExist {
return object, WrapErrorf(NotFoundErr("VPC", id), NotFoundWithResponse, response)
}
return
}
func (s *VpcService) VpcBgpNetworkStateRefreshFunc(id string, failStates []string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
object, err := s.DescribeVpcBgpNetwork(id)
if err != nil {
if NotFoundError(err) {
// Set this to nil as if we didn't find anything.
return nil, "", nil
}
return nil, "", WrapError(err)
}
for _, failState := range failStates {
if fmt.Sprint(object["Status"]) == failState {
return object, fmt.Sprint(object["Status"]), WrapError(Error(FailedToReachTargetStatus, fmt.Sprint(object["Status"])))
}
}
return object, fmt.Sprint(object["Status"]), nil
}
}
func (s *VpcService) DescribeVpnRouteEntry(id string) (object map[string]interface{}, err error) {
var response map[string]interface{}
client := s.client
action := "DescribeVpnRouteEntries"
parts, err := ParseResourceId(id, 3)
if err != nil {
return object, WrapError(err)
}
request := map[string]interface{}{
"RegionId": s.client.RegionId,
"VpnGatewayId": parts[0],
"PageNumber": 1,
"PageSize": PageSizeMedium,
}
idExist := false
for {
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(5*time.Minute, func() *resource.RetryError {
response, err = client.RpcPost("Vpc", "2016-04-28", action, nil, 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("$.VpnRouteEntries.VpnRouteEntry", response)
if err != nil {
return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.VpnRouteEntries.VpnRouteEntry", response)
}
if len(v.([]interface{})) < 1 {
return object, WrapErrorf(NotFoundErr("VPC", id), NotFoundWithResponse, response)
}
for _, v := range v.([]interface{}) {
if fmt.Sprint(v.(map[string]interface{})["NextHop"]) == parts[1] && fmt.Sprint(v.(map[string]interface{})["RouteDest"]) == parts[2] {
idExist = true
return v.(map[string]interface{}), nil
}
}
if len(v.([]interface{})) < request["PageSize"].(int) {
break
}
request["PageNumber"] = request["PageNumber"].(int) + 1
}
if !idExist {
return object, WrapErrorf(NotFoundErr("VPC", id), NotFoundWithResponse, response)
}
return
}
func (s *VpcService) VpnRouteEntryStateRefreshFunc(id string, failStates []string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
object, err := s.DescribeVpnRouteEntry(id)
if err != nil {
if NotFoundError(err) {
// Set this to nil as if we didn't find anything.
return nil, "", nil
}
return nil, "", WrapError(err)
}
for _, failState := range failStates {
if object["State"].(string) == failState {
return object, object["State"].(string), WrapError(Error(FailedToReachTargetStatus, object["State"].(string)))
}
}
return object, object["State"].(string), nil
}
}
func (s *VpcService) DescribeVpnIpsecServer(id string) (object map[string]interface{}, err error) {
var response map[string]interface{}
client := s.client
action := "ListIpsecServers"
request := map[string]interface{}{
"RegionId": s.client.RegionId,
"IpsecServerId": []string{id},
}
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(5*time.Minute, func() *resource.RetryError {
response, err = client.RpcPost("Vpc", "2016-04-28", action, nil, 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("$.IpsecServers", response)
if err != nil {
return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.IpsecServers", response)
}
if len(v.([]interface{})) < 1 {
return object, WrapErrorf(NotFoundErr("VPC", id), NotFoundWithResponse, response)
} else {
if fmt.Sprint(v.([]interface{})[0].(map[string]interface{})["IpsecServerId"]) != id {
return object, WrapErrorf(NotFoundErr("VPC", id), NotFoundWithResponse, response)
}
}
object = v.([]interface{})[0].(map[string]interface{})
return object, nil
}
func (s *VpcService) DescribeVpnPbrRouteEntry(id string) (object map[string]interface{}, err error) {
var response map[string]interface{}
client := s.client
action := "DescribeVpnPbrRouteEntries"
parts, err := ParseResourceId(id, 4)
if err != nil {
return object, WrapError(err)
}
request := map[string]interface{}{
"RegionId": s.client.RegionId,
"VpnGatewayId": parts[0],
"PageNumber": 1,
"PageSize": PageSizeMedium,
}
idExist := false
for {
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(5*time.Minute, func() *resource.RetryError {
response, err = client.RpcPost("Vpc", "2016-04-28", action, nil, 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("$.VpnPbrRouteEntries.VpnPbrRouteEntry", response)
if err != nil {
return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.VpnPbrRouteEntries.VpnPbrRouteEntry", response)
}
if len(v.([]interface{})) < 1 {
return object, WrapErrorf(NotFoundErr("VPC", id), NotFoundWithResponse, response)
}
for _, v := range v.([]interface{}) {
if fmt.Sprint(v.(map[string]interface{})["NextHop"]) == parts[1] && fmt.Sprint(v.(map[string]interface{})["RouteSource"]) == parts[2] && fmt.Sprint(v.(map[string]interface{})["RouteDest"]) == parts[3] {
idExist = true
return v.(map[string]interface{}), nil
}
}
if len(v.([]interface{})) < request["PageSize"].(int) {
break
}
request["PageNumber"] = request["PageNumber"].(int) + 1
}
if !idExist {
return object, WrapErrorf(NotFoundErr("VPC", id), NotFoundWithResponse, response)
}
return
}
func (s *VpcService) VpnPbrRouteEntryStateRefreshFunc(id string, failStates []string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
object, err := s.DescribeVpnPbrRouteEntry(id)
if err != nil {
if NotFoundError(err) {
// Set this to nil as if we didn't find anything.
return nil, "", nil
}
return nil, "", WrapError(err)
}
for _, failState := range failStates {
if object["State"].(string) == failState {
return object, object["State"].(string), WrapError(Error(FailedToReachTargetStatus, object["State"].(string)))
}
}
return object, object["State"].(string), nil
}
}
func (s *VpcService) DescribeVpnGatewayVpnAttachment(id string) (object map[string]interface{}, err error) {
var response map[string]interface{}
client := s.client
action := "DescribeVpnConnection"
request := map[string]interface{}{
"RegionId": s.client.RegionId,
"VpnConnectionId": id,
}
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(5*time.Minute, func() *resource.RetryError {
response, err = client.RpcPost("Vpc", "2016-04-28", action, nil, 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{"InvalidVpnConnectionInstanceId.NotFound"}) {
return object, WrapErrorf(NotFoundErr("VpnConnection", id), NotFoundMsg, ProviderERROR, fmt.Sprint(response["RequestId"]))
}
return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR)
}
v, err := jsonpath.Get("$", response)
if err != nil {
return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$", response)
}
object = v.(map[string]interface{})
return object, nil
}
func (s *VpcService) VpnGatewayVpnAttachmentStateRefreshFunc(id string, failStates []string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
object, err := s.DescribeVpnGatewayVpnAttachment(id)
if err != nil {
if NotFoundError(err) {
// Set this to nil as if we didn't find anything.
return nil, "", nil
}
return nil, "", WrapError(err)
}
for _, failState := range failStates {
if object["State"].(string) == failState {
return object, object["State"].(string), WrapError(Error(FailedToReachTargetStatus, object["State"].(string)))
}
}
return object, object["State"].(string), nil
}
}
func (s *VpcService) GetVpcPrefixListEntries(id string) (objects []map[string]interface{}, err error) {
var response map[string]interface{}
client := s.client
action := "GetVpcPrefixListEntries"
request := map[string]interface{}{
"RegionId": s.client.RegionId,
"PrefixListId": id,
}
for {
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(5*time.Minute, func() *resource.RetryError {
response, err = client.RpcPost("Vpc", "2016-04-28", action, nil, 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 objects, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR)
}
if formatInt(response["TotalCount"]) == 0 {
return objects, nil
}
resp, err := jsonpath.Get("$.PrefixListEntry", response)
if err != nil {
return objects, WrapErrorf(err, FailedGetAttributeMsg, id, "$", response)
}
result, _ := resp.([]interface{})
for _, v := range result {
item := v.(map[string]interface{})
objects = append(objects, item)
}
if nextToken, ok := response["NextToken"].(string); ok && nextToken != "" {
request["NextToken"] = nextToken
} else {
break
}
}
return objects, nil
}
func (s *VpcService) DescribeVpnGatewayVcoRoute(id string) (object map[string]interface{}, err error) {
var response map[string]interface{}
client := s.client
action := "DescribeVcoRouteEntries"
parts, err := ParseResourceId(id, 4)
if err != nil {
err = WrapError(err)
return
}
request := map[string]interface{}{
"RegionId": s.client.RegionId,
"VpnConnectionId": parts[0],
"PageNumber": 1,
"PageSize": PageSizeMedium,
}
idExist := false
for {
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(5*time.Minute, func() *resource.RetryError {
response, err = client.RpcPost("Vpc", "2016-04-28", action, nil, 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{"UnknownError"}) {
return object, WrapErrorf(NotFoundErr("VPC:VPNGateway", id), NotFoundMsg, ProviderERROR, fmt.Sprint(response["RequestId"]))
}
return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR)
}
v, err := jsonpath.Get("$.VcoRouteEntries", response)
if err != nil {
return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.VcoRouteEntries", response)
}
if len(v.([]interface{})) < 1 {
return object, WrapErrorf(NotFoundErr("VPNGateway", id), NotFoundWithResponse, response)
}
for _, v := range v.([]interface{}) {
item := v.(map[string]interface{})
if fmt.Sprint(item["RouteDest"]) == parts[1] && fmt.Sprint(item["NextHop"]) == parts[2] && fmt.Sprint(item["Weight"]) == parts[3] {
idExist = true
return item, nil
}
}
if len(v.([]interface{})) < request["PageSize"].(int) {
break
}
request["PageNumber"] = request["PageNumber"].(int) + 1
}
if !idExist {
return object, WrapErrorf(NotFoundErr("VPNGateway", id), NotFoundWithResponse, response)
}
return object, nil
}
func (s *VpcService) DescribeExpressConnectGrantRuleToCen(id string) (object map[string]interface{}, err error) {
var response map[string]interface{}
action := "DescribeGrantRulesToCen"
client := s.client
parts, err := ParseResourceId(id, 3)
if err != nil {
return nil, WrapError(err)
}
request := map[string]interface{}{
"RegionId": s.client.RegionId,
"ClientToken": buildClientToken("DescribeGrantRulesToCen"),
"InstanceId": parts[2],
"InstanceType": "VBR",
}
idExist := false
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(5*time.Minute, func() *resource.RetryError {
response, err = client.RpcPost("Vpc", "2016-04-28", action, nil, 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)
}
resp, err := jsonpath.Get("$.CenGrantRules.CbnGrantRule", response)
if err != nil {
return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.CenGrantRules.CbnGrantRule", response)
}
if v, ok := resp.([]interface{}); !ok || len(v) < 1 {
return object, WrapErrorf(NotFoundErr("ExpressConnect:GrantRuleToCen", id), NotFoundWithResponse, response)
}
for _, v := range resp.([]interface{}) {
if fmt.Sprint(v.(map[string]interface{})["CenInstanceId"]) == parts[0] {
idExist = true
return v.(map[string]interface{}), nil
}
}
if !idExist {
return object, WrapErrorf(NotFoundErr("ExpressConnect:GrantRuleToCen", id), NotFoundWithResponse, response)
}
return object, nil
}
func (s *VpcService) DescribeExpressConnectRouterInterface(id string) (object map[string]interface{}, err error) {
client := s.client
request := map[string]interface{}{
"Filter.1.Key": "RouterInterfaceId",
"Filter.1.Value": []string{id},
"RegionId": s.client.RegionId,
}
var response map[string]interface{}
action := "DescribeRouterInterfaces"
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(5*time.Minute, func() *resource.RetryError {
resp, err := client.RpcPost("Vpc", "2016-04-28", action, nil, request, true)
if err != nil {
if NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
response = resp
addDebug(action, response, request)
return nil
})
if err != nil {
return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR)
}
v, err := jsonpath.Get("$.RouterInterfaceSet.RouterInterfaceType", response)
if err != nil {
return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.RouterInterfaceSet.RouterInterfaceType", response)
}
if len(v.([]interface{})) < 1 {
return object, WrapErrorf(NotFoundErr("RouterInterface", id), NotFoundWithResponse, response)
}
return v.([]interface{})[0].(map[string]interface{}), nil
}
func (s *VpcService) ModifyExpressConnectPhysicalConnectionStatus(d *schema.ResourceData, status string) (err error) {
var response map[string]interface{}
client := s.client
switch status {
case "Confirmed":
action := "ConfirmPhysicalConnection"
confirmedReq := map[string]interface{}{
"RegionId": s.client.RegionId,
"ClientToken": buildClientToken("ConfirmPhysicalConnection"),
"PhysicalConnectionId": d.Id(),
}
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(20*time.Minute, func() *resource.RetryError {
response, err = client.RpcPost("Vpc", "2016-04-28", action, nil, confirmedReq, true)
if err != nil {
if NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
return nil
})
addDebug(action, response, confirmedReq)
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
}
stateConf := BuildStateConf([]string{}, []string{"Confirmed"}, d.Timeout(schema.TimeoutUpdate), 5*time.Second, s.ExpressConnectPhysicalConnectionStateRefreshFunc(d.Id(), []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}
case "Enabled":
action := "CreatePhysicalConnectionOccupancyOrder"
createPhysicalConnectionOccupancyOrderReq := map[string]interface{}{
"RegionId": s.client.RegionId,
"ClientToken": buildClientToken("CreatePhysicalConnectionOccupancyOrder"),
"PhysicalConnectionId": d.Id(),
"InstanceChargeType": "PrePaid",
"AutoPay": true,
}
if v, ok := d.GetOkExists("period"); ok {
createPhysicalConnectionOccupancyOrderReq["Period"] = v
}
if v, ok := d.GetOk("pricing_cycle"); ok {
createPhysicalConnectionOccupancyOrderReq["PricingCycle"] = v
}
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(20*time.Minute, func() *resource.RetryError {
response, err = client.RpcPost("Vpc", "2016-04-28", action, nil, createPhysicalConnectionOccupancyOrderReq, true)
if err != nil {
if NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
return nil
})
addDebug(action, response, createPhysicalConnectionOccupancyOrderReq)
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
}
if resp, err := jsonpath.Get("$.Data", response); err != nil || resp == nil {
return WrapErrorf(err, FailedGetAttributeMsg, d.Id(), "$.Data", response)
} else {
orderId := resp.(map[string]interface{})["OrderId"]
d.Set("order_id", orderId)
}
stateConf := BuildStateConf([]string{}, []string{"Enabled"}, d.Timeout(schema.TimeoutUpdate), 5*time.Second, s.ExpressConnectPhysicalConnectionStateRefreshFunc(d.Id(), []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}
case "Canceled":
action := "CancelPhysicalConnection"
canceledReq := map[string]interface{}{
"RegionId": s.client.RegionId,
"ClientToken": buildClientToken("CancelPhysicalConnection"),
"PhysicalConnectionId": d.Id(),
}
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(20*time.Minute, func() *resource.RetryError {
response, err = client.RpcPost("Vpc", "2016-04-28", action, nil, canceledReq, true)
if err != nil {
if NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
return nil
})
addDebug(action, response, canceledReq)
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
}
stateConf := BuildStateConf([]string{}, []string{"Canceled"}, d.Timeout(schema.TimeoutUpdate), 5*time.Second, s.ExpressConnectPhysicalConnectionStateRefreshFunc(d.Id(), []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}
case "Terminated":
action := "TerminatePhysicalConnection"
terminatedReq := map[string]interface{}{
"RegionId": s.client.RegionId,
"ClientToken": buildClientToken("TerminatePhysicalConnection"),
"PhysicalConnectionId": d.Id(),
}
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(20*time.Minute, func() *resource.RetryError {
response, err = client.RpcPost("Vpc", "2016-04-28", action, nil, terminatedReq, true)
if err != nil {
if NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
return nil
})
addDebug(action, response, terminatedReq)
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
}
stateConf := BuildStateConf([]string{}, []string{"Terminated"}, d.Timeout(schema.TimeoutUpdate), 5*time.Second, s.ExpressConnectPhysicalConnectionStateRefreshFunc(d.Id(), []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}
}
return nil
}