alicloud/resource_alicloud_lindorm_instance.go (1,058 lines of code) (raw):

package alicloud import ( "fmt" "log" "time" "github.com/hashicorp/terraform-plugin-sdk/helper/validation" "github.com/aliyun/terraform-provider-alicloud/alicloud/connectivity" "github.com/hashicorp/terraform-plugin-sdk/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" ) func resourceAliCloudLindormInstance() *schema.Resource { return &schema.Resource{ Create: resourceAliCloudLindormInstanceCreate, Read: resourceAliCloudLindormInstanceRead, Update: resourceAliCloudLindormInstanceUpdate, Delete: resourceAliCloudLindormInstanceDelete, Importer: &schema.ResourceImporter{ State: schema.ImportStatePassthrough, }, Timeouts: &schema.ResourceTimeout{ Create: schema.DefaultTimeout(90 * time.Minute), Update: schema.DefaultTimeout(180 * time.Minute), Delete: schema.DefaultTimeout(10 * time.Minute), }, Schema: map[string]*schema.Schema{ "vswitch_id": { Type: schema.TypeString, Required: true, ForceNew: true, }, "disk_category": { Type: schema.TypeString, Required: true, ForceNew: true, ValidateFunc: StringInSlice([]string{"cloud_efficiency", "cloud_ssd", "cloud_essd", "cloud_essd_pl0", "capacity_cloud_storage", "local_ssd_pro", "local_hdd_pro"}, false), }, "payment_type": { Type: schema.TypeString, Required: true, ForceNew: true, ValidateFunc: StringInSlice([]string{"PayAsYouGo", "Subscription"}, false), }, "cold_storage": { Type: schema.TypeInt, Optional: true, Computed: true, ValidateFunc: validation.Any(IntInSlice([]int{0}), IntBetween(800, 1000000)), }, "core_num": { Type: schema.TypeInt, Optional: true, Removed: "Field `core_num` has been deprecated from provider version 1.188.0, and it has been removed from provider version 1.207.0.", }, "core_spec": { Type: schema.TypeString, Optional: true, ForceNew: true, Computed: true, }, "deletion_proection": { Type: schema.TypeBool, Optional: true, Computed: true, }, "duration": { Type: schema.TypeString, Optional: true, DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool { return d.Get("payment_type").(string) != "Subscription" }, }, "file_engine_node_count": { Type: schema.TypeInt, Optional: true, Computed: true, ValidateFunc: IntAtLeast(2), }, "file_engine_specification": { Type: schema.TypeString, Optional: true, Computed: true, ValidateFunc: StringInSlice([]string{"lindorm.c.xlarge"}, false), }, "group_name": { Type: schema.TypeString, Optional: true, Removed: "Field `group_name` has been removed from provider version 1.211.0.", }, "instance_name": { Type: schema.TypeString, Optional: true, }, "instance_storage": { Type: schema.TypeString, Optional: true, Computed: true, }, "ip_white_list": { Type: schema.TypeSet, Optional: true, Elem: &schema.Schema{Type: schema.TypeString}, }, "lts_node_count": { Type: schema.TypeInt, Optional: true, Computed: true, }, "lts_node_specification": { Type: schema.TypeString, Optional: true, Computed: true, ValidateFunc: StringInSlice([]string{"lindorm.g.xlarge", "lindorm.g.2xlarge"}, false), }, "phoenix_node_count": { Type: schema.TypeInt, Optional: true, Removed: "Field `phoenix_node_count` has been removed from provider version 1.211.0.", }, "phoenix_node_specification": { Type: schema.TypeString, Optional: true, Removed: "Field `phoenix_node_specification` has been removed from provider version 1.211.0.", }, "pricing_cycle": { Type: schema.TypeString, Optional: true, ValidateFunc: StringInSlice([]string{"Month", "Year"}, false), DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool { return d.Get("payment_type").(string) != "Subscription" }, }, "search_engine_node_count": { Type: schema.TypeInt, Optional: true, Computed: true, ValidateFunc: IntAtLeast(2), }, "search_engine_specification": { Type: schema.TypeString, Optional: true, Computed: true, ValidateFunc: StringInSlice([]string{"lindorm.g.xlarge", "lindorm.g.2xlarge", "lindorm.g.4xlarge", "lindorm.g.8xlarge"}, false), }, "table_engine_node_count": { Type: schema.TypeInt, Optional: true, Computed: true, ValidateFunc: IntAtLeast(2), }, "table_engine_specification": { Type: schema.TypeString, Optional: true, Computed: true, }, "time_series_engine_node_count": { Type: schema.TypeInt, Optional: true, Computed: true, ValidateFunc: IntAtLeast(2), }, "time_serires_engine_specification": { Type: schema.TypeString, Optional: true, Computed: true, ConflictsWith: []string{"time_series_engine_specification"}, Deprecated: "Field `time_serires_engine_specification` has been deprecated from provider version 1.182.0. New field `time_series_engine_specification` instead.", }, "time_series_engine_specification": { Type: schema.TypeString, Optional: true, Computed: true, ConflictsWith: []string{"time_serires_engine_specification"}, }, "stream_engine_node_count": { Type: schema.TypeInt, Optional: true, Computed: true, }, "stream_engine_specification": { Type: schema.TypeString, Optional: true, Computed: true, }, "upgrade_type": { Type: schema.TypeString, Optional: true, Removed: "Field `upgrade_type` has been deprecated from provider version 1.163.0, and it has been removed from provider version 1.207.0.", }, "vpc_id": { Type: schema.TypeString, Optional: true, ForceNew: true, Computed: true, }, "zone_id": { Type: schema.TypeString, Optional: true, ForceNew: true, Computed: true, }, "resource_group_id": { Type: schema.TypeString, Optional: true, ForceNew: true, Computed: true, }, "log_num": { Type: schema.TypeInt, Optional: true, ValidateFunc: IntBetween(4, 400), }, "log_single_storage": { Type: schema.TypeInt, Optional: true, ValidateFunc: IntBetween(400, 64000), }, "arbiter_zone_id": { Type: schema.TypeString, Optional: true, ForceNew: true, }, "multi_zone_combination": { Type: schema.TypeString, Optional: true, ForceNew: true, ValidateFunc: StringInSlice([]string{"ap-southeast-5abc-aliyun", "cn-hangzhou-ehi-aliyun", "cn-beijing-acd-aliyun", "ap-southeast-1-abc-aliyun", "cn-zhangjiakou-abc-aliyun", "cn-shanghai-efg-aliyun", "cn-shanghai-abd-aliyun", "cn-hangzhou-bef-aliyun", "cn-hangzhou-bce-aliyun", "cn-beijing-fgh-aliyun", "cn-shenzhen-abc-aliyun"}, false), }, "arbiter_vswitch_id": { Type: schema.TypeString, Optional: true, ForceNew: true, }, "standby_zone_id": { Type: schema.TypeString, Optional: true, ForceNew: true, }, "log_spec": { Type: schema.TypeString, Optional: true, ValidateFunc: StringInSlice([]string{"lindorm.sn1.large", "lindorm.sn1.2xlarge"}, false), }, "log_disk_category": { Type: schema.TypeString, Optional: true, ForceNew: true, ValidateFunc: StringInSlice([]string{"cloud_efficiency", "cloud_ssd"}, false), }, "core_single_storage": { Type: schema.TypeInt, Optional: true, ValidateFunc: IntBetween(400, 64000), }, "standby_vswitch_id": { Type: schema.TypeString, Optional: true, ForceNew: true, }, "arch_version": { Type: schema.TypeString, Optional: true, ForceNew: true, Computed: true, ValidateFunc: StringInSlice([]string{"1.0", "2.0"}, false), }, "primary_vswitch_id": { Type: schema.TypeString, Optional: true, ForceNew: true, }, "primary_zone_id": { Type: schema.TypeString, Optional: true, ForceNew: true, }, "tags": tagsSchema(), "service_type": { Type: schema.TypeString, Computed: true, }, "enabled_file_engine": { Type: schema.TypeBool, Computed: true, }, "enabled_time_serires_engine": { Type: schema.TypeBool, Computed: true, }, "enabled_table_engine": { Type: schema.TypeBool, Computed: true, }, "enabled_search_engine": { Type: schema.TypeBool, Computed: true, }, "enabled_lts_engine": { Type: schema.TypeBool, Computed: true, }, "enabled_stream_engine": { Type: schema.TypeBool, Computed: true, }, "status": { Type: schema.TypeString, Computed: true, }, "auto_renew": { Type: schema.TypeString, Optional: true, DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool { return d.Get("payment_type").(string) != "Subscription" }, }, "auto_renew_period": { Type: schema.TypeString, Optional: true, DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool { return d.Get("payment_type").(string) != "Subscription" }, }, }, } } func resourceAliCloudLindormInstanceCreate(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AliyunClient) var response map[string]interface{} action := "CreateLindormInstance" request := make(map[string]interface{}) var err error if v, ok := d.GetOk("cold_storage"); ok { request["ColdStorage"] = v } request["DiskCategory"] = d.Get("disk_category") if v, ok := d.GetOk("duration"); ok { request["Duration"] = v } if v, ok := d.GetOk("file_engine_node_count"); ok { request["FilestoreNum"] = v } if v, ok := d.GetOk("file_engine_specification"); ok { request["FilestoreSpec"] = v } if v, ok := d.GetOk("instance_name"); ok { request["InstanceAlias"] = v } if v, ok := d.GetOk("instance_storage"); ok { request["InstanceStorage"] = v } request["PayType"] = convertLindormInstancePaymentTypeRequest(d.Get("payment_type").(string)) if v, ok := d.GetOk("pricing_cycle"); ok { request["PricingCycle"] = v } request["RegionId"] = client.RegionId if v, ok := d.GetOk("search_engine_node_count"); ok { request["SolrNum"] = v } if v, ok := d.GetOk("search_engine_specification"); ok { request["SolrSpec"] = v } if v, ok := d.GetOk("table_engine_node_count"); ok { request["LindormNum"] = v } if v, ok := d.GetOk("table_engine_specification"); ok { request["LindormSpec"] = v } if v, ok := d.GetOk("time_series_engine_node_count"); ok { request["TsdbNum"] = v } if v, ok := d.GetOk("time_serires_engine_specification"); ok { request["TsdbSpec"] = v } else if v, ok := d.GetOk("time_series_engine_specification"); ok { request["TsdbSpec"] = v } if v, ok := d.GetOkExists("stream_engine_node_count"); ok { request["StreamNum"] = v } if v, ok := d.GetOk("stream_engine_specification"); ok { request["StreamSpec"] = v } if v, ok := d.GetOk("zone_id"); ok { request["ZoneId"] = v } if v, ok := d.GetOk("vpc_id"); ok { request["VPCId"] = v } if v, ok := d.GetOk("vswitch_id"); ok { request["VSwitchId"] = v } if v, ok := d.GetOk("resource_group_id"); ok { request["ResourceGroupId"] = v } if v, ok := d.GetOk("core_spec"); ok { request["CoreSpec"] = v } if v, ok := d.GetOk("log_num"); ok { request["LogNum"] = v } if v, ok := d.GetOk("log_single_storage"); ok { request["LogSingleStorage"] = v } if v, ok := d.GetOk("arbiter_zone_id"); ok { request["ArbiterZoneId"] = v } if v, ok := d.GetOk("multi_zone_combination"); ok { request["MultiZoneCombination"] = v } if v, ok := d.GetOk("arbiter_vswitch_id"); ok { request["ArbiterVSwitchId"] = v } if v, ok := d.GetOk("standby_zone_id"); ok { request["StandbyZoneId"] = v } if v, ok := d.GetOk("log_spec"); ok { request["LogSpec"] = v } if v, ok := d.GetOk("log_disk_category"); ok { request["LogDiskCategory"] = v } if v, ok := d.GetOk("core_single_storage"); ok { request["CoreSingleStorage"] = v } if v, ok := d.GetOk("standby_vswitch_id"); ok { request["StandbyVSwitchId"] = v } if v, ok := d.GetOk("primary_zone_id"); ok { request["PrimaryZoneId"] = v } if v, ok := d.GetOk("primary_vswitch_id"); ok { request["PrimaryVSwitchId"] = v } if v, ok := d.GetOk("arch_version"); ok { request["ArchVersion"] = v } if v, ok := d.GetOk("auto_renew"); ok { request["AutoRenewal"] = v } if v, ok := d.GetOk("auto_renew_period"); ok { request["AutoRenewDuration"] = v } if (request["ZoneId"] == nil || request["VpcId"] == nil) && request["VSwitchId"] != nil { vpcService := VpcService{client} vsw, err := vpcService.DescribeVSwitchWithTeadsl(request["VSwitchId"].(string)) if err != nil { return WrapError(err) } if v, ok := request["VPCId"].(string); !ok || v == "" { request["VPCId"] = vsw["VpcId"] } if v, ok := request["ZoneId"].(string); !ok || v == "" { request["ZoneId"] = vsw["ZoneId"] } } wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(client.GetRetryTimeout(d.Timeout(schema.TimeoutCreate)), func() *resource.RetryError { response, err = client.RpcPost("hitsdb", "2020-06-15", action, nil, request, false) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { return WrapErrorf(err, DefaultErrorMsg, "alicloud_lindorm_instance", action, AlibabaCloudSdkGoERROR) } d.SetId(fmt.Sprint(response["InstanceId"])) hitsdbService := HitsdbService{client} stateConf := BuildStateConf([]string{}, []string{"ACTIVATION"}, d.Timeout(schema.TimeoutCreate), 1*time.Minute, hitsdbService.LindormInstanceStateRefreshFunc(d.Id(), []string{})) if _, err := stateConf.WaitForState(); err != nil { return WrapErrorf(err, IdMsg, d.Id()) } return resourceAliCloudLindormInstanceUpdate(d, meta) } func resourceAliCloudLindormInstanceRead(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AliyunClient) hitsdbService := HitsdbService{client} object, err := hitsdbService.DescribeLindormInstance(d.Id()) if err != nil { if !d.IsNewResource() && NotFoundError(err) { log.Printf("[DEBUG] Resource alicloud_lindorm_instance hitsdbService.DescribeLindormInstance Failed!!! %s", err) d.SetId("") return nil } return WrapError(err) } if v, ok := object["ColdStorage"]; ok { d.Set("cold_storage", formatInt(v)) } d.Set("deletion_proection", object["DeletionProtection"]) d.Set("disk_category", object["DiskCategory"]) d.Set("instance_name", object["InstanceAlias"]) d.Set("payment_type", convertLindormInstancePaymentTypeResponse(object["PayType"])) d.Set("status", object["InstanceStatus"]) d.Set("vswitch_id", object["VswitchId"]) d.Set("zone_id", object["ZoneId"]) d.Set("primary_zone_id", object["PrimaryZoneId"]) d.Set("primary_vswitch_id", object["PrimaryVSwitchId"]) d.Set("resource_group_id", object["ResourceGroupId"]) d.Set("vpc_id", object["VpcId"]) //if object["ServiceType"] == "lindorm_multizone" { d.Set("log_num", object["LogNum"]) d.Set("log_single_storage", object["LogSingleStorage"]) d.Set("arbiter_zone_id", object["ArbiterZoneId"]) d.Set("multi_zone_combination", object["MultiZoneCombination"]) d.Set("arbiter_vswitch_id", object["ArbiterVSwitchId"]) d.Set("standby_zone_id", object["StandbyZoneId"]) d.Set("arbiter_vswitch_id", object["ArbiterVSwitchId"]) d.Set("log_spec", object["LogSpec"]) d.Set("log_disk_category", object["LogDiskCategory"]) d.Set("standby_vswitch_id", object["StandbyVSwitchId"]) //} d.Set("arch_version", object["ArchVersion"]) d.Set("core_spec", object["CoreSpec"]) //} //if object["DiskCategory"] != "local_ssd_pro" && object["DiskCategory"] != "local_hdd_pro" { d.Set("core_single_storage", object["CoreSingleStorage"]) d.Set("instance_storage", object["InstanceStorage"]) //} engineType := formatInt(object["EngineType"]) d.Set("enabled_file_engine", engineType&0x08 == 8) d.Set("enabled_time_serires_engine", engineType&0x02 == 2) d.Set("enabled_table_engine", engineType&0x04 == 4) d.Set("enabled_search_engine", engineType&0x01 == 1) d.Set("enabled_lts_engine", object["EnableBDS"]) d.Set("enabled_stream_engine", object["EnableStream"]) ipWhite, err := hitsdbService.GetInstanceIpWhiteList(d.Id()) if err != nil { return WrapError(err) } d.Set("ip_white_list", ipWhite) getLindormInstanceEngineInfoObject, err := hitsdbService.GetLindormInstanceEngineInfo(d.Id()) if err != nil { return WrapError(err) } if v, ok := getLindormInstanceEngineInfoObject["FileEngineNodeCount"]; ok { d.Set("file_engine_node_count", formatInt(v)) } d.Set("file_engine_specification", getLindormInstanceEngineInfoObject["FileEngineSpecification"]) if v, ok := getLindormInstanceEngineInfoObject["LtsNodeCount"]; ok { d.Set("lts_node_count", formatInt(v)) } d.Set("lts_node_specification", getLindormInstanceEngineInfoObject["LtsNodeSpecification"]) if v, ok := getLindormInstanceEngineInfoObject["SearchEngineNodeCount"]; ok { d.Set("search_engine_node_count", formatInt(v)) } d.Set("search_engine_specification", getLindormInstanceEngineInfoObject["SearchEngineSpecification"]) if v, ok := getLindormInstanceEngineInfoObject["TableEngineNodeCount"]; ok { d.Set("table_engine_node_count", formatInt(v)) } d.Set("table_engine_specification", getLindormInstanceEngineInfoObject["TableEngineSpecification"]) if v, ok := getLindormInstanceEngineInfoObject["TimeSeriesNodeCount"]; ok { d.Set("time_series_engine_node_count", formatInt(v)) } d.Set("time_serires_engine_specification", getLindormInstanceEngineInfoObject["TimeSeriesSpecification"]) d.Set("time_series_engine_specification", getLindormInstanceEngineInfoObject["TimeSeriesSpecification"]) if v, ok := getLindormInstanceEngineInfoObject["StreamNodeCount"]; ok { d.Set("stream_engine_node_count", formatInt(v)) } d.Set("stream_engine_specification", getLindormInstanceEngineInfoObject["StreamSpecification"]) listTagResourcesObject, err := hitsdbService.ListTagResources(d.Id(), "INSTANCE") if err != nil { return WrapError(err) } d.Set("tags", tagsToMap(listTagResourcesObject)) d.Set("service_type", object["ServiceType"]) return nil } func resourceAliCloudLindormInstanceUpdate(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AliyunClient) hitsdbService := HitsdbService{client} var response map[string]interface{} var err error d.Partial(true) if d.HasChange("tags") { if err := hitsdbService.SetResourceTags(d, "INSTANCE"); err != nil { return WrapError(err) } d.SetPartial("tags") } update := false request := map[string]interface{}{ "InstanceId": d.Id(), } if d.HasChange("ip_white_list") { update = true if v, ok := d.GetOk("ip_white_list"); ok && v != nil { request["SecurityIpList"] = convertListToCommaSeparate(v.(*schema.Set).List()) } } if update { action := "UpdateInstanceIpWhiteList" wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(client.GetRetryTimeout(d.Timeout(schema.TimeoutUpdate)), func() *resource.RetryError { response, err = client.RpcPost("hitsdb", "2020-06-15", action, nil, request, false) if err != nil { if IsExpectedErrors(err, []string{"Instance.IsNotValid"}) || NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR) } d.SetPartial("ip_white_list") } update = false updateLindormInstanceAttributeReq := map[string]interface{}{ "InstanceId": d.Id(), } if d.HasChange("instance_name") && !d.IsNewResource() { update = true if v, ok := d.GetOk("instance_name"); ok { updateLindormInstanceAttributeReq["InstanceAlias"] = v } } if d.HasChange("deletion_proection") { update = true if v, ok := d.GetOkExists("deletion_proection"); ok { updateLindormInstanceAttributeReq["DeletionProtection"] = v } } if update { action := "UpdateLindormInstanceAttribute" wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(client.GetRetryTimeout(d.Timeout(schema.TimeoutUpdate)), func() *resource.RetryError { response, err = client.RpcPost("hitsdb", "2020-06-15", action, nil, updateLindormInstanceAttributeReq, false) if err != nil { if IsExpectedErrors(err, []string{"Instance.IsNotValid"}) || NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, updateLindormInstanceAttributeReq) if err != nil { return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR) } d.SetPartial("instance_name") d.SetPartial("deletion_proection") } update = false upgradeLindormLogReq := map[string]interface{}{} if !d.IsNewResource() && d.HasChange("log_single_storage") { update = true upgradeLindormLogReq["UpgradeType"] = "upgrade-disk-size" upgradeLindormLogReq["LogSingleStorage"] = d.Get("log_single_storage") } if !d.IsNewResource() && d.HasChange("log_spec") { update = true upgradeLindormLogReq["UpgradeType"] = "upgrade-lindorm-engine" upgradeLindormLogReq["LogSpec"] = d.Get("log_spec") } if !d.IsNewResource() && d.HasChange("core_single_storage") { update = true upgradeLindormLogReq["UpgradeType"] = "upgrade-disk-size" upgradeLindormLogReq["CoreSingleStorage"] = d.Get("core_single_storage") } if update { err := UpgradeLindormInstance(d, meta, upgradeLindormLogReq) if err != nil { return WrapError(err) } d.SetPartial("log_single_storage") d.SetPartial("core_single_storage") d.SetPartial("log_spec") } update = false upgradeLindormInstanceColdStorageReq := map[string]interface{}{ "UpgradeType": "upgrade-cold-storage", } if d.HasChange("cold_storage") && !d.IsNewResource() { update = true if v, ok := d.GetOk("cold_storage"); ok { upgradeLindormInstanceColdStorageReq["ColdStorage"] = v } d.SetPartial("cold_storage") } if update { err := UpgradeLindormInstance(d, meta, upgradeLindormInstanceColdStorageReq) if err != nil { return WrapError(err) } } update = false upgradeLindormInstanceFilestoreNumReq := map[string]interface{}{ "UpgradeType": "upgrade-file-core-num", } if d.HasChange("file_engine_node_count") && !d.IsNewResource() { update = true if v, ok := d.GetOk("file_engine_node_count"); ok { upgradeLindormInstanceFilestoreNumReq["FilestoreNum"] = v } } if update { if v, ok := d.GetOk("instance_storage"); ok { upgradeLindormInstanceFilestoreNumReq["ClusterStorage"] = v } err := UpgradeLindormInstance(d, meta, upgradeLindormInstanceFilestoreNumReq) if err != nil { return WrapError(err) } d.SetPartial("file_engine_node_count") } update = false upgradeLindormInstanceFilestoreSpecReq := map[string]interface{}{ "UpgradeType": "upgrade-file-engine", } if d.HasChange("file_engine_specification") && !d.IsNewResource() { update = true if v, ok := d.GetOk("file_engine_specification"); ok { upgradeLindormInstanceFilestoreSpecReq["FilestoreSpec"] = v } } if update { if v, ok := d.GetOk("instance_storage"); ok { upgradeLindormInstanceFilestoreNumReq["ClusterStorage"] = v } err := UpgradeLindormInstance(d, meta, upgradeLindormInstanceFilestoreSpecReq) if err != nil { return WrapError(err) } d.SetPartial("file_engine_specification") } if (d.HasChange("search_engine_node_count") || d.HasChange("search_engine_specification")) && !d.IsNewResource() { newSolrSpec := d.Get("search_engine_specification") newSolrNum := d.Get("search_engine_node_count") enabled := d.Get("enabled_search_engine").(bool) currentInstanceStorage := formatInt(d.Get("instance_storage")) if !enabled { upgradeLindormInstanceSearchReq := map[string]interface{}{} upgradeLindormInstanceSearchReq["UpgradeType"] = "open-search-engine" upgradeLindormInstanceSearchReq["SolrSpec"] = newSolrSpec upgradeLindormInstanceSearchReq["SolrNum"] = newSolrNum upgradeLindormInstanceSearchReq["ClusterStorage"] = currentInstanceStorage err := UpgradeLindormInstance(d, meta, upgradeLindormInstanceSearchReq) if err != nil { return WrapError(err) } } if enabled && d.HasChange("search_engine_specification") { upgradeLindormInstanceSearchReq := map[string]interface{}{} upgradeLindormInstanceSearchReq["UpgradeType"] = "upgrade-search-engine" upgradeLindormInstanceSearchReq["SolrSpec"] = newSolrSpec upgradeLindormInstanceSearchReq["ClusterStorage"] = currentInstanceStorage err := UpgradeLindormInstance(d, meta, upgradeLindormInstanceSearchReq) if err != nil { return WrapError(err) } } if enabled && d.HasChange("search_engine_node_count") { upgradeLindormInstanceSearchNumReq := map[string]interface{}{} upgradeLindormInstanceSearchNumReq["UpgradeType"] = "upgrade-search-core-num" upgradeLindormInstanceSearchNumReq["SolrNum"] = newSolrNum upgradeLindormInstanceSearchNumReq["ClusterStorage"] = currentInstanceStorage err := UpgradeLindormInstance(d, meta, upgradeLindormInstanceSearchNumReq) if err != nil { return WrapError(err) } } d.SetPartial("search_engine_specification") d.SetPartial("search_engine_node_count") } if (d.HasChange("table_engine_node_count") || d.HasChange("table_engine_specification")) && !d.IsNewResource() { newLindormSpec := d.Get("table_engine_specification") newLindormNum := d.Get("table_engine_node_count") enabled := d.Get("enabled_table_engine").(bool) currentInstanceStorage := formatInt(d.Get("instance_storage")) if !enabled { upgradeLindormInstanceTableReq := map[string]interface{}{} upgradeLindormInstanceTableReq["UpgradeType"] = "open-lindorm-engine" upgradeLindormInstanceTableReq["LindormSpec"] = newLindormSpec upgradeLindormInstanceTableReq["LindormNum"] = newLindormNum upgradeLindormInstanceTableReq["ClusterStorage"] = currentInstanceStorage err := UpgradeLindormInstance(d, meta, upgradeLindormInstanceTableReq) if err != nil { return WrapError(err) } } if enabled && d.HasChange("table_engine_specification") { upgradeLindormInstanceTableReq := map[string]interface{}{} upgradeLindormInstanceTableReq["UpgradeType"] = "upgrade-lindorm-engine" upgradeLindormInstanceTableReq["LindormSpec"] = newLindormSpec upgradeLindormInstanceTableReq["ClusterStorage"] = currentInstanceStorage err := UpgradeLindormInstance(d, meta, upgradeLindormInstanceTableReq) if err != nil { return WrapError(err) } } if enabled && d.HasChange("table_engine_node_count") { if !d.IsNewResource() && d.HasChange("log_num") && d.HasChange("table_engine_node_count") { upgradeLindormLogNumReq := map[string]interface{}{} upgradeLindormLogNumReq["UpgradeType"] = "upgrade-lindorm-core-num" upgradeLindormLogNumReq["LogNum"] = d.Get("log_num") upgradeLindormLogNumReq["LindormNum"] = d.Get("table_engine_node_count") err := UpgradeLindormInstance(d, meta, upgradeLindormLogNumReq) if err != nil { return WrapError(err) } } else { upgradeLindormInstanceTableNumReq := map[string]interface{}{} upgradeLindormInstanceTableNumReq["UpgradeType"] = "upgrade-lindorm-core-num" upgradeLindormInstanceTableNumReq["LindormNum"] = newLindormNum upgradeLindormInstanceTableNumReq["ClusterStorage"] = currentInstanceStorage err := UpgradeLindormInstance(d, meta, upgradeLindormInstanceTableNumReq) if err != nil { return WrapError(err) } } } d.SetPartial("table_engine_specification") d.SetPartial("table_engine_node_count") } if (d.HasChange("time_series_engine_node_count") || d.HasChange("time_serires_engine_specification") || d.HasChange("time_series_engine_specification")) && !d.IsNewResource() { var newTsdbSpec interface{} if d.HasChange("time_serires_engine_specification") { newTsdbSpec = d.Get("time_serires_engine_specification") } if d.HasChange("time_series_engine_specification") { newTsdbSpec = d.Get("time_series_engine_specification") } newTsdbNum := d.Get("time_series_engine_node_count") enabled := d.Get("enabled_time_serires_engine").(bool) currentInstanceStorage := formatInt(d.Get("instance_storage")) if !enabled { upgradeLindormInstanceSearchReq := map[string]interface{}{} upgradeLindormInstanceSearchReq["UpgradeType"] = "open-tsdb-engine" upgradeLindormInstanceSearchReq["TsdbSpec"] = newTsdbSpec upgradeLindormInstanceSearchReq["TsdbNum"] = newTsdbNum upgradeLindormInstanceSearchReq["ClusterStorage"] = currentInstanceStorage err := UpgradeLindormInstance(d, meta, upgradeLindormInstanceSearchReq) if err != nil { return WrapError(err) } } if enabled && (d.HasChange("time_serires_engine_specification") || d.HasChange("time_series_engine_specification")) { upgradeLindormInstanceSearchReq := map[string]interface{}{} upgradeLindormInstanceSearchReq["UpgradeType"] = "upgrade-tsdb-engine" upgradeLindormInstanceSearchReq["TsdbSpec"] = newTsdbSpec upgradeLindormInstanceSearchReq["ClusterStorage"] = currentInstanceStorage err := UpgradeLindormInstance(d, meta, upgradeLindormInstanceSearchReq) if err != nil { return WrapError(err) } } if enabled && d.HasChange("time_series_engine_node_count") { upgradeLindormInstanceSearchNumReq := map[string]interface{}{} upgradeLindormInstanceSearchNumReq["UpgradeType"] = "upgrade-tsdb-core-num" upgradeLindormInstanceSearchNumReq["TsdbNum"] = newTsdbNum upgradeLindormInstanceSearchNumReq["ClusterStorage"] = currentInstanceStorage err := UpgradeLindormInstance(d, meta, upgradeLindormInstanceSearchNumReq) if err != nil { return WrapError(err) } } d.SetPartial("time_serires_engine_specification") d.SetPartial("time_series_engine_specification") d.SetPartial("time_series_engine_node_count") } if d.HasChange("lts_node_count") || d.HasChange("lts_node_specification") { newLtsCoreSpec := d.Get("lts_node_specification") newLtsCoreNum := d.Get("lts_node_count") enabled := d.Get("enabled_lts_engine").(bool) currentInstanceStorage := formatInt(d.Get("instance_storage")) if !enabled { upgradeLindormInstanceLtsReq := map[string]interface{}{} upgradeLindormInstanceLtsReq["UpgradeType"] = "open-bds-transfer-only" upgradeLindormInstanceLtsReq["LtsCoreSpec"] = newLtsCoreSpec upgradeLindormInstanceLtsReq["LtsCoreNum"] = newLtsCoreNum upgradeLindormInstanceLtsReq["ClusterStorage"] = currentInstanceStorage err := UpgradeLindormInstance(d, meta, upgradeLindormInstanceLtsReq) if err != nil { return WrapError(err) } } if enabled && d.HasChange("lts_node_specification") { upgradeLindormInstanceLtsReq := map[string]interface{}{} upgradeLindormInstanceLtsReq["UpgradeType"] = "upgrade-bds-transfer" upgradeLindormInstanceLtsReq["LtsCoreSpec"] = newLtsCoreSpec upgradeLindormInstanceLtsReq["ClusterStorage"] = currentInstanceStorage err := UpgradeLindormInstance(d, meta, upgradeLindormInstanceLtsReq) if err != nil { return WrapError(err) } } if enabled && d.HasChange("lts_node_count") { upgradeLindormInstanceLtsNumReq := map[string]interface{}{} upgradeLindormInstanceLtsNumReq["UpgradeType"] = "upgrade-bds-core-num" upgradeLindormInstanceLtsNumReq["LtsCoreNum"] = newLtsCoreNum upgradeLindormInstanceLtsNumReq["ClusterStorage"] = currentInstanceStorage err := UpgradeLindormInstance(d, meta, upgradeLindormInstanceLtsNumReq) if err != nil { return WrapError(err) } } d.SetPartial("lts_node_specification") d.SetPartial("lts_node_count") } if (d.HasChange("stream_engine_node_count") || d.HasChange("stream_engine_specification")) && !d.IsNewResource() { newStreamCoreNum := d.Get("stream_engine_node_count") newStreamCoreSpec := d.Get("stream_engine_specification") enabled := d.Get("enabled_stream_engine").(bool) currentInstanceStorage := formatInt(d.Get("instance_storage")) if !enabled { openStreamEngineReq := map[string]interface{}{} openStreamEngineReq["UpgradeType"] = "open-stream-engine" openStreamEngineReq["StreamNum"] = newStreamCoreNum openStreamEngineReq["StreamSpec"] = newStreamCoreSpec openStreamEngineReq["ClusterStorage"] = currentInstanceStorage err := UpgradeLindormInstance(d, meta, openStreamEngineReq) if err != nil { return WrapError(err) } } if enabled && d.HasChange("stream_engine_node_count") { upgradeStreamCoreNumReq := map[string]interface{}{} upgradeStreamCoreNumReq["UpgradeType"] = "upgrade-stream-core-num" upgradeStreamCoreNumReq["StreamNum"] = newStreamCoreNum upgradeStreamCoreNumReq["ClusterStorage"] = currentInstanceStorage err := UpgradeLindormInstance(d, meta, upgradeStreamCoreNumReq) if err != nil { return WrapError(err) } } if enabled && d.HasChange("stream_engine_specification") { upgradeStreamEngineReq := map[string]interface{}{} upgradeStreamEngineReq["UpgradeType"] = "upgrade-stream-engine" upgradeStreamEngineReq["StreamSpec"] = newStreamCoreSpec err := UpgradeLindormInstance(d, meta, upgradeStreamEngineReq) if err != nil { return WrapError(err) } } d.SetPartial("stream_engine_node_count") d.SetPartial("stream_engine_specification") } update = false upgradeLindormInstanceClusterStorageReq := map[string]interface{}{ "UpgradeType": "upgrade-disk-size", } if d.HasChange("instance_storage") && !d.IsNewResource() { object, err := hitsdbService.DescribeLindormInstance(d.Id()) if err != nil { return WrapError(err) } currentInstanceStorage := fmt.Sprint(object["InstanceStorage"]) chanageInstanceStorage := fmt.Sprint(d.Get("instance_storage")) if currentInstanceStorage != chanageInstanceStorage { update = true upgradeLindormInstanceClusterStorageReq["ClusterStorage"] = chanageInstanceStorage } } if update { err := UpgradeLindormInstance(d, meta, upgradeLindormInstanceClusterStorageReq) if err != nil { return WrapError(err) } d.SetPartial("instance_storage") } d.Partial(false) return resourceAliCloudLindormInstanceRead(d, meta) } func resourceAliCloudLindormInstanceDelete(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AliyunClient) hitsdbService := HitsdbService{client} action := "ReleaseLindormInstance" var response map[string]interface{} var err error object, err := hitsdbService.DescribeLindormInstance(d.Id()) if err != nil { if NotFoundError(err) { d.SetId("") return nil } return WrapError(err) } if fmt.Sprint(object["PayType"]) == "PREPAY" { log.Printf("[WARN] Cannot destroy resource alicloud_lindorm_instance. Terraform will remove this resource from the state file, however resources may remain.") return nil } request := map[string]interface{}{ "InstanceId": d.Id(), } wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(client.GetRetryTimeout(d.Timeout(schema.TimeoutDelete)), func() *resource.RetryError { response, err = client.RpcPost("hitsdb", "2020-06-15", action, nil, request, false) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { if IsExpectedErrors(err, []string{"Lindorm.Errorcode.InstanceNotFound", "Instance.IsDeleted"}) { return nil } return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR) } return nil } func convertLindormInstancePaymentTypeRequest(source interface{}) interface{} { switch source { case "PayAsYouGo": return "POSTPAY" case "Subscription": return "PREPAY" } return source } func convertLindormInstancePaymentTypeResponse(source interface{}) interface{} { switch source { case "POSTPAY": return "PayAsYouGo" case "PREPAY": return "Subscription" } return source } func UpgradeLindormInstance(d *schema.ResourceData, meta interface{}, request map[string]interface{}) error { client := meta.(*connectivity.AliyunClient) var response map[string]interface{} var err error request["InstanceId"] = d.Id() request["RegionId"] = client.RegionId request["ZoneId"] = d.Get("zone_id") action := "UpgradeLindormInstance" wait := incrementalWait(3*time.Second, 30*time.Second) err = resource.Retry(client.GetRetryTimeout(d.Timeout(schema.TimeoutUpdate)), func() *resource.RetryError { response, err = client.RpcPost("hitsdb", "2020-06-15", action, nil, request, false) if err != nil { if IsExpectedErrors(err, []string{"Instance.NotActive", "OperationDenied.OrderProcessing"}) || NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR) } hitsdbService := HitsdbService{client} stateConf := BuildStateConf([]string{}, []string{"ACTIVATION"}, d.Timeout(schema.TimeoutUpdate), 1*time.Minute, hitsdbService.LindormInstanceStateRefreshFunc(d.Id(), []string{})) if _, err := stateConf.WaitForState(); err != nil { return WrapErrorf(err, IdMsg, d.Id()) } return nil }