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
}