alibabacloudstack/resource_apsarastack_edas_application.go (338 lines of code) (raw):

package alibabacloudstack import ( "strconv" "time" "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "strings" "github.com/aliyun/alibaba-cloud-sdk-go/services/edas" "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" ) var component_ids map[string]interface{} var component_id int func resourceAlibabacloudStackEdasApplication() *schema.Resource { resource := &schema.Resource{ Schema: map[string]*schema.Schema{ "application_name": { Type: schema.TypeString, Required: true, }, "package_type": { Type: schema.TypeString, Required: true, ForceNew: true, ValidateFunc: validation.StringInSlice([]string{"JAR", "WAR", "Image"}, false), }, "cluster_id": { Type: schema.TypeString, ForceNew: true, Required: true, }, "build_pack_id": { Type: schema.TypeInt, Optional: true, }, "component_id": { Type: schema.TypeInt, Optional: true, }, "descriotion": { Type: schema.TypeString, Optional: true, }, "health_check_url": { Type: schema.TypeString, Optional: true, }, "region_id": { Type: schema.TypeString, Optional: true, }, "ecu_info": { Type: schema.TypeList, Elem: &schema.Schema{Type: schema.TypeString}, Optional: true, }, "group_id": { Type: schema.TypeString, Optional: true, }, "package_version": { Type: schema.TypeString, Optional: true, }, "war_url": { Type: schema.TypeString, Optional: true, }, }, } setResourceFunc(resource, resourceAlibabacloudStackEdasApplicationCreate, resourceAlibabacloudStackEdasApplicationRead, resourceAlibabacloudStackEdasApplicationUpdate, resourceAlibabacloudStackEdasApplicationDelete) return resource } func resourceAlibabacloudStackEdasApplicationCreate(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AlibabacloudStackClient) edasService := EdasService{client} request := edas.CreateInsertApplicationRequest() client.InitRoaRequest(*request.RoaRequest) request.ApplicationName = d.Get("application_name").(string) request.PackageType = d.Get("package_type").(string) request.ClusterId = d.Get("cluster_id").(string) request.Headers["x-acs-content-type"] = "application/x-www-form-urlencoded" if v, ok := d.GetOk("build_pack_id"); ok { request.BuildPackId = requests.NewInteger(v.(int)) } else { request.BuildPackId = requests.NewInteger(-1) } if v, ok := d.GetOk("component_id"); ok { request.ComponentIds = strconv.Itoa(v.(int)) component_id = v.(int) } if v, ok := d.GetOk("descriotion"); ok { request.Description = v.(string) } if v, ok := d.GetOk("health_check_url"); ok { request.HealthCheckUrl = v.(string) } if v, ok := d.GetOk("region_id"); ok { request.RegionId = v.(string) } if v, ok := d.GetOk("ecu_info"); ok { ecuInfo := v.([]interface{}) aString := make([]string, len(ecuInfo)) for i, v := range ecuInfo { if v != nil { aString[i] = v.(string) request.EcuInfo = strings.Join(aString, ",") } } } var appId string var changeOrderId string raw, err := edasService.client.WithEdasClient(func(edasClient *edas.Client) (interface{}, error) { return edasClient.InsertApplication(request) }) bresponse, ok := raw.(*edas.InsertApplicationResponse) if err != nil { errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse) } return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_edas_application", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } addDebug(request.GetActionName(), raw, request.RoaRequest, request) appId = bresponse.ApplicationInfo.AppId if _, ok := d.GetOk("component_id"); ok { if component_ids == nil { component_ids = make(map[string]interface{}) } component_ids[appId] = component_id } changeOrderId = bresponse.ApplicationInfo.ChangeOrderId d.SetId(appId) if bresponse.Code != 200 { return errmsgs.WrapError(errmsgs.Error("create application failed for " + bresponse.Message)) } if len(changeOrderId) > 0 { stateConf := BuildStateConf([]string{"0", "1"}, []string{"2"}, d.Timeout(schema.TimeoutCreate), 5*time.Second, edasService.EdasChangeOrderStatusRefreshFunc(changeOrderId, []string{"3", "6", "10"})) if _, err := stateConf.WaitForState(); err != nil { return errmsgs.WrapErrorf(err, errmsgs.IdMsg, d.Id()) } } // check url information var groupId string var warUrl string if v, ok := d.GetOk("group_id"); ok { groupId = v.(string) } if v, ok := d.GetOk("war_url"); ok { warUrl = v.(string) } if len(warUrl) != 0 && len(groupId) != 0 { // deploy application var packageVersion string if v, ok := d.GetOk("package_version"); ok { packageVersion = v.(string) } else { packageVersion = strconv.FormatInt(time.Now().Unix(), 10) } request := edas.CreateDeployApplicationRequest() client.InitRoaRequest(*request.RoaRequest) request.AppId = appId request.GroupId = groupId request.PackageVersion = packageVersion request.DeployType = "url" request.WarUrl = warUrl request.Headers["x-acs-content-type"] = "application/x-www-form-urlencoded" raw, err := edasService.client.WithEdasClient(func(edasClient *edas.Client) (interface{}, error) { return edasClient.DeployApplication(request) }) bresponse, ok := raw.(*edas.DeployApplicationResponse) 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.RoaRequest, request) changeOrderId = bresponse.ChangeOrderId if bresponse.Code != 200 { return errmsgs.WrapError(errmsgs.Error("deploy application failed for " + bresponse.Message)) } if len(changeOrderId) > 0 { stateConf := BuildStateConf([]string{"0", "1"}, []string{"2"}, d.Timeout(schema.TimeoutCreate), 5*time.Second, edasService.EdasChangeOrderStatusRefreshFunc(changeOrderId, []string{"3", "6", "10"})) if _, err := stateConf.WaitForState(); err != nil { return errmsgs.WrapErrorf(err, errmsgs.IdMsg, d.Id()) } } } return nil } func resourceAlibabacloudStackEdasApplicationUpdate(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AlibabacloudStackClient) edasService := EdasService{client} if d.HasChanges("application_name", "descriotion") { request := edas.CreateUpdateApplicationBaseInfoRequest() client.InitRoaRequest(*request.RoaRequest) request.AppId = d.Id() request.AppName = d.Get("application_name").(string) request.Headers["x-acs-content-type"] = "application/x-www-form-urlencoded" if v, ok := d.GetOk("descriotion"); ok { request.Desc = v.(string) } raw, err := edasService.client.WithEdasClient(func(edasClient *edas.Client) (interface{}, error) { return edasClient.UpdateApplicationBaseInfo(request) }) bresponse, ok := raw.(*edas.UpdateApplicationBaseInfoResponse) 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.RoaRequest, request) } time.Sleep(3 * time.Second) return nil } func resourceAlibabacloudStackEdasApplicationRead(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AlibabacloudStackClient) edasService := EdasService{client} appId := d.Id() request := edas.CreateGetApplicationRequest() client.InitRoaRequest(*request.RoaRequest) request.AppId = appId request.Headers["x-acs-content-type"] = "application/x-www-form-urlencoded" wait := incrementalWait(1*time.Second, 2*time.Second) err := resource.Retry(5*time.Minute, func() *resource.RetryError { raw, err := edasService.client.WithEdasClient(func(edasClient *edas.Client) (interface{}, error) { return edasClient.GetApplication(request) }) bresponse, ok := raw.(*edas.GetApplicationResponse) if err != nil { if errmsgs.IsExpectedErrors(err, []string{errmsgs.ThrottlingUser}) { wait() return resource.RetryableError(err) } errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse) } return resource.NonRetryableError(errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_edas_application", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)) } addDebug(request.GetActionName(), raw, request.RoaRequest, request) d.Set("application_name", bresponse.Applcation.Name) d.Set("cluster_id", bresponse.Applcation.ClusterId) if bresponse.Applcation.BuildPackageId != -1 { d.Set("build_pack_id", bresponse.Applcation.BuildPackageId) } d.Set("descriotion", bresponse.Applcation.Description) d.Set("health_check_url", bresponse.Applcation.HealthCheckUrl) if len(bresponse.Applcation.ApplicationType) > 0 && bresponse.Applcation.ApplicationType == "FatJar" { d.Set("package_type", "JAR") } else { d.Set("package_type", "WAR") } if _, ok := component_ids[appId]; ok { component_id = component_ids[appId].(int) d.Set("component_id", component_id) } return nil }) if err != nil { return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, "alibabacloudstack_edas_application", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR) } return nil } func resourceAlibabacloudStackEdasApplicationDelete(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AlibabacloudStackClient) edasService := EdasService{client} appId := d.Id() request := edas.CreateStopApplicationRequest() client.InitRoaRequest(*request.RoaRequest) request.AppId = appId request.Headers["x-acs-content-type"] = "application/x-www-form-urlencoded" raw, err := edasService.client.WithEdasClient(func(edasClient *edas.Client) (interface{}, error) { return edasClient.StopApplication(request) }) bresponse, ok := raw.(*edas.StopApplicationResponse) 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.RoaRequest, request) changeOrderId := bresponse.ChangeOrderId if len(changeOrderId) > 0 { stateConf := BuildStateConf([]string{"0", "1"}, []string{"2"}, d.Timeout(schema.TimeoutCreate), 5*time.Second, edasService.EdasChangeOrderStatusRefreshFunc(changeOrderId, []string{"3", "6", "10"})) if _, err := stateConf.WaitForState(); err != nil { return errmsgs.WrapErrorf(err, errmsgs.IdMsg, d.Id()) } } req := edas.CreateDeleteApplicationRequest() client.InitRoaRequest(*req.RoaRequest) req.AppId = d.Id() req.Headers["x-acs-content-type"] = "application/x-www-form-urlencoded" wait := incrementalWait(1*time.Second, 2*time.Second) err = resource.Retry(5*time.Minute, func() *resource.RetryError { raw, err := edasService.client.WithEdasClient(func(edasClient *edas.Client) (interface{}, error) { return edasClient.DeleteApplication(req) }) bresponse, ok := raw.(*edas.DeleteApplicationResponse) if err != nil { if errmsgs.IsExpectedErrors(err, []string{errmsgs.ThrottlingUser}) { wait() return resource.RetryableError(err) } errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse) } return resource.NonRetryableError(errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), req.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)) } addDebug(req.GetActionName(), raw, req.RoaRequest, req) if bresponse.Code == 601 && strings.Contains(bresponse.Message, "Operation cannot be processed because there are running instances.") { err = errmsgs.Error("Operation cannot be processed because there are running instances.") return resource.RetryableError(err) } changeOrderId = bresponse.ChangeOrderId delete(component_ids, req.AppId) if len(changeOrderId) > 0 { stateConf := BuildStateConf([]string{"0", "1"}, []string{"2"}, d.Timeout(schema.TimeoutCreate), 5*time.Second, edasService.EdasChangeOrderStatusRefreshFunc(changeOrderId, []string{"3", "6", "10"})) if _, err := stateConf.WaitForState(); err != nil { return resource.NonRetryableError(errmsgs.WrapErrorf(err, errmsgs.IdMsg, d.Id())) } } return nil }) if err != nil { return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, d.Id(), req.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR) } return nil }