alicloud/resource_alicloud_vpn_connection.go (1,204 lines of code) (raw):

// Package alicloud. This file is generated automatically. Please do not modify it manually, thank you! package alicloud import ( "encoding/json" "fmt" "log" "time" "github.com/PaesslerAG/jsonpath" "github.com/aliyun/terraform-provider-alicloud/alicloud/connectivity" "github.com/blues/jsonata-go" "github.com/hashicorp/terraform-plugin-sdk/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" ) func resourceAliCloudVPNGatewayVpnConnection() *schema.Resource { return &schema.Resource{ Create: resourceAliCloudVPNGatewayVpnConnectionCreate, Read: resourceAliCloudVPNGatewayVpnConnectionRead, Update: resourceAliCloudVPNGatewayVpnConnectionUpdate, Delete: resourceAliCloudVPNGatewayVpnConnectionDelete, Importer: &schema.ResourceImporter{ State: schema.ImportStatePassthrough, }, Timeouts: &schema.ResourceTimeout{ Create: schema.DefaultTimeout(5 * time.Minute), Update: schema.DefaultTimeout(5 * time.Minute), Delete: schema.DefaultTimeout(5 * time.Minute), }, Schema: map[string]*schema.Schema{ "auto_config_route": { Type: schema.TypeBool, Optional: true, }, "bgp_config": { Type: schema.TypeList, Optional: true, Computed: true, MaxItems: 1, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "status": { Type: schema.TypeString, Computed: true, }, "local_asn": { Type: schema.TypeString, Optional: true, Computed: true, }, "tunnel_cidr": { Type: schema.TypeString, Optional: true, Computed: true, }, "enable": { Type: schema.TypeBool, Optional: true, Computed: true, }, "local_bgp_ip": { Type: schema.TypeString, Optional: true, Computed: true, }, }, }, }, "create_time": { Type: schema.TypeInt, Computed: true, }, "customer_gateway_id": { Type: schema.TypeString, Optional: true, ForceNew: true, }, "effect_immediately": { Type: schema.TypeBool, Optional: true, }, "enable_dpd": { Type: schema.TypeBool, Optional: true, Computed: true, }, "enable_nat_traversal": { Type: schema.TypeBool, Optional: true, Computed: true, }, "enable_tunnels_bgp": { Type: schema.TypeBool, Optional: true, Computed: true, }, "health_check_config": { Type: schema.TypeList, Optional: true, Computed: true, MaxItems: 1, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "enable": { Type: schema.TypeBool, Optional: true, Computed: true, }, "dip": { Type: schema.TypeString, Optional: true, Computed: true, }, "retry": { Type: schema.TypeInt, Optional: true, Computed: true, }, "sip": { Type: schema.TypeString, Optional: true, Computed: true, }, "interval": { Type: schema.TypeInt, Optional: true, Computed: true, }, }, }, }, "ike_config": { Type: schema.TypeList, Optional: true, Computed: true, MaxItems: 1, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "ike_auth_alg": { Type: schema.TypeString, Optional: true, Computed: true, }, "ike_enc_alg": { Type: schema.TypeString, Optional: true, Computed: true, }, "ike_version": { Type: schema.TypeString, Optional: true, Computed: true, }, "ike_local_id": { Type: schema.TypeString, Optional: true, Computed: true, }, "ike_remote_id": { Type: schema.TypeString, Optional: true, Computed: true, }, "ike_mode": { Type: schema.TypeString, Optional: true, Computed: true, }, "ike_lifetime": { Type: schema.TypeInt, Optional: true, Computed: true, }, "psk": { Type: schema.TypeString, Optional: true, Computed: true, }, "ike_pfs": { Type: schema.TypeString, Optional: true, Computed: true, }, }, }, }, "ipsec_config": { Type: schema.TypeList, Optional: true, Computed: true, MaxItems: 1, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "ipsec_pfs": { Type: schema.TypeString, Optional: true, Computed: true, }, "ipsec_enc_alg": { Type: schema.TypeString, Optional: true, Computed: true, }, "ipsec_auth_alg": { Type: schema.TypeString, Optional: true, Computed: true, }, "ipsec_lifetime": { Type: schema.TypeInt, Optional: true, Computed: true, }, }, }, }, "local_subnet": { Type: schema.TypeSet, Required: true, Elem: &schema.Schema{ Type: schema.TypeString, ValidateFunc: validateCIDRNetworkAddress, }, MinItems: 1, MaxItems: 10, }, "network_type": { Type: schema.TypeString, Optional: true, }, "remote_subnet": { Type: schema.TypeSet, Required: true, Elem: &schema.Schema{ Type: schema.TypeString, ValidateFunc: validateCIDRNetworkAddress, }, MinItems: 1, MaxItems: 10, }, "resource_group_id": { Type: schema.TypeString, Computed: true, }, "status": { Type: schema.TypeString, Computed: true, }, "tags": tagsSchema(), "tunnel_options_specification": { Type: schema.TypeList, Optional: true, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "role": { Type: schema.TypeString, Optional: true, Computed: true, }, "status": { Type: schema.TypeString, Computed: true, }, "tunnel_ike_config": { Type: schema.TypeList, Optional: true, MaxItems: 1, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "ike_auth_alg": { Type: schema.TypeString, Optional: true, }, "local_id": { Type: schema.TypeString, Optional: true, Computed: true, }, "ike_enc_alg": { Type: schema.TypeString, Optional: true, }, "ike_version": { Type: schema.TypeString, Optional: true, }, "ike_mode": { Type: schema.TypeString, Optional: true, }, "ike_lifetime": { Type: schema.TypeInt, Optional: true, }, "psk": { Type: schema.TypeString, Optional: true, }, "remote_id": { Type: schema.TypeString, Optional: true, Computed: true, }, "ike_pfs": { Type: schema.TypeString, Optional: true, }, }, }, }, "customer_gateway_id": { Type: schema.TypeString, Optional: true, ForceNew: true, }, "internet_ip": { Type: schema.TypeString, Computed: true, }, "tunnel_bgp_config": { Type: schema.TypeList, Optional: true, MaxItems: 1, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "local_asn": { Type: schema.TypeString, Optional: true, }, "tunnel_cidr": { Type: schema.TypeString, Optional: true, }, "bgp_status": { Type: schema.TypeString, Computed: true, }, "peer_bgp_ip": { Type: schema.TypeString, Computed: true, }, "peer_asn": { Type: schema.TypeString, Computed: true, }, "local_bgp_ip": { Type: schema.TypeString, Optional: true, }, }, }, }, "state": { Type: schema.TypeString, Computed: true, }, "enable_nat_traversal": { Type: schema.TypeBool, Optional: true, }, "tunnel_id": { Type: schema.TypeString, Computed: true, }, "tunnel_ipsec_config": { Type: schema.TypeList, Optional: true, MaxItems: 1, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "ipsec_pfs": { Type: schema.TypeString, Optional: true, }, "ipsec_enc_alg": { Type: schema.TypeString, Optional: true, }, "ipsec_auth_alg": { Type: schema.TypeString, Optional: true, }, "ipsec_lifetime": { Type: schema.TypeInt, Optional: true, }, }, }, }, "enable_dpd": { Type: schema.TypeBool, Optional: true, }, "zone_no": { Type: schema.TypeString, Computed: true, }, }, }, }, "vpn_connection_name": { Type: schema.TypeString, Optional: true, Computed: true, ConflictsWith: []string{"name"}, }, "vpn_gateway_id": { Type: schema.TypeString, Required: true, ForceNew: true, }, "name": { Type: schema.TypeString, Optional: true, Computed: true, Deprecated: "Field 'name' has been deprecated since provider version 1.216.0. New field 'vpn_connection_name' instead.", }, }, } } func resourceAliCloudVPNGatewayVpnConnectionCreate(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AliyunClient) action := "CreateVpnConnection" var request map[string]interface{} var response map[string]interface{} query := make(map[string]interface{}) var err error request = make(map[string]interface{}) request["RegionId"] = client.RegionId request["ClientToken"] = buildClientToken(action) if v, ok := d.GetOk("local_subnet"); ok { request["LocalSubnet"] = convertListToCommaSeparate(v.(*schema.Set).List()) } if v, ok := d.GetOk("remote_subnet"); ok { request["RemoteSubnet"] = convertListToCommaSeparate(v.(*schema.Set).List()) } if v, ok := d.GetOkExists("effect_immediately"); ok { request["EffectImmediately"] = v } if v, ok := d.GetOkExists("enable_dpd"); ok { request["EnableDpd"] = v } if v, ok := d.GetOkExists("enable_nat_traversal"); ok { request["EnableNatTraversal"] = v } objectDataLocalMap := make(map[string]interface{}) if v := d.Get("ike_config"); !IsNil(v) { nodeNative, _ := jsonpath.Get("$[0].psk", d.Get("ike_config")) if nodeNative != nil && nodeNative != "" { objectDataLocalMap["Psk"] = nodeNative } nodeNative1, _ := jsonpath.Get("$[0].ike_version", d.Get("ike_config")) if nodeNative1 != nil && nodeNative1 != "" { objectDataLocalMap["IkeVersion"] = nodeNative1 } nodeNative2, _ := jsonpath.Get("$[0].ike_mode", d.Get("ike_config")) if nodeNative2 != nil && nodeNative2 != "" { objectDataLocalMap["IkeMode"] = nodeNative2 } nodeNative3, _ := jsonpath.Get("$[0].ike_enc_alg", d.Get("ike_config")) if nodeNative3 != nil && nodeNative3 != "" { objectDataLocalMap["IkeEncAlg"] = nodeNative3 } nodeNative4, _ := jsonpath.Get("$[0].ike_auth_alg", d.Get("ike_config")) if nodeNative4 != nil && nodeNative4 != "" { objectDataLocalMap["IkeAuthAlg"] = nodeNative4 } nodeNative5, _ := jsonpath.Get("$[0].ike_pfs", d.Get("ike_config")) if nodeNative5 != nil && nodeNative5 != "" { objectDataLocalMap["IkePfs"] = nodeNative5 } nodeNative6, _ := jsonpath.Get("$[0].ike_lifetime", d.Get("ike_config")) if nodeNative6 != nil && nodeNative6 != "" { objectDataLocalMap["IkeLifetime"] = nodeNative6 } nodeNative7, _ := jsonpath.Get("$[0].ike_local_id", d.Get("ike_config")) if nodeNative7 != nil && nodeNative7 != "" { objectDataLocalMap["LocalId"] = nodeNative7 } nodeNative8, _ := jsonpath.Get("$[0].ike_remote_id", d.Get("ike_config")) if nodeNative8 != nil && nodeNative8 != "" { objectDataLocalMap["RemoteId"] = nodeNative8 } objectDataLocalMapJson, err := json.Marshal(objectDataLocalMap) if err != nil { return WrapError(err) } request["IkeConfig"] = string(objectDataLocalMapJson) } objectDataLocalMap1 := make(map[string]interface{}) if v := d.Get("ipsec_config"); !IsNil(v) { nodeNative9, _ := jsonpath.Get("$[0].ipsec_enc_alg", d.Get("ipsec_config")) if nodeNative9 != nil && nodeNative9 != "" { objectDataLocalMap1["IpsecEncAlg"] = nodeNative9 } nodeNative10, _ := jsonpath.Get("$[0].ipsec_auth_alg", d.Get("ipsec_config")) if nodeNative10 != nil && nodeNative10 != "" { objectDataLocalMap1["IpsecAuthAlg"] = nodeNative10 } nodeNative11, _ := jsonpath.Get("$[0].ipsec_pfs", d.Get("ipsec_config")) if nodeNative11 != nil && nodeNative11 != "" { objectDataLocalMap1["IpsecPfs"] = nodeNative11 } nodeNative12, _ := jsonpath.Get("$[0].ipsec_lifetime", d.Get("ipsec_config")) if nodeNative12 != nil && nodeNative12 != "" { objectDataLocalMap1["IpsecLifetime"] = nodeNative12 } objectDataLocalMap1Json, err := json.Marshal(objectDataLocalMap1) if err != nil { return WrapError(err) } request["IpsecConfig"] = string(objectDataLocalMap1Json) } objectDataLocalMap2 := make(map[string]interface{}) if v := d.Get("bgp_config"); !IsNil(v) { nodeNative13, _ := jsonpath.Get("$[0].local_asn", d.Get("bgp_config")) if nodeNative13 != nil && nodeNative13 != "" { objectDataLocalMap2["LocalAsn"] = nodeNative13 } nodeNative14, _ := jsonpath.Get("$[0].tunnel_cidr", d.Get("bgp_config")) if nodeNative14 != nil && nodeNative14 != "" { objectDataLocalMap2["TunnelCidr"] = nodeNative14 } nodeNative15, _ := jsonpath.Get("$[0].local_bgp_ip", d.Get("bgp_config")) if nodeNative15 != nil && nodeNative15 != "" { objectDataLocalMap2["LocalBgpIp"] = nodeNative15 } nodeNative16, _ := jsonpath.Get("$[0].enable", d.Get("bgp_config")) if nodeNative16 != nil && nodeNative16 != "" { objectDataLocalMap2["EnableBgp"] = nodeNative16 } objectDataLocalMap2Json, err := json.Marshal(objectDataLocalMap2) if err != nil { return WrapError(err) } request["BgpConfig"] = string(objectDataLocalMap2Json) } if v, ok := d.GetOk("customer_gateway_id"); ok { request["CustomerGatewayId"] = v } if v, ok := d.GetOkExists("auto_config_route"); ok { request["AutoConfigRoute"] = v } if v, ok := d.GetOk("name"); ok { request["Name"] = v } if v, ok := d.GetOk("vpn_connection_name"); ok { request["Name"] = v } request["VpnGatewayId"] = d.Get("vpn_gateway_id") if v, ok := d.GetOk("tags"); ok { tagsMap := ConvertTags(v.(map[string]interface{})) request["Tags"] = tagsMap } if v, ok := d.GetOk("tunnel_options_specification"); ok { tunnelOptionsSpecificationMaps := make([]map[string]interface{}, 0) for _, dataLoop1 := range v.([]interface{}) { dataLoop1Tmp := dataLoop1.(map[string]interface{}) dataLoop1Map := make(map[string]interface{}) dataLoop1Map["CustomerGatewayId"] = dataLoop1Tmp["customer_gateway_id"] dataLoop1Map["EnableDpd"] = dataLoop1Tmp["enable_dpd"] dataLoop1Map["EnableNatTraversal"] = dataLoop1Tmp["enable_nat_traversal"] dataLoop1Map["Role"] = dataLoop1Tmp["role"] if !IsNil(dataLoop1Tmp["tunnel_bgp_config"]) { localData2 := make(map[string]interface{}) nodeNative23, _ := jsonpath.Get("$.tunnel_bgp_config[0].local_asn", dataLoop1Tmp) if nodeNative23 != nil && nodeNative23 != "" { localData2["LocalAsn"] = nodeNative23 } nodeNative24, _ := jsonpath.Get("$.tunnel_bgp_config[0].local_bgp_ip", dataLoop1Tmp) if nodeNative24 != nil && nodeNative24 != "" { localData2["LocalBgpIp"] = nodeNative24 } nodeNative25, _ := jsonpath.Get("$.tunnel_bgp_config[0].tunnel_cidr", dataLoop1Tmp) if nodeNative25 != nil && nodeNative25 != "" { localData2["TunnelCidr"] = nodeNative25 } dataLoop1Map["TunnelBgpConfig"] = localData2 } if !IsNil(dataLoop1Tmp["tunnel_ike_config"]) { localData3 := make(map[string]interface{}) nodeNative26, _ := jsonpath.Get("$.tunnel_ike_config[0].ike_auth_alg", dataLoop1Tmp) if nodeNative26 != nil && nodeNative26 != "" { localData3["IkeAuthAlg"] = nodeNative26 } nodeNative27, _ := jsonpath.Get("$.tunnel_ike_config[0].ike_enc_alg", dataLoop1Tmp) if nodeNative27 != nil && nodeNative27 != "" { localData3["IkeEncAlg"] = nodeNative27 } nodeNative28, _ := jsonpath.Get("$.tunnel_ike_config[0].ike_lifetime", dataLoop1Tmp) if nodeNative28 != nil && nodeNative28 != "" { localData3["IkeLifetime"] = nodeNative28 } nodeNative29, _ := jsonpath.Get("$.tunnel_ike_config[0].ike_mode", dataLoop1Tmp) if nodeNative29 != nil && nodeNative29 != "" { localData3["IkeMode"] = nodeNative29 } nodeNative30, _ := jsonpath.Get("$.tunnel_ike_config[0].ike_pfs", dataLoop1Tmp) if nodeNative30 != nil && nodeNative30 != "" { localData3["IkePfs"] = nodeNative30 } nodeNative31, _ := jsonpath.Get("$.tunnel_ike_config[0].ike_version", dataLoop1Tmp) if nodeNative31 != nil && nodeNative31 != "" { localData3["IkeVersion"] = nodeNative31 } nodeNative32, _ := jsonpath.Get("$.tunnel_ike_config[0].local_id", dataLoop1Tmp) if nodeNative32 != nil && nodeNative32 != "" { localData3["LocalId"] = nodeNative32 } nodeNative33, _ := jsonpath.Get("$.tunnel_ike_config[0].psk", dataLoop1Tmp) if nodeNative33 != nil && nodeNative33 != "" { localData3["Psk"] = nodeNative33 } nodeNative34, _ := jsonpath.Get("$.tunnel_ike_config[0].remote_id", dataLoop1Tmp) if nodeNative34 != nil && nodeNative34 != "" { localData3["RemoteId"] = nodeNative34 } dataLoop1Map["TunnelIkeConfig"] = localData3 } if !IsNil(dataLoop1Tmp["tunnel_ipsec_config"]) { localData4 := make(map[string]interface{}) nodeNative35, _ := jsonpath.Get("$.tunnel_ipsec_config[0].ipsec_auth_alg", dataLoop1Tmp) if nodeNative35 != nil && nodeNative35 != "" { localData4["IpsecAuthAlg"] = nodeNative35 } nodeNative36, _ := jsonpath.Get("$.tunnel_ipsec_config[0].ipsec_enc_alg", dataLoop1Tmp) if nodeNative36 != nil && nodeNative36 != "" { localData4["IpsecEncAlg"] = nodeNative36 } nodeNative37, _ := jsonpath.Get("$.tunnel_ipsec_config[0].ipsec_lifetime", dataLoop1Tmp) if nodeNative37 != nil && nodeNative37 != "" { localData4["IpsecLifetime"] = nodeNative37 } nodeNative38, _ := jsonpath.Get("$.tunnel_ipsec_config[0].ipsec_pfs", dataLoop1Tmp) if nodeNative38 != nil && nodeNative38 != "" { localData4["IpsecPfs"] = nodeNative38 } dataLoop1Map["TunnelIpsecConfig"] = localData4 } tunnelOptionsSpecificationMaps = append(tunnelOptionsSpecificationMaps, dataLoop1Map) } request["TunnelOptionsSpecification"] = tunnelOptionsSpecificationMaps } if v, ok := d.GetOkExists("enable_tunnels_bgp"); ok { request["EnableTunnelsBgp"] = v } objectDataLocalMap3 := make(map[string]interface{}) if v := d.Get("health_check_config"); !IsNil(v) { nodeNative39, _ := jsonpath.Get("$[0].enable", d.Get("health_check_config")) if nodeNative39 != nil && nodeNative39 != "" { objectDataLocalMap3["enable"] = nodeNative39 } nodeNative40, _ := jsonpath.Get("$[0].dip", d.Get("health_check_config")) if nodeNative40 != nil && nodeNative40 != "" { objectDataLocalMap3["dip"] = nodeNative40 } nodeNative41, _ := jsonpath.Get("$[0].sip", d.Get("health_check_config")) if nodeNative41 != nil && nodeNative41 != "" { objectDataLocalMap3["sip"] = nodeNative41 } nodeNative42, _ := jsonpath.Get("$[0].interval", d.Get("health_check_config")) if nodeNative42 != nil && nodeNative42 != "" { objectDataLocalMap3["interval"] = nodeNative42 } nodeNative43, _ := jsonpath.Get("$[0].retry", d.Get("health_check_config")) if nodeNative43 != nil && nodeNative43 != "" { objectDataLocalMap3["retry"] = nodeNative43 } objectDataLocalMap3Json, err := json.Marshal(objectDataLocalMap3) if err != nil { return WrapError(err) } request["HealthCheckConfig"] = string(objectDataLocalMap3Json) } wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(d.Timeout(schema.TimeoutCreate), func() *resource.RetryError { response, err = client.RpcPost("Vpc", "2016-04-28", action, query, request, true) request["ClientToken"] = buildClientToken(action) if err != nil { if IsExpectedErrors(err, []string{"Appliance.Configuring", "VpnGateway.Configuring", "VpnTask.CONFLICT", "VpnConnection.Configuring"}) || NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } addDebug(action, response, request) return nil }) if err != nil { return WrapErrorf(err, DefaultErrorMsg, "alicloud_vpn_connection", action, AlibabaCloudSdkGoERROR) } d.SetId(fmt.Sprint(response["VpnConnectionId"])) vPNGatewayServiceV2 := VPNGatewayServiceV2{client} stateConf := BuildStateConf([]string{}, []string{"active"}, d.Timeout(schema.TimeoutCreate), 10*time.Second, vPNGatewayServiceV2.VPNGatewayVpnConnectionStateRefreshFunc(d.Id(), "State", []string{})) if _, err := stateConf.WaitForState(); err != nil { return WrapErrorf(err, IdMsg, d.Id()) } return resourceAliCloudVPNGatewayVpnConnectionUpdate(d, meta) } func resourceAliCloudVPNGatewayVpnConnectionRead(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AliyunClient) vPNGatewayServiceV2 := VPNGatewayServiceV2{client} objectRaw, err := vPNGatewayServiceV2.DescribeVPNGatewayVpnConnection(d.Id()) if err != nil { if !d.IsNewResource() && NotFoundError(err) { log.Printf("[DEBUG] Resource alicloud_vpn_connection DescribeVPNGatewayVpnConnection Failed!!! %s", err) d.SetId("") return nil } return WrapError(err) } d.Set("create_time", objectRaw["CreateTime"]) d.Set("customer_gateway_id", objectRaw["CustomerGatewayId"]) d.Set("effect_immediately", objectRaw["EffectImmediately"]) d.Set("enable_dpd", objectRaw["EnableDpd"]) d.Set("enable_nat_traversal", objectRaw["EnableNatTraversal"]) d.Set("enable_tunnels_bgp", objectRaw["EnableTunnelsBgp"]) d.Set("resource_group_id", objectRaw["ResourceGroupId"]) d.Set("status", objectRaw["Status"]) d.Set("vpn_connection_name", objectRaw["Name"]) d.Set("vpn_gateway_id", objectRaw["VpnGatewayId"]) bgpConfigMaps := make([]map[string]interface{}, 0) bgpConfigMap := make(map[string]interface{}) vpnBgpConfig1Raw := make(map[string]interface{}) if objectRaw["VpnBgpConfig"] != nil { vpnBgpConfig1Raw = objectRaw["VpnBgpConfig"].(map[string]interface{}) } if len(vpnBgpConfig1Raw) > 0 { bgpConfigMap["enable"] = formatBool(vpnBgpConfig1Raw["EnableBgp"]) bgpConfigMap["local_asn"] = vpnBgpConfig1Raw["LocalAsn"] bgpConfigMap["local_bgp_ip"] = vpnBgpConfig1Raw["LocalBgpIp"] bgpConfigMap["status"] = vpnBgpConfig1Raw["Status"] bgpConfigMap["tunnel_cidr"] = vpnBgpConfig1Raw["TunnelCidr"] bgpConfigMaps = append(bgpConfigMaps, bgpConfigMap) } d.Set("bgp_config", bgpConfigMaps) healthCheckConfigMaps := make([]map[string]interface{}, 0) healthCheckConfigMap := make(map[string]interface{}) vcoHealthCheck1Raw := make(map[string]interface{}) if objectRaw["VcoHealthCheck"] != nil { vcoHealthCheck1Raw = objectRaw["VcoHealthCheck"].(map[string]interface{}) } if len(vcoHealthCheck1Raw) > 0 { healthCheckConfigMap["dip"] = vcoHealthCheck1Raw["Dip"] healthCheckConfigMap["enable"] = formatBool(vcoHealthCheck1Raw["Enable"]) healthCheckConfigMap["interval"] = vcoHealthCheck1Raw["Interval"] healthCheckConfigMap["retry"] = vcoHealthCheck1Raw["Retry"] healthCheckConfigMap["sip"] = vcoHealthCheck1Raw["Sip"] healthCheckConfigMaps = append(healthCheckConfigMaps, healthCheckConfigMap) } d.Set("health_check_config", healthCheckConfigMaps) ikeConfigMaps := make([]map[string]interface{}, 0) ikeConfigMap := make(map[string]interface{}) ikeConfig1Raw := make(map[string]interface{}) if objectRaw["IkeConfig"] != nil { ikeConfig1Raw = objectRaw["IkeConfig"].(map[string]interface{}) } if len(ikeConfig1Raw) > 0 { ikeConfigMap["ike_auth_alg"] = ikeConfig1Raw["IkeAuthAlg"] ikeConfigMap["ike_enc_alg"] = ikeConfig1Raw["IkeEncAlg"] ikeConfigMap["ike_lifetime"] = ikeConfig1Raw["IkeLifetime"] ikeConfigMap["ike_local_id"] = ikeConfig1Raw["LocalId"] ikeConfigMap["ike_mode"] = ikeConfig1Raw["IkeMode"] ikeConfigMap["ike_pfs"] = ikeConfig1Raw["IkePfs"] ikeConfigMap["ike_remote_id"] = ikeConfig1Raw["RemoteId"] ikeConfigMap["ike_version"] = ikeConfig1Raw["IkeVersion"] ikeConfigMap["psk"] = ikeConfig1Raw["Psk"] ikeConfigMaps = append(ikeConfigMaps, ikeConfigMap) } d.Set("ike_config", ikeConfigMaps) ipsecConfigMaps := make([]map[string]interface{}, 0) ipsecConfigMap := make(map[string]interface{}) ipsecConfig1Raw := make(map[string]interface{}) if objectRaw["IpsecConfig"] != nil { ipsecConfig1Raw = objectRaw["IpsecConfig"].(map[string]interface{}) } if len(ipsecConfig1Raw) > 0 { ipsecConfigMap["ipsec_auth_alg"] = ipsecConfig1Raw["IpsecAuthAlg"] ipsecConfigMap["ipsec_enc_alg"] = ipsecConfig1Raw["IpsecEncAlg"] ipsecConfigMap["ipsec_lifetime"] = ipsecConfig1Raw["IpsecLifetime"] ipsecConfigMap["ipsec_pfs"] = ipsecConfig1Raw["IpsecPfs"] ipsecConfigMaps = append(ipsecConfigMaps, ipsecConfigMap) } d.Set("ipsec_config", ipsecConfigMaps) tagsMaps, _ := jsonpath.Get("$.Tags.Tag", objectRaw) d.Set("tags", tagsToMap(tagsMaps)) tunnelOptions1Raw, _ := jsonpath.Get("$.TunnelOptionsSpecification.TunnelOptions", objectRaw) tunnelOptionsSpecificationMaps := make([]map[string]interface{}, 0) if tunnelOptions1Raw != nil { for _, tunnelOptionsChild1Raw := range tunnelOptions1Raw.([]interface{}) { tunnelOptionsSpecificationMap := make(map[string]interface{}) tunnelOptionsChild1Raw := tunnelOptionsChild1Raw.(map[string]interface{}) tunnelOptionsSpecificationMap["customer_gateway_id"] = tunnelOptionsChild1Raw["CustomerGatewayId"] tunnelOptionsSpecificationMap["enable_dpd"] = tunnelOptionsChild1Raw["EnableDpd"] tunnelOptionsSpecificationMap["enable_nat_traversal"] = tunnelOptionsChild1Raw["EnableNatTraversal"] tunnelOptionsSpecificationMap["internet_ip"] = tunnelOptionsChild1Raw["InternetIp"] tunnelOptionsSpecificationMap["role"] = tunnelOptionsChild1Raw["Role"] tunnelOptionsSpecificationMap["state"] = tunnelOptionsChild1Raw["State"] tunnelOptionsSpecificationMap["status"] = tunnelOptionsChild1Raw["Status"] tunnelOptionsSpecificationMap["tunnel_id"] = tunnelOptionsChild1Raw["TunnelId"] tunnelOptionsSpecificationMap["zone_no"] = tunnelOptionsChild1Raw["ZoneNo"] tunnelBgpConfigMaps := make([]map[string]interface{}, 0) tunnelBgpConfigMap := make(map[string]interface{}) tunnelBgpConfig1RawObj, _ := jsonpath.Get("$.TunnelBgpConfig", tunnelOptionsChild1Raw) tunnelBgpConfig1Raw := make(map[string]interface{}) if tunnelBgpConfig1RawObj != nil { tunnelBgpConfig1Raw = tunnelBgpConfig1RawObj.(map[string]interface{}) } if len(tunnelBgpConfig1Raw) > 0 { tunnelBgpConfigMap["bgp_status"] = tunnelBgpConfig1Raw["BgpStatus"] tunnelBgpConfigMap["local_asn"] = tunnelBgpConfig1Raw["LocalAsn"] tunnelBgpConfigMap["local_bgp_ip"] = tunnelBgpConfig1Raw["LocalBgpIp"] tunnelBgpConfigMap["peer_asn"] = tunnelBgpConfig1Raw["PeerAsn"] tunnelBgpConfigMap["peer_bgp_ip"] = tunnelBgpConfig1Raw["PeerBgpIp"] tunnelBgpConfigMap["tunnel_cidr"] = tunnelBgpConfig1Raw["TunnelCidr"] tunnelBgpConfigMaps = append(tunnelBgpConfigMaps, tunnelBgpConfigMap) } tunnelOptionsSpecificationMap["tunnel_bgp_config"] = tunnelBgpConfigMaps tunnelIkeConfigMaps := make([]map[string]interface{}, 0) tunnelIkeConfigMap := make(map[string]interface{}) tunnelIkeConfig1RawObj, _ := jsonpath.Get("$.TunnelIkeConfig", tunnelOptionsChild1Raw) tunnelIkeConfig1Raw := make(map[string]interface{}) if tunnelIkeConfig1RawObj != nil { tunnelIkeConfig1Raw = tunnelIkeConfig1RawObj.(map[string]interface{}) } if len(tunnelIkeConfig1Raw) > 0 { tunnelIkeConfigMap["ike_auth_alg"] = tunnelIkeConfig1Raw["IkeAuthAlg"] tunnelIkeConfigMap["ike_enc_alg"] = tunnelIkeConfig1Raw["IkeEncAlg"] tunnelIkeConfigMap["ike_lifetime"] = tunnelIkeConfig1Raw["IkeLifetime"] tunnelIkeConfigMap["ike_mode"] = tunnelIkeConfig1Raw["IkeMode"] tunnelIkeConfigMap["ike_pfs"] = tunnelIkeConfig1Raw["IkePfs"] tunnelIkeConfigMap["ike_version"] = tunnelIkeConfig1Raw["IkeVersion"] tunnelIkeConfigMap["local_id"] = tunnelIkeConfig1Raw["LocalId"] tunnelIkeConfigMap["psk"] = tunnelIkeConfig1Raw["Psk"] tunnelIkeConfigMap["remote_id"] = tunnelIkeConfig1Raw["RemoteId"] tunnelIkeConfigMaps = append(tunnelIkeConfigMaps, tunnelIkeConfigMap) } tunnelOptionsSpecificationMap["tunnel_ike_config"] = tunnelIkeConfigMaps tunnelIpsecConfigMaps := make([]map[string]interface{}, 0) tunnelIpsecConfigMap := make(map[string]interface{}) tunnelIpsecConfig1RawObj, _ := jsonpath.Get("$.TunnelIpsecConfig", tunnelOptionsChild1Raw) tunnelIpsecConfig1Raw := make(map[string]interface{}) if tunnelIpsecConfig1RawObj != nil { tunnelIpsecConfig1Raw = tunnelIpsecConfig1RawObj.(map[string]interface{}) } if len(tunnelIpsecConfig1Raw) > 0 { tunnelIpsecConfigMap["ipsec_auth_alg"] = tunnelIpsecConfig1Raw["IpsecAuthAlg"] tunnelIpsecConfigMap["ipsec_enc_alg"] = tunnelIpsecConfig1Raw["IpsecEncAlg"] tunnelIpsecConfigMap["ipsec_lifetime"] = tunnelIpsecConfig1Raw["IpsecLifetime"] tunnelIpsecConfigMap["ipsec_pfs"] = tunnelIpsecConfig1Raw["IpsecPfs"] tunnelIpsecConfigMaps = append(tunnelIpsecConfigMaps, tunnelIpsecConfigMap) } tunnelOptionsSpecificationMap["tunnel_ipsec_config"] = tunnelIpsecConfigMaps tunnelOptionsSpecificationMaps = append(tunnelOptionsSpecificationMaps, tunnelOptionsSpecificationMap) } } d.Set("tunnel_options_specification", tunnelOptionsSpecificationMaps) e := jsonata.MustCompile("$split($.LocalSubnet, \",\")") evaluation, _ := e.Eval(objectRaw) d.Set("local_subnet", evaluation) e = jsonata.MustCompile("$split($.RemoteSubnet, \",\")") evaluation, _ = e.Eval(objectRaw) d.Set("remote_subnet", evaluation) d.Set("name", d.Get("vpn_connection_name")) return nil } func resourceAliCloudVPNGatewayVpnConnectionUpdate(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AliyunClient) var request map[string]interface{} var response map[string]interface{} var query map[string]interface{} update := false action := "ModifyVpnConnectionAttribute" var err error request = make(map[string]interface{}) query = make(map[string]interface{}) query["VpnConnectionId"] = d.Id() request["RegionId"] = client.RegionId request["ClientToken"] = buildClientToken(action) if !d.IsNewResource() && d.HasChange("local_subnet") { update = true } if !d.IsNewResource() && d.HasChange("remote_subnet") { update = true } if v, ok := d.GetOk("local_subnet"); ok { request["LocalSubnet"] = convertListToCommaSeparate(v.(*schema.Set).List()) } if v, ok := d.GetOk("remote_subnet"); ok { request["RemoteSubnet"] = convertListToCommaSeparate(v.(*schema.Set).List()) } if !d.IsNewResource() && d.HasChange("effect_immediately") { update = true request["EffectImmediately"] = d.Get("effect_immediately") } if v, ok := d.GetOkExists("auto_config_route"); ok { request["AutoConfigRoute"] = v } if !d.IsNewResource() && d.HasChange("enable_dpd") { update = true request["EnableDpd"] = d.Get("enable_dpd") } if !d.IsNewResource() && d.HasChange("enable_nat_traversal") { update = true request["EnableNatTraversal"] = d.Get("enable_nat_traversal") } if !d.IsNewResource() && d.HasChange("enable_tunnels_bgp") { request["EnableTunnelsBgp"] = d.Get("enable_tunnels_bgp") } if !d.IsNewResource() && d.HasChange("name") { update = true request["Name"] = d.Get("name") } if !d.IsNewResource() && d.HasChange("vpn_connection_name") { update = true request["Name"] = d.Get("vpn_connection_name") } if !d.IsNewResource() && d.HasChange("ike_config") { update = true objectDataLocalMap := make(map[string]interface{}) if v := d.Get("ike_config"); v != nil { nodeNative, _ := jsonpath.Get("$[0].ike_lifetime", v) if nodeNative != nil && nodeNative != "" { objectDataLocalMap["IkeLifetime"] = nodeNative } nodeNative1, _ := jsonpath.Get("$[0].ike_enc_alg", v) if nodeNative1 != nil && nodeNative1 != "" { objectDataLocalMap["IkeEncAlg"] = nodeNative1 } nodeNative2, _ := jsonpath.Get("$[0].ike_mode", v) if nodeNative2 != nil && nodeNative2 != "" { objectDataLocalMap["IkeMode"] = nodeNative2 } nodeNative3, _ := jsonpath.Get("$[0].ike_version", v) if nodeNative3 != nil && nodeNative3 != "" { objectDataLocalMap["IkeVersion"] = nodeNative3 } nodeNative4, _ := jsonpath.Get("$[0].ike_pfs", v) if nodeNative4 != nil && nodeNative4 != "" { objectDataLocalMap["IkePfs"] = nodeNative4 } nodeNative5, _ := jsonpath.Get("$[0].psk", v) if nodeNative5 != nil && nodeNative5 != "" { objectDataLocalMap["Psk"] = nodeNative5 } nodeNative6, _ := jsonpath.Get("$[0].ike_auth_alg", v) if nodeNative6 != nil && nodeNative6 != "" { objectDataLocalMap["IkeAuthAlg"] = nodeNative6 } nodeNative7, _ := jsonpath.Get("$[0].ike_local_id", v) if nodeNative7 != nil && nodeNative7 != "" { objectDataLocalMap["LocalId"] = nodeNative7 } nodeNative8, _ := jsonpath.Get("$[0].ike_remote_id", v) if nodeNative8 != nil && nodeNative8 != "" { objectDataLocalMap["RemoteId"] = nodeNative8 } objectDataLocalMapJson, err := json.Marshal(objectDataLocalMap) if err != nil { return WrapError(err) } request["IkeConfig"] = string(objectDataLocalMapJson) } } if !d.IsNewResource() && d.HasChange("ipsec_config") { update = true objectDataLocalMap1 := make(map[string]interface{}) if v := d.Get("ipsec_config"); v != nil { nodeNative9, _ := jsonpath.Get("$[0].ipsec_auth_alg", v) if nodeNative9 != nil && nodeNative9 != "" { objectDataLocalMap1["IpsecAuthAlg"] = nodeNative9 } nodeNative10, _ := jsonpath.Get("$[0].ipsec_lifetime", v) if nodeNative10 != nil && nodeNative10 != "" { objectDataLocalMap1["IpsecLifetime"] = nodeNative10 } nodeNative11, _ := jsonpath.Get("$[0].ipsec_enc_alg", v) if nodeNative11 != nil && nodeNative11 != "" { objectDataLocalMap1["IpsecEncAlg"] = nodeNative11 } nodeNative12, _ := jsonpath.Get("$[0].ipsec_pfs", v) if nodeNative12 != nil && nodeNative12 != "" { objectDataLocalMap1["IpsecPfs"] = nodeNative12 } objectDataLocalMap1Json, err := json.Marshal(objectDataLocalMap1) if err != nil { return WrapError(err) } request["IpsecConfig"] = string(objectDataLocalMap1Json) } } if !d.IsNewResource() && d.HasChange("bgp_config") { update = true objectDataLocalMap2 := make(map[string]interface{}) if v := d.Get("bgp_config"); v != nil { nodeNative13, _ := jsonpath.Get("$[0].tunnel_cidr", v) if nodeNative13 != nil && nodeNative13 != "" { objectDataLocalMap2["TunnelCidr"] = nodeNative13 } nodeNative14, _ := jsonpath.Get("$[0].enable", v) if nodeNative14 != nil && nodeNative14 != "" { objectDataLocalMap2["EnableBgp"] = nodeNative14 } nodeNative15, _ := jsonpath.Get("$[0].local_bgp_ip", v) if nodeNative15 != nil && nodeNative15 != "" { objectDataLocalMap2["LocalBgpIp"] = nodeNative15 } nodeNative16, _ := jsonpath.Get("$[0].local_asn", v) if nodeNative16 != nil && nodeNative16 != "" { objectDataLocalMap2["LocalAsn"] = nodeNative16 } objectDataLocalMap2Json, err := json.Marshal(objectDataLocalMap2) if err != nil { return WrapError(err) } request["BgpConfig"] = string(objectDataLocalMap2Json) } } if !d.IsNewResource() && d.HasChange("tunnel_options_specification") { update = true if v, ok := d.GetOk("tunnel_options_specification"); ok { tunnelOptionsSpecificationMaps := make([]map[string]interface{}, 0) for _, dataLoop := range v.([]interface{}) { dataLoopTmp := dataLoop.(map[string]interface{}) dataLoopMap := make(map[string]interface{}) dataLoopMap["EnableDpd"] = dataLoopTmp["enable_dpd"] dataLoopMap["EnableNatTraversal"] = dataLoopTmp["enable_nat_traversal"] if !IsNil(dataLoopTmp["tunnel_bgp_config"]) { localData1 := make(map[string]interface{}) nodeNative19, _ := jsonpath.Get("$.tunnel_bgp_config[0].local_asn", dataLoopTmp) if nodeNative19 != nil && nodeNative19 != "" { localData1["LocalAsn"] = nodeNative19 } nodeNative20, _ := jsonpath.Get("$.tunnel_bgp_config[0].local_bgp_ip", dataLoopTmp) if nodeNative20 != nil && nodeNative20 != "" { localData1["LocalBgpIp"] = nodeNative20 } nodeNative21, _ := jsonpath.Get("$.tunnel_bgp_config[0].tunnel_cidr", dataLoopTmp) if nodeNative21 != nil && nodeNative21 != "" { localData1["TunnelCidr"] = nodeNative21 } dataLoopMap["TunnelBgpConfig"] = localData1 } if !IsNil(dataLoopTmp["tunnel_ike_config"]) { localData2 := make(map[string]interface{}) nodeNative22, _ := jsonpath.Get("$.tunnel_ike_config[0].ike_auth_alg", dataLoopTmp) if nodeNative22 != nil && nodeNative22 != "" { localData2["IkeAuthAlg"] = nodeNative22 } nodeNative23, _ := jsonpath.Get("$.tunnel_ike_config[0].ike_enc_alg", dataLoopTmp) if nodeNative23 != nil && nodeNative23 != "" { localData2["IkeEncAlg"] = nodeNative23 } nodeNative24, _ := jsonpath.Get("$.tunnel_ike_config[0].ike_lifetime", dataLoopTmp) if nodeNative24 != nil && nodeNative24 != "" { localData2["IkeLifetime"] = nodeNative24 } nodeNative25, _ := jsonpath.Get("$.tunnel_ike_config[0].ike_mode", dataLoopTmp) if nodeNative25 != nil && nodeNative25 != "" { localData2["IkeMode"] = nodeNative25 } nodeNative26, _ := jsonpath.Get("$.tunnel_ike_config[0].ike_pfs", dataLoopTmp) if nodeNative26 != nil && nodeNative26 != "" { localData2["IkePfs"] = nodeNative26 } nodeNative27, _ := jsonpath.Get("$.tunnel_ike_config[0].ike_version", dataLoopTmp) if nodeNative27 != nil && nodeNative27 != "" { localData2["IkeVersion"] = nodeNative27 } nodeNative28, _ := jsonpath.Get("$.tunnel_ike_config[0].local_id", dataLoopTmp) if nodeNative28 != nil && nodeNative28 != "" { localData2["LocalId"] = nodeNative28 } nodeNative29, _ := jsonpath.Get("$.tunnel_ike_config[0].psk", dataLoopTmp) if nodeNative29 != nil && nodeNative29 != "" { localData2["Psk"] = nodeNative29 } nodeNative30, _ := jsonpath.Get("$.tunnel_ike_config[0].remote_id", dataLoopTmp) if nodeNative30 != nil && nodeNative30 != "" { localData2["RemoteId"] = nodeNative30 } dataLoopMap["TunnelIkeConfig"] = localData2 } if !IsNil(dataLoopTmp["tunnel_ipsec_config"]) { localData3 := make(map[string]interface{}) nodeNative31, _ := jsonpath.Get("$.tunnel_ipsec_config[0].ipsec_auth_alg", dataLoopTmp) if nodeNative31 != nil && nodeNative31 != "" { localData3["IpsecAuthAlg"] = nodeNative31 } nodeNative32, _ := jsonpath.Get("$.tunnel_ipsec_config[0].ipsec_enc_alg", dataLoopTmp) if nodeNative32 != nil && nodeNative32 != "" { localData3["IpsecEncAlg"] = nodeNative32 } nodeNative33, _ := jsonpath.Get("$.tunnel_ipsec_config[0].ipsec_lifetime", dataLoopTmp) if nodeNative33 != nil && nodeNative33 != "" { localData3["IpsecLifetime"] = nodeNative33 } nodeNative34, _ := jsonpath.Get("$.tunnel_ipsec_config[0].ipsec_pfs", dataLoopTmp) if nodeNative34 != nil && nodeNative34 != "" { localData3["IpsecPfs"] = nodeNative34 } dataLoopMap["TunnelIpsecConfig"] = localData3 } dataLoopMap["Role"] = dataLoopTmp["role"] tunnelOptionsSpecificationMaps = append(tunnelOptionsSpecificationMaps, dataLoopMap) } request["TunnelOptionsSpecification"] = tunnelOptionsSpecificationMaps } } if d.HasChange("health_check_config") { update = true objectDataLocalMap3 := make(map[string]interface{}) if v := d.Get("health_check_config"); v != nil { nodeNative36, _ := jsonpath.Get("$[0].enable", v) if nodeNative36 != nil && nodeNative36 != "" { objectDataLocalMap3["Enable"] = nodeNative36 } nodeNative37, _ := jsonpath.Get("$[0].dip", v) if nodeNative37 != nil && nodeNative37 != "" { objectDataLocalMap3["Dip"] = nodeNative37 } nodeNative38, _ := jsonpath.Get("$[0].sip", v) if nodeNative38 != nil && nodeNative38 != "" { objectDataLocalMap3["Sip"] = nodeNative38 } nodeNative39, _ := jsonpath.Get("$[0].interval", v) if nodeNative39 != nil && nodeNative39 != "" { objectDataLocalMap3["Interval"] = nodeNative39 } nodeNative40, _ := jsonpath.Get("$[0].retry", v) if nodeNative40 != nil && nodeNative40 != "" { objectDataLocalMap3["Retry"] = nodeNative40 } objectDataLocalMap3Json, err := json.Marshal(objectDataLocalMap3) if err != nil { return WrapError(err) } request["HealthCheckConfig"] = string(objectDataLocalMap3Json) } } if update { wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError { response, err = client.RpcPost("Vpc", "2016-04-28", action, query, request, true) request["ClientToken"] = buildClientToken(action) if err != nil { if IsExpectedErrors(err, []string{"VpnGateway.Configuring", "VpnTask.CONFLICT"}) || NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } addDebug(action, response, request) return nil }) if err != nil { return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR) } vPNGatewayServiceV2 := VPNGatewayServiceV2{client} stateConf := BuildStateConf([]string{}, []string{"active"}, d.Timeout(schema.TimeoutUpdate), 10*time.Second, vPNGatewayServiceV2.VPNGatewayVpnConnectionStateRefreshFunc(d.Id(), "State", []string{})) if _, err := stateConf.WaitForState(); err != nil { return WrapErrorf(err, IdMsg, d.Id()) } } if d.HasChange("tags") { vPNGatewayServiceV2 := VPNGatewayServiceV2{client} if err := vPNGatewayServiceV2.SetResourceTags(d, "VPNCONNECTION"); err != nil { return WrapError(err) } } return resourceAliCloudVPNGatewayVpnConnectionRead(d, meta) } func resourceAliCloudVPNGatewayVpnConnectionDelete(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AliyunClient) action := "DeleteVpnConnection" var request map[string]interface{} var response map[string]interface{} query := make(map[string]interface{}) var err error request = make(map[string]interface{}) query["VpnConnectionId"] = d.Id() request["RegionId"] = client.RegionId request["ClientToken"] = buildClientToken(action) wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError { response, err = client.RpcPost("Vpc", "2016-04-28", action, query, request, true) request["ClientToken"] = buildClientToken(action) if err != nil { if IsExpectedErrors(err, []string{"VpnGateway.Configuring", "Appliance.Configuring", "VpnTask.CONFLICT", "VpnConnection.Configuring"}) || NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } addDebug(action, response, request) return nil }) if err != nil { return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR) } vPNGatewayServiceV2 := VPNGatewayServiceV2{client} stateConf := BuildStateConf([]string{}, []string{}, d.Timeout(schema.TimeoutDelete), 5*time.Second, vPNGatewayServiceV2.VPNGatewayVpnConnectionStateRefreshFunc(d.Id(), "Status", []string{})) if _, err := stateConf.WaitForState(); err != nil { return WrapErrorf(err, IdMsg, d.Id()) } return nil }