alibabacloudstack/resource_apsarastack_elasticsearch_on_k8s_instance.go (563 lines of code) (raw):

package alibabacloudstack import ( "encoding/json" "log" "regexp" "strings" "time" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/denverdino/aliyungo/common" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/aliyun/alibaba-cloud-sdk-go/sdk/responses" "github.com/aliyun/alibaba-cloud-sdk-go/services/ecs" "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 resourceAlibabacloudStackElasticsearchOnk8s() *schema.Resource { resource := &schema.Resource{ Timeouts: &schema.ResourceTimeout{ Create: schema.DefaultTimeout(120 * time.Minute), Update: schema.DefaultTimeout(120 * time.Minute), Delete: schema.DefaultTimeout(120 * time.Minute), }, Schema: map[string]*schema.Schema{ // Basic instance information "description": { Type: schema.TypeString, Optional: true, ValidateFunc: validation.StringMatch(regexp.MustCompile(`^[\w\-.]{0,30}$`), "be 0 to 30 characters in length and can contain numbers, letters, underscores, (_) and hyphens (-). It must start with a letter, a number or Chinese character."), Computed: true, }, "vswitch_id": { Type: schema.TypeString, Required: true, ForceNew: true, }, "password": { Type: schema.TypeString, Sensitive: true, Optional: true, }, "kms_encrypted_password": { Type: schema.TypeString, Optional: true, DiffSuppressFunc: kmsDiffSuppressFunc, }, "kms_encryption_context": { Type: schema.TypeMap, Optional: true, DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool { return d.Get("kms_encrypted_password").(string) == "" }, Elem: schema.TypeString, }, "version": { Type: schema.TypeString, Required: true, DiffSuppressFunc: esVersionDiffSuppressFunc, ForceNew: true, }, "tags": tagsSchema(), // Life cycle "instance_charge_type": { Type: schema.TypeString, ValidateFunc: validation.StringInSlice([]string{string(common.PrePaid), string(common.PostPaid)}, false), Default: PostPaid, Optional: true, }, "period": { Type: schema.TypeInt, ValidateFunc: validation.IntInSlice([]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 12, 24, 36}), Optional: true, Default: 1, DiffSuppressFunc: PostPaidDiffSuppressFunc, }, // Data node configuration "data_node_amount": { Type: schema.TypeInt, Required: true, ValidateFunc: validation.IntBetween(2, 50), }, "data_node_spec": { Type: schema.TypeString, Required: true, }, "data_node_disk_size": { Type: schema.TypeInt, Required: true, }, "data_node_disk_type": { Type: schema.TypeString, Required: true, }, "data_node_disk_encrypted": { Type: schema.TypeBool, Optional: true, ForceNew: true, Default: false, }, "private_whitelist": { Type: schema.TypeSet, Optional: true, Elem: &schema.Schema{Type: schema.TypeString}, Computed: true, }, "enable_public": { Type: schema.TypeBool, Optional: true, Default: false, }, "public_whitelist": { Type: schema.TypeSet, Optional: true, Elem: &schema.Schema{Type: schema.TypeString}, Computed: true, DiffSuppressFunc: elasticsearchEnablePublicDiffSuppressFunc, }, "master_node_spec": { Type: schema.TypeString, Optional: true, }, // Client node configuration "client_node_amount": { Type: schema.TypeInt, Optional: true, ValidateFunc: validation.IntBetween(2, 25), }, "client_node_spec": { Type: schema.TypeString, Optional: true, }, "protocol": { Type: schema.TypeString, Optional: true, Default: "HTTP", ValidateFunc: validation.StringInSlice([]string{"HTTP", "HTTPS"}, false), }, "domain": { Type: schema.TypeString, Computed: true, }, "port": { Type: schema.TypeInt, Computed: true, }, "status": { Type: schema.TypeString, Computed: true, }, // Kibana node configuration "kibana_domain": { Type: schema.TypeString, Computed: true, }, "kibana_port": { Type: schema.TypeInt, Computed: true, }, "enable_kibana_public_network": { Type: schema.TypeBool, Optional: true, Default: true, }, "kibana_whitelist": { Type: schema.TypeSet, Optional: true, Elem: &schema.Schema{Type: schema.TypeString}, Computed: true, DiffSuppressFunc: elasticsearchEnableKibanaPublicDiffSuppressFunc, }, "enable_kibana_private_network": { Type: schema.TypeBool, Optional: true, Default: false, }, "kibana_private_whitelist": { Type: schema.TypeSet, Optional: true, Elem: &schema.Schema{Type: schema.TypeString}, Computed: true, DiffSuppressFunc: elasticsearchEnableKibanaPrivateDiffSuppressFunc, }, "zone_count": { Type: schema.TypeInt, ForceNew: true, Optional: true, ValidateFunc: validation.IntBetween(1, 3), Default: 1, }, "resource_group_id": { Type: schema.TypeString, ForceNew: true, Optional: true, Computed: true, }, "setting_config": { Type: schema.TypeMap, Optional: true, Computed: true, }, }, } setResourceFunc(resource, resourceAlibabacloudStackElasticsearchOnk8sCreate, resourceAlibabacloudStackElasticsearchOnk8sRead, resourceAlibabacloudStackElasticsearchOnk8sUpdate, resourceAlibabacloudStackElasticsearchOnk8sDelete) return resource } func resourceAlibabacloudStackElasticsearchOnk8sCreate(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AlibabacloudStackClient) elasticsearchService := ElasticsearchService{client} action := "createInstance" requestBody, _ := buildElasticsearchOnk8sCreateRequestBody(d, meta) body, _ := json.Marshal(requestBody) bodydata := string(body) request := client.NewCommonRequest("POST", "elasticsearch-k8s", "2017-06-13", "createInstance", "") request.Headers["Content-Type"] = "application/json" request.QueryParams["X-acs-body"] = bodydata request.QueryParams["ClientToken"] = buildClientToken("createInstance") raw, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { return ecsClient.ProcessCommonRequest(request) }) bresponse, ok := raw.(*responses.CommonResponse) if err != nil { errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse) } return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_elasticsearch_k8s_instance", action, errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } addDebug(action, raw, request.QueryParams) var resp CreateElasticsearchOnk8sResponse err = json.Unmarshal(bresponse.GetHttpContentBytes(), &resp) if err != nil { return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, "apsarastack_elasticsearch_on_k8s_instance", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR) } Result := resp.Result log.Printf("############## Result : %s", Result) d.SetId(Result["instanceId"]) stateConf := BuildStateConf([]string{"activating"}, []string{"active"}, d.Timeout(schema.TimeoutCreate), 5*time.Minute, elasticsearchService.ElasticsearchOnK8sStateRefreshFunc(d.Id(), []string{"inactive"})) stateConf.PollInterval = 5 * time.Second if _, err := stateConf.WaitForState(); err != nil { return errmsgs.WrapErrorf(err, errmsgs.IdMsg, d.Id()) } return nil } func resourceAlibabacloudStackElasticsearchOnk8sRead(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AlibabacloudStackClient) elasticsearchService := ElasticsearchService{client} object, err := elasticsearchService.DescribeElasticsearchOnk8sInstance(d.Id()) if err != nil { if errmsgs.NotFoundError(err) { d.SetId("") return nil } return errmsgs.WrapError(err) } if (object["instanceId"].(string)) != d.Id() { return errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("ElasticsearchOnK8s Instance", d.Id())), errmsgs.NotFoundWithResponse) } d.Set("description", object["description"]) d.Set("status", object["status"]) d.Set("vswitch_id", object["networkConfig"].(map[string]interface{})["vswitchId"]) esIPWhitelist := object["esIPWhitelist"].([]interface{}) publicIpWhitelist := object["publicIpWhitelist"].([]interface{}) d.Set("private_whitelist", filterWhitelist(convertArrayInterfaceToArrayString(esIPWhitelist), d.Get("private_whitelist").(*schema.Set))) d.Set("public_whitelist", filterWhitelist(convertArrayInterfaceToArrayString(publicIpWhitelist), d.Get("public_whitelist").(*schema.Set))) d.Set("enable_public", object["enablePublic"]) d.Set("version", object["esVersion"]) d.Set("instance_charge_type", getChargeType(object["paymentType"].(string))) d.Set("domain", object["domain"]) d.Set("port", object["port"]) // Kibana configuration d.Set("enable_kibana_public_network", object["enableKibanaPublicNetwork"]) kibanaIPWhitelist := object["kibanaIPWhitelist"].([]interface{}) d.Set("kibana_whitelist", filterWhitelist(convertArrayInterfaceToArrayString(kibanaIPWhitelist), d.Get("kibana_whitelist").(*schema.Set))) if object["enableKibanaPublicNetwork"].(bool) { d.Set("kibana_domain", object["kibanaDomain"]) d.Set("kibana_port", object["kibanaPort"]) } d.Set("enable_kibana_private_network", object["enableKibanaPrivateNetwork"]) kibanaPrivateIPWhitelist := object["kibanaPrivateIPWhitelist"].([]interface{}) d.Set("kibana_private_whitelist", filterWhitelist(convertArrayInterfaceToArrayString(kibanaPrivateIPWhitelist), d.Get("kibana_private_whitelist").(*schema.Set))) // Data node configuration d.Set("data_node_amount", object["nodeAmount"]) d.Set("data_node_spec", object["nodeSpec"].(map[string]interface{})["spec"]) d.Set("data_node_disk_size", object["nodeSpec"].(map[string]interface{})["disk"]) d.Set("data_node_disk_type", object["nodeSpec"].(map[string]interface{})["diskType"]) d.Set("data_node_disk_encrypted", object["nodeSpec"].(map[string]interface{})["diskEncryption"]) d.Set("master_node_spec", object["masterConfiguration"].(map[string]interface{})["spec"]) // Client node configuration d.Set("client_node_amount", object["clientNodeConfiguration"].(map[string]interface{})["amount"]) d.Set("client_node_spec", object["clientNodeConfiguration"].(map[string]interface{})["spec"]) // Protocol: HTTP/HTTPS d.Set("protocol", object["protocol"]) // Cross zone configuration d.Set("zone_count", object["zoneCount"]) d.Set("resource_group_id", object["resourceGroup"]) esConfig := object["esConfig"].(map[string]interface{}) if esConfig != nil { d.Set("setting_config", esConfig) } // tags //tags, err := elasticsearchService.DescribeElasticsearchTags(d.Id()) //if err != nil { // return errmsgs.WrapError(err) //} //if len(tags) > 0 { // d.Set("tags", tags) //} return nil } func resourceAlibabacloudStackElasticsearchOnk8sUpdate(d *schema.ResourceData, meta interface{}) (err error) { client := meta.(*connectivity.AlibabacloudStackClient) elasticsearchService := ElasticsearchService{client} d.Partial(true) stateConf := BuildStateConf([]string{"activating"}, []string{"active"}, d.Timeout(schema.TimeoutUpdate), 5*time.Minute, elasticsearchService.ElasticsearchOnK8sStateRefreshFunc(d.Id(), []string{"inactive"})) stateConf.PollInterval = 5 * time.Second if d.HasChange("description") { if err := updateDescription(d, meta); err != nil { return errmsgs.WrapError(err) } //d.SetPartial("description") } if d.HasChange("private_whitelist") { content := make(map[string]interface{}) content["networkType"] = string(PRIVATE) content["nodeType"] = string(WORKER) content["whiteIpList"] = d.Get("private_whitelist").(*schema.Set).List() if err := elasticsearchService.ModifyWhiteIps(d, content, meta); err != nil { return errmsgs.WrapError(err) } //d.SetPartial("private_whitelist") } // if d.HasChange("enable_public") { // content := make(map[string]interface{}) // content["networkType"] = string(PUBLIC) // content["nodeType"] = string(WORKER) // content["actionType"] = elasticsearchService.getActionType(d.Get("enable_public").(bool)) // if err := elasticsearchService.TriggerNetwork(d, content, meta); err != nil { // return errmsgs.WrapError(err) // } // //d.SetPartial("enable_public") // } if d.Get("enable_public").(bool) && d.HasChange("public_whitelist") { content := make(map[string]interface{}) content["networkType"] = string(PUBLIC) content["nodeType"] = string(WORKER) content["whiteIpList"] = d.Get("public_whitelist").(*schema.Set).List() if err := elasticsearchService.ModifyWhiteIps(d, content, meta); err != nil { return errmsgs.WrapError(err) } //d.SetPartial("public_whitelist") } // if d.HasChange("enable_kibana_public_network") || d.IsNewResource() { // content := make(map[string]interface{}) // content["networkType"] = string(PUBLIC) // content["nodeType"] = string(KIBANA) // content["actionType"] = elasticsearchService.getActionType(d.Get("enable_kibana_public_network").(bool)) // if err := elasticsearchService.TriggerNetwork(d, content, meta); err != nil { // return errmsgs.WrapError(err) // } // //d.SetPartial("enable_kibana_public_network") // } if d.Get("enable_kibana_public_network").(bool) && d.HasChange("kibana_whitelist") { content := make(map[string]interface{}) content["networkType"] = string(PUBLIC) content["nodeType"] = string(KIBANA) content["whiteIpList"] = d.Get("kibana_whitelist").(*schema.Set).List() if err := elasticsearchService.ModifyWhiteIps(d, content, meta); err != nil { return errmsgs.WrapError(err) } //d.SetPartial("kibana_whitelist") } // if d.HasChange("enable_kibana_private_network") { // content := make(map[string]interface{}) // content["networkType"] = string(PRIVATE) // content["nodeType"] = string(KIBANA) // content["actionType"] = elasticsearchService.getActionType(d.Get("enable_kibana_private_network").(bool)) // if err := elasticsearchService.TriggerNetwork(d, content, meta); err != nil { // return errmsgs.WrapError(err) // } // //d.SetPartial("enable_kibana_private_network") // } if d.Get("enable_kibana_private_network").(bool) == true && d.HasChange("kibana_private_whitelist") { content := make(map[string]interface{}) content["networkType"] = string(PRIVATE) content["nodeType"] = string(KIBANA) content["whiteIpList"] = d.Get("kibana_private_whitelist").(*schema.Set).List() if err := elasticsearchService.ModifyWhiteIps(d, content, meta); err != nil { return errmsgs.WrapError(err) } //d.SetPartial("kibana_private_whitelist") } if d.HasChange("tags") { if err := updateInstanceTags(d, meta); err != nil { return errmsgs.WrapError(err) } //d.SetPartial("tags") } if d.HasChanges("client_node_spec", "client_node_amount") { if _, err := stateConf.WaitForState(); err != nil { return errmsgs.WrapErrorf(err, errmsgs.IdMsg, d.Id()) } if err := updateClientNode(d, meta); err != nil { return errmsgs.WrapError(err) } //d.SetPartial("client_node_spec") //d.SetPartial("client_node_amount") } // if d.HasChange("protocol") { // if _, err := stateConf.WaitForState(); err != nil { // return errmsgs.WrapErrorf(err, errmsgs.IdMsg, d.Id()) // } // var https func(*schema.ResourceData, interface{}) error // if d.Get("protocol") == "HTTPS" { // https = openHttps // } else if d.Get("protocol") == "HTTP" { // https = closeHttps // } // if nil != https { // if err := https(d, meta); err != nil { // return errmsgs.WrapError(err) // } // } // //d.SetPartial("protocol") // } if d.HasChange("setting_config") { action := "UpdateInstanceSettings" content := map[string]interface{}{ "RegionId": client.RegionId, "clientToken": StringPointer(buildClientToken(action)), } config := d.Get("setting_config").(map[string]interface{}) content["esConfig"] = config _, err = client.DoTeaRequest("POST", "elasticsearch-k8s", "2017-06-13", action, "", nil, nil, content) if err != nil && !errmsgs.IsExpectedErrors(err, []string{"MustChangeOneResource", "CssCheckUpdowngradeError"}) { return err } stateConf := BuildStateConf([]string{"activating"}, []string{"active"}, d.Timeout(schema.TimeoutUpdate), 5*time.Minute, elasticsearchService.ElasticsearchOnK8sStateRefreshFunc(d.Id(), []string{"inactive"})) stateConf.PollInterval = 5 * time.Second if _, err := stateConf.WaitForState(); err != nil { return errmsgs.WrapErrorf(err, errmsgs.IdMsg, d.Id()) } //d.SetPartial("setting_config") } if d.IsNewResource() { d.Partial(false) return nil } if d.HasChange("instance_charge_type") { if err := updateInstanceChargeType(d, meta); err != nil { return errmsgs.WrapError(err) } //d.SetPartial("instance_charge_type") //d.SetPartial("period") } else if d.Get("instance_charge_type").(string) == string(PrePaid) && d.HasChange("period") { if err := renewInstance(d, meta); err != nil { return errmsgs.WrapError(err) } //d.SetPartial("period") } if d.HasChange("data_node_amount") { if _, err := stateConf.WaitForState(); err != nil { return errmsgs.WrapErrorf(err, errmsgs.IdMsg, d.Id()) } if err := updateDataNodeAmount(d, meta); err != nil { return errmsgs.WrapError(err) } //d.SetPartial("data_node_amount") } if d.HasChanges("data_node_spec", "data_node_disk_size", "data_node_disk_type") { if _, err := stateConf.WaitForState(); err != nil { return errmsgs.WrapErrorf(err, errmsgs.IdMsg, d.Id()) } if err := updateDataNodeSpec(d, meta); err != nil { return errmsgs.WrapError(err) } //d.SetPartial("data_node_spec") //d.SetPartial("data_node_disk_size") //d.SetPartial("data_node_disk_type") //d.SetPartial("data_node_disk_encrypted") } if d.HasChange("master_node_spec") { if _, err := stateConf.WaitForState(); err != nil { return errmsgs.WrapErrorf(err, errmsgs.IdMsg, d.Id()) } if err := updateMasterNode(d, meta); err != nil { return errmsgs.WrapError(err) } //d.SetPartial("master_node_spec") } if d.HasChanges("password", "kms_encrypted_password") { if _, err := stateConf.WaitForState(); err != nil { return errmsgs.WrapErrorf(err, errmsgs.IdMsg, d.Id()) } if err := updatePassword(d, meta); err != nil { return errmsgs.WrapError(err) } //d.SetPartial("password") } d.Partial(false) return nil } func resourceAlibabacloudStackElasticsearchOnk8sDelete(d *schema.ResourceData, meta interface{}) (err error) { client := meta.(*connectivity.AlibabacloudStackClient) elasticsearchService := ElasticsearchService{client} action := "DeleteInstance" if strings.ToLower(d.Get("instance_charge_type").(string)) == strings.ToLower(string(PrePaid)) { return errmsgs.WrapError(errmsgs.Error("At present, 'PrePaid' instance cannot be deleted and must wait it to be expired and release it automatically")) } request := map[string]interface{}{ "RegionId": client.RegionId, "clientToken": StringPointer(buildClientToken(action)), } // retry _, err = client.DoTeaRequest("POST", "elasticsearch-k8s", "2017-06-13", action, "", nil, nil, request) if err != nil { if errmsgs.IsExpectedErrors(err, []string{"InstanceNotFound"}) { return nil } return err } stateConf := BuildStateConf([]string{"activating"}, []string{"active"}, d.Timeout(schema.TimeoutDelete), 5*time.Minute, elasticsearchService.ElasticsearchOnK8sStateRefreshFunc(d.Id(), []string{})) stateConf.PollInterval = 5 * time.Second if _, err = stateConf.WaitForState(); err != nil { return errmsgs.WrapErrorf(err, errmsgs.IdMsg, d.Id()) } // Instance will be completed deleted in 5 minutes, so deleting vswitch is available after the time. time.Sleep(5 * time.Minute) return nil } func buildElasticsearchOnk8sCreateRequestBody(d *schema.ResourceData, meta interface{}) (map[string]interface{}, error) { client := meta.(*connectivity.AlibabacloudStackClient) vpcService := VpcService{client} content := make(map[string]interface{}) if v, ok := d.GetOk("resource_group_id"); ok && v.(string) != "" { content["ResourceGroup"] = v.(string) } else { content["ResourceGroup"] = client.ResourceGroup } content["OrganizationId"] = client.Department content["region"] = client.RegionId content["Department"] = client.Department content["paymentType"] = strings.ToLower(d.Get("instance_charge_type").(string)) if d.Get("instance_charge_type").(string) == string(PrePaid) { paymentInfo := make(map[string]interface{}) if d.Get("period").(int) >= 12 { paymentInfo["duration"] = d.Get("period").(int) / 12 paymentInfo["pricingCycle"] = string(Year) } else { paymentInfo["duration"] = d.Get("period").(int) paymentInfo["pricingCycle"] = string(Month) } content["paymentInfo"] = paymentInfo } //content["nodeAmount"] = d.Get("data_node_amount") content["esVersion"] = d.Get("version") content["description"] = d.Get("description") content["instanceCategory"] = "x-pack" password := d.Get("password").(string) kmsPassword := d.Get("kms_encrypted_password").(string) if password == "" && kmsPassword == "" { return nil, errmsgs.WrapError(errmsgs.Error("One of the 'password' and 'kms_encrypted_password' should be set.")) } if password != "" { content["esAdminPassword"] = password } else { kmsService := KmsService{client} decryptResp, err := kmsService.Decrypt(kmsPassword, d.Get("kms_encryption_context").(map[string]interface{})) if err != nil { return content, errmsgs.WrapError(err) } content["esAdminPassword"] = decryptResp } // Data node configuration if d.Get("data_node_spec") != nil && d.Get("data_node_spec") != "" { dataNodeSpec := make(map[string]interface{}) dataNodeSpec["spec"] = d.Get("data_node_spec") dataNodeSpec["disk"] = d.Get("data_node_disk_size") dataNodeSpec["diskType"] = "fast-disks" content["dataNode"] = true content["nodeSpec"] = dataNodeSpec content["nodeAmount"] = 3 } //dataNodeSpec := make(map[string]interface{}) //dataNodeSpec["spec"] = d.Get("data_node_spec") //dataNodeSpec["disk"] = d.Get("data_node_disk_size") //dataNodeSpec["diskType"] = d.Get("data_node_disk_type") //dataNodeSpec["diskEncryption"] = d.Get("data_node_disk_encrypted") //content["nodeSpec"] = dataNodeSpec // Master node configuration if d.Get("master_node_spec") != nil && d.Get("master_node_spec") != "" { masterNode := make(map[string]interface{}) masterNode["spec"] = d.Get("master_node_spec") masterNode["amount"] = "3" masterNode["disk"] = "100" masterNode["diskType"] = "yoda-lvm" content["advancedDedicateMaster"] = true content["masterConfiguration"] = masterNode } // kinba node configuration if d.Get("kibana_node_spec") != nil && d.Get("kibana_node_spec") != "" { kibanaNode := make(map[string]interface{}) kibanaNode["spec"] = d.Get("kibana_node_spec") kibanaNode["amount"] = "1" content["haveKibana"] = true content["kibanaConfiguration"] = kibanaNode } // Client node configuration if d.Get("client_node_spec") != nil && d.Get("client_node_spec") != "" { clientNode := make(map[string]interface{}) clientNode["spec"] = d.Get("client_node_spec") clientNode["amount"] = 2 content["haveClientNode"] = true content["clientNodeConfiguration"] = clientNode } // Network configuration vswitchId := d.Get("vswitch_id") vsw, err := vpcService.DescribeVSwitch(vswitchId.(string)) if err != nil { return nil, errmsgs.WrapError(err) } network := make(map[string]interface{}) network["type"] = "vpc" network["vpcId"] = vsw.VpcId network["vswitchId"] = vswitchId network["vsArea"] = vsw.ZoneId content["networkConfig"] = network if d.Get("zone_count") != nil && d.Get("zone_count") != "" { content["zoneCount"] = d.Get("zone_count") } var zones []map[string]interface{} zones = append(zones, map[string]interface{}{ "zoneName": vsw.ZoneId, }) content["zones"] = zones content["zoneName"] = vsw.ZoneId return content, nil } type CreateElasticsearchOnk8sResponse struct { *responses.BaseResponse RequestId string `json:"RequestId" xml:"RequestId"` AsapiRequestId string `json:"asapiRequestId" xml:"asapiRequestId"` Result map[string]string } // {"eagleEyeTraceId":"0a1c830b16989984038808531d0052","asapiSuccess":true,"asapiRequestId":"D0D646B0-0205-4B73-9E83-B198419B88E7","RequestId":"D0D646B0-0205-4B73-9E83-B198419B88E7","Result":{"instanceId":"es-cn-re90hg799q019d250"}} func (s *ElasticsearchService) ElasticsearchOnK8sStateRefreshFunc(id string, failStates []string) resource.StateRefreshFunc { return func() (interface{}, string, error) { object, err := s.DescribeElasticsearchOnk8sInstance(id) if err != nil { if errmsgs.NotFoundError(err) { // Set this to nil as if we didn't find anything. return nil, "", nil } return nil, "", errmsgs.WrapError(err) } for _, failState := range failStates { if object["status"].(string) == failState { return object, object["status"].(string), errmsgs.WrapError(errmsgs.Error(errmsgs.FailedToReachTargetStatus, object["status"].(string))) } } log.Printf("DescribeElasticsearchOnk8sInstance result status: %s", object["status"]) return object, object["status"].(string), nil } }