func resourceAliCloudServiceMeshServiceMeshUpdate()

in alicloud/resource_alicloud_service_mesh_service_mesh.go [1136:1929]


func resourceAliCloudServiceMeshServiceMeshUpdate(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
	d.Partial(true)
	action := "UpdateMeshFeature"
	var err error
	request = make(map[string]interface{})
	query = make(map[string]interface{})
	request["ServiceMeshId"] = d.Id()

	if !d.IsNewResource() && d.HasChange("mesh_config.0.tracing") {
		update = true
		jsonPathResult, err := jsonpath.Get("$[0].tracing", d.Get("mesh_config"))
		if err == nil {
			request["Tracing"] = jsonPathResult
		}
	}

	if !d.IsNewResource() && d.HasChange("mesh_config.0.pilot.0.trace_sampling") {
		update = true
		jsonPathResult1, err := jsonpath.Get("$[0].pilot[0].trace_sampling", d.Get("mesh_config"))
		if err == nil {
			request["TraceSampling"] = jsonPathResult1
		}
	}

	if !d.IsNewResource() && d.HasChange("mesh_config.0.telemetry") {
		update = true
		jsonPathResult2, err := jsonpath.Get("$[0].telemetry", d.Get("mesh_config"))
		if err == nil {
			request["Telemetry"] = jsonPathResult2
		}
	}

	if !d.IsNewResource() && d.HasChange("mesh_config.0.customized_zipkin") {
		update = true
		jsonPathResult3, err := jsonpath.Get("$[0].customized_zipkin", d.Get("mesh_config"))
		if err == nil {
			request["CustomizedZipkin"] = jsonPathResult3
		}
	}

	if d.HasChange("mesh_config.0.outbound_traffic_policy") {
		update = true
		jsonPathResult4, err := jsonpath.Get("$[0].outbound_traffic_policy", d.Get("mesh_config"))
		if err == nil {
			request["OutboundTrafficPolicy"] = jsonPathResult4
		}
	}

	if !d.IsNewResource() && d.HasChange("mesh_config.0.include_ip_ranges") {
		update = true
		jsonPathResult5, err := jsonpath.Get("$[0].include_ip_ranges", d.Get("mesh_config"))
		if err == nil {
			request["IncludeIPRanges"] = jsonPathResult5
		}
	}

	if d.HasChange("mesh_config.0.sidecar_injector.0.enable_namespaces_by_default") {
		update = true
		jsonPathResult6, err := jsonpath.Get("$[0].sidecar_injector[0].enable_namespaces_by_default", d.Get("mesh_config"))
		if err == nil {
			request["EnableNamespacesByDefault"] = jsonPathResult6
		}
	}

	if d.HasChange("mesh_config.0.pilot.0.http10_enabled") {
		update = true
		jsonPathResult7, err := jsonpath.Get("$[0].pilot[0].http10_enabled", d.Get("mesh_config"))
		if err == nil {
			request["Http10Enabled"] = jsonPathResult7
		}
	}

	if !d.IsNewResource() && d.HasChange("mesh_config.0.opa.0.log_level") {
		update = true
		jsonPathResult8, err := jsonpath.Get("$[0].opa[0].log_level", d.Get("mesh_config"))
		if err == nil {
			request["OPALogLevel"] = jsonPathResult8
		}
	}

	if !d.IsNewResource() && d.HasChange("mesh_config.0.opa.0.request_cpu") {
		update = true
		jsonPathResult9, err := jsonpath.Get("$[0].opa[0].request_cpu", d.Get("mesh_config"))
		if err == nil {
			request["OPARequestCPU"] = jsonPathResult9
		}
	}

	if !d.IsNewResource() && d.HasChange("mesh_config.0.opa.0.request_memory") {
		update = true
		jsonPathResult10, err := jsonpath.Get("$[0].opa[0].request_memory", d.Get("mesh_config"))
		if err == nil {
			request["OPARequestMemory"] = jsonPathResult10
		}
	}

	if !d.IsNewResource() && d.HasChange("mesh_config.0.opa.0.limit_cpu") {
		update = true
		jsonPathResult11, err := jsonpath.Get("$[0].opa[0].limit_cpu", d.Get("mesh_config"))
		if err == nil {
			request["OPALimitCPU"] = jsonPathResult11
		}
	}

	if !d.IsNewResource() && d.HasChange("mesh_config.0.opa.0.limit_memory") {
		update = true
		jsonPathResult12, err := jsonpath.Get("$[0].opa[0].limit_memory", d.Get("mesh_config"))
		if err == nil {
			request["OPALimitMemory"] = jsonPathResult12
		}
	}

	if !d.IsNewResource() && d.HasChange("mesh_config.0.proxy.0.limit_cpu") {
		update = true
		jsonPathResult13, err := jsonpath.Get("$[0].proxy[0].limit_cpu", d.Get("mesh_config"))
		if err == nil {
			request["ProxyLimitCPU"] = jsonPathResult13
		}
	}

	if !d.IsNewResource() && d.HasChange("mesh_config.0.proxy.0.request_cpu") {
		update = true
		jsonPathResult14, err := jsonpath.Get("$[0].proxy[0].request_cpu", d.Get("mesh_config"))
		if err == nil {
			request["ProxyRequestCPU"] = jsonPathResult14
		}
	}

	if !d.IsNewResource() && d.HasChange("mesh_config.0.proxy.0.limit_memory") {
		update = true
		jsonPathResult15, err := jsonpath.Get("$[0].proxy[0].limit_memory", d.Get("mesh_config"))
		if err == nil {
			request["ProxyLimitMemory"] = jsonPathResult15
		}
	}

	if !d.IsNewResource() && d.HasChange("mesh_config.0.access_log.0.enabled") {
		update = true
		jsonPathResult16, err := jsonpath.Get("$[0].access_log[0].enabled", d.Get("mesh_config"))
		if err == nil {
			request["AccessLogEnabled"] = jsonPathResult16
		}
	}

	if d.HasChange("mesh_config.0.sidecar_injector.0.init_cni_configuration.0.exclude_namespaces") && (d.Get("cluster_spec") == "enterprise" || d.Get("cluster_spec") == "ultimate") {
		update = true
		jsonPathResult18, err := jsonpath.Get("$[0].sidecar_injector[0].init_cni_configuration[0].exclude_namespaces", d.Get("mesh_config"))
		if err == nil {
			request["CniExcludeNamespaces"] = jsonPathResult18
		}
	}

	if d.HasChange("mesh_config.0.sidecar_injector.0.init_cni_configuration.0.enabled") && (d.Get("cluster_spec") == "enterprise" || d.Get("cluster_spec") == "ultimate") {
		update = true
	}
	jsonPathResult19, err := jsonpath.Get("$[0].sidecar_injector[0].init_cni_configuration[0].enabled", d.Get("mesh_config"))
	if err == nil {
		request["CniEnabled"] = jsonPathResult19
	}

	if !d.IsNewResource() && d.HasChange("mesh_config.0.proxy.0.request_memory") {
		update = true
		jsonPathResult19, err := jsonpath.Get("$[0].proxy[0].request_memory", d.Get("mesh_config"))
		if err == nil {
			request["ProxyRequestMemory"] = jsonPathResult19
		}
	}

	if d.HasChange("mesh_config.0.sidecar_injector.0.request_memory") {
		update = true
		jsonPathResult20, err := jsonpath.Get("$[0].sidecar_injector[0].request_memory", d.Get("mesh_config"))
		if err == nil {
			request["SidecarInjectorRequestMemory"] = jsonPathResult20
		}
	}

	if d.HasChange("mesh_config.0.sidecar_injector.0.limit_memory") {
		update = true
		jsonPathResult21, err := jsonpath.Get("$[0].sidecar_injector[0].limit_memory", d.Get("mesh_config"))
		if err == nil {
			request["SidecarInjectorLimitMemory"] = jsonPathResult21
		}
	}

	if d.HasChange("mesh_config.0.sidecar_injector.0.limit_cpu") {
		update = true
		jsonPathResult22, err := jsonpath.Get("$[0].sidecar_injector[0].limit_cpu", d.Get("mesh_config"))
		if err == nil {
			request["SidecarInjectorLimitCPU"] = jsonPathResult22
		}
	}

	if d.HasChange("mesh_config.0.sidecar_injector.0.request_cpu") {
		update = true
		jsonPathResult23, err := jsonpath.Get("$[0].sidecar_injector[0].request_cpu", d.Get("mesh_config"))
		if err == nil {
			request["SidecarInjectorRequestCPU"] = jsonPathResult23
		}
	}

	if !d.IsNewResource() && d.HasChange("mesh_config.0.opa.0.enabled") {
		update = true
	}
	jsonPathResult25, err := jsonpath.Get("$[0].opa[0].enabled", d.Get("mesh_config"))
	if err == nil {
		request["OpaEnabled"] = jsonPathResult25
	}

	if v, ok := d.GetOkExists("customized_prometheus"); ok {
		request["CustomizedPrometheus"] = v
	}
	if v, ok := d.GetOk("prometheus_url"); ok {
		request["PrometheusUrl"] = v
	}
	if d.HasChange("mesh_config.0.sidecar_injector.0.auto_injection_policy_enabled") {
		update = true
	}
	jsonPathResult28, err := jsonpath.Get("$[0].sidecar_injector[0].auto_injection_policy_enabled", d.Get("mesh_config"))
	if err == nil {
		request["AutoInjectionPolicyEnabled"] = jsonPathResult28
	}

	if !d.IsNewResource() && d.HasChange("mesh_config.0.access_log.0.project") {
		update = true
		jsonPathResult28, err := jsonpath.Get("$[0].access_log[0].project", d.Get("mesh_config"))
		if err == nil {
			request["AccessLogProject"] = jsonPathResult28
		}
	}

	if d.HasChange("mesh_config.0.access_log.0.gateway_enabled") {
		update = true
		jsonPathResult29, err := jsonpath.Get("$[0].access_log[0].gateway_enabled", d.Get("mesh_config"))
		if err == nil {
			request["AccessLogGatewayEnabled"] = jsonPathResult29
		}
	}

	if d.HasChange("mesh_config.0.access_log.0.sidecar_enabled") {
		update = true
		jsonPathResult30, err := jsonpath.Get("$[0].access_log[0].sidecar_enabled", d.Get("mesh_config"))
		if err == nil {
			request["AccessLogSidecarEnabled"] = jsonPathResult30
		}
	}

	if d.HasChange("mesh_config.0.access_log.0.gateway_lifecycle") {
		update = true
		jsonPathResult31, err := jsonpath.Get("$[0].access_log[0].gateway_lifecycle", d.Get("mesh_config"))
		if err == nil && jsonPathResult31.(int) > 0 {
			request["AccessLogGatewayLifecycle"] = jsonPathResult31
		}
	}

	if d.HasChange("mesh_config.0.access_log.0.sidecar_lifecycle") {
		update = true
		jsonPathResult32, err := jsonpath.Get("$[0].access_log[0].sidecar_lifecycle", d.Get("mesh_config"))
		if err == nil && jsonPathResult32.(int) > 0 {
			request["AccessLogSidecarLifecycle"] = jsonPathResult32
		}
	}

	if !d.IsNewResource() && d.HasChange("mesh_config.0.audit.0.project") {
		update = true
	}
	jsonPathResult34, err := jsonpath.Get("$[0].audit[0].project", d.Get("mesh_config"))
	if err == nil {
		request["AuditProject"] = jsonPathResult34
	}

	if !d.IsNewResource() && d.HasChange("mesh_config.0.audit.0.enabled") {
		update = true
	}
	jsonPathResult35, err := jsonpath.Get("$[0].audit[0].enabled", d.Get("mesh_config"))
	if err == nil {
		request["EnableAudit"] = jsonPathResult35
	}

	if !d.IsNewResource() && d.HasChange("cluster_spec") {
		update = true
		request["ClusterSpec"] = d.Get("cluster_spec")
	}

	if update {
		wait := incrementalWait(3*time.Second, 5*time.Second)
		err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
			response, err = client.RpcPost("servicemesh", "2020-01-11", action, query, request, true)
			if err != nil {
				if 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)
		}
		serviceMeshServiceV2 := ServiceMeshServiceV2{client}
		stateConf := BuildStateConf([]string{}, []string{"running"}, d.Timeout(schema.TimeoutUpdate), 30*time.Second, serviceMeshServiceV2.ServiceMeshServiceMeshStateRefreshFunc(d.Id(), "$.ServiceMeshInfo.State", []string{}))
		if _, err := stateConf.WaitForState(); err != nil {
			return WrapErrorf(err, IdMsg, d.Id())
		}
	}
	update = false
	action = "UpdateMeshCRAggregation"
	request = make(map[string]interface{})
	query = make(map[string]interface{})
	request["ServiceMeshId"] = d.Id()

	if d.HasChange("extra_configuration.0.cr_aggregation_enabled") {
		update = true
		jsonPathResult, err := jsonpath.Get("$[0].cr_aggregation_enabled", d.Get("extra_configuration"))
		if err == nil {
			request["Enabled"] = jsonPathResult
		}
	}

	if update {
		wait := incrementalWait(3*time.Second, 5*time.Second)
		err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
			response, err = client.RpcPost("servicemesh", "2020-01-11", action, query, request, true)
			if err != nil {
				if 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)
		}
		serviceMeshServiceV2 := ServiceMeshServiceV2{client}
		stateConf := BuildStateConf([]string{}, []string{"running"}, d.Timeout(schema.TimeoutUpdate), 5*time.Second, serviceMeshServiceV2.ServiceMeshServiceMeshStateRefreshFunc(d.Id(), "$.ServiceMeshInfo.State", []string{}))
		if _, err := stateConf.WaitForState(); err != nil {
			return WrapErrorf(err, IdMsg, d.Id())
		}
	}
	update = false
	action = "UpgradeMeshEditionPartially"
	request = make(map[string]interface{})
	query = make(map[string]interface{})
	request["ServiceMeshId"] = d.Id()

	if !d.IsNewResource() && d.HasChange("version") {
		update = true
		request["ExpectedVersion"] = d.Get("version")
	}

	request["ASMGatewayContinue"] = "false"
	if update {
		wait := incrementalWait(3*time.Second, 5*time.Second)
		err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
			response, err = client.RpcPost("servicemesh", "2020-01-11", action, query, request, true)
			if err != nil {
				if 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)
		}
		serviceMeshServiceV2 := ServiceMeshServiceV2{client}
		stateConf := BuildStateConf([]string{}, []string{"running"}, d.Timeout(schema.TimeoutUpdate), 30*time.Second, serviceMeshServiceV2.ServiceMeshServiceMeshStateRefreshFunc(d.Id(), "$.ServiceMeshInfo.State", []string{}))
		if _, err := stateConf.WaitForState(); err != nil {
			return WrapErrorf(err, IdMsg, d.Id())
		}
	}
	update = false
	action = "UpdateControlPlaneLogConfig"
	request = make(map[string]interface{})
	query = make(map[string]interface{})
	request["ServiceMeshId"] = d.Id()

	if !d.IsNewResource() && d.HasChange("mesh_config.0.control_plane_log.0.enabled") {
		update = true
	}
	jsonPathResult, err := jsonpath.Get("$[0].control_plane_log[0].enabled", d.Get("mesh_config"))
	if err == nil {
		request["Enabled"] = jsonPathResult
	}

	if !d.IsNewResource() && d.HasChange("mesh_config.0.control_plane_log.0.project") {
		update = true
		jsonPathResult1, err := jsonpath.Get("$[0].control_plane_log[0].project", d.Get("mesh_config"))
		if err == nil {
			request["Project"] = jsonPathResult1
		}
	}

	if d.HasChange("mesh_config.0.control_plane_log.0.log_ttl_in_day") {
		update = true
		jsonPathResult2, err := jsonpath.Get("$[0].control_plane_log[0].log_ttl_in_day", d.Get("mesh_config"))
		if err == nil && jsonPathResult2.(int) > 0 {
			request["LogTTLInDay"] = jsonPathResult2
		}
	}

	if update {
		wait := incrementalWait(3*time.Second, 5*time.Second)
		err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
			response, err = client.RpcPost("servicemesh", "2020-01-11", action, query, request, true)
			if err != nil {
				if 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)
		}
		serviceMeshServiceV2 := ServiceMeshServiceV2{client}
		stateConf := BuildStateConf([]string{}, []string{"running"}, d.Timeout(schema.TimeoutUpdate), 5*time.Second, serviceMeshServiceV2.ServiceMeshServiceMeshStateRefreshFunc(d.Id(), "$.ServiceMeshInfo.State", []string{}))
		if _, err := stateConf.WaitForState(); err != nil {
			return WrapErrorf(err, IdMsg, d.Id())
		}
	}
	update = false
	action = "ModifyServiceMeshName"
	request = make(map[string]interface{})
	query = make(map[string]interface{})
	request["ServiceMeshId"] = d.Id()

	if !d.IsNewResource() && d.HasChange("service_mesh_name") {
		update = true
	}
	request["Name"] = d.Get("service_mesh_name")
	if update {
		wait := incrementalWait(3*time.Second, 5*time.Second)
		err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
			response, err = client.RpcPost("servicemesh", "2020-01-11", action, query, request, true)
			if err != nil {
				if 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)
		}
	}
	update = false
	action = "UpdateKialiConfiguration"
	request = make(map[string]interface{})
	query = make(map[string]interface{})
	request["ServiceMeshId"] = d.Id()

	if !d.IsNewResource() && d.HasChange("mesh_config.0.kiali.0.enabled") {
		update = true
		jsonPathResult, err := jsonpath.Get("$[0].kiali[0].enabled", d.Get("mesh_config"))
		if err == nil {
			request["Enabled"] = jsonPathResult
		}
	}

	if d.HasChange("mesh_config.0.kiali.0.custom_prometheus_url") {
		update = true
		jsonPathResult1, err := jsonpath.Get("$[0].kiali[0].custom_prometheus_url", d.Get("mesh_config"))
		if err == nil {
			request["CustomPrometheusUrl"] = jsonPathResult1
		}
	}

	if d.HasChange("mesh_config.0.kiali.0.integrate_clb") {
		update = true
		jsonPathResult2, err := jsonpath.Get("$[0].kiali[0].integrate_clb", d.Get("mesh_config"))
		if err == nil {
			request["IntegrateCLB"] = jsonPathResult2
		}
	}

	if d.HasChange("mesh_config.0.kiali.0.kiali_service_annotations") {
		update = true
		jsonPathResult3, err := jsonpath.Get("$[0].kiali[0].kiali_service_annotations", d.Get("mesh_config"))
		if err == nil {
			request["KialiServiceAnnotations"] = jsonPathResult3
		}
	}

	if d.HasChange("mesh_config.0.kiali.0.kiali_arms_auth_tokens") {
		update = true
		jsonPathResult4, err := jsonpath.Get("$[0].kiali[0].kiali_arms_auth_tokens", d.Get("mesh_config"))
		if err == nil {
			request["KialiArmsAuthTokens"] = jsonPathResult4
		}
	}

	if d.HasChange("mesh_config.0.kiali.0.auth_strategy") {
		update = true
		jsonPathResult5, err := jsonpath.Get("$[0].kiali[0].auth_strategy", d.Get("mesh_config"))
		if err == nil {
			request["AuthStrategy"] = jsonPathResult5
		}
	}

	if d.HasChange("mesh_config") {
		update = true
		objectDataLocalMap := make(map[string]interface{})

		if v := d.Get("mesh_config"); !IsNil(v) {
			redirectUris1, _ := jsonpath.Get("$[0].kiali[0].ram_oauth_config[0].redirect_uris", v)
			if redirectUris1 != nil && (d.HasChange("mesh_config.0.kiali.0.ram_oauth_config.0.redirect_uris") || redirectUris1 != "") {
				objectDataLocalMap["RedirectUris"] = redirectUris1
			}

			objectDataLocalMapJson, err := json.Marshal(objectDataLocalMap)
			if err != nil {
				return WrapError(err)
			}
			request["RAMOAuthConfig"] = string(objectDataLocalMapJson)
		}
	}

	if d.HasChange("mesh_config") {
		update = true
		objectDataLocalMap1 := make(map[string]interface{})

		if v := d.Get("mesh_config"); !IsNil(v) {
			clientId1, _ := jsonpath.Get("$[0].kiali[0].open_id_config[0].client_id", v)
			if clientId1 != nil && (d.HasChange("mesh_config.0.kiali.0.open_id_config.0.client_id") || clientId1 != "") {
				objectDataLocalMap1["ClientId"] = clientId1
			}
			clientSecret1, _ := jsonpath.Get("$[0].kiali[0].open_id_config[0].client_secret", v)
			if clientSecret1 != nil && (d.HasChange("mesh_config.0.kiali.0.open_id_config.0.client_secret") || clientSecret1 != "") {
				objectDataLocalMap1["ClientSecret"] = clientSecret1
			}
			issuerUri1, _ := jsonpath.Get("$[0].kiali[0].open_id_config[0].issuer_uri", v)
			if issuerUri1 != nil && (d.HasChange("mesh_config.0.kiali.0.open_id_config.0.issuer_uri") || issuerUri1 != "") {
				objectDataLocalMap1["IssuerUri"] = issuerUri1
			}
			scopes1, _ := jsonpath.Get("$[0].kiali[0].open_id_config[0].scopes", d.Get("mesh_config"))
			if scopes1 != nil && (d.HasChange("mesh_config.0.kiali.0.open_id_config.0.scopes") || scopes1 != "") {
				objectDataLocalMap1["Scopes"] = scopes1
			}

			objectDataLocalMap1Json, err := json.Marshal(objectDataLocalMap1)
			if err != nil {
				return WrapError(err)
			}
			request["OpenIdConfig"] = string(objectDataLocalMap1Json)
		}
	}

	if d.HasChange("mesh_config") {
		update = true
		objectDataLocalMap2 := make(map[string]interface{})

		if v := d.Get("mesh_config"); !IsNil(v) {
			webFqdn, _ := jsonpath.Get("$[0].kiali[0].server_config[0].web_fqdn", v)
			if webFqdn != nil && (d.HasChange("mesh_config.0.kiali.0.server_config.0.web_fqdn") || webFqdn != "") {
				objectDataLocalMap2["WebFQDN"] = webFqdn
			}
			webPort1, _ := jsonpath.Get("$[0].kiali[0].server_config[0].web_port", v)
			if webPort1 != nil && (d.HasChange("mesh_config.0.kiali.0.server_config.0.web_port") || webPort1 != "") {
				objectDataLocalMap2["WebPort"] = webPort1
			}
			webRoot1, _ := jsonpath.Get("$[0].kiali[0].server_config[0].web_root", v)
			if webRoot1 != nil && (d.HasChange("mesh_config.0.kiali.0.server_config.0.web_root") || webRoot1 != "") {
				objectDataLocalMap2["WebRoot"] = webRoot1
			}
			webSchema1, _ := jsonpath.Get("$[0].kiali[0].server_config[0].web_schema", v)
			if webSchema1 != nil && (d.HasChange("mesh_config.0.kiali.0.server_config.0.web_schema") || webSchema1 != "") {
				objectDataLocalMap2["WebSchema"] = webSchema1
			}

			objectDataLocalMap2Json, err := json.Marshal(objectDataLocalMap2)
			if err != nil {
				return WrapError(err)
			}
			request["ServerConfig"] = string(objectDataLocalMap2Json)
		}
	}

	if update {
		wait := incrementalWait(3*time.Second, 5*time.Second)
		err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
			response, err = client.RpcPost("servicemesh", "2020-01-11", action, query, request, true)
			if err != nil {
				if 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)
		}
		serviceMeshServiceV2 := ServiceMeshServiceV2{client}
		stateConf := BuildStateConf([]string{}, []string{"running"}, d.Timeout(schema.TimeoutUpdate), 5*time.Second, serviceMeshServiceV2.ServiceMeshServiceMeshStateRefreshFunc(d.Id(), "$.ServiceMeshInfo.State", []string{}))
		if _, err := stateConf.WaitForState(); err != nil {
			return WrapErrorf(err, IdMsg, d.Id())
		}
	}

	if d.HasChange("cluster_ids") {
		oldEntry, newEntry := d.GetChange("cluster_ids")
		removed := oldEntry
		added := newEntry

		if len(removed.([]interface{})) > 0 {
			clusterIds := removed.([]interface{})

			for _, item := range clusterIds {
				action := "RemoveClusterFromServiceMesh"
				request = make(map[string]interface{})
				query = make(map[string]interface{})
				request["ServiceMeshId"] = d.Id()

				if v, ok := item.(string); ok {
					jsonPathResult, err := jsonpath.Get("$", v)
					if err != nil {
						return WrapError(err)
					}
					request["ClusterId"] = jsonPathResult
				}
				wait := incrementalWait(3*time.Second, 5*time.Second)
				err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
					response, err = client.RpcPost("servicemesh", "2020-01-11", action, query, request, true)
					if err != nil {
						if 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)
				}
				serviceMeshServiceV2 := ServiceMeshServiceV2{client}
				stateConf := BuildStateConf([]string{}, []string{"running"}, d.Timeout(schema.TimeoutUpdate), 5*time.Second, serviceMeshServiceV2.ServiceMeshServiceMeshStateRefreshFunc(d.Id(), "$.ServiceMeshInfo.State", []string{}))
				if _, err := stateConf.WaitForState(); err != nil {
					return WrapErrorf(err, IdMsg, d.Id())
				}

			}
		}

		if len(added.([]interface{})) > 0 {
			clusterIds := added.([]interface{})

			for _, item := range clusterIds {
				action := "AddClusterIntoServiceMesh"
				request = make(map[string]interface{})
				query = make(map[string]interface{})
				request["ServiceMeshId"] = d.Id()

				if v, ok := item.(string); ok {
					jsonPathResult, err := jsonpath.Get("$", v)
					if err != nil {
						return WrapError(err)
					}
					request["ClusterId"] = jsonPathResult
				}
				wait := incrementalWait(3*time.Second, 5*time.Second)
				err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
					response, err = client.RpcPost("servicemesh", "2020-01-11", action, query, request, true)
					if err != nil {
						if 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)
				}
				serviceMeshServiceV2 := ServiceMeshServiceV2{client}
				stateConf := BuildStateConf([]string{}, []string{"running"}, d.Timeout(schema.TimeoutUpdate), 5*time.Second, serviceMeshServiceV2.ServiceMeshServiceMeshStateRefreshFunc(d.Id(), "$.ServiceMeshInfo.State", []string{}))
				if _, err := stateConf.WaitForState(); err != nil {
					return WrapErrorf(err, IdMsg, d.Id())
				}

			}
		}
	}
	if d.HasChange("tags") {
		serviceMeshServiceV2 := ServiceMeshServiceV2{client}
		if err := serviceMeshServiceV2.SetResourceTags(d, "servicemesh"); err != nil {
			return WrapError(err)
		}
	}
	if !d.IsNewResource() && d.HasChange("load_balancer.0.pilot_public_eip_id") {
		oldEntry, newEntry := d.GetChange("load_balancer.0.pilot_public_eip_id")
		removed, removedOk := oldEntry.(string)
		added, addedOk := newEntry.(string)

		log.Printf("[INFO] Resource load_balancer.0.pilot_public_eip_id  removed %s removedOk %v added %s addedOk %v", removed, removedOk, added, addedOk)
		if removedOk && len(removed) > 0 && added != removed {
			action := "ModifyPilotEipResource"
			request = make(map[string]interface{})
			query = make(map[string]interface{})
			request["ServiceMeshId"] = d.Id()

			request["Operation"] = "UnBindEip"
			if v, ok := d.GetOk("load_balancer"); ok {
				jsonPathResult, err := jsonpath.Get("$[0].pilot_public_eip_id", v)
				if err == nil && jsonPathResult != "" {
					request["EipId"] = jsonPathResult
				}
			}
			wait := incrementalWait(3*time.Second, 5*time.Second)
			err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
				response, err = client.RpcPost("servicemesh", "2020-01-11", action, query, request, true)
				if err != nil {
					if 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)
			}
			serviceMeshServiceV2 := ServiceMeshServiceV2{client}
			stateConf := BuildStateConf([]string{}, []string{"running"}, d.Timeout(schema.TimeoutUpdate), 5*time.Second, serviceMeshServiceV2.ServiceMeshServiceMeshStateRefreshFunc(d.Id(), "$.ServiceMeshInfo.State", []string{}))
			if _, err := stateConf.WaitForState(); err != nil {
				return WrapErrorf(err, IdMsg, d.Id())
			}
		}

		if addedOk && len(added) > 0 && added != removed {
			action := "ModifyPilotEipResource"
			request = make(map[string]interface{})
			query = make(map[string]interface{})
			request["ServiceMeshId"] = d.Id()

			if v, ok := d.GetOk("load_balancer"); ok {
				jsonPathResult, err := jsonpath.Get("$[0].pilot_public_eip_id", v)
				if err == nil && jsonPathResult != "" {
					request["EipId"] = jsonPathResult
				}
			}
			request["Operation"] = "BindEip"
			wait := incrementalWait(3*time.Second, 5*time.Second)
			err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
				response, err = client.RpcPost("servicemesh", "2020-01-11", action, query, request, true)
				if err != nil {
					if 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)
			}
			serviceMeshServiceV2 := ServiceMeshServiceV2{client}
			stateConf := BuildStateConf([]string{}, []string{"running"}, d.Timeout(schema.TimeoutUpdate), 5*time.Second, serviceMeshServiceV2.ServiceMeshServiceMeshStateRefreshFunc(d.Id(), "$.ServiceMeshInfo.State", []string{}))
			if _, err := stateConf.WaitForState(); err != nil {
				return WrapErrorf(err, IdMsg, d.Id())
			}
		}
	}
	d.Partial(false)
	return resourceAliCloudServiceMeshServiceMeshRead(d, meta)
}