@@ -3539,6 +3539,107 @@ func TestAccSqlDatabaseInstance_useCustomerManagedServerCa(t *testing.T) {
35393539 })
35403540}
35413541
3542+ func TestAccSqlDatabaseInstance_DiskSizeAutoResizeWithoutDiskSize (t * testing.T ) {
3543+ t .Parallel ()
3544+
3545+ project := envvar .GetTestProjectFromEnv ()
3546+ databaseName := "tf-test-" + acctest .RandString (t , 10 )
3547+
3548+ trueVar := true
3549+ falseVar := false
3550+
3551+ acctest .VcrTest (t , resource.TestCase {
3552+ PreCheck : func () { acctest .AccTestPreCheck (t ) },
3553+ ProtoV5ProviderFactories : acctest .ProtoV5ProviderFactories (t ),
3554+ CheckDestroy : testAccSqlDatabaseInstanceDestroyProducer (t ),
3555+ Steps : []resource.TestStep {
3556+ {
3557+ // Create DB with disk size 10gb (minimal) - no disk size specified in configuration, auto resize enabled
3558+ Config : testGoogleSqlDatabaseInstance_diskSizeAutoResize (project , databaseName , 0 , 100 , nil , false , false ),
3559+ // Add additional 2gb outside of TF to simulate increase in disk size
3560+ Check : testGoogleSqlDatabaseInstanceResizeDisk (t , databaseName , 2 ),
3561+ },
3562+ {
3563+ // Disk size is now 12gb - requested (original value) 10gb, configuration is empty - should not trigger resize, no errors.
3564+ Config : testGoogleSqlDatabaseInstance_diskSizeAutoResize (project , databaseName , 0 , 101 , nil , false , false ),
3565+ Check : testGoogleSqlDatabaseInstanceCheckDiskSize (t , databaseName , 12 ),
3566+ },
3567+ {
3568+ // Disk size is now 12gb - requested (original value) 10gb, configuration is empty - should not trigger resize, no errors.
3569+ Config : testGoogleSqlDatabaseInstance_diskSizeAutoResize (project , databaseName , 0 , 101 , & trueVar , false , false ),
3570+ Check : testGoogleSqlDatabaseInstanceCheckDiskSize (t , databaseName , 12 ),
3571+ },
3572+ {
3573+ // Disk size is now 12gb - requested (original value) 10gb, configuration is empty - disable auto resize - should not error.
3574+ Config : testGoogleSqlDatabaseInstance_diskSizeAutoResize (project , databaseName , 0 , 101 , & falseVar , false , false ),
3575+ Check : testGoogleSqlDatabaseInstanceCheckDiskSize (t , databaseName , 12 ),
3576+ },
3577+ {
3578+ // Disk size is now 12gb - requested (original value) 10gb, configuration is empty - disable auto resize, but enable deletion protection should not error.
3579+ Config : testGoogleSqlDatabaseInstance_diskSizeAutoResize (project , databaseName , 0 , 101 , & falseVar , true , false ),
3580+ Check : testGoogleSqlDatabaseInstanceCheckDiskSize (t , databaseName , 12 ),
3581+ },
3582+ {
3583+ // Allow destroy
3584+ Config : testGoogleSqlDatabaseInstance_diskSizeAutoResize (project , databaseName , 0 , 101 , & falseVar , true , true ),
3585+ },
3586+ },
3587+ })
3588+ }
3589+
3590+ func TestAccSqlDatabaseInstance_DiskSizeAutoResizeWithDiskSize (t * testing.T ) {
3591+ t .Parallel ()
3592+
3593+ project := envvar .GetTestProjectFromEnv ()
3594+ databaseName := "tf-test-" + acctest .RandString (t , 10 )
3595+
3596+ trueVar := true
3597+ falseVar := false
3598+
3599+ acctest .VcrTest (t , resource.TestCase {
3600+ PreCheck : func () { acctest .AccTestPreCheck (t ) },
3601+ ProtoV5ProviderFactories : acctest .ProtoV5ProviderFactories (t ),
3602+ CheckDestroy : testAccSqlDatabaseInstanceDestroyProducer (t ),
3603+ Steps : []resource.TestStep {
3604+ {
3605+ // Create DB with disk size 12gb with auto resize enabled
3606+ Config : testGoogleSqlDatabaseInstance_diskSizeAutoResize (project , databaseName , 12 , 100 , nil , false , false ),
3607+ // Add additional 2gb outside of TF to simulate increase in disk size
3608+ Check : testGoogleSqlDatabaseInstanceResizeDisk (t , databaseName , 2 ),
3609+ },
3610+ {
3611+ // Disk size is now 14gb - requested (original value) 12gb and auto resize enable - should not trigger resize, no errors.
3612+ Config : testGoogleSqlDatabaseInstance_diskSizeAutoResize (project , databaseName , 12 , 101 , nil , false , false ),
3613+ Check : testGoogleSqlDatabaseInstanceCheckDiskSize (t , databaseName , 14 ),
3614+ },
3615+ {
3616+ // Disk size is now 14gb - requested 13gb in configuration, still less - should not trigger resize, no errors.
3617+ Config : testGoogleSqlDatabaseInstance_diskSizeAutoResize (project , databaseName , 13 , 102 , & trueVar , false , false ),
3618+ Check : testGoogleSqlDatabaseInstanceCheckDiskSize (t , databaseName , 14 ),
3619+ },
3620+ {
3621+ // Disk size is now 14gb - requested 15gb in configuration, that's an additional increase should trigger resize to 15gb.
3622+ Config : testGoogleSqlDatabaseInstance_diskSizeAutoResize (project , databaseName , 15 , 103 , nil , false , false ),
3623+ Check : testGoogleSqlDatabaseInstanceCheckDiskSize (t , databaseName , 15 ),
3624+ },
3625+ {
3626+ // Disk size is now 15gb - requested 14gb, but disabled auto resize - should error because it can't be deleted for replacement.
3627+ Config : testGoogleSqlDatabaseInstance_diskSizeAutoResize (project , databaseName , 14 , 104 , & falseVar , false , false ),
3628+ ExpectError : regexp .MustCompile ("Instance cannot be destroyed" ),
3629+ },
3630+ {
3631+ // Disk size is now 15gb - requested 14gb, but ignore changes is set - so should ignore the configuration change.
3632+ Config : testGoogleSqlDatabaseInstance_diskSizeAutoResize (project , databaseName , 14 , 105 , & falseVar , true , false ),
3633+ Check : testGoogleSqlDatabaseInstanceCheckDiskSize (t , databaseName , 15 ),
3634+ },
3635+ {
3636+ // Allow destroy
3637+ Config : testGoogleSqlDatabaseInstance_diskSizeAutoResize (project , databaseName , 14 , 105 , & falseVar , true , true ),
3638+ },
3639+ },
3640+ })
3641+ }
3642+
35423643func testGoogleSqlDatabaseInstance_setCustomSubjectAlternateName (context map [string ]interface {}) string {
35433644 return acctest .Nprintf (`
35443645data "google_project" "project" {
@@ -7186,3 +7287,102 @@ resource "google_sql_database_instance" "instance" {
71867287}
71877288` , instance , databaseVersion , deletionProtection , activationPolicy )
71887289}
7290+
7291+ func testGoogleSqlDatabaseInstance_diskSizeAutoResize (project , dbName string , diskSize , maxConnections int , autoResize * bool , ignoreChanges , allowDestroy bool ) string {
7292+ diskSizeStmt := ""
7293+ if diskSize != 0 {
7294+ diskSizeStmt = fmt .Sprintf ("disk_size = %d" , diskSize )
7295+ }
7296+ autoResizeStmt := ""
7297+ if autoResize != nil {
7298+ if * autoResize {
7299+ autoResizeStmt = "disk_autoresize = true"
7300+ } else {
7301+ autoResizeStmt = "disk_autoresize = false"
7302+ }
7303+ }
7304+ ignoreChangesStmt := ""
7305+ if ignoreChanges {
7306+ ignoreChangesStmt = "settings[0].disk_size"
7307+ }
7308+
7309+ preventDestroyStmt := "prevent_destroy = true"
7310+ if allowDestroy {
7311+ preventDestroyStmt = ""
7312+ }
7313+
7314+ return fmt .Sprintf (`
7315+ data "google_project" "project" {
7316+ project_id = "%s"
7317+ }
7318+
7319+ resource "google_sql_database_instance" "instance" {
7320+ name = "%s"
7321+ region = "us-central1"
7322+ database_version = "POSTGRES_15"
7323+ deletion_protection = false
7324+ settings {
7325+ tier = "db-f1-micro"
7326+ %s
7327+ %s
7328+ database_flags {
7329+ name = "max_connections"
7330+ value = "%d"
7331+ }
7332+ }
7333+ lifecycle {
7334+ ignore_changes = [%s]
7335+ %s
7336+ }
7337+ }
7338+ ` , project , dbName , diskSizeStmt , autoResizeStmt , maxConnections , ignoreChangesStmt , preventDestroyStmt )
7339+ }
7340+
7341+ func testGoogleSqlDatabaseInstanceResizeDisk (t * testing.T , instance string , addGb int64 ) resource.TestCheckFunc {
7342+ return func (s * terraform.State ) error {
7343+ config := acctest .GoogleProviderConfig (t )
7344+
7345+ sqlAdminClient := config .NewSqlAdminClient (config .UserAgent )
7346+
7347+ inst , err := sqlAdminClient .Instances .Get (config .Project , instance ).Do ()
7348+ if err != nil {
7349+ return fmt .Errorf ("Could not get database instance %q: %s" , instance , err )
7350+ }
7351+
7352+ operation , err := sqlAdminClient .Instances .Patch (config .Project , instance , & sqladmin.DatabaseInstance {
7353+ Settings : & sqladmin.Settings {
7354+ SettingsVersion : inst .Settings .SettingsVersion ,
7355+ DataDiskSizeGb : inst .Settings .DataDiskSizeGb + addGb ,
7356+ },
7357+ }).Do ()
7358+ if err != nil {
7359+ return fmt .Errorf ("Could not update database instance %q: %s" , instance , err )
7360+ }
7361+
7362+ // Wait for the operation to complete
7363+ if err := sql .SqlAdminOperationWaitTime (config , operation , config .Project , "Waiting for disk resize" , config .UserAgent , 10 * time .Minute ); err != nil {
7364+ return fmt .Errorf ("Could not wait for operation to complete: %s" , err )
7365+ }
7366+
7367+ return nil
7368+ }
7369+ }
7370+
7371+ func testGoogleSqlDatabaseInstanceCheckDiskSize (t * testing.T , instance string , size int64 ) resource.TestCheckFunc {
7372+ return func (s * terraform.State ) error {
7373+ config := acctest .GoogleProviderConfig (t )
7374+
7375+ sqlAdminClient := config .NewSqlAdminClient (config .UserAgent )
7376+
7377+ inst , err := sqlAdminClient .Instances .Get (config .Project , instance ).Do ()
7378+ if err != nil {
7379+ return fmt .Errorf ("Could not get database instance %q: %s" , instance , err )
7380+ }
7381+
7382+ if inst .Settings .DataDiskSizeGb != size {
7383+ return fmt .Errorf ("Expected disk size %d, got %d" , size , inst .Settings .DataDiskSizeGb )
7384+ }
7385+
7386+ return nil
7387+ }
7388+ }
0 commit comments