alibabacloudstack/resource_apsarastack_hbase_cluster.go (683 lines of code) (raw):
package alibabacloudstack
import (
"strings"
"time"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
"github.com/aliyun/alibaba-cloud-sdk-go/services/hbase"
"github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/connectivity"
"github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/errmsgs"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
func resourceAlibabacloudStackHBaseInstance() *schema.Resource {
resource := &schema.Resource{
Timeouts: &schema.ResourceTimeout{
Create: schema.DefaultTimeout(30 * time.Minute),
Update: schema.DefaultTimeout(30 * time.Minute),
Delete: schema.DefaultTimeout(30 * time.Minute),
},
Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Required: true,
ValidateFunc: validation.StringLenBetween(2, 128),
},
"zone_id": {
Type: schema.TypeString,
Optional: true,
Computed: true,
ForceNew: true,
},
"engine": {
Type: schema.TypeString,
Optional: true,
ForceNew: true,
ValidateFunc: validation.StringInSlice([]string{"hbase", "hbaseue", "bds"}, false),
Default: "hbase",
},
"engine_version": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
},
"master_instance_type": {
Type: schema.TypeString,
Required: true,
},
"master_instance_quantity": {
Type: schema.TypeInt,
Computed: true,
},
"core_instance_type": {
Type: schema.TypeString,
Required: true,
},
"core_instance_quantity": {
Type: schema.TypeInt,
ValidateFunc: validation.IntBetween(1, 200),
Optional: true,
Default: 2,
},
"core_disk_type": {
Type: schema.TypeString,
Optional: true,
ForceNew: true,
ValidateFunc: validation.StringInSlice([]string{"cloud_ssd", "cloud_essd_pl1", "cloud_efficiency", "local_hdd_pro", "local_ssd_pro", ""}, false),
DiffSuppressFunc: engineDiffSuppressFunc,
},
"core_disk_size": {
Type: schema.TypeInt,
Optional: true,
ValidateFunc: validation.Any(validation.IntBetween(20, 64000), validation.IntInSlice([]int{0})),
Default: 400,
DiffSuppressFunc: engineDiffSuppressFunc,
},
"pay_type": {
Type: schema.TypeString,
Optional: true,
ValidateFunc: validation.StringInSlice([]string{string(PostPaid), string(PrePaid)}, false),
Default: PostPaid,
},
"duration": {
Type: schema.TypeInt,
Optional: true,
Computed: true,
ValidateFunc: validation.IntInSlice([]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 12, 24, 36}),
DiffSuppressFunc: payTypePostPaidDiffSuppressFunc,
},
"auto_renew": {
Type: schema.TypeBool,
Optional: true,
ForceNew: true,
Computed: true,
DiffSuppressFunc: payTypePostPaidDiffSuppressFunc,
},
"vswitch_id": {
Type: schema.TypeString,
Optional: true,
ForceNew: true,
},
"cold_storage_size": {
Type: schema.TypeInt,
Optional: true,
ValidateFunc: validation.Any(validation.IntBetween(800, 1000000), validation.IntInSlice([]int{0})),
Default: 0,
},
"maintain_start_time": {
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"maintain_end_time": {
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"deletion_protection": {
Type: schema.TypeBool,
Optional: true,
Default: true,
},
"immediate_delete_flag": {
Type: schema.TypeBool,
Optional: true,
Default: false,
},
"tags": tagsSchema(),
"account": {
Type: schema.TypeString,
Optional: true,
ValidateFunc: validation.StringLenBetween(0, 128),
},
"password": {
Type: schema.TypeString,
Optional: true,
Sensitive: true,
ValidateFunc: validation.StringLenBetween(0, 128),
},
"ip_white": {
Type: schema.TypeString,
Optional: true,
Computed: true,
DiffSuppressFunc: whiteIpListDiffSuppressFunc,
},
"security_groups": {
Type: schema.TypeSet,
Optional: true,
Computed: true,
Elem: &schema.Schema{Type: schema.TypeString},
},
"ui_proxy_conn_addrs": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"conn_addr_port": {
Type: schema.TypeString,
Computed: true,
},
"conn_addr": {
Type: schema.TypeString,
Computed: true,
},
"net_type": {
Type: schema.TypeString,
Computed: true,
},
},
},
},
"zk_conn_addrs": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"conn_addr_port": {
Type: schema.TypeString,
Computed: true,
},
"conn_addr": {
Type: schema.TypeString,
Computed: true,
},
"net_type": {
Type: schema.TypeString,
Computed: true,
},
},
},
},
"slb_conn_addrs": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"conn_addr_port": {
Type: schema.TypeString,
Computed: true,
},
"conn_addr": {
Type: schema.TypeString,
Computed: true,
},
"net_type": {
Type: schema.TypeString,
Computed: true,
},
},
},
},
},
}
setResourceFunc(resource, resourceAlibabacloudStackHBaseInstanceCreate, resourceAlibabacloudStackHBaseInstanceRead, resourceAlibabacloudStackHBaseInstanceUpdate, resourceAlibabacloudStackHBaseInstanceDelete)
return resource
}
func checkParams(request *hbase.CreateClusterRequest) error {
if request.Engine == "bds" && request.VSwitchId == "" {
return errmsgs.WrapError(errmsgs.Error("bds is not support classic"))
}
return nil
}
func buildHBaseCreateRequest(d *schema.ResourceData, meta interface{}) (*hbase.CreateClusterRequest, error) {
client := meta.(*connectivity.AlibabacloudStackClient)
vpcService := VpcService{client}
request := hbase.CreateCreateClusterRequest()
client.InitRpcRequest(*request.RpcRequest)
request.ClusterName = Trim(d.Get("name").(string))
request.RegionId = string(client.Region)
request.ZoneId = Trim(d.Get("zone_id").(string))
request.Engine = Trim(d.Get("engine").(string))
request.EngineVersion = Trim(d.Get("engine_version").(string))
request.MasterInstanceType = Trim(d.Get("master_instance_type").(string))
request.CoreInstanceType = Trim(d.Get("core_instance_type").(string))
request.NodeCount = requests.NewInteger(d.Get("core_instance_quantity").(int))
request.DiskType = Trim(d.Get("core_disk_type").(string))
request.DiskSize = requests.NewInteger(d.Get("core_disk_size").(int))
request.PayType = Trim(d.Get("pay_type").(string))
if d.Get("duration").(int) > 9 {
request.PeriodUnit = "year"
request.Period = requests.NewInteger(d.Get("duration").(int) / 12)
} else {
request.PeriodUnit = "month"
request.Period = requests.NewInteger(d.Get("duration").(int))
}
if d.Get("auto_renew").(bool) {
request.AutoRenewPeriod = requests.NewInteger(1)
}
vswitchId := Trim(d.Get("vswitch_id").(string))
if vswitchId != "" {
request.VSwitchId = vswitchId
// check vswitchId in zone
vsw, err := vpcService.DescribeVSwitch(vswitchId)
if err != nil {
return nil, errmsgs.WrapError(err)
}
if request.ZoneId == "" {
request.ZoneId = vsw.ZoneId
} else if strings.Contains(request.ZoneId, MULTI_IZ_SYMBOL) {
zonestr := strings.Split(strings.SplitAfter(request.ZoneId, "(")[1], ")")[0]
if !strings.Contains(zonestr, string([]byte(vsw.ZoneId)[len(vsw.ZoneId)-1])) {
return nil, errmsgs.WrapError(errmsgs.Error("The specified vswitch %s isn't in the multi zone %s.", vsw.VSwitchId, request.ZoneId))
}
} else if request.ZoneId != vsw.ZoneId {
return nil, errmsgs.WrapError(errmsgs.Error("The specified vswitch %s isn't in the zone %s.", vsw.VSwitchId, request.ZoneId))
}
request.VpcId = vsw.VpcId
}
if d.Get("cold_storage_size").(int) < 0 {
return nil, errmsgs.WrapError(errmsgs.Error("cold_storage_size=%s is invalid", d.Get("cold_storage_size")))
}
request.ColdStorageSize = requests.NewInteger(d.Get("cold_storage_size").(int))
request.SecurityIPList = d.Get("ip_white").(string)
return request, checkParams(request)
}
func resourceAlibabacloudStackHBaseInstanceCreate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
hBaseService := HBaseService{client}
request, err := buildHBaseCreateRequest(d, meta)
if err != nil {
return errmsgs.WrapError(err)
}
raw, err := client.WithHbaseClient(func(client *hbase.Client) (interface{}, error) {
return client.CreateCluster(request)
})
bresponse, ok := raw.(*hbase.CreateClusterResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_hbase_instance", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
response, _ := raw.(*hbase.CreateClusterResponse)
d.SetId(response.ClusterId)
stateConf := BuildStateConf([]string{Hb_LAUNCHING, Hb_CREATING}, []string{Hb_ACTIVATION}, d.Timeout(schema.TimeoutCreate),
5*time.Minute, hBaseService.HBaseClusterStateRefreshFunc(d.Id(), []string{Hb_CREATE_FAILED}))
if _, err := stateConf.WaitForState(); err != nil {
return errmsgs.WrapError(err)
}
return nil
}
func resourceAlibabacloudStackHBaseInstanceRead(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
hbaseService := HBaseService{client}
instance, err := hbaseService.DescribeHBaseInstance(d.Id())
if err != nil {
if errmsgs.NotFoundError(err) {
d.SetId("")
return nil
}
return errmsgs.WrapError(err)
}
d.Set("name", instance["InstanceName"])
d.Set("zone_id", instance["ZoneId"])
d.Set("engine", instance["Engine"])
d.Set("engine_version", instance["MajorVersion"])
d.Set("master_instance_type", instance["MasterInstanceType"])
d.Set("master_instance_quantity", instance["MasterNodeCount"])
d.Set("core_instance_type", instance["CoreInstanceType"])
d.Set("core_instance_quantity", instance["CoreNodeCount"])
d.Set("core_disk_size", formatInt(instance["CoreDiskCount"])*formatInt(instance["CoreDiskSize"]))
d.Set("core_disk_type", instance["CoreDiskType"])
// Postpaid -> PostPaid
if instance["PayType"] == string(Postpaid) {
d.Set("pay_type", string(PostPaid))
} else if instance["PayType"] == string(Prepaid) {
d.Set("pay_type", string(PrePaid))
period, err := computePeriodByUnit(instance["CreatedTimeUTC"], instance["ExpireTimeUTC"], d.Get("duration").(int), "Month")
if err != nil {
return errmsgs.WrapError(err)
}
d.Set("duration", period)
}
// now sdk can not get right value, "auto_renew", "is_cold_storage".
d.Set("auto_renew", instance["AutoRenewal"])
d.Set("cold_storage_size", instance["ColdStorageSize"])
d.Set("vpc_id", instance["VpcId"])
d.Set("vswitch_id", instance["VswitchId"])
d.Set("maintain_start_time", instance["MaintainStartTime"])
d.Set("maintain_end_time", instance["MaintainEndTime"])
d.Set("deletion_protection", instance["IsDeletionProtection"])
d.Set("tags", tagsToMap(instance["Tags"]))
ipWhitelist, err := hbaseService.DescribeIpWhitelist(d.Id())
if err != nil {
return errmsgs.WrapError(err)
}
ipWhite := LOCAL_HOST_IP
for _, value := range ipWhitelist.Groups.Group {
if value.GroupName == "default" {
ipWhite = strings.Join(value.IpList.Ip, ",")
}
}
d.Set("ip_white", ipWhite)
securityGroups, err := hbaseService.DescribeSecurityGroups(d.Id())
if err != nil {
return errmsgs.WrapError(err)
}
d.Set("security_groups", securityGroups.SecurityGroupIds.SecurityGroupId)
conns, err := hbaseService.DescribeClusterConnection(d.Id())
if err != nil {
return errmsgs.WrapError(err)
}
// UiProxyConnAddrInfo
var uiConnAddrs []map[string]interface{}
e := map[string]interface{}{
"conn_addr_port": conns.UiProxyConnAddrInfo.ConnAddrPort,
"conn_addr": conns.UiProxyConnAddrInfo.ConnAddr,
"net_type": conns.UiProxyConnAddrInfo.NetType,
}
uiConnAddrs = append(uiConnAddrs, e)
d.Set("ui_proxy_conn_addrs", uiConnAddrs)
// ZKConnAddrs
var zkConnAddrs []map[string]interface{}
for _, v := range conns.ZkConnAddrs.ZkConnAddr {
e := map[string]interface{}{
"conn_addr_port": v.ConnAddrPort,
"conn_addr": v.ConnAddr,
"net_type": v.NetType,
}
zkConnAddrs = append(zkConnAddrs, e)
}
d.Set("zk_conn_addrs", zkConnAddrs)
// slbConnAddrs
var slbConnAddrs []map[string]interface{}
for _, v := range conns.SlbConnAddrs.SlbConnAddr {
e := map[string]interface{}{
"conn_addr_port": v.ConnAddrInfo.ConnAddrPort,
"conn_addr": v.ConnAddrInfo.ConnAddr,
"net_type": v.ConnAddrInfo.NetType,
}
slbConnAddrs = append(slbConnAddrs, e)
}
d.Set("slb_conn_addrs", slbConnAddrs)
return nil
}
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
}
func resourceAlibabacloudStackHBaseInstanceDelete(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
hbaseService := HBaseService{client}
request := hbase.CreateDeleteInstanceRequest()
client.InitRpcRequest(*request.RpcRequest)
request.ClusterId = d.Id()
if v, ok := d.GetOk("immediate_delete_flag"); ok {
request.ImmediateDeleteFlag = requests.NewBoolean(v.(bool))
}
raw, err := client.WithHbaseClient(func(hbaseClient *hbase.Client) (interface{}, error) {
return hbaseClient.DeleteInstance(request)
})
bresponse, ok := raw.(*hbase.DeleteInstanceResponse)
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{"Instance.NotFound"}) {
return 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{Hb_DELETING}, []string{}, d.Timeout(schema.TimeoutDelete), 1*time.Minute, hbaseService.HBaseClusterStateRefreshFunc(d.Id(), []string{}))
_, err = stateConf.WaitForState()
return errmsgs.WrapError(err)
}