func resourceAliCloudVPNGatewayVpnConnectionCreate()

in alicloud/resource_alicloud_vpn_connection.go [423:721]


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)
}