alibabacloudstack/resource_apsarastack_polardb_dbconnection.go (184 lines of code) (raw):

package alibabacloudstack import ( "fmt" "strings" "time" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "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 resourceAlibabacloudStackPolardbConnection() *schema.Resource { resource := &schema.Resource{ Schema: map[string]*schema.Schema{ "instance_id": { Type: schema.TypeString, ForceNew: true, Required: true, }, "connection_prefix": { Type: schema.TypeString, Optional: true, Computed: true, ForceNew: true, ValidateFunc: validation.StringLenBetween(1, 31), }, "port": { Type: schema.TypeString, Optional: true, ValidateFunc: validateDBConnectionPort, Default: "3306", }, "connection_string": { Type: schema.TypeString, Computed: true, }, "ip_address": { Type: schema.TypeString, Computed: true, }, }, } setResourceFunc(resource, resourceAlibabacloudStackPolardbConnectionCreate, resourceAlibabacloudStackPolardbConnectionRead, resourceAlibabacloudStackPolardbConnectionUpdate, resourceAlibabacloudStackPolardbConnectionDelete) return resource } func resourceAlibabacloudStackPolardbConnectionCreate(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AlibabacloudStackClient) PolardbService := PolardbService{client} instanceId := d.Get("instance_id").(string) prefix := d.Get("connection_prefix").(string) if prefix == "" { prefix = fmt.Sprintf("%stf", instanceId) } if err := PolardbService.WaitForConnectionDBInstance(d, client, instanceId, Running, DefaultTimeoutMedium); err != nil { return errmsgs.WrapError(err) } request := client.NewCommonRequest("POST", "polardb", "2024-01-30", "AllocateInstancePublicConnection", "") request.QueryParams["DBInstanceId"] = instanceId request.QueryParams["Port"] = d.Get("port").(string) request.QueryParams["ConnectionStringPrefix"] = prefix bresponse, err := client.ProcessCommonRequest(request) if err != nil { if bresponse == nil { return errmsgs.WrapErrorf(err, "Process Common Request Failed") } errmsg := errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse) return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_polardb_db_instance", "AllocateInstancePublicConnection", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } d.SetId(fmt.Sprintf("%s%s%s", instanceId, COLON_SEPARATED, prefix)) if err := PolardbService.WaitForDBConnection(d, client, d.Id(), Available, DefaultTimeoutMedium); err != nil { return errmsgs.WrapError(err) } if err := PolardbService.WaitForConnectionDBInstance(d, client, instanceId, Running, DefaultTimeoutMedium); err != nil { return errmsgs.WrapError(err) } return nil } func resourceAlibabacloudStackPolardbConnectionRead(d *schema.ResourceData, meta interface{}) error { submatch := dbConnectionIdWithSuffixRegexp.FindStringSubmatch(d.Id()) if len(submatch) > 1 { d.SetId(submatch[1]) } parts, _ := ParseResourceId(d.Id(), 2) client := meta.(*connectivity.AlibabacloudStackClient) polardbdb_instanceservice := PolardbService{client} response, err := polardbdb_instanceservice.DescribeDBConnection(d.Id()) if err != nil { return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, "alibabacloudstack_polardb_dbinstance", errmsgs.AlibabacloudStackSdkGoERROR) } if err != nil { if errmsgs.NotFoundError(err) { d.SetId("") return nil } return errmsgs.WrapError(err) } data := response d.Set("instance_id", parts[0]) d.Set("connection_prefix", parts[1]) d.Set("port", data.DBInstanceNetInfos.DBInstanceNetInfo[0].Port) d.Set("connection_string", data.DBInstanceNetInfos.DBInstanceNetInfo[0].ConnectionString) d.Set("ip_address", data.DBInstanceNetInfos.DBInstanceNetInfo[0].IPAddress) return nil } func resourceAlibabacloudStackPolardbConnectionUpdate(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AlibabacloudStackClient) polardbService := PolardbService{client} submatch := dbConnectionIdWithSuffixRegexp.FindStringSubmatch(d.Id()) if len(submatch) > 1 { d.SetId(submatch[1]) } parts, err := ParseResourceId(d.Id(), 2) if err != nil { return errmsgs.WrapError(err) } if d.HasChanges("connection_string", "port") { request := client.NewCommonRequest("POST", "polardb", "2024-01-30", "ModifyDBInstanceConnectionString", "") request.QueryParams["DBInstanceId"] = parts[0] request.QueryParams["ConnectionStringPrefix"] = parts[1] if v, ok := d.GetOk("connection_string"); ok { request.QueryParams["CurrentConnectionString"] = v.(string) } else { return fmt.Errorf("CurrentConnectionString is required") } if v, ok := d.GetOk("port"); ok { request.QueryParams["Port"] = v.(string) } else { return fmt.Errorf("Port is required") } bresponse, err := client.ProcessCommonRequest(request) if err != nil { if bresponse == nil { return errmsgs.WrapErrorf(err, "Process Common Request Failed") } errmsg := errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse) return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_polardb_db_instance", "ModifyDBInstanceConnectionString", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } // wait instance running after modifying if err := polardbService.WaitForConnectionDBInstance(d, client, parts[0], Running, DefaultTimeoutMedium); err != nil { return errmsgs.WrapError(err) } } return nil } func resourceAlibabacloudStackPolardbConnectionDelete(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AlibabacloudStackClient) PolardbService := PolardbService{client} submatch := dbConnectionIdWithSuffixRegexp.FindStringSubmatch(d.Id()) if len(submatch) > 1 { d.SetId(submatch[1]) } split := strings.Split(d.Id(), COLON_SEPARATED) request := client.NewCommonRequest("POST", "polardb", "2024-01-30", "ReleaseInstancePublicConnection", "") request.QueryParams["DBInstanceId"] = split[0] err := resource.Retry(5*time.Minute, func() *resource.RetryError { response, err := PolardbService.DescribeDBConnection(d.Id()) if err != nil { return resource.NonRetryableError(errmsgs.WrapError(err)) } request.QueryParams["CurrentConnectionString"] = response.DBInstanceNetInfos.DBInstanceNetInfo[0].ConnectionString _, err = client.ProcessCommonRequest(request) if err != nil { if errmsgs.IsExpectedErrors(err, []string{"OperationDenied.DBInstanceStatus"}) { return resource.RetryableError(err) } errmsg := "" if errmsgs.NotFoundError(err) || errmsgs.IsExpectedErrors(err, []string{"InvalidCurrentConnectionString.NotFound", "AtLeastOneNetTypeExists"}) { return nil } err = errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) return resource.NonRetryableError(err) } return nil }) if err != nil { return err } return PolardbService.WaitForDBConnection(d, client, d.Id(), Deleted, DefaultTimeoutMedium) }