alibabacloudstack/resource_apsarastack_ons_instance.go (271 lines of code) (raw):

package alibabacloudstack import ( "encoding/json" "errors" "fmt" "log" "strconv" "time" "github.com/aliyun/alibaba-cloud-sdk-go/sdk/responses" "github.com/aliyun/alibaba-cloud-sdk-go/services/ons" "github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/connectivity" "github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/errmsgs" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) func resourceAlibabacloudStackOnsInstance() *schema.Resource { resource := &schema.Resource{ Schema: map[string]*schema.Schema{ "name": { Type: schema.TypeString, Required: true, ValidateFunc: validation.StringLenBetween(3, 64), }, "tps_receive_max": { Type: schema.TypeInt, Required: true, }, "tps_send_max": { Type: schema.TypeInt, Required: true, }, "topic_capacity": { Type: schema.TypeInt, Required: true, }, "independent_naming": { Type: schema.TypeString, Required: true, }, "cluster": { Type: schema.TypeString, Required: true, }, "remark": { Type: schema.TypeString, Optional: true, ValidateFunc: validation.StringLenBetween(0, 128), }, // Computed Values "instance_type": { Type: schema.TypeInt, Computed: true, }, "instance_status": { Type: schema.TypeInt, Computed: true, }, "create_time": { Type: schema.TypeString, Computed: true, }, }, } setResourceFunc(resource, resourceAlibabacloudStackOnsInstanceCreate, resourceAlibabacloudStackOnsInstanceRead, resourceAlibabacloudStackOnsInstanceUpdate, resourceAlibabacloudStackOnsInstanceDelete) return resource } func resourceAlibabacloudStackOnsInstanceCreate(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AlibabacloudStackClient) maxrtps := d.Get("tps_receive_max").(int) maxstps := d.Get("tps_send_max").(int) topiccapacity := d.Get("topic_capacity").(int) independentname := d.Get("independent_naming").(string) ins_resp := OnsInstance{} cluster := d.Get("cluster").(string) name := d.Get("name").(string) request := client.NewCommonRequest("POST", "Ons-inner", "2018-02-05", "ConsoleInstanceCreate", "") mergeMaps(request.QueryParams, map[string]string{ "ProductName": "Ons-inner", "OnsRegionId": client.RegionId, "InstanceName": name, "MaxReceiveTps": fmt.Sprint(maxrtps), "MaxSendTps": fmt.Sprint(maxstps), "TopicCapacity": fmt.Sprint(topiccapacity), "Cluster": cluster, "IndependentNaming": independentname, }) raw, err := client.WithOnsClient(func(onsClient *ons.Client) (interface{}, error) { return onsClient.ProcessCommonRequest(request) }) bresponse, ok := raw.(*responses.CommonResponse) addDebug("ConsoleInstanceCreate", raw, request, request.QueryParams) if err != nil { errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse) } return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_ons_instance", "ConsoleInstanceCreate", errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } err = json.Unmarshal(bresponse.GetHttpContentBytes(), &ins_resp) if ins_resp.Success != true { return errmsgs.WrapErrorf(errors.New(ins_resp.Message), errmsgs.DefaultErrorMsg, "alibabacloudstack_ons_instance", "ConsoleInstanceCreate", errmsgs.AlibabacloudStackSdkGoERROR) } if err != nil { return errmsgs.WrapError(err) } d.SetId(ins_resp.Data.InstanceID) return nil } func resourceAlibabacloudStackOnsInstanceRead(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AlibabacloudStackClient) onsService := OnsService{client} response, err := onsService.DescribeOnsInstance(d.Id()) if err != nil { // Handle exceptions if errmsgs.NotFoundError(err) { d.SetId("") return nil } return errmsgs.WrapError(err) } d.Set("name", response.Data.InstanceName) d.Set("instance_type", response.Data.InstanceType) d.Set("instance_status", response.Data.InstanceStatus) d.Set("remark", response.Data.Remark) d.Set("tps_receive_max", response.Data.TpsReceiveMax) d.Set("tps_send_max", response.Data.TpsSendMax) d.Set("independent_naming", fmt.Sprintf("%t", response.Data.IndependentNaming)) d.Set("cluster", response.Data.Cluster) d.Set("topic_capacity", response.Data.TopicCapacity) d.Set("create_time", time.Unix(response.Data.CreateTime/1000, 0).Format("2006-01-02 03:04:05")) return nil } func resourceAlibabacloudStackOnsInstanceUpdate(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AlibabacloudStackClient) onsService := OnsService{client} independentname := d.Get("independent_naming").(string) cluster := d.Get("cluster").(string) attributeUpdate := false check, err := onsService.DescribeOnsInstance(d.Id()) if err != nil { return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, d.Id(), "IsInstanceExist", errmsgs.AlibabacloudStackSdkGoERROR) } var name, remark string if d.HasChange("name") { if v, ok := d.GetOk("name"); ok { name = v.(string) } check.Data.InstanceName = name attributeUpdate = true } else { if v, ok := d.GetOk("name"); ok { name = v.(string) } check.Data.InstanceName = name } var maxrtps, maxstps, topic int if d.HasChange("tps_receive_max") { if v, ok := d.GetOk("tps_receive_max"); ok { maxrtps = v.(int) } check.Data.TpsReceiveMax = maxrtps attributeUpdate = true } else { if v, ok := d.GetOk("tps_receive_max"); ok { maxrtps = v.(int) } check.Data.TpsReceiveMax = maxrtps } if d.HasChange("tps_send_max") { if v, ok := d.GetOk("tps_send_max"); ok { maxstps = v.(int) } check.Data.TpsSendMax = maxstps attributeUpdate = true } else { if v, ok := d.GetOk("tps_send_max"); ok { maxstps = v.(int) } check.Data.TpsSendMax = maxstps } if d.HasChange("topic_capacity") { if v, ok := d.GetOk("topic_capacity"); ok { topic = v.(int) } check.Data.TopicCapacity = topic attributeUpdate = true } else { if v, ok := d.GetOk("topic_capacity"); ok { topic = v.(int) } check.Data.TopicCapacity = topic } if d.HasChange("remark") { if v, ok := d.GetOk("remark"); ok { remark = v.(string) } check.Data.Remark = remark attributeUpdate = true } else { if v, ok := d.GetOk("remark"); ok { remark = v.(string) } check.Data.Remark = remark } topiccap := strconv.Itoa(topic) Maxrtps := strconv.Itoa(maxrtps) Maxstps := strconv.Itoa(maxstps) request := client.NewCommonRequest("POST", "Ons-inner", "2018-02-05", "ConsoleInstanceUpdate", "") mergeMaps(request.QueryParams, map[string]string{ "Remark": remark, "InstanceName": name, "OnsRegionId": client.RegionId, "PreventCache": "", "MaxReceiveTps": Maxrtps, "MaxSendTps": Maxstps, "Cluster": cluster, "IndependentNaming": independentname, "InstanceId": d.Id(), "TopicCapacity": topiccap, }) check.Data.InstanceID = d.Id() if attributeUpdate { raw, err := client.WithOnsClient(func(onsClient *ons.Client) (interface{}, error) { return onsClient.ProcessCommonRequest(request) }) bresponse, ok := raw.(*responses.CommonResponse) log.Printf(" response of raw ConsoleInstanceUpdate : %s", raw) if err != nil { errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse) } return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_ons_instance", "ConsoleInstanceUpdate", errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } addDebug(request.GetActionName(), raw, request) log.Printf("total QueryParams and topic %v %v", request.GetQueryParams(), topic) } return nil } func resourceAlibabacloudStackOnsInstanceDelete(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AlibabacloudStackClient) onsService := OnsService{client} var requestInfo *ons.Client check, err := onsService.DescribeOnsInstance(d.Id()) if err != nil { return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, d.Id(), "IsInstanceExist", errmsgs.AlibabacloudStackSdkGoERROR) } addDebug("IsInstanceExist", check, requestInfo, map[string]string{"InstanceId": d.Id()}) err = resource.Retry(2*time.Minute, func() *resource.RetryError { request := client.NewCommonRequest("POST", "Ons-inner", "2018-02-05", "ConsoleInstanceDelete", "") request.QueryParams["OnsRegionId"] = client.RegionId request.QueryParams["InstanceId"] = d.Id() request.QueryParams["PreventCache"] = "" raw, err := client.WithOnsClient(func(onsClient *ons.Client) (interface{}, error) { return onsClient.ProcessCommonRequest(request) }) bresponse, ok := raw.(*responses.CommonResponse) if err != nil { errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse) } return resource.RetryableError(errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_ons_instance", "ConsoleInstanceDelete", errmsgs.AlibabacloudStackSdkGoERROR, errmsg)) } check, err = onsService.DescribeOnsInstance(d.Id()) if err != nil { return resource.NonRetryableError(err) } return nil }) return nil }