diff --git a/tencentcloud/resource_tc_postgresql_instance.go b/tencentcloud/resource_tc_postgresql_instance.go index 2c9c9e61cf..ce64f1d10e 100644 --- a/tencentcloud/resource_tc_postgresql_instance.go +++ b/tencentcloud/resource_tc_postgresql_instance.go @@ -581,18 +581,21 @@ func resourceTencentCloudPostgresqlInstanceCreate(d *schema.ResourceData, meta i d.SetId(instanceId) // check creation done - err := resource.Retry(5*readRetryTimeout, func() *resource.RetryError { + err := resource.Retry(20*readRetryTimeout, func() *resource.RetryError { instance, has, err := postgresqlService.DescribePostgresqlInstanceById(ctx, instanceId) if err != nil { return retryError(err) - } else if has && *instance.DBInstanceStatus == "running" { + } + + if !has { + return resource.NonRetryableError(fmt.Errorf("create postgresql instance fail")) + } + + if *instance.DBInstanceStatus == POSTGRESQL_STAUTS_RUNNING { memory = int(*instance.DBInstanceMemory) return nil - } else if !has { - return resource.NonRetryableError(fmt.Errorf("create postgresql instance fail")) - } else { - return resource.RetryableError(fmt.Errorf("creating postgresql instance %s , status %s ", instanceId, *instance.DBInstanceStatus)) } + return resource.RetryableError(fmt.Errorf("creating postgresql instance %s , status %s ", instanceId, *instance.DBInstanceStatus)) }) if err != nil { @@ -757,8 +760,20 @@ func resourceTencentCloudPostgresqlInstanceUpdate(d *schema.ResourceData, meta i if outErr != nil { return outErr } + // Wait for status to processing + _ = resource.Retry(time.Second*10, func() *resource.RetryError { + instance, _, err := postgresqlService.DescribePostgresqlInstanceById(ctx, instanceId) + if err != nil { + return retryError(err) + } + if *instance.DBInstanceStatus == POSTGRESQL_STAUTS_RUNNING { + return resource.RetryableError(fmt.Errorf("waiting for upgrade status change")) + } + return nil + }) + time.Sleep(time.Second * 5) // check update storage and memory done - checkErr = postgresqlService.CheckDBInstanceStatus(ctx, instanceId) + checkErr = postgresqlService.CheckDBInstanceStatus(ctx, instanceId, 60) if checkErr != nil { return checkErr } diff --git a/tencentcloud/resource_tc_postgresql_instance_test.go b/tencentcloud/resource_tc_postgresql_instance_test.go index dfd3d986f8..6f49a8a9e5 100644 --- a/tencentcloud/resource_tc_postgresql_instance_test.go +++ b/tencentcloud/resource_tc_postgresql_instance_test.go @@ -128,7 +128,19 @@ func TestAccTencentCloudPostgresqlInstanceResource(t *testing.T) { ImportStateVerify: true, ImportStateVerifyIgnore: []string{"root_password", "spec_code", "public_access_switch", "charset", "backup_plan"}, }, - + { + Config: testAccPostgresqlInstanceOpenPublic, + Check: resource.ComposeTestCheckFunc( + testAccCheckPostgresqlInstanceExists(testPostgresqlInstanceResourceKey), + resource.TestCheckResourceAttrSet(testPostgresqlInstanceResourceKey, "id"), + resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "public_access_switch", "true"), + resource.TestCheckResourceAttrSet(testPostgresqlInstanceResourceKey, "private_access_ip"), + resource.TestCheckResourceAttrSet(testPostgresqlInstanceResourceKey, "private_access_port"), + resource.TestCheckResourceAttrSet(testPostgresqlInstanceResourceKey, "public_access_host"), + resource.TestCheckResourceAttrSet(testPostgresqlInstanceResourceKey, "public_access_port"), + //resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "tags.tf", "teest"), + ), + }, { Config: testAccPostgresqlInstanceUpdate, Check: resource.ComposeTestCheckFunc( @@ -142,13 +154,9 @@ func TestAccTencentCloudPostgresqlInstanceResource(t *testing.T) { resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "storage", "250"), resource.TestCheckResourceAttrSet(testPostgresqlInstanceResourceKey, "create_time"), resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "project_id", "0"), - resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "public_access_switch", "true"), + resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "public_access_switch", "false"), resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "root_password", "t1qaA2k1wgvfa3?ZZZ"), resource.TestCheckResourceAttrSet(testPostgresqlInstanceResourceKey, "availability_zone"), - resource.TestCheckResourceAttrSet(testPostgresqlInstanceResourceKey, "private_access_ip"), - resource.TestCheckResourceAttrSet(testPostgresqlInstanceResourceKey, "private_access_port"), - resource.TestCheckResourceAttrSet(testPostgresqlInstanceResourceKey, "public_access_host"), - resource.TestCheckResourceAttrSet(testPostgresqlInstanceResourceKey, "public_access_port"), resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "backup_plan.0.min_backup_start_time", "01:10:11"), resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "backup_plan.0.max_backup_start_time", "02:10:11"), resource.TestCheckResourceAttr(testPostgresqlInstanceResourceKey, "backup_plan.0.backup_period.#", "3"), @@ -280,7 +288,7 @@ resource "tencentcloud_postgresql_instance" "test" { } ` -const testAccPostgresqlInstanceUpdate string = testAccPostgresqlInstanceBasic + defaultVpcSubnets + ` +const testAccPostgresqlInstanceOpenPublic string = testAccPostgresqlInstanceBasic + defaultVpcSubnets + ` resource "tencentcloud_postgresql_instance" "test" { name = "tf_postsql_instance_update" availability_zone = data.tencentcloud_availability_zones_by_product.zone.zones[5].name @@ -307,6 +315,33 @@ resource "tencentcloud_postgresql_instance" "test" { } ` +const testAccPostgresqlInstanceUpdate string = testAccPostgresqlInstanceBasic + defaultVpcSubnets + ` +resource "tencentcloud_postgresql_instance" "test" { + name = "tf_postsql_instance_update" + availability_zone = data.tencentcloud_availability_zones_by_product.zone.zones[5].name + charge_type = "POSTPAID_BY_HOUR" + vpc_id = local.vpc_id + subnet_id = local.subnet_id + engine_version = "10.4" + root_password = "t1qaA2k1wgvfa3?ZZZ" + charset = "LATIN1" + project_id = 0 + public_access_switch = false + memory = 4 + storage = 250 + backup_plan { + min_backup_start_time = "01:10:11" + max_backup_start_time = "02:10:11" + base_backup_retention_period = 5 + backup_period = ["monday", "thursday", "sunday"] + } + + tags = { + tf = "teest" + } +} +` + const testAccPostgresqlMAZInstance string = ` resource "tencentcloud_vpc" "vpc" { cidr_block = "10.0.0.0/24" diff --git a/tencentcloud/service_tencentcloud_postgresql.go b/tencentcloud/service_tencentcloud_postgresql.go index 086ce61f81..43ff77404b 100644 --- a/tencentcloud/service_tencentcloud_postgresql.go +++ b/tencentcloud/service_tencentcloud_postgresql.go @@ -6,6 +6,7 @@ import ( "fmt" "log" "strconv" + "time" "github.com/hashicorp/terraform-plugin-sdk/helper/resource" sdkErrors "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors" @@ -534,19 +535,26 @@ func (me *PostgresqlService) SetPostgresqlInstanceRootPassword(ctx context.Conte return err } -func (me *PostgresqlService) CheckDBInstanceStatus(ctx context.Context, instanceId string) error { +func (me *PostgresqlService) CheckDBInstanceStatus(ctx context.Context, instanceId string, retryMinutes ...int) error { + + var timeout = 2 * readRetryTimeout + if len(retryMinutes) > 0 && retryMinutes[0] > 0 { + times := retryMinutes[0] + timeout = time.Minute * time.Duration(times) + } // check status - err := resource.Retry(2*readRetryTimeout, func() *resource.RetryError { + err := resource.Retry(timeout, func() *resource.RetryError { instance, has, err := me.DescribePostgresqlInstanceById(ctx, instanceId) if err != nil { return retryError(err) - } else if has && *instance.DBInstanceStatus == POSTGRESQL_STAUTS_RUNNING { - return nil - } else if !has { + } + if !has { return resource.NonRetryableError(fmt.Errorf("check postgresql instance %s fail", instanceId)) - } else { - return resource.RetryableError(fmt.Errorf("checking postgresql instance %s , status %s ", instanceId, *instance.DBInstanceStatus)) } + if *instance.DBInstanceStatus == POSTGRESQL_STAUTS_RUNNING { + return nil + } + return resource.RetryableError(fmt.Errorf("checking postgresql instance %s , status %s ", instanceId, *instance.DBInstanceStatus)) }) return err