func resourceAlibabacloudStackCSKubernetesNodePoolUpdate()

in alibabacloudstack/resource_apsarastack_cs_kubernetes_node_pool.go [472:681]


func resourceAlibabacloudStackCSKubernetesNodePoolUpdate(d *schema.ResourceData, meta interface{}) error {
	client := meta.(*connectivity.AlibabacloudStackClient)
	csService := CsService{client}

	clusterId := d.Get("cluster_id").(string)
	d.Partial(true)
	update := false

	args := &CreateNodePoolRequest{
		ClusterID:        clusterId,
		NodepoolID:       d.Id(),
		UpdateNodes:      true,
		ScalingGroup:     scalingGroup{},
		KubernetesConfig: kubernetesConfig{},
		TEEConfig:        tEEConfig{},
		AutoScaling:      autoScaling{},
	}
	if d.HasChange("node_count") {
		oldV, newV := d.GetChange("node_count")

		oldValue, ok := oldV.(int)
		if !ok {
			return errmsgs.WrapErrorf(fmt.Errorf("node_count old value can not be parsed"), "parseError %d", oldValue)
		}
		newValue, ok := newV.(int)
		if !ok {
			return errmsgs.WrapErrorf(fmt.Errorf("node_count new value can not be parsed"), "parseError %d", newValue)
		}
		log.Printf("UUUUUUUUUUUUUUUUUUUUUUUUUUUU %d , %d", newValue, oldValue)
		if newValue < oldValue {
			err := RemoveNodePoolNodes(d, meta, clusterId, d.Id(), nil, nil)
			if err != nil {
				return err
			}

			// The removal of a node is logically independent.
			// The removal of a node should not involve parameter changes.
			return nil

		}
		//update = true
		if newValue > oldValue {
			err := ScaleClusterNodePool(d, meta, clusterId, d.Id(), oldValue, newValue)
			if err != nil {
				return err
			}

			// The removal of a node is logically independent.
			// The removal of a node should not involve parameter changes.
			return nil

		}
	}

	if d.HasChange("vswitch_ids") {
		update = true

		args.ScalingGroup.VswitchIds = expandStringList(d.Get("vswitch_ids").([]interface{}))
	}

	if d.HasChange("install_cloud_monitor") {
		update = true
		args.KubernetesConfig.CmsEnabled = d.Get("install_cloud_monitor").(bool)
	}

	if d.HasChange("unschedulable") {
		update = true
		args.KubernetesConfig.Unschedulable = d.Get("unschedulable").(bool)
	}

	if d.HasChange("instance_types") {
		update = true
		args.ScalingGroup.InstanceTypes = expandStringList(d.Get("instance_types").([]interface{}))
	}

	// password is required by update method
	args.ScalingGroup.LoginPassword = d.Get("password").(string)
	if d.HasChange("password") {
		update = true
		args.ScalingGroup.LoginPassword = d.Get("password").(string)
	}

	if d.HasChange("system_disk_category") {
		update = true
		args.ScalingGroup.SystemDiskCategory = d.Get("system_disk_category").(string)
	}

	if d.HasChange("system_disk_size") {
		update = true
		args.ScalingGroup.SystemDiskSize = int64(d.Get("system_disk_size").(int))
	}

	if d.HasChange("image_id") {
		update = true
		args.ScalingGroup.ImageId = d.Get("image_id").(string)
	}

	if d.HasChange("data_disks") {
		update = true
		setNodePoolDataDisks(&args.ScalingGroup, d)
	}

	if d.HasChange("tags") {
		update = true
		setNodePoolTags(&args.ScalingGroup, d)
	}

	if d.HasChange("labels") {
		update = true
		setNodePoolLabels(&args.KubernetesConfig, d)
	}

	if d.HasChange("taints") {
		update = true
		setNodePoolTaints(&args.KubernetesConfig, d)
	}

	if d.HasChange("user_data") {
		update = true
		if v := d.Get("user_data").(string); v != "" {
			_, base64DecodeError := base64.StdEncoding.DecodeString(v)
			if base64DecodeError == nil {
				args.KubernetesConfig.UserData = v
			} else {
				args.KubernetesConfig.UserData = base64.StdEncoding.EncodeToString([]byte(v))
			}
		}
	}

	if d.HasChange("scaling_config") {
		update = true
		if v, ok := d.GetOk("scaling_config"); ok {
			args.AutoScaling = setAutoScalingConfig(v.([]interface{}))
		}
	}

	if v, ok := d.GetOk("internet_charge_type"); ok {
		update = true
		args.ScalingGroup.InternetChargeType = v.(string)
	}

	if v, ok := d.GetOk("internet_max_bandwidth_out"); ok {
		update = true
		args.ScalingGroup.InternetMaxBandwidthOut = v.(int)
	}

	if v, ok := d.GetOk("platform"); ok {
		update = true
		args.ScalingGroup.Platform = v.(string)
	}

	if d.HasChange("scaling_policy") {
		update = true
		args.ScalingGroup.ScalingPolicy = d.Get("scaling_policy").(string)
	}

	if update {
		//begin
		request := client.NewCommonRequest("POST", "CS", "2015-12-15", "ModifyClusterNodePool", fmt.Sprintf("/clusters/%s/nodepools/%s", clusterId, d.Id()))
		request.QueryParams["ClusterId"] = clusterId
		request.QueryParams["SignatureVersion"] = "1.0"
		request.Headers["x-acs-asapi-gateway-version"] = "3.0"
		jsonData, err := json.Marshal(args)
		if err != nil {
			return errmsgs.WrapError(fmt.Errorf("Error marshaling to JSON: %v", err))
		}
		request.SetContentType(requests.Json)
		request.SetContent(jsonData)
		response, err := client.ProcessCommonRequest(request)
		if err != nil {
			if response == nil {
				return errmsgs.WrapErrorf(err, "Process Common Request Failed")
			}
			errmsg := errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
			return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), "UpdateKubernetesNodePool", response, errmsg)
		}

		stateConf := BuildStateConf([]string{"scaling", "updating"}, []string{"active"}, d.Timeout(schema.TimeoutUpdate), 30*time.Second, csService.CsKubernetesNodePoolStateRefreshFunc(d.Id(), clusterId, []string{"deleting", "failed"}))

		if _, err := stateConf.WaitForState(); err != nil {
			return errmsgs.WrapErrorf(err, errmsgs.IdMsg, d.Id())
		}
	}

	// attach or remove existing node
	if d.HasChange("instances") {
		rawOldValue, rawNewValue := d.GetChange("instances")
		oldValue, ok := rawOldValue.([]interface{})
		if !ok {
			return errmsgs.WrapErrorf(fmt.Errorf("instances old value can not be parsed"), "parseError %d", oldValue)
		}
		newValue, ok := rawNewValue.([]interface{})
		if !ok {
			return errmsgs.WrapErrorf(fmt.Errorf("instances new value can not be parsed"), "parseError %d", oldValue)
		}

		if len(newValue) > len(oldValue) {
			attachExistingInstance(d, meta)
		} else {
			err := RemoveNodePoolNodes(d, meta, clusterId, d.Id(), oldValue, newValue)
			if err != nil {
				return err
			}
		}
	}

	update = false
	d.Partial(false)
	return nil
}