func resourceAlibabacloudStackHBaseInstanceUpdate()

in alibabacloudstack/resource_apsarastack_hbase_cluster.go [424:732]


func resourceAlibabacloudStackHBaseInstanceUpdate(d *schema.ResourceData, meta interface{}) error {
	client := meta.(*connectivity.AlibabacloudStackClient)
	hBaseService := HBaseService{client}
	d.Partial(true)
	if d.HasChange("pay_type") {
		object, err := hBaseService.DescribeHBaseInstance(d.Id())
		if err != nil {
			return errmsgs.WrapError(err)
		}
		target := strings.ToLower(d.Get("pay_type").(string))
		if strings.ToLower(object["PayType"].(string)) != target {
			request := hbase.CreateConvertInstanceRequest()
			client.InitRpcRequest(*request.RpcRequest)
			request.ClusterId = d.Id()
			request.PayType = string(Postpaid)
			if target == "prepaid" {
				request.PayType = string(Prepaid)
			}
			if d.Get("duration").(int) > 9 {
				request.PricingCycle = "year"
				request.Duration = requests.NewInteger(d.Get("duration").(int) / 12)
			} else {
				request.PricingCycle = "month"
				request.Duration = requests.NewInteger(d.Get("duration").(int))
			}
			raw, err := client.WithHbaseClient(func(hbaseClient *hbase.Client) (interface{}, error) {
				return hbaseClient.ConvertInstance(request)
			})
			bresponse, ok := raw.(*hbase.ConvertInstanceResponse)
			addDebug(request.GetActionName(), raw)
			if err != nil {
				errmsg := ""
				if ok {
					errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
				}
				return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
			}
			stateConf := BuildStateConf([]string{}, []string{Hb_ACTIVATION}, d.Timeout(schema.TimeoutUpdate),
				2*time.Minute, hBaseService.HBaseClusterStateRefreshFunc(d.Id(), []string{}))
			if _, err := stateConf.WaitForState(); err != nil {
				return errmsgs.WrapErrorf(err, errmsgs.IdMsg, d.Id())
			}
			// d.SetPartial("pay_type")
		}
	}

	if d.HasChange("ip_white") {
		request := hbase.CreateModifyIpWhitelistRequest()
		client.InitRpcRequest(*request.RpcRequest)
		request.ClusterId = d.Id()
		request.IpList = d.Get("ip_white").(string)
		request.GroupName = "default"
		request.IpVersion = "4"
		raw, err := client.WithHbaseClient(func(hbaseClient *hbase.Client) (interface{}, error) {
			return hbaseClient.ModifyIpWhitelist(request)
		})
		bresponse, ok := raw.(*hbase.ModifyIpWhitelistResponse)
		addDebug(request.GetActionName(), raw, request.RpcRequest, request)
		if err != nil {
			errmsg := ""
			if ok {
				errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
			}
			return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
		}
		//d.SetPartial("ip_white")
	}

	if d.HasChange("security_groups") {
		request := hbase.CreateModifySecurityGroupsRequest()
		client.InitRpcRequest(*request.RpcRequest)
		request.ClusterId = d.Id()
		securityGroups := d.Get("security_groups").(*schema.Set).List()
		if securityGroups != nil && len(securityGroups) > 0 {
			request.SecurityGroupIds = strings.Join(expandStringList(securityGroups), ",")
		} else {
			request.SecurityGroupIds = " "
		}
		raw, err := client.WithHbaseClient(func(hbaseClient *hbase.Client) (interface{}, error) {
			return hbaseClient.ModifySecurityGroups(request)
		})
		bresponse, ok := raw.(*hbase.ModifySecurityGroupsResponse)
		addDebug(request.GetActionName(), raw, request.RpcRequest, request)
		if err != nil {
			errmsg := ""
			if ok {
				errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
			}
			return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
		}
		stateConf := BuildStateConf([]string{}, []string{Hb_ACTIVATION}, d.Timeout(schema.TimeoutUpdate),
			5*time.Second, hBaseService.HBaseClusterStateRefreshFunc(d.Id(), []string{}))
		if _, err := stateConf.WaitForState(); err != nil {
			return errmsgs.WrapErrorf(err, errmsgs.IdMsg, d.Id())
		}
		//d.SetPartial("security_groups")
	}

	if d.HasChanges("maintain_start_time", "maintain_end_time") {
		request := hbase.CreateModifyInstanceMaintainTimeRequest()
		client.InitRpcRequest(*request.RpcRequest)
		request.ClusterId = d.Id()
		request.MaintainStartTime = d.Get("maintain_start_time").(string)
		request.MaintainEndTime = d.Get("maintain_end_time").(string)

		raw, err := client.WithHbaseClient(func(client *hbase.Client) (interface{}, error) {
			return client.ModifyInstanceMaintainTime(request)
		})
		bresponse, ok := raw.(*hbase.ModifyInstanceMaintainTimeResponse)
		if err != nil {
			errmsg := ""
			if ok {
				errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
			}
			return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
		}
		addDebug(request.GetActionName(), raw, request.RpcRequest, request)
		// d.SetPartial("maintain_start_time")
		// d.SetPartial("maintain_end_time")
	}

	if d.HasChange("deletion_protection") {
		if err := hBaseService.ModifyClusterDeletionProtection(d.Id(), d.Get("deletion_protection").(bool)); err != nil {
			return errmsgs.WrapError(err)
		}
		//d.SetPartial("deletion_protection")
	}

	if err := hBaseService.setInstanceTags(d); err != nil {
		return errmsgs.WrapError(err)
	}

	if d.HasChanges("account", "password") {
		request := hbase.CreateModifyUIAccountPasswordRequest()
		client.InitRpcRequest(*request.RpcRequest)
		request.ClusterId = d.Id()
		request.AccountName = d.Get("account").(string)
		request.AccountPassword = d.Get("password").(string)

		raw, err := client.WithHbaseClient(func(client *hbase.Client) (interface{}, error) {
			return client.ModifyUIAccountPassword(request)
		})
		bresponse, ok := raw.(*hbase.ModifyUIAccountPasswordResponse)
		if err != nil {
			errmsg := ""
			if ok {
				errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
			}
			return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
		}
		addDebug(request.GetActionName(), raw, request.RpcRequest, request)
		// d.SetPartial("account")
		// d.SetPartial("password")
	}

	if d.IsNewResource() {
		d.Partial(false)
		return nil
	}

	if d.HasChange("name") {
		request := hbase.CreateModifyInstanceNameRequest()
		client.InitRpcRequest(*request.RpcRequest)
		request.ClusterId = d.Id()
		request.ClusterName = d.Get("name").(string)

		raw, err := client.WithHbaseClient(func(client *hbase.Client) (interface{}, error) {
			return client.ModifyInstanceName(request)
		})
		bresponse, ok := raw.(*hbase.ModifyInstanceNameResponse)
		if err != nil {
			errmsg := ""
			if ok {
				errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
			}
			return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
		}
		addDebug(request.GetActionName(), raw, request.RpcRequest, request)
		//d.SetPartial("name")
	}

	if d.HasChange("core_instance_quantity") {
		request := hbase.CreateResizeNodeCountRequest()
		client.InitRpcRequest(*request.RpcRequest)
		request.ClusterId = d.Id()
		request.NodeCount = requests.NewInteger(d.Get("core_instance_quantity").(int))

		raw, err := client.WithHbaseClient(func(client *hbase.Client) (interface{}, error) {
			return client.ResizeNodeCount(request)
		})
		bresponse, ok := raw.(*hbase.ResizeNodeCountResponse)
		if err != nil {
			errmsg := ""
			if ok {
				errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
			}
			return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
		}
		// Cumbersome operation,async call, wait for state change
		// wait instance status is running after modifying
		stateConf := BuildStateConf([]string{Hb_NODE_RESIZING}, []string{Hb_ACTIVATION}, d.Timeout(schema.TimeoutUpdate),
			5*time.Minute, hBaseService.HBaseClusterStateRefreshFunc(d.Id(), []string{Hb_NODE_RESIZING_FAILED}))
		if _, err := stateConf.WaitForState(); err != nil {
			return errmsgs.WrapError(err)
		}
		addDebug(request.GetActionName(), raw, request.RpcRequest, request)
		//d.SetPartial("core_instance_quantity")
	}

	if d.HasChanges("master_instance_type", "core_instance_type") {
		request := hbase.CreateModifyInstanceTypeRequest()
		client.InitRpcRequest(*request.RpcRequest)
		request.ClusterId = d.Id()
		typeChange := false
		if d.HasChange("master_instance_type") &&
			d.Get("engine") != "bds" && d.Get("core_instance_quantity").(int) > 1 {
			request.MasterInstanceType = d.Get("master_instance_type").(string)
			typeChange = true
		}

		if d.HasChange("core_instance_type") {
			request.CoreInstanceType = d.Get("core_instance_type").(string)
			typeChange = true
		}

		if typeChange {
			raw, err := client.WithHbaseClient(func(client *hbase.Client) (interface{}, error) {
				return client.ModifyInstanceType(request)
			})
			bresponse, ok := raw.(*hbase.ModifyInstanceTypeResponse)
			if err != nil {
				errmsg := ""
				if ok {
					errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
				}
				return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
			}
			// Cumbersome operation,async call, wait for state change
			// wait instance status is running after modifying
			stateConf := BuildStateConf([]string{Hb_LEVEL_MODIFY}, []string{Hb_ACTIVATION}, d.Timeout(schema.TimeoutUpdate),
				5*time.Minute, hBaseService.HBaseClusterStateRefreshFunc(d.Id(), []string{Hb_LEVEL_MODIFY_FAILED}))
			if _, err := stateConf.WaitForState(); err != nil {
				return errmsgs.WrapError(err)
			}
			addDebug(request.GetActionName(), raw, request.RpcRequest, request)
			// d.SetPartial("master_instance_type")
			// d.SetPartial("core_instance_type")
		}
	}

	if d.HasChange("core_disk_size") && d.Get("engine") != "bds" {
		request := hbase.CreateResizeDiskSizeRequest()
		client.InitRpcRequest(*request.RpcRequest)
		request.ClusterId = d.Id()
		request.NodeDiskSize = requests.NewInteger(d.Get("core_disk_size").(int))

		raw, err := client.WithHbaseClient(func(client *hbase.Client) (interface{}, error) {
			return client.ResizeDiskSize(request)
		})
		bresponse, ok := raw.(*hbase.ResizeDiskSizeResponse)
		if err != nil {
			errmsg := ""
			if ok {
				errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
			}
			return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
		}
		// Cumbersome operation,async call, wait for state change
		// wait instance status is running after modifying
		stateConf := BuildStateConf([]string{Hb_DISK_RESIZING}, []string{Hb_ACTIVATION}, d.Timeout(schema.TimeoutUpdate),
			2*time.Minute, hBaseService.HBaseClusterStateRefreshFunc(d.Id(), []string{Hb_DISK_RESIZE_FAILED}))
		if _, err := stateConf.WaitForState(); err != nil {
			return errmsgs.WrapError(err)
		}
		addDebug(request.GetActionName(), raw, request.RpcRequest, request)
		//d.SetPartial("core_disk_size")
	}

	if d.HasChange("cold_storage_size") {
		request := hbase.CreateResizeColdStorageSizeRequest()
		client.InitRpcRequest(*request.RpcRequest)
		request.ClusterId = d.Id()
		request.ColdStorageSize = requests.NewInteger(d.Get("cold_storage_size").(int))

		raw, err := client.WithHbaseClient(func(client *hbase.Client) (interface{}, error) {
			return client.ResizeColdStorageSize(request)
		})
		bresponse, ok := raw.(*hbase.ResizeColdStorageSizeResponse)
		if err != nil {
			errmsg := ""
			if ok {
				errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
			}
			return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
		}
		// Cumbersome operation,async call, wait for state change
		// wait instance status is running after modifying
		stateConf := BuildStateConf([]string{Hb_HBASE_COLD_EXPANDING}, []string{Hb_ACTIVATION}, d.Timeout(schema.TimeoutUpdate),
			10*time.Second, hBaseService.HBaseClusterStateRefreshFunc(d.Id(), []string{Hb_DISK_RESIZE_FAILED}))
		if _, err := stateConf.WaitForState(); err != nil {
			return errmsgs.WrapError(err)
		}
		addDebug(request.GetActionName(), raw, request.RpcRequest, request)
		//d.SetPartial("cold_storage_size")
	}

	d.Partial(false)
	return nil
}