alibabacloudstack/resource_apsarastack_edas_k8s_application.go (907 lines of code) (raw):

package alibabacloudstack import ( "encoding/json" "fmt" "log" "time" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "strings" "github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/connectivity" "github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/errmsgs" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) func resourceAlibabacloudStackEdasK8sApplication() *schema.Resource { resource := &schema.Resource{ Timeouts: &schema.ResourceTimeout{ Create: schema.DefaultTimeout(30 * time.Minute), Delete: schema.DefaultTimeout(30 * time.Minute), }, Schema: map[string]*schema.Schema{ "application_name": { Type: schema.TypeString, Required: true, }, "cluster_id": { Type: schema.TypeString, ForceNew: true, Required: true, }, "replicas": { Type: schema.TypeInt, Optional: true, Default: 1, }, "image_url": { Type: schema.TypeString, Optional: true, //ConflictsWith: []string{"package_url"}, }, "package_type": { Type: schema.TypeString, Optional: true, ForceNew: true, ValidateFunc: validation.StringInSlice([]string{"FatJar", "War", "Image"}, false), Default: "Image", }, "application_description": { Type: schema.TypeString, Optional: true, }, "application_descriotion": { Type: schema.TypeString, Optional: true, Deprecated: "Field 'application_descriotion' is deprecated and will be removed in a future release. Please use new field 'application_description' instead.", }, "limit_mem": { Type: schema.TypeInt, Optional: true, }, "requests_mem": { Type: schema.TypeInt, Optional: true, }, "command": { Type: schema.TypeString, Optional: true, }, "command_args": { Type: schema.TypeList, Elem: &schema.Schema{Type: schema.TypeString}, Optional: true, }, "internet_slb_id": { Optional: true, Type: schema.TypeString, }, "internet_slb_protocol": { Optional: true, Type: schema.TypeString, ValidateFunc: validation.StringInSlice([]string{"TCP", "HTTP", "HTTPS"}, false), }, "internet_slb_port": { Type: schema.TypeInt, Optional: true, }, "internet_target_port": { Type: schema.TypeInt, Optional: true, }, "intranet_slb_id": { Optional: true, Type: schema.TypeString, }, "intranet_slb_protocol": { Optional: true, Type: schema.TypeString, ValidateFunc: validation.StringInSlice([]string{"TCP", "HTTP", "HTTPS"}, false), }, "intranet_slb_port": { Type: schema.TypeInt, Optional: true, }, "intranet_target_port": { Type: schema.TypeInt, Optional: true, }, "envs": { Type: schema.TypeMap, Elem: &schema.Schema{ Type: schema.TypeString, }, Optional: true, }, "pre_stop": { Type: schema.TypeString, Optional: true, DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool { e := EdasService{} return e.PreStopEqual(old, new) }, }, "post_start": { Type: schema.TypeString, Optional: true, DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool { e := EdasService{} return e.PostStartEqual(old, new) }, }, "liveness": { Type: schema.TypeString, Optional: true, DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool { e := EdasService{} return e.LivenessEqual(old, new) }, }, "readiness": { Type: schema.TypeString, Optional: true, DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool { e := EdasService{} return e.ReadinessEqual(old, new) }, }, "nas_id": { Type: schema.TypeString, Optional: true, }, "mount_descs": { Type: schema.TypeString, Optional: true, }, "namespace": { Type: schema.TypeString, Optional: true, }, "logical_region_id": { Type: schema.TypeString, Optional: true, }, "package_url": { Type: schema.TypeString, Optional: true, //ConflictsWith: []string{"image_url"}, }, "package_version": { Type: schema.TypeString, Optional: true, Computed: true, //Default: strconv.FormatInt(time.Now().Unix(), 10), }, "jdk": { Type: schema.TypeString, Optional: true, }, "web_container": { Type: schema.TypeString, Optional: true, }, "edas_container_version": { Type: schema.TypeString, Optional: true, }, "requests_m_cpu": { Type: schema.TypeInt, Optional: true, }, "limit_m_cpu": { Type: schema.TypeInt, Optional: true, }, "cr_ee_repo_id": { Type: schema.TypeString, Optional: true, }, "update_type": { Type: schema.TypeString, Optional: true, ValidateFunc: validation.StringInSlice([]string{"BatchUpdate", "GrayBatchUpdate"}, false), }, "update_batch": { Type: schema.TypeInt, Optional: true, }, "update_release_type": { Type: schema.TypeString, Optional: true, ValidateFunc: validation.StringInSlice([]string{"auto", "manual"}, false), }, "update_batch_wait_time": { Type: schema.TypeInt, Optional: true, }, "update_gray": { Type: schema.TypeInt, Optional: true, }, "config_mount_descs": { Type: schema.TypeList, Optional: true, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "name": { Type: schema.TypeString, Required: true, }, "type": { Type: schema.TypeString, Required: true, ValidateFunc: validation.StringInSlice([]string{"ConfigMap", "Secret"}, false), }, "mount_path": { Type: schema.TypeString, Required: true, }, }, }, }, "local_volume": { Type: schema.TypeList, Optional: true, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "type": { Type: schema.TypeString, Required: true, // ValidateFunc: validation.StringInSlice([]string{"file", "filepath"}, false), }, "node_path": { Type: schema.TypeString, Required: true, }, "mount_path": { Type: schema.TypeString, Required: true, }, }, }, }, "pvc_mount_descs": { Type: schema.TypeList, Optional: true, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "pvc_name": { Type: schema.TypeString, Required: true, // ValidateFunc: validation.StringInSlice([]string{"file", "filepath"}, false), }, "mount_paths": { Type: schema.TypeList, Required: true, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "mount_path": { Type: schema.TypeString, Required: true, }, "read_only": { Type: schema.TypeBool, Optional: true, Default: false, }, }, }, }, }, }, }, }, } setResourceFunc(resource, resourceAlibabacloudStackEdasK8sApplicationCreate, resourceAlibabacloudStackEdasK8sApplicationRead, resourceAlibabacloudStackEdasK8sApplicationUpdate, resourceAlibabacloudStackEdasK8sApplicationDelete) return resource } func resourceAlibabacloudStackEdasK8sApplicationCreate(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AlibabacloudStackClient) edasService := EdasService{client} // request := edas.CreateInsertK8sApplicationRequest() request := client.NewCommonRequest("POST", "Edas", "2017-08-01", "InsertK8sApplication", "/pop/v5/k8s/acs/create_k8s_app") packageType := d.Get("package_type").(string) request.QueryParams["AppName"] = d.Get("application_name").(string) request.QueryParams["RegionId"] = client.RegionId request.QueryParams["PackageType"] = packageType request.QueryParams["ClusterId"] = d.Get("cluster_id").(string) if strings.ToLower(packageType) == "image" { if v, ok := d.GetOk("image_url"); !ok { return errmsgs.WrapError(errmsgs.Error("image_url is needed for creating image k8s application")) } else { request.QueryParams["ImageUrl"] = v.(string) if strings.HasPrefix(v.(string), "cr-ee.registry") { if crid, ok := d.GetOk("cr_ee_repo_id"); ok && crid.(string) != "" { request.QueryParams["crInstanceId"] = crid.(string) } else { return errmsgs.WrapError(errmsgs.Error("`cr_ee_repo_id` is needed for the image repo is enterprise-edition")) } } } } else { if v, ok := d.GetOk("package_url"); !ok { return errmsgs.WrapError(errmsgs.Error("package_url is needed for creating fatjar k8s application")) } else { request.QueryParams["PackageUrl"] = v.(string) request.QueryParams["ImageUrl"] = v.(string) } if v, ok := d.GetOk("package_version"); ok { request.QueryParams["PackageVersion"] = v.(string) } if v, ok := d.GetOk("jdk"); !ok { return errmsgs.WrapError(errmsgs.Error("jdk is needed for creating non-image k8s application")) } else { request.QueryParams["JDK"] = v.(string) } if strings.ToLower(packageType) == "war" { var webContainer string var edasContainer string if v, ok := d.GetOk("web_container"); ok { webContainer = v.(string) } if v, ok := d.GetOk("edas_container_version"); ok { edasContainer = v.(string) } if len(webContainer) == 0 && len(edasContainer) == 0 { return errmsgs.WrapError(errmsgs.Error("web_container or edas_container_version is needed for creating war k8s application")) } request.QueryParams["WebContainer"] = webContainer request.QueryParams["EdasContainerVersion"] = edasContainer } } request.QueryParams["Replicas"] = fmt.Sprintf("%d", d.Get("replicas").(int)) if v, ok := connectivity.GetResourceDataOk(d, "application_description", "application_descriotion"); ok { request.QueryParams["ApplicationDescription"] = v.(string) } if v, ok := d.GetOk("limit_mem"); ok { request.QueryParams["LimitMem"] = fmt.Sprintf("%d", v.(int)) } if v, ok := d.GetOk("requests_mem"); ok { request.QueryParams["RequestsMem"] = fmt.Sprintf("%d", v.(int)) } if v, ok := d.GetOk("command"); ok { request.QueryParams["Command"] = v.(string) } if v, ok := d.GetOk("command_args"); ok { commands, err := edasService.GetK8sCommandArgs(v.([]interface{})) if err != nil { return errmsgs.WrapError(err) } request.QueryParams["CommandArgs"] = commands } if v, ok := d.GetOk("envs"); ok { envs, err := edasService.GetK8sEnvs(v.(map[string]interface{})) if err != nil { return errmsgs.WrapError(err) } request.QueryParams["Envs"] = envs } if v, ok := d.GetOk("pre_stop"); ok { request.QueryParams["PreStop"] = v.(string) } if v, ok := d.GetOk("post_start"); ok { request.QueryParams["PostStart"] = v.(string) } if v, ok := d.GetOk("liveness"); ok { request.QueryParams["Liveness"] = v.(string) } if v, ok := d.GetOk("readiness"); ok { request.QueryParams["Readiness"] = v.(string) } if v, ok := d.GetOk("nas_id"); ok { request.QueryParams["NasId"] = v.(string) } if v, ok := d.GetOk("mount_descs"); ok { request.QueryParams["MountDescs"] = v.(string) } if v, ok := d.GetOk("config_mount_descs"); ok { configmaps, err := edasService.GetK8sConfigMaps(v.([]interface{})) if err != nil { return errmsgs.WrapError(err) } request.QueryParams["ConfigMountDescs"] = configmaps } if v, ok := d.GetOk("local_volume"); ok { local_volumes, err := edasService.GetK8sLocalVolumes(v.([]interface{})) if err != nil { return errmsgs.WrapError(err) } request.QueryParams["LocalVolume"] = local_volumes } if v, ok := d.GetOk("pvc_mount_descs"); ok { pvc_mount_descs, err := edasService.GetK8sPvcMountDescs(v.([]interface{})) if err != nil { return errmsgs.WrapError(err) } request.QueryParams["PvcMountDescs"] = pvc_mount_descs } if v, ok := d.GetOk("namespace"); ok { request.QueryParams["Namespace"] = v.(string) } if v, ok := d.GetOk("logical_region_id"); ok { request.QueryParams["LogicalRegionId"] = v.(string) } if v, ok := d.GetOk("requests_m_cpu"); ok { request.QueryParams["RequestsmCpu"] = fmt.Sprintf("%d", v.(int)) } if v, ok := d.GetOk("limit_m_cpu"); ok { request.QueryParams["LimitmCpu"] = fmt.Sprintf("%d", v.(int)) } bresponse, err := client.ProcessCommonRequest(request) addDebug("InsertK8sApplication", bresponse, request.QueryParams, request) if err != nil { errmsg := "" if bresponse != nil { errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse) } return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_edas_k8s_application", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } var response map[string]interface{} err = json.Unmarshal(bresponse.GetHttpContentBytes(), &response) if response["Code"].(float64) != 200 { return errmsgs.WrapError(fmt.Errorf("Create k8s application failed for %s", response["Message"].(string))) } appId := response["ApplicationInfo"].(map[string]interface{})["AppId"].(string) changeOrderId := response["ApplicationInfo"].(map[string]interface{})["ChangeOrderId"].(string) d.SetId(appId) if len(changeOrderId) > 0 { stateConf := BuildStateConf([]string{"0", "1"}, []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()) } } bind_slb_err := K8sBindSlb(d, meta) if bind_slb_err != nil { return errmsgs.WrapError(bind_slb_err) } return nil } func resourceAlibabacloudStackEdasK8sApplicationRead(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AlibabacloudStackClient) edasService := EdasService{client} response, err := edasService.DescribeEdasK8sApplication(d.Id()) if err != nil { if errmsgs.NotFoundError(err) { log.Printf("[DEBUG] Resource alibabacloudstack_edas_k8s_application ecsService.DescribeEdasK8sApplication Failed!!! %s", err) d.SetId("") return nil } return errmsgs.WrapError(err) } d.Set("application_name", response.App.ApplicationName) d.Set("cluster_id", response.App.ClusterId) d.Set("replicas", response.App.Instances) d.Set("package_type", response.App.ApplicationType) if d.Get("package_type").(string) == "docker" { d.Set("image_url", response.ImageInfo.ImageUrl) } envs := make(map[string]string) for _, e := range response.App.EnvList.Env { envs[e.Name] = e.Value } d.Set("envs", envs) d.Set("command", response.App.Cmd) d.Set("command_args", response.App.CmdArgs.CmdArg) d.Set("requests_m_cpu", response.App.RequestCpuM) d.Set("limit_m_cpu", response.App.LimitCpuM) d.Set("limit_mem", response.App.LimitMem) d.Set("requests_mem", response.App.RequestMem) allDeploy := response.DeployGroups.DeployGroup for _, v := range allDeploy { if len(v.PackageVersion) > 0 { d.Set("package_version", v.PackageVersion) } for _, c := range v.Components.ComponentsItem { if strings.Contains(c.ComponentKey, "JDK") { d.Set("jdk", c.ComponentKey) } } } if len(response.App.EdasContainerVersion) > 0 { d.Set("edas_container_version", response.App.EdasContainerVersion) } if len(response.Conf.PreStop) > 0 { d.Set("pre_stop", response.Conf.PreStop) } if len(response.Conf.PostStart) > 0 { d.Set("post_start", response.Conf.PostStart) } if len(response.Conf.Liveness) > 0 { d.Set("liveness", response.Conf.Liveness) } if len(response.Conf.Readiness) > 0 { d.Set("readiness", response.Conf.Readiness) } d.Set("namespace", response.App.K8sNamespace) if len(response.Conf.K8sVolumeInfo) > 0 { k8sVolumeInfo := make(map[string]interface{}) err = json.Unmarshal([]byte(response.Conf.K8sVolumeInfo), &k8sVolumeInfo) if err != nil { return errmsgs.WrapError(err) } configMountDescs, ok := k8sVolumeInfo["configMountDescs"] if ok { configmaps := make([]ConfigMaps, 0) err = json.Unmarshal([]byte(configMountDescs.(string)), &configmaps) if err != nil { return errmsgs.WrapError(err) } config_mount_descs := make([]map[string]interface{}, 0) for _, v := range configmaps { config_mount_descs = append(config_mount_descs, map[string]interface{}{ "name": v.Name, "type": v.Type, "mount_path": v.MountPath, }) } d.Set("config_mount_descs", config_mount_descs) } pvcMountDescs, ok := k8sVolumeInfo["pvcMountDescs"] if ok { pvcmounts := make([]PvcMountDescs, 0) err = json.Unmarshal([]byte(pvcMountDescs.(string)), &pvcmounts) if err != nil { return errmsgs.WrapError(err) } pvc_mount_descs := make([]map[string]interface{}, 0) for _, v := range pvcmounts { mountPaths := make([]map[string]interface{}, 0) for _, vm := range v.MountPaths { mountPaths = append(mountPaths, map[string]interface{}{ "mount_path": vm.MountPath, "read_only": vm.ReadOnly, }) } pvc_mount_descs = append(pvc_mount_descs, map[string]interface{}{ "pvc_name": v.PvcName, "mount_paths": mountPaths, }) } d.Set("pvc_mount_descs", pvc_mount_descs) } } if response.Conf.K8sLocalvolumeInfo != "" { K8sLocalvolumeInfo := make(map[string]interface{}) err = json.Unmarshal([]byte(response.Conf.K8sLocalvolumeInfo), &K8sLocalvolumeInfo) if err != nil { return errmsgs.WrapError(err) } localVolumeDOs, ok := K8sLocalvolumeInfo["localVolumeDOs"] local_volumes := make([]map[string]string, 0) if ok { localVolumes := localVolumeDOs.([]interface{}) for _, lv := range localVolumes { v := lv.(map[string]interface{}) local_volume := map[string]string{ "mount_path": v["mountPath"].(string), "node_path": v["nodePath"].(string), } lv_type, ok := v["type"] if ok { local_volume["type"] = lv_type.(string) } else { local_volume["type"] = "" } local_volumes = append(local_volumes, local_volume) } } d.Set("local_volume", local_volumes) } return nil } 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 } func resourceAlibabacloudStackEdasK8sApplicationDelete(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AlibabacloudStackClient) edasService := EdasService{client} // request := edas.CreateDeleteK8sApplicationRequest() request := client.NewCommonRequest("DELETE", "Edas", "2017-08-01", "DeleteK8sApplication", "/pop/v5/k8s/acs/k8s_apps") request.QueryParams["RegionId"] = client.RegionId request.QueryParams["AppId"] = d.Id() request.Headers["x-acs-content-type"] = "application/json" request.Headers["Content-Type"] = "application/json" wait := incrementalWait(1*time.Second, 2*time.Second) err := resource.Retry(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError { bresponse, err := client.ProcessCommonRequest(request) addDebug(request.GetActionName(), bresponse, request) if err != nil { if errmsgs.IsExpectedErrors(err, []string{errmsgs.ThrottlingUser}) { wait() return resource.RetryableError(err) } errmsg := "" if bresponse != nil { errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse) } err = errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) return resource.NonRetryableError(err) } response := make(map[string]interface{}) _ = json.Unmarshal(bresponse.GetHttpContentBytes(), &response) changeOrderId := response["ChangeOrderId"].(string) if response["Code"].(float64) != 200 { return resource.NonRetryableError(errmsgs.Error("Delete k8s application failed for " + response["Message"].(string))) } if changeOrderId != "" { stateConf := BuildStateConf([]string{"0", "1"}, []string{"2"}, d.Timeout(schema.TimeoutCreate), 5*time.Second, edasService.EdasChangeOrderStatusRefreshFunc(changeOrderId, []string{"3", "6", "10"})) if _, err := stateConf.WaitForState(); err != nil { return resource.NonRetryableError(errmsgs.WrapErrorf(err, errmsgs.IdMsg, d.Id())) } } return nil }) if err != nil { return err } return nil } func K8sBindSlb(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AlibabacloudStackClient) edasService := EdasService{client} bind_intranet_slb := false intranet_request := client.NewCommonRequest("POST", "Edas", "2017-08-01", "BindK8sSlb", "/pop/v5/k8s/acs/k8s_slb_binding") intranet_request.QueryParams["RegionId"] = client.RegionId intranet_request.QueryParams["AppId"] = d.Id() intranet_request.QueryParams["ClusterId"] = d.Get("cluster_id").(string) intranet_request.QueryParams["Type"] = "intranet" intranet_request.Headers["x-acs-content-type"] = "application/json" intranet_request.Headers["Content-Type"] = "application/json" if v, ok := d.GetOk("intranet_slb_id"); ok { intranet_request.QueryParams["SlbId"] = v.(string) bind_intranet_slb = true } else { if v, ok := d.GetOk("intranet_slb_protocol"); ok { bind_intranet_slb = true intranet_request.QueryParams["SlbProtocol"] = v.(string) intranet_request.QueryParams["Port"] = fmt.Sprintf("%d", d.Get("intranet_slb_port").(int)) intranet_request.QueryParams["TargetPort"] = fmt.Sprintf("%d", d.Get("intranet_target_port").(int)) } } if bind_intranet_slb { bresponse, err := client.ProcessCommonRequest(intranet_request) addDebug("BindK8sSlb: intranet", bresponse, intranet_request) if err != nil { errmsg := "" if bresponse != nil { errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse) } return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_edas_k8s_application", "BindK8sSlb", errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } response := make(map[string]interface{}) _ = json.Unmarshal(bresponse.GetHttpContentBytes(), &response) if response["Code"].(float64) != 200 { return errmsgs.WrapError(fmt.Errorf("BindK8sSlb Failed , response: %#v", response)) } stateConf := BuildStateConf([]string{"0", "1"}, []string{"2"}, d.Timeout(schema.TimeoutCreate), 5*time.Second, edasService.EdasChangeOrderStatusRefreshFunc(response["ChangeOrderId"].(string), []string{"3", "6", "10"})) if _, err := stateConf.WaitForState(); err != nil { return errmsgs.WrapError(fmt.Errorf("BindK8sSlb Failed , response: %#v", response)) } } time.Sleep(time.Duration(20) * time.Second) bind_internet_slb := false internet_request := client.NewCommonRequest("POST", "Edas", "2017-08-01", "BindK8sSlb", "/pop/v5/k8s/acs/k8s_slb_binding") internet_request.QueryParams["RegionId"] = client.RegionId internet_request.QueryParams["AppId"] = d.Id() internet_request.QueryParams["ClusterId"] = d.Get("cluster_id").(string) internet_request.QueryParams["Type"] = "internet" internet_request.Headers["x-acs-content-type"] = "application/json" internet_request.Headers["Content-Type"] = "application/json" if v, ok := d.GetOk("internet_slb_id"); ok { internet_request.QueryParams["SlbId"] = v.(string) bind_internet_slb = true } else { if v, ok := d.GetOk("internet_slb_protocol"); ok { bind_internet_slb = true internet_request.QueryParams["SlbProtocol"] = v.(string) internet_request.QueryParams["Port"] = fmt.Sprintf("%d", d.Get("internet_slb_port").(int)) internet_request.QueryParams["TargetPort"] = fmt.Sprintf("%d", d.Get("internet_target_port").(int)) } } if bind_internet_slb { bresponse, err := client.ProcessCommonRequest(internet_request) addDebug("BindK8sSlb: internet", bresponse, internet_request) if err != nil { errmsg := "" if bresponse != nil { errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse) } return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_edas_k8s_application", "BindK8sSlb", errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } response := make(map[string]interface{}) _ = json.Unmarshal(bresponse.GetHttpContentBytes(), &response) if response["Code"].(float64) != 200 { return errmsgs.WrapError(fmt.Errorf("BindK8sSlb Failed , ============================ response: ============================ \n%#v", response)) } stateConf := BuildStateConf([]string{"0", "1"}, []string{"2"}, d.Timeout(schema.TimeoutCreate), 5*time.Second, edasService.EdasChangeOrderStatusRefreshFunc(response["ChangeOrderId"].(string), []string{"3", "6", "10"})) if _, err := stateConf.WaitForState(); err != nil { return errmsgs.WrapError(fmt.Errorf("BindK8sSlb Failed , response: %#v", response)) } } return nil }