func resourceAliCloudVPNGatewayVpnConnectionUpdate()

in alicloud/resource_alicloud_vpn_connection.go [904:1227]


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