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 }