alibabacloudstack/service_apsarastack_vpc.go (1,631 lines of code) (raw):
package alibabacloudstack
import (
"fmt"
"log"
"regexp"
"time"
"github.com/PaesslerAG/jsonpath"
util "github.com/alibabacloud-go/tea-utils/service"
"github.com/alibabacloud-go/tea/tea"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
"github.com/aliyun/alibaba-cloud-sdk-go/services/vpc"
"github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/connectivity"
"github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/errmsgs"
)
type VpcService struct {
client *connectivity.AlibabacloudStackClient
}
func (s *VpcService) DoVpcDescribeforwardtableentriesRequest(id string) (entry vpc.ForwardTableEntry, err error) {
return s.DescribeForwardEntry(id)
}
func (s *VpcService) DoVpcDescribesnattableentriesRequest(id string) (snat vpc.SnatTableEntry, err error) {
return s.DescribeSnatEntry(id)
}
func (s *VpcService) DoVpcDescribeeipaddressesRequest(id string) (eip vpc.EipAddress, err error) {
return s.DescribeEip(id)
}
func (s *VpcService) DescribeEip(id string) (eip vpc.EipAddress, err error) {
request := vpc.CreateDescribeEipAddressesRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.AllocationId = id
raw, err := s.client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) {
return vpcClient.DescribeEipAddresses(request)
})
bresponse, ok := raw.(*vpc.DescribeEipAddressesResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
return eip, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_eip", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
if len(bresponse.EipAddresses.EipAddress) <= 0 || bresponse.EipAddresses.EipAddress[0].AllocationId != id {
return eip, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("Eip", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
}
eip = bresponse.EipAddresses.EipAddress[0]
return
}
func (s *VpcService) DescribeEipAssociation(id string) (object vpc.EipAddress, err error) {
parts, err := ParseResourceId(id, 2)
if err != nil {
err = errmsgs.WrapError(err)
return
}
object, err = s.DescribeEip(parts[0])
if err != nil {
err = errmsgs.WrapError(err)
return
}
if object.InstanceId != parts[1] {
err = errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("Eip Association", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
}
return
}
func (s *VpcService) DescribeNatGateway(id string) (nat vpc.NatGateway, err error) {
request := vpc.CreateDescribeNatGatewaysRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.NatGatewayId = id
invoker := NewInvoker()
err = invoker.Run(func() error {
raw, err := s.client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) {
return vpcClient.DescribeNatGateways(request)
})
bresponse, ok := raw.(*vpc.DescribeNatGatewaysResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
if errmsgs.IsExpectedErrors(err, []string{"InvalidNatGatewayId.NotFound"}) {
return errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR)
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_nat_gateway", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
if len(bresponse.NatGateways.NatGateway) <= 0 || bresponse.NatGateways.NatGateway[0].NatGatewayId != id {
return errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("NatGateway", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
}
nat = bresponse.NatGateways.NatGateway[0]
return nil
})
return
}
func (s *VpcService) DescribeVpc(id string) (v vpc.Vpc, err error) {
request := vpc.CreateDescribeVpcsRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.VpcId = id
invoker := NewInvoker()
err = invoker.Run(func() error {
raw, err := s.client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) {
return vpcClient.DescribeVpcs(request)
})
bresponse, ok := raw.(*vpc.DescribeVpcsResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
if errmsgs.IsExpectedErrors(err, []string{"InvalidVpcID.NotFound", "Forbidden.VpcNotFound"}) {
return errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR)
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_vpc", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
if len(bresponse.Vpcs.Vpc) < 1 || bresponse.Vpcs.Vpc[0].VpcId != id {
return errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("VPC", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
}
v = bresponse.Vpcs.Vpc[0]
return nil
})
return
}
func (s *VpcService) VpcStateRefreshFunc(id string, failStates []string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
object, err := s.DescribeVpc(id)
if err != nil {
if errmsgs.NotFoundError(err) {
// Set this to nil as if we didn't find anything.
return nil, "", nil
}
return nil, "", errmsgs.WrapError(err)
}
for _, failState := range failStates {
if object.Status == failState {
return object, object.Status, errmsgs.WrapError(errmsgs.Error(errmsgs.FailedToReachTargetStatus, object.Status))
}
}
return object, object.Status, nil
}
}
func (s *VpcService) DoVpcDescribevswitchattributesRequest(id string) (v vpc.DescribeVSwitchAttributesResponse, err error) {
return s.DescribeVSwitch(id)
}
func (s *VpcService) DoVpcDescribevpcattributesRequest(id string) (v map[string]interface{}, err error) {
object, err := s.DescribeVpc(id)
result := map[string]interface{}{
"cidr_block": object.CidrBlock,
"name": object.VpcName,
"description": object.Description,
"router_id": object.VRouterId,
"ipv6_cidr_block": object.Ipv6CidrBlock,
"secondary_cidr_blocks": object.SecondaryCidrBlocks.SecondaryCidrBlock,
"status": object.Status,
"tags": s.tagToMap(object.Tags.Tag),
"user_cidrs": object.UserCidrs.UserCidr,
"vpc_name": object.VpcName,
}
return result, err
}
func (s *VpcService) DescribeVSwitch(id string) (v vpc.DescribeVSwitchAttributesResponse, err error) {
request := vpc.CreateDescribeVSwitchAttributesRequest()
s.client.InitRpcRequest(*request.RpcRequest)
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)
})
bresponse, ok := raw.(*vpc.DescribeVSwitchAttributesResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
if errmsgs.IsExpectedErrors(err, []string{"InvalidVswitchID.NotFound"}) {
return errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR)
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_vswitch", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
if bresponse.VSwitchId != id {
return errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("vswitch", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
}
v = *bresponse
return nil
})
return
}
func (s *VpcService) VSwitchStateRefreshFunc(id string, failStates []string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
object, err := s.DescribeVSwitch(id)
if err != nil {
if errmsgs.NotFoundError(err) {
// Set this to nil as if we didn't find anything.
return nil, "", nil
}
return nil, "", errmsgs.WrapError(err)
}
for _, failState := range failStates {
if object.Status == failState {
return object, object.Status, errmsgs.WrapError(errmsgs.Error(errmsgs.FailedToReachTargetStatus, object.Status))
}
}
return object, object.Status, nil
}
}
func (s *VpcService) DescribeSnatEntry(id string) (snat vpc.SnatTableEntry, err error) {
parts, err := ParseResourceId(id, 2)
if err != nil {
return snat, errmsgs.WrapError(err)
}
request := vpc.CreateDescribeSnatTableEntriesRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.SnatTableId = parts[0]
request.PageSize = requests.NewInteger(PageSizeLarge)
for {
invoker := NewInvoker()
var raw interface{}
err = invoker.Run(func() error {
raw, err = s.client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) {
return vpcClient.DescribeSnatTableEntries(request)
})
return err
})
response, ok := raw.(*vpc.DescribeSnatTableEntriesResponse)
//this special deal cause the DescribeSnatEntry can't find the records would be throw "cant find the snatTable error"
//so judge the snatEntries length priority
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
if errmsgs.IsExpectedErrors(err, []string{"InvalidSnatTableId.NotFound", "InvalidSnatEntryId.NotFound"}) {
return snat, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR)
}
return snat, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_snat_entry", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
if len(response.SnatTableEntries.SnatTableEntry) < 1 {
break
}
for _, snat := range response.SnatTableEntries.SnatTableEntry {
if snat.SnatEntryId == parts[1] {
return snat, nil
}
}
if len(response.SnatTableEntries.SnatTableEntry) < PageSizeLarge {
break
}
page, err := getNextpageNumber(request.PageNumber)
if err != nil {
return snat, errmsgs.WrapError(err)
}
request.PageNumber = page
}
return snat, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("SnatEntry", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
}
func (s *VpcService) DescribeForwardEntry(id string) (entry vpc.ForwardTableEntry, err error) {
parts, err := ParseResourceId(id, 2)
if err != nil {
return entry, errmsgs.WrapError(err)
}
forwardTableId, forwardEntryId := parts[0], parts[1]
request := vpc.CreateDescribeForwardTableEntriesRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.ForwardTableId = forwardTableId
request.ForwardEntryId = forwardEntryId
invoker := NewInvoker()
err = invoker.Run(func() error {
raw, err := s.client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) {
return vpcClient.DescribeForwardTableEntries(request)
})
bresponse, ok := raw.(*vpc.DescribeForwardTableEntriesResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
if errmsgs.IsExpectedErrors(err, []string{"InvalidForwardEntryId.NotFound", "InvalidForwardTableId.NotFound"}) {
return errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("ForwardEntry", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_forward_entry", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
if len(bresponse.ForwardTableEntries.ForwardTableEntry) > 0 {
entry = bresponse.ForwardTableEntries.ForwardTableEntry[0]
return nil
}
return errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("ForwardEntry", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
})
return
}
func (s *VpcService) QueryRouteTableById(routeTableId string) (rt vpc.RouteTable, err error) {
request := vpc.CreateDescribeRouteTablesRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.RouteTableId = routeTableId
invoker := NewInvoker()
err = invoker.Run(func() error {
raw, err := s.client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) {
return vpcClient.DescribeRouteTables(request)
})
bresponse, ok := raw.(*vpc.DescribeRouteTablesResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_route_table", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
if len(bresponse.RouteTables.RouteTable) == 0 ||
bresponse.RouteTables.RouteTable[0].RouteTableId != routeTableId {
return errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("RouteTable", routeTableId)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
}
rt = bresponse.RouteTables.RouteTable[0]
return nil
})
return
}
func (s *VpcService) DescribeRouteEntry(id string) (*vpc.RouteEntry, error) {
v := &vpc.RouteEntry{}
parts, err := ParseResourceId(id, 5)
if err != nil {
return v, errmsgs.WrapError(err)
}
rtId, cidr, nexthop_type, nexthop_id := parts[0], parts[2], parts[3], parts[4]
request := vpc.CreateDescribeRouteTablesRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.RouteTableId = rtId
invoker := NewInvoker()
for {
var raw interface{}
var err error
err = invoker.Run(func() error {
raw, err = s.client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) {
return vpcClient.DescribeRouteTables(request)
})
return err
})
response, ok := raw.(*vpc.DescribeRouteTablesResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
return v, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_route_entry", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
if len(response.RouteTables.RouteTable) < 1 {
break
}
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, errmsgs.WrapError(err)
} else {
request.PageNumber = page
}
}
return v, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("RouteEntry", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
}
func (s *VpcService) DoVpcDescriberouterinterfaceattributeRequest(id, regionId string) (ri vpc.RouterInterfaceType, err error) {
return s.DescribeRouterInterface(id, regionId)
}
func (s *VpcService) DescribeRouterInterface(id, regionId string) (ri vpc.RouterInterfaceType, err error) {
request := vpc.CreateDescribeRouterInterfacesRequest()
s.client.InitRpcRequest(*request.RpcRequest)
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)
})
bresponse, ok := raw.(*vpc.DescribeRouterInterfacesResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_router_interface", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
if len(bresponse.RouterInterfaceSet.RouterInterfaceType) <= 0 ||
bresponse.RouterInterfaceSet.RouterInterfaceType[0].RouterInterfaceId != id {
return errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("RouterInterface", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
}
ri = bresponse.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, errmsgs.WrapError(err)
}
if ri.OppositeInterfaceId == "" || ri.OppositeRouterType == "" ||
ri.OppositeRouterId == "" || ri.OppositeInterfaceOwnerId == "" {
return ri, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("RouterInterface", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
}
return ri, nil
}
func (s *VpcService) DescribeCenInstanceGrant(id string) (rule vpc.CbnGrantRule, err error) {
request := vpc.CreateDescribeGrantRulesToCenRequest()
s.client.InitRpcRequest(*request.RpcRequest)
parts, err := ParseResourceId(id, 3)
if err != nil {
return rule, errmsgs.WrapError(err)
}
cenId := parts[0]
instanceId := parts[1]
instanceType, err := GetCenChildInstanceType(instanceId)
if err != nil {
return rule, errmsgs.WrapError(err)
}
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)
})
bresponse, ok := raw.(*vpc.DescribeGrantRulesToCenResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_cen_instance_grant", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
ruleList := bresponse.CenGrantRules.CbnGrantRule
if len(ruleList) <= 0 {
return errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("GrantRules", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
}
for ruleNum := 0; ruleNum <= len(bresponse.CenGrantRules.CbnGrantRule)-1; ruleNum++ {
if ruleList[ruleNum].CenInstanceId == cenId {
rule = ruleList[ruleNum]
return nil
}
}
return errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("GrantRules", id)), errmsgs.NotFoundMsg, errmsgs.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 errmsgs.WrapError(err)
}
instanceId := parts[1]
ownerId := parts[2]
for {
object, err := s.DescribeCenInstanceGrant(id)
if err != nil {
if errmsgs.NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return errmsgs.WrapError(err)
}
}
if object.CenInstanceId == instanceId && fmt.Sprint(object.CenOwnerId) == ownerId && status != Deleted {
break
}
if time.Now().After(deadline) {
return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.CenInstanceId, instanceId, errmsgs.ProviderERROR)
}
time.Sleep(DefaultIntervalShort * time.Second)
}
return nil
}
func (s *VpcService) DoVpcDescribecommonbandwidthpackagesRequest(id string) (v vpc.CommonBandwidthPackage, err error) {
return s.DescribeCommonBandwidthPackage(id)
}
func (s *VpcService) DescribeCommonBandwidthPackage(id string) (v vpc.CommonBandwidthPackage, err error) {
request := vpc.CreateDescribeCommonBandwidthPackagesRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.BandwidthPackageId = id
invoker := NewInvoker()
err = invoker.Run(func() error {
raw, err := s.client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) {
return vpcClient.DescribeCommonBandwidthPackages(request)
})
bresponse, ok := raw.(*vpc.DescribeCommonBandwidthPackagesResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_common_bandwidth_package", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
//Finding the commonBandwidthPackageId
for _, bandPackage := range bresponse.CommonBandwidthPackages.CommonBandwidthPackage {
if bandPackage.BandwidthPackageId == id {
v = bandPackage
return nil
}
}
return errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("CommonBandWidthPackage", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
})
return
}
func (s *VpcService) DescribeCommonBandwidthPackageAttachment(id string) (v vpc.CommonBandwidthPackage, err error) {
parts, err := ParseResourceId(id, 2)
if err != nil {
return v, errmsgs.WrapError(err)
}
bandwidthPackageId, ipInstanceId := parts[0], parts[1]
object, err := s.DescribeCommonBandwidthPackage(bandwidthPackageId)
if err != nil {
return v, errmsgs.WrapError(err)
}
for _, ipAddresse := range object.PublicIpAddresses.PublicIpAddresse {
if ipAddresse.AllocationId == ipInstanceId {
v = object
return
}
}
return v, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("CommonBandWidthPackageAttachment", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
}
func (s *VpcService) DoVpcDescriberoutetablelistRequest(id string) (v vpc.RouterTableListType, err error) {
return s.DescribeRouteTable(id)
}
func (s *VpcService) DescribeRouteTable(id string) (v vpc.RouterTableListType, err error) {
request := vpc.CreateDescribeRouteTableListRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.RouteTableId = id
invoker := NewInvoker()
err = invoker.Run(func() error {
raw, err := s.client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) {
return vpcClient.DescribeRouteTableList(request)
})
bresponse, ok := raw.(*vpc.DescribeRouteTableListResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_route_table", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
//Finding the routeTableId
for _, routerTableType := range bresponse.RouterTableList.RouterTableListType {
if routerTableType.RouteTableId == id {
v = routerTableType
return nil
}
}
return errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("RouteTable", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
})
return v, errmsgs.WrapError(err)
}
func (s *VpcService) DescribeRouteTableAttachment(id string) (v vpc.RouterTableListType, err error) {
parts, err := ParseResourceId(id, 2)
if err != nil {
return v, errmsgs.WrapError(err)
}
invoker := NewInvoker()
routeTableId := parts[0]
vSwitchId := parts[1]
err = invoker.Run(func() error {
object, err := s.DescribeRouteTable(routeTableId)
if err != nil {
return errmsgs.WrapError(err)
}
for _, id := range object.VSwitchIds.VSwitchId {
if id == vSwitchId {
v = object
return nil
}
}
return errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("RouteTableAttachment", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
})
return v, errmsgs.WrapError(err)
}
func (s *VpcService) WaitForVSwitch(id string, status Status, timeout int) error {
deadline := time.Now().Add(time.Duration(timeout) * time.Second)
for {
object, err := s.DescribeVSwitch(id)
if err != nil {
if errmsgs.NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return errmsgs.WrapError(err)
}
}
if object.Status == string(status) {
return nil
}
if time.Now().After(deadline) {
return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.Status, string(status), errmsgs.ProviderERROR)
}
time.Sleep(DefaultIntervalShort * time.Second)
}
}
func (s *VpcService) WaitForNatGateway(id string, status Status, timeout int) error {
deadline := time.Now().Add(time.Duration(timeout) * time.Second)
for {
object, err := s.DescribeNatGateway(id)
if err != nil {
if errmsgs.NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return errmsgs.WrapError(err)
}
}
if object.Status == string(status) {
return nil
}
if time.Now().After(deadline) {
return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.Status, string(status), errmsgs.ProviderERROR)
}
time.Sleep(DefaultIntervalShort * time.Second)
}
}
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 errmsgs.NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return errmsgs.WrapError(err)
}
}
if object.Status == string(status) {
return nil
}
if time.Now().After(deadline) {
return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.Status, status, errmsgs.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 errmsgs.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 errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, routeTableId, GetFunc(1), timeout, Available, Null, errmsgs.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 errmsgs.NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return errmsgs.WrapError(err)
}
}
if object.Status == string(status) {
return nil
}
if time.Now().After(deadline) {
return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.Status, string(status), errmsgs.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 errmsgs.NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return errmsgs.WrapError(err)
}
}
if object.Status == string(status) {
return nil
}
if time.Now().After(deadline) {
return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.Status, string(status), errmsgs.ProviderERROR)
}
time.Sleep(DefaultIntervalShort * time.Second)
}
}
func (s *VpcService) WaitForEip(id string, status Status, timeout int) error {
deadline := time.Now().Add(time.Duration(timeout) * time.Second)
for {
object, err := s.DescribeEip(id)
if err != nil {
if errmsgs.NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return errmsgs.WrapError(err)
}
}
if object.Status == string(status) {
return nil
}
if time.Now().After(deadline) {
return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.Status, string(status), errmsgs.ProviderERROR)
}
time.Sleep(DefaultIntervalShort * time.Second)
}
}
func (s *VpcService) WaitForEipAssociation(id string, status Status, timeout int) error {
deadline := time.Now().Add(time.Duration(timeout) * time.Second)
for {
object, err := s.DescribeEipAssociation(id)
if err != nil {
if errmsgs.NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return errmsgs.WrapError(err)
}
}
if object.Status == string(status) {
return nil
}
if time.Now().After(deadline) {
return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.Status, string(status), errmsgs.ProviderERROR)
}
time.Sleep(DefaultIntervalShort * time.Second)
}
}
func (s *VpcService) DeactivateRouterInterface(interfaceId string) error {
request := vpc.CreateDeactivateRouterInterfaceRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.RouterInterfaceId = interfaceId
raw, err := s.client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) {
return vpcClient.DeactivateRouterInterface(request)
})
bresponse, ok := raw.(*vpc.DeactivateRouterInterfaceResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_router_interface", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
return nil
}
func (s *VpcService) ActivateRouterInterface(interfaceId string) error {
request := vpc.CreateActivateRouterInterfaceRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.RouterInterfaceId = interfaceId
raw, err := s.client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) {
return vpcClient.ActivateRouterInterface(request)
})
bresponse, ok := raw.(*vpc.ActivateRouterInterfaceResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_router_interface", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
return nil
}
func (s *VpcService) WaitForForwardEntry(id string, status Status, timeout int) error {
deadline := time.Now().Add(time.Duration(timeout) * time.Second)
for {
object, err := s.DescribeForwardEntry(id)
if err != nil {
if errmsgs.NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return errmsgs.WrapError(err)
}
}
if object.Status == string(status) {
return nil
}
if time.Now().After(deadline) {
return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.Status, string(status), errmsgs.ProviderERROR)
}
time.Sleep(DefaultIntervalShort * time.Second)
}
}
func (s *VpcService) WaitForSnatEntry(id string, status Status, timeout int) error {
deadline := time.Now().Add(time.Duration(timeout) * time.Second)
for {
object, err := s.DescribeSnatEntry(id)
if err != nil {
if errmsgs.NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return errmsgs.WrapError(err)
}
}
if object.Status == string(status) {
return nil
}
if time.Now().After(deadline) {
return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.Status, string(status), errmsgs.ProviderERROR)
}
}
}
func (s *VpcService) WaitForCommonBandwidthPackage(id string, status Status, timeout int) error {
deadline := time.Now().Add(time.Duration(timeout) * time.Second)
for {
object, err := s.DescribeCommonBandwidthPackage(id)
if err != nil {
if errmsgs.NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return errmsgs.WrapError(err)
}
}
if object.Status == string(status) {
return nil
}
if time.Now().After(deadline) {
return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.Status, string(status), errmsgs.ProviderERROR)
}
}
}
func (s *VpcService) WaitForCommonBandwidthPackageAttachment(id string, status Status, timeout int) error {
deadline := time.Now().Add(time.Duration(timeout) * time.Second)
for {
object, err := s.DescribeCommonBandwidthPackageAttachment(id)
if err != nil {
if errmsgs.NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return errmsgs.WrapError(err)
}
}
if object.Status == string(status) {
return nil
}
if time.Now().After(deadline) {
return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.Status, string(status), errmsgs.ProviderERROR)
}
}
}
// Flattens an array of vpc.public_ip_addresses into a []map[string]string
func (s *VpcService) FlattenPublicIpAddressesMappings(list []vpc.PublicIpAddresse) []map[string]interface{} {
result := make([]map[string]interface{}, 0, len(list))
for _, i := range list {
l := map[string]interface{}{
"ip_address": i.IpAddress,
"allocation_id": i.AllocationId,
}
result = append(result, l)
}
return result
}
func (s *VpcService) WaitForRouteTable(id string, status Status, timeout int) error {
deadline := time.Now().Add(time.Duration(timeout) * time.Second)
for {
object, err := s.DescribeRouteTable(id)
if err != nil {
if errmsgs.NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return errmsgs.WrapError(err)
}
}
if object.Status == string(status) {
return nil
}
if time.Now().After(deadline) {
return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.Status, string(status), errmsgs.ProviderERROR)
}
time.Sleep(3 * time.Second)
}
}
func (s *VpcService) WaitForRouteTableAttachment(id string, status Status, timeout int) error {
deadline := time.Now().Add(time.Duration(timeout) * time.Second)
for {
object, err := s.DescribeRouteTableAttachment(id)
if err != nil {
if errmsgs.NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return errmsgs.WrapError(err)
}
}
if object.Status == string(status) {
return nil
}
if time.Now().After(deadline) {
return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.Status, string(status), errmsgs.ProviderERROR)
}
time.Sleep(3 * time.Second)
}
}
func (s *VpcService) DoVpcDescribenetworkaclattributesRequest(id string) (object map[string]interface{}, err error) {
return s.DescribeNetworkAcl(id)
}
func (s *VpcService) DescribeNetworkAcl(id string) (object map[string]interface{}, err error) {
var response map[string]interface{}
if err != nil {
return nil, errmsgs.WrapError(err)
}
request := map[string]interface{}{
"NetworkAclId": id,
}
response, err = s.client.DoTeaRequest("POST", "VPC", "2016-04-28", "DescribeNetworkAclAttributes", "", nil, nil, request)
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{"InvalidNetworkAcl.NotFound"}) {
return object, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("VPC:NetworkAcl", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR, fmt.Sprint(response["RequestId"]))
}
return object, err
}
v, err := jsonpath.Get("$.NetworkAclAttribute", response)
if err != nil {
return object, errmsgs.WrapErrorf(err, errmsgs.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 errmsgs.WrapError(err)
}
resources, _ := object["Resources"].(map[string]interface{})["Resource"].([]interface{})
if len(resources) < 1 {
return errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("Network Acl Attachment", id)), errmsgs.NotFoundMsg, errmsgs.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 errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("Network Acl Attachment", id)), errmsgs.NotFoundMsg, errmsgs.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 errmsgs.NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return errmsgs.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 errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, networkAclId, GetFunc(1), timeout, fmt.Sprint(object["Status"]), string(status), errmsgs.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 errmsgs.NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return errmsgs.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 errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, fmt.Sprint(object["Status"]), string(status), errmsgs.ProviderERROR)
}
time.Sleep(DefaultIntervalShort * time.Second)
}
}
func (s *VpcService) DescribeTags(resourceId string, resourceTags map[string]interface{}, resourceType TagResourceType) (tags []vpc.TagResource, err error) {
request := vpc.CreateListTagResourcesRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.ResourceType = string(resourceType)
request.ResourceId = &[]string{resourceId}
if resourceTags != nil && len(resourceTags) > 0 {
var reqTags []vpc.ListTagResourcesTag
for key, value := range resourceTags {
reqTags = append(reqTags, vpc.ListTagResourcesTag{
Key: key,
Value: value.(string),
})
}
request.Tag = &reqTags
}
wait := incrementalWait(3*time.Second, 5*time.Second)
var raw interface{}
err = resource.Retry(5*time.Minute, func() *resource.RetryError {
raw, err = s.client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) {
return vpcClient.ListTagResources(request)
})
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{errmsgs.Throttling}) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
return nil
})
if err != nil {
err = errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, resourceId, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR)
return
}
response, _ := raw.(*vpc.ListTagResourcesResponse)
return response.TagResources.TagResource, nil
}
func (s *VpcService) setInstanceTags(d *schema.ResourceData, resourceType TagResourceType) error {
if d.HasChange("tags") {
oraw, nraw := d.GetChange("tags")
o := oraw.(map[string]interface{})
n := nraw.(map[string]interface{})
create, remove := s.diffTags(s.tagsFromMap(o), s.tagsFromMap(n))
if len(remove) > 0 {
var tagKey []string
for _, v := range remove {
tagKey = append(tagKey, v.Key)
}
request := vpc.CreateUnTagResourcesRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.ResourceId = &[]string{d.Id()}
request.ResourceType = string(resourceType)
request.TagKey = &tagKey
request.RegionId = s.client.RegionId
wait := incrementalWait(2*time.Second, 1*time.Second)
err := resource.Retry(10*time.Minute, func() *resource.RetryError {
raw, err := s.client.WithVpcClient(func(client *vpc.Client) (interface{}, error) {
return client.UnTagResources(request)
})
if err != nil {
if errmsgs.IsThrottling(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
return nil
})
if err != nil {
return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR)
}
}
if len(create) > 0 {
request := vpc.CreateTagResourcesRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.ResourceId = &[]string{d.Id()}
request.Tag = &create
request.ResourceType = string(resourceType)
request.RegionId = s.client.RegionId
wait := incrementalWait(2*time.Second, 1*time.Second)
err := resource.Retry(10*time.Minute, func() *resource.RetryError {
raw, err := s.client.WithVpcClient(func(client *vpc.Client) (interface{}, error) {
return client.TagResources(request)
})
if err != nil {
if errmsgs.IsThrottling(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
return nil
})
if err != nil {
return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR)
}
}
//d.SetPartial("tags")
}
return nil
}
func (s *VpcService) tagsToMap(tags []vpc.TagResource) map[string]string {
result := make(map[string]string)
for _, t := range tags {
if !s.ignoreTag(t) {
result[t.TagKey] = t.TagValue
}
}
return result
}
func (s *VpcService) ignoreTag(t vpc.TagResource) bool {
filter := []string{"^aliyun", "^acs:", "^http://", "^https://"}
for _, v := range filter {
log.Printf("[DEBUG] Matching prefix %v with %v\n", v, t.TagKey)
ok, _ := regexp.MatchString(v, t.TagKey)
if ok {
log.Printf("[DEBUG] Found AlibabacloudStack Cloud specific t %s (val: %s), ignoring.\n", t.TagKey, t.TagValue)
return true
}
}
return false
}
func (s *VpcService) tagToMap(tags []vpc.Tag) map[string]string {
result := make(map[string]string)
for _, t := range tags {
if !s.vpcTagIgnored(t) {
result[t.Key] = t.Value
}
}
return result
}
func (s *VpcService) vpcTagIgnored(t vpc.Tag) bool {
filter := []string{"^aliyun", "^acs:", "^http://", "^https://"}
for _, v := range filter {
log.Printf("[DEBUG] Matching prefix %v with %v\n", v, t.Key)
ok, _ := regexp.MatchString(v, t.Key)
if ok {
log.Printf("[DEBUG] Found AlibabacloudStack Cloud specific tag %s (val: %s), ignoring.\n", t.Key, t.Value)
return true
}
}
return false
}
func (s *VpcService) diffTags(oldTags, newTags []vpc.TagResourcesTag) ([]vpc.TagResourcesTag, []vpc.TagResourcesTag) {
// First, we're creating everything we have
create := make(map[string]interface{})
for _, t := range newTags {
create[t.Key] = t.Value
}
// Build the list of what to remove
var remove []vpc.TagResourcesTag
for _, t := range oldTags {
old, ok := create[t.Key]
if !ok || old != t.Value {
// Delete it!
remove = append(remove, t)
}
}
return s.tagsFromMap(create), remove
}
func (s *VpcService) tagsFromMap(m map[string]interface{}) []vpc.TagResourcesTag {
result := make([]vpc.TagResourcesTag, 0, len(m))
for k, v := range m {
result = append(result, vpc.TagResourcesTag{
Key: k,
Value: v.(string),
})
}
return result
}
func (s *VpcService) DescribeVSwitchWithTeadsl(id string) (object map[string]interface{}, err error) {
request := map[string]interface{}{
"VSwitchId": id,
}
response, err := s.client.DoTeaRequest("POST", "VPC", "2016-04-28", "DescribeVSwitchAttributes", "", nil, nil, request)
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{"InvalidVswitchID.NotFound"}) {
return nil, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR)
}
return nil, err
}
if v, ok := response["VSwitchId"].(string); ok && v != id {
return nil, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("vswitch", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
}
return response, 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 errmsgs.NotFoundError(err) {
// Set this to nil as if we didn't find anything.
return nil, "", nil
}
return nil, "", errmsgs.WrapError(err)
}
for _, failState := range failStates {
if fmt.Sprint(object["Status"]) == failState {
return object, fmt.Sprint(object["Status"]), errmsgs.WrapError(errmsgs.Error(errmsgs.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, errmsgs.WrapError(err)
}
deleteResources := make([]map[string]interface{}, 0)
res, err := jsonpath.Get("$.Resources.Resource", acl)
if err != nil {
return object, errmsgs.WrapError(err)
}
resources, _ := res.([]interface{})
if resources != nil && len(resources) < 1 {
return object, nil
}
for _, val := range resources {
item, _ := val.(map[string]interface{})
deleteResources = append(deleteResources, map[string]interface{}{
"ResourceId": item["ResourceId"],
"ResourceType": item["ResourceType"],
})
}
var response map[string]interface{}
request := map[string]interface{}{
"NetworkAclId": id,
"Resource": deleteResources,
}
request["ClientToken"] = buildClientToken("UnassociateNetworkAcl")
response, err = s.client.DoTeaRequest("POST", "VPC", "2016-04-28", "UnassociateNetworkAcl", "", nil, nil, request)
if err != nil {
return response, err
}
stateConf := BuildStateConf([]string{}, []string{"Available"}, 10*time.Minute, 5*time.Second, s.NetworkAclStateRefreshFunc(id, []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return response, errmsgs.WrapErrorf(err, errmsgs.IdMsg, id)
}
return object, nil
}
func (s *VpcService) DescribeVpcIpv6EgressRule(id string) (object map[string]interface{}, err error) {
var response map[string]interface{}
parts, err := ParseResourceId(id, 2)
if err != nil {
err = errmsgs.WrapError(err)
return
}
request := map[string]interface{}{
"PageSize": PageSizeLarge,
"PageNumber": 1,
"Ipv6GatewayId": parts[0],
}
idExist := false
for {
runtime := util.RuntimeOptions{IgnoreSSL: tea.Bool(s.client.Config.Insecure)}
runtime.SetAutoretry(true)
response, err = s.client.DoTeaRequest("POST", "VPC", "2016-04-28", "DescribeIpv6EgressOnlyRules", "", nil, nil, request)
if err != nil {
return object, err
}
v, err := jsonpath.Get("$.Ipv6EgressOnlyRules.Ipv6EgressOnlyRule", response)
if err != nil {
return object, errmsgs.WrapErrorf(err, errmsgs.FailedGetAttributeMsg, id, "$.Ipv6EgressOnlyRules.Ipv6EgressOnlyRule", response)
}
if len(v.([]interface{})) < 1 {
return object, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("VPC", id)), errmsgs.NotFoundWithResponse, response)
}
for _, v := range v.([]interface{}) {
if fmt.Sprint(v.(map[string]interface{})["Ipv6EgressOnlyRuleId"]) == 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, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("VPC", id)), errmsgs.NotFoundWithResponse, response)
}
return
}
func (s *VpcService) VpcIpv6EgressRuleStateRefreshFunc(id string, failStates []string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
object, err := s.DescribeVpcIpv6EgressRule(id)
if err != nil {
if errmsgs.NotFoundError(err) {
// Set this to nil as if we didn't find anything.
return nil, "", nil
}
return nil, "", errmsgs.WrapError(err)
}
for _, failState := range failStates {
if fmt.Sprint(object["Status"]) == failState {
return object, fmt.Sprint(object["Status"]), errmsgs.WrapError(errmsgs.Error(errmsgs.FailedToReachTargetStatus, fmt.Sprint(object["Status"])))
}
}
return object, fmt.Sprint(object["Status"]), nil
}
}
func (s *VpcService) DescribeVpcIpv6Gateway(id string) (object map[string]interface{}, err error) {
var response map[string]interface{}
request := map[string]interface{}{
"Ipv6GatewayId": id,
}
response, err = s.client.DoTeaRequest("POST", "VPC", "2016-04-28", "DescribeIpv6GatewayAttribute", "", nil, nil, request)
if err != nil {
return object, err
}
v, err := jsonpath.Get("$", response)
if err != nil {
return object, errmsgs.WrapErrorf(err, errmsgs.FailedGetAttributeMsg, id, "$", response)
}
object = v.(map[string]interface{})
if Ipv6GatewayId, ok := object["Ipv6GatewayId"]; !ok || fmt.Sprint(Ipv6GatewayId) == "" {
return object, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("VPC", id)), errmsgs.NotFoundWithResponse, response)
}
return object, nil
}
func (s *VpcService) VpcIpv6GatewayStateRefreshFunc(id string, failStates []string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
object, err := s.DescribeVpcIpv6Gateway(id)
if err != nil {
if errmsgs.NotFoundError(err) {
// Set this to nil as if we didn't find anything.
return nil, "", nil
}
return nil, "", errmsgs.WrapError(err)
}
for _, failState := range failStates {
if fmt.Sprint(object["Status"]) == failState {
return object, fmt.Sprint(object["Status"]), errmsgs.WrapError(errmsgs.Error(errmsgs.FailedToReachTargetStatus, fmt.Sprint(object["Status"])))
}
}
return object, fmt.Sprint(object["Status"]), nil
}
}
func (s *VpcService) DescribeVpcIpv6InternetBandwidth(id string) (object map[string]interface{}, err error) {
var response map[string]interface{}
request := map[string]interface{}{
"Ipv6InternetBandwidthId": id,
}
response, err = s.client.DoTeaRequest("POST", "VPC", "2016-04-28", "DescribeIpv6Addresses", "", nil, nil, request)
if err != nil {
return object, err
}
v, err := jsonpath.Get("$.Ipv6Addresses.Ipv6Address", response)
if err != nil {
return object, errmsgs.WrapErrorf(err, errmsgs.FailedGetAttributeMsg, id, "$.Ipv6Addresses.Ipv6Address", response)
}
if len(v.([]interface{})) < 1 {
return object, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("VPC", id)), errmsgs.NotFoundWithResponse, response)
} else {
if fmt.Sprint(v.([]interface{})[0].(map[string]interface{})["Ipv6InternetBandwidth"].(map[string]interface{})["Ipv6InternetBandwidthId"]) != id {
return object, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("VPC", id)), errmsgs.NotFoundWithResponse, response)
}
}
object = v.([]interface{})[0].(map[string]interface{})
return object, nil
}
func (s *VpcService) setInstanceSecondaryCidrBlocks(d *schema.ResourceData) error {
var response map[string]interface{}
var err error
if d.HasChange("secondary_cidr_blocks") {
oraw, nraw := d.GetChange("secondary_cidr_blocks")
removed := oraw.([]interface{})
added := nraw.([]interface{})
if len(removed) > 0 {
action := "UnassociateVpcCidrBlock"
request := map[string]interface{}{
"VpcId": d.Id(),
}
for _, item := range removed {
request["SecondaryCidrBlock"] = item
response, err = s.client.DoTeaRequest("POST", "VPC", "2016-04-28", "UnassociateVpcCidrBlock", "", nil, nil, request)
if err != nil {
return err
}
addDebug(action, response, request)
}
}
if len(added) > 0 {
request := map[string]interface{}{
"VpcId": d.Id(),
}
for _, item := range added {
request["SecondaryCidrBlock"] = item
response, err = s.client.DoTeaRequest("POST", "VPC", "2016-04-28", "AssociateVpcCidrBlock", "", nil, nil, request)
if err != nil {
return err
}
}
}
//d.SetPartial("secondary_cidr_blocks")
}
return nil
}
func (s *VpcService) SetResourceTags(d *schema.ResourceData, resourceType string) error {
if d.HasChange("tags") {
added, removed := parsingTags(d)
removedTagKeys := make([]string, 0)
for _, v := range removed {
if !ignoredTags(v, "") {
removedTagKeys = append(removedTagKeys, v)
}
}
if len(removedTagKeys) > 0 {
action := "UnTagResources"
request := map[string]interface{}{
"ResourceType": resourceType,
"ResourceId.1": d.Id(),
}
for i, key := range removedTagKeys {
request[fmt.Sprintf("TagKey.%d", i+1)] = key
}
_, err := s.client.DoTeaRequest("POST", "VPC", "2016-04-28", action, "", nil, nil, request)
if err != nil {
return err
}
}
if len(added) > 0 {
action := "TagResources"
request := map[string]interface{}{
"ResourceType": resourceType,
"ResourceId.1": d.Id(),
}
count := 1
for key, value := range added {
request[fmt.Sprintf("Tag.%d.Key", count)] = key
request[fmt.Sprintf("Tag.%d.Value", count)] = value
count++
}
_, err := s.client.DoTeaRequest("POST", "VPC", "2016-04-28", action, "", nil, nil, request)
if err != nil {
return err
}
}
//d.SetPartial("tags")
}
return nil
}
func (s *VpcService) ListTagResources(id string, resourceType string) (object interface{}, err error) {
action := "ListTagResources"
request := map[string]interface{}{
"ResourceType": resourceType,
"ResourceId.1": id,
"Product": "Vpc",
"OrganizationId": s.client.Department,
}
tags := make([]interface{}, 0)
var response map[string]interface{}
for {
response, err = s.client.DoTeaRequest("POST", "Vpc", "2016-04-28", action, "", nil, nil, request)
addDebug("ListTagResources", response, request)
if err != nil {
return nil, err
}
v, err := jsonpath.Get("$.TagResources.TagResource", response)
if err != nil {
return nil, errmsgs.WrapErrorf(err, errmsgs.FailedGetAttributeMsg, id, "$.TagResources.TagResource", response)
}
if v != nil {
tags = append(tags, v.([]interface{})...)
}
if response["NextToken"].(string) == "" {
break
}
request["NextToken"] = response["NextToken"]
}
return tags, nil
}
func (s *VpcService) DoVpcDescribephysicalconnectionsRequest(id string) (object map[string]interface{}, err error) {
return s.DescribeExpressConnectPhysicalConnection(id)
}
func (s *VpcService) DescribeExpressConnectPhysicalConnection(id string) (object map[string]interface{}, err error) {
var response map[string]interface{}
action := "DescribePhysicalConnections"
request := map[string]interface{}{
"Product": "Vpc",
"OrganizationId": s.client.Department,
}
filterMapList := make([]map[string]interface{}, 0)
filterMapList = append(filterMapList, map[string]interface{}{
"Key": "PhysicalConnectionId",
"Value": []string{id},
})
request["Filter"] = filterMapList
response, err = s.client.DoTeaRequest("POST", "VPC", "2016-04-28", action, "", nil, nil, request)
if err != nil {
return object, err
}
v, err := jsonpath.Get("$.PhysicalConnectionSet.PhysicalConnectionType", response)
if err != nil {
return object, errmsgs.WrapErrorf(err, errmsgs.FailedGetAttributeMsg, id, "$.PhysicalConnectionSet.PhysicalConnectionType", response)
}
if len(v.([]interface{})) < 1 {
return object, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("ExpressConnect", id)), errmsgs.NotFoundWithResponse, response)
} else {
if fmt.Sprint(v.([]interface{})[0].(map[string]interface{})["PhysicalConnectionId"]) != id {
return object, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("ExpressConnect", id)), errmsgs.NotFoundWithResponse, response)
}
}
object = v.([]interface{})[0].(map[string]interface{})
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 errmsgs.NotFoundError(err) {
// Set this to nil as if we didn't find anything.
return nil, "", nil
}
return nil, "", errmsgs.WrapError(err)
}
for _, failState := range failStates {
if fmt.Sprint(object["Status"]) == failState {
return object, fmt.Sprint(object["Status"]), errmsgs.WrapError(errmsgs.Error(errmsgs.FailedToReachTargetStatus, fmt.Sprint(object["Status"])))
}
}
return object, fmt.Sprint(object["Status"]), nil
}
}
func (s *VpcService) DescribeExpressConnectVirtualBorderRouter(id string) (object map[string]interface{}, err error) {
var response map[string]interface{}
action := "DescribeVirtualBorderRouters"
request := map[string]interface{}{
"PageNumber": 1,
"PageSize": 50,
"Product": "Vpc",
"OrganizationId": s.client.Department,
}
idExist := false
for {
response, err = s.client.DoTeaRequest("POST", "VPC", "2016-04-28", action, "", nil, nil, request)
if err != nil {
return object, err
}
v, err := jsonpath.Get("$.VirtualBorderRouterSet.VirtualBorderRouterType", response)
if err != nil {
return object, errmsgs.WrapErrorf(err, errmsgs.FailedGetAttributeMsg, id, "$.VirtualBorderRouterSet.VirtualBorderRouterType", response)
}
if len(v.([]interface{})) < 1 {
return object, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("ExpressConnect", id)), errmsgs.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, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("ExpressConnect", id)), errmsgs.NotFoundWithResponse, response)
}
return
}
func (s *VpcService) ExpressConnectVirtualBorderRouterStateRefreshFunc(id string, failStates []string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
object, err := s.DescribeExpressConnectVirtualBorderRouter(id)
if err != nil {
if errmsgs.NotFoundError(err) {
// Set this to nil as if we didn't find anything.
return nil, "", nil
}
return nil, "", errmsgs.WrapError(err)
}
for _, failState := range failStates {
if fmt.Sprint(object["Status"]) == failState {
return object, fmt.Sprint(object["Status"]), errmsgs.WrapError(errmsgs.Error(errmsgs.FailedToReachTargetStatus, fmt.Sprint(object["Status"])))
}
}
return object, fmt.Sprint(object["Status"]), nil
}
}