Skip to content

Commit 9c895d3

Browse files
committed
Fix breaking change w/ disk_autoresize in cloudsql
googleapis/google-api-go-client@95e5582 The cloudsql admin client changed the way it handles StorageAutoResize as a parameter, in order to be more explicit about when the server has ommitted the field. This changed the type from being bool to *bool, and we need to modify provider code so that we supply the right value to the api client.
1 parent 570a996 commit 9c895d3

File tree

2 files changed

+36
-21
lines changed

2 files changed

+36
-21
lines changed

google/resource_sql_database_instance.go

+26-16
Original file line numberDiff line numberDiff line change
@@ -356,21 +356,25 @@ func resourceSqlDatabaseInstance() *schema.Resource {
356356
// Suppress diff with any attribute value that is not supported on 1st Generation
357357
// Instances
358358
func suppressFirstGen(k, old, new string, d *schema.ResourceData) bool {
359-
settingsList := d.Get("settings").([]interface{})
360-
361-
settings := settingsList[0].(map[string]interface{})
362-
tier := settings["tier"].(string)
363-
matched, err := regexp.MatchString("db*", tier)
364-
if err != nil {
365-
log.Printf("[ERR] error with regex in diff supression for %s: %s", k, err)
366-
}
367-
if !matched {
359+
if isFirstGen(d) {
368360
log.Printf("[DEBUG] suppressing diff on %s due to 1st gen instance type", k)
369361
return true
370362
}
363+
371364
return false
372365
}
373366

367+
// Detects whether a database is 1st Generation by inspecting the tier name
368+
func isFirstGen(d *schema.ResourceData) bool {
369+
settingsList := d.Get("settings").([]interface{})
370+
settings := settingsList[0].(map[string]interface{})
371+
tier := settings["tier"].(string)
372+
373+
// 1st Generation databases have tiers like 'D0', as opposed to 2nd Generation which are
374+
// prefixed with 'db'
375+
return !regexp.MustCompile("db*").Match([]byte(tier))
376+
}
377+
374378
func resourceSqlDatabaseInstanceCreate(d *schema.ResourceData, meta interface{}) error {
375379
config := meta.(*Config)
376380

@@ -431,8 +435,11 @@ func resourceSqlDatabaseInstanceCreate(d *schema.ResourceData, meta interface{})
431435
settings.CrashSafeReplicationEnabled = v.(bool)
432436
}
433437

434-
autoResize := _settings["disk_autoresize"].(bool)
435-
settings.StorageAutoResize = &autoResize
438+
// 1st Generation instances don't support the disk_autoresize parameter
439+
if !isFirstGen(d) {
440+
autoResize := _settings["disk_autoresize"].(bool)
441+
settings.StorageAutoResize = &autoResize
442+
}
436443

437444
if v, ok := _settings["disk_size"]; ok && v.(int) > 0 {
438445
settings.DataDiskSizeGb = int64(v.(int))
@@ -734,13 +741,16 @@ func resourceSqlDatabaseInstanceUpdate(d *schema.ResourceData, meta interface{})
734741
_settingsList := _settingsListCast.([]interface{})
735742

736743
_settings := _settingsList[0].(map[string]interface{})
737-
_autoResize := _settings["disk_autoresize"].(bool)
738744

739745
settings := &sqladmin.Settings{
740-
Tier: _settings["tier"].(string),
741-
SettingsVersion: instance.Settings.SettingsVersion,
742-
StorageAutoResize: &_autoResize,
743-
ForceSendFields: []string{"StorageAutoResize"},
746+
Tier: _settings["tier"].(string),
747+
SettingsVersion: instance.Settings.SettingsVersion,
748+
ForceSendFields: []string{"StorageAutoResize"},
749+
}
750+
751+
if !isFirstGen(d) {
752+
autoResize := _settings["disk_autoresize"].(bool)
753+
settings.StorageAutoResize = &autoResize
744754
}
745755

746756
if v, ok := _settings["activation_policy"]; ok {

google/resource_sql_database_instance_test.go

+10-5
Original file line numberDiff line numberDiff line change
@@ -437,7 +437,7 @@ func TestAccGoogleSqlDatabaseInstance_settings_upgrade(t *testing.T) {
437437
})
438438
}
439439

440-
func TestAccGoogleSqlDatabaseInstance_settings_downgrade(t *testing.T) {
440+
func TestAccGoogleSqlDatabaseInstance_settingsDowngrade(t *testing.T) {
441441
t.Parallel()
442442

443443
var instance sqladmin.DatabaseInstance
@@ -608,10 +608,15 @@ func testAccCheckGoogleSqlDatabaseInstanceEquals(n string,
608608
return fmt.Errorf("Error settings.crash_safe_replication mismatch, (%s, %s)", server, local)
609609
}
610610

611-
server = strconv.FormatBool(*instance.Settings.StorageAutoResize)
612-
local = attributes["settings.0.disk_autoresize"]
613-
if server != local && len(server) > 0 && len(local) > 0 {
614-
return fmt.Errorf("Error settings.disk_autoresize mismatch, (%s, %s)", server, local)
611+
// First generation CloudSQL instances will not have any value for StorageAutoResize.
612+
// We need to check if this value has been omitted before we potentially deference a
613+
// nil pointer.
614+
if instance.Settings.StorageAutoResize != nil {
615+
server = strconv.FormatBool(*instance.Settings.StorageAutoResize)
616+
local = attributes["settings.0.disk_autoresize"]
617+
if server != local && len(server) > 0 && len(local) > 0 {
618+
return fmt.Errorf("Error settings.disk_autoresize mismatch, (%s, %s)", server, local)
619+
}
615620
}
616621

617622
server = strconv.FormatInt(instance.Settings.DataDiskSizeGb, 10)

0 commit comments

Comments
 (0)