func resourceAlibabacloudStackEdasK8sApplicationUpdate()

in alibabacloudstack/resource_apsarastack_edas_k8s_application.go [626:849]


func resourceAlibabacloudStackEdasK8sApplicationUpdate(d *schema.ResourceData, meta interface{}) error {
	client := meta.(*connectivity.AlibabacloudStackClient)
	edasService := EdasService{client}
	var partialKeys []string
	request := client.NewCommonRequest("POST", "Edas", "2017-08-01", "DeployK8sApplication", "/pop/v5/k8s/acs/k8s_apps")
	request.QueryParams["RegionId"] = client.RegionId
	request.QueryParams["AppId"] = d.Id()

	d.Partial(true)
	packageType, err := edasService.QueryK8sAppPackageType(d.Id())
	if err != nil {
		return errmsgs.WrapError(err)
	}
	if strings.ToLower(packageType) == "image" {
		if d.HasChange("image_url") {
			partialKeys = append(partialKeys, "image_url")
		}
		request.QueryParams["Image"] = d.Get("image_url").(string)
		if len(request.QueryParams["Image"]) == 0 {
			return errmsgs.WrapError(errmsgs.Error("image_url is needed for creating image k8s application"))
		}
	} else {
		if d.HasChange("package_url") {
			partialKeys = append(partialKeys, "package_url")
		}
		request.QueryParams["PackageUrl"] = d.Get("package_url").(string)
		if len(request.QueryParams["PackageUrl"]) == 0 {
			return errmsgs.WrapError(errmsgs.Error("package_url is needed for creating fatjar k8s application"))
		}
		if d.HasChange("package_version") {
			partialKeys = append(partialKeys, "package_version")
		}
		request.QueryParams["PackageVersion"] = d.Get("package_version").(string)

		if d.HasChange("jdk") {
			partialKeys = append(partialKeys, "jdk")
		}
		request.QueryParams["JDK"] = d.Get("jdk").(string)
		if len(request.QueryParams["JDK"]) == 0 {
			return errmsgs.WrapError(errmsgs.Error("jdk is needed for creating non-image k8s application"))
		}
		if strings.ToLower(packageType) == "war" {
			var webContainer string
			var edasContainer string
			if d.HasChange("web_container") {
				partialKeys = append(partialKeys, "web_container")
			}
			webContainer = d.Get("web_container").(string)

			if d.HasChange("edas_container_version") {
				partialKeys = append(partialKeys, "edas_container_version")
			}
			edasContainer = d.Get("edas_container_version").(string)
			if len(webContainer) == 0 && len(edasContainer) == 0 {
				return errmsgs.WrapError(errmsgs.Error("web_container or edas_container_version is needed for updating war k8s application"))
			}
			request.QueryParams["WebContainer"] = webContainer
			request.QueryParams["EdasContainerVersion"] = edasContainer
		}
	}

	if d.HasChange("replicas") {
		partialKeys = append(partialKeys, "replicas")
	}
	replicas := d.Get("replicas").(int)
	request.QueryParams["Replicas"] = fmt.Sprintf("%d", replicas)

	if d.HasChange("limit_mem") {
		partialKeys = append(partialKeys, "limit_mem")
		request.QueryParams["MemoryLimit"] = fmt.Sprintf("%d", d.Get("limit_mem").(int))
	}

	if d.HasChange("requests_mem") {
		partialKeys = append(partialKeys, "requests_mem")
		request.QueryParams["MemoryRequest"] = fmt.Sprintf("%d", d.Get("requests_mem").(int))
	}

	if d.HasChange("command") {
		partialKeys = append(partialKeys, "command")
		request.QueryParams["Command"] = d.Get("command").(string)
	}

	if d.HasChange("command_args") {
		partialKeys = append(partialKeys, "command_args")
		commands, err := edasService.GetK8sCommandArgsForDeploy(d.Get("command_args").([]interface{}))
		if err != nil {
			return errmsgs.WrapError(err)
		}
		request.QueryParams["Args"] = commands
	}

	if d.HasChange("envs") {
		partialKeys = append(partialKeys, "envs")
		envs, err := edasService.GetK8sEnvs(d.Get("envs").(map[string]interface{}))
		if err != nil {
			return errmsgs.WrapError(err)
		}
		request.QueryParams["Envs"] = envs
	}

	if d.HasChange("pre_stop") {
		if !edasService.PreStopEqual(d.GetChange("pre_stop")) {
			partialKeys = append(partialKeys, "pre_stop")
			request.QueryParams["PreStop"] = d.Get("pre_stop").(string)
		}
	}

	if d.HasChange("post_start") {
		if !edasService.PostStartEqual(d.GetChange("post_start")) {
			partialKeys = append(partialKeys, "post_start")
			request.QueryParams["PostStart"] = d.Get("post_start").(string)
		}
	}

	if d.HasChange("liveness") {
		if !edasService.LivenessEqual(d.GetChange("liveness")) {
			partialKeys = append(partialKeys, "liveness")
			request.QueryParams["Liveness"] = d.Get("liveness").(string)
		}
	}

	if d.HasChange("readiness") {
		if !edasService.ReadinessEqual(d.GetChange("readiness")) {
			partialKeys = append(partialKeys, "readiness")
			request.QueryParams["Readiness"] = d.Get("readiness").(string)
		}
	}

	if d.HasChange("nas_id") {
		partialKeys = append(partialKeys, "nas_id")
		request.QueryParams["NasId"] = d.Get("nas_id").(string)
	}

	if d.HasChange("mount_descs") {
		partialKeys = append(partialKeys, "mount_descs")
		request.QueryParams["MountDescs"] = d.Get("mount_descs").(string)
	}

	if d.HasChange("config_mount_descs") {
		configmaps, err := edasService.GetK8sConfigMaps(d.Get("config_mount_descs").([]interface{}))
		if err != nil {
			return errmsgs.WrapError(err)
		}
		request.QueryParams["ConfigMountDescs"] = configmaps
	}

	if d.HasChange("local_volume") {
		local_volumes, err := edasService.GetK8sLocalVolumes(d.Get("local_volume").([]interface{}))
		if err != nil {
			return errmsgs.WrapError(err)
		}
		request.QueryParams["LocalVolume"] = local_volumes
	}

	if d.HasChange("pvc_mount_descs") {
		pvc_mount_descs, err := edasService.GetK8sPvcMountDescs(d.Get("pvc_mount_descs").([]interface{}))
		if err != nil {
			return errmsgs.WrapError(err)
		}
		request.QueryParams["PvcMountDescs"] = pvc_mount_descs
	}

	if d.HasChange("requests_m_cpu") {
		partialKeys = append(partialKeys, "requests_m_cpu")
		request.QueryParams["McpuRequest"] = fmt.Sprintf("%d", d.Get("requests_m_cpu").(int))
	}

	if d.HasChange("limit_m_cpu") {
		partialKeys = append(partialKeys, "limit_m_cpu")
		request.QueryParams["McpuLimit"] = fmt.Sprintf("%d", d.Get("limit_m_cpu").(int))
	}

	if len(partialKeys) > 0 && !d.IsNewResource() {
		if v, ok := d.GetOk("update_type"); ok && v.(string) != "" && replicas > 1 {
			partialKeys = append(partialKeys, "update_type")
			update_type := d.Get("update_type").(string)
			update_batch := d.Get("update_batch").(int)
			if update_batch < 2 {
				return errmsgs.WrapError(errmsgs.Error("`update_batch` must be greater than 2"))
			}
			update_release_type := d.Get("update_release_type").(string)
			gray_update_strategy := ""
			if v, ok := d.GetOk("update_gray"); ok {
				update_gray := v.(int)
				gray_update_strategy = fmt.Sprintf(",\"grayUpdate\":{\"gray\":%d}", update_gray)
			}
			if update_release_type == "auto" {
				update_batch_wait_time := d.Get("update_batch_wait_time").(int)
				request.QueryParams["UpdateStrategy"] = fmt.Sprintf("{\"type\":\"%s\",\"batchUpdate\":{\"batch\":%d,\"releaseType\":\"%s\",\"batchWaitTime\":%d}%s}", update_type, update_batch, update_release_type, update_batch_wait_time, gray_update_strategy)
			} else {
				request.QueryParams["UpdateStrategy"] = fmt.Sprintf("{\"type\":\"%s\",\"batchUpdate\":{\"batch\":%d,\"releaseType\":\"%s\"}%s}", update_type, update_batch, update_release_type, gray_update_strategy)
			}
		}
		bresponse, err := client.ProcessCommonRequest(request)
		addDebug(request.GetActionName(), bresponse, request)

		if err != nil {
			errmsg := ""
			if bresponse != nil {
				errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
			}
			return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
		}

		response := make(map[string]interface{})
		_ = json.Unmarshal(bresponse.GetHttpContentBytes(), &response)
		changeOrderId := response["ChangeOrderId"].(string)
		if response["Code"].(float64) != 200 {
			return errmsgs.WrapError(errmsgs.Error("deploy k8s application failed for " + response["Message"].(string)))
		}

		if changeOrderId != "" {
			stateConf := BuildStateConf([]string{"0", "1", "9"}, []string{"2"}, d.Timeout(schema.TimeoutCreate), 5*time.Second, edasService.EdasChangeOrderStatusRefreshFunc(changeOrderId, []string{"3", "6", "10"}))
			if _, err := stateConf.WaitForState(); err != nil {
				return errmsgs.WrapErrorf(err, errmsgs.IdMsg, d.Id())
			}
		}
		//for _, key := range partialKeys {
		//	d.SetPartial(key)
		//}
	}
	d.Partial(false)
	return nil
}