diff --git a/google/resource_compute_instance.go b/google/resource_compute_instance.go index 43020134ca9..512fa5078cb 100644 --- a/google/resource_compute_instance.go +++ b/google/resource_compute_instance.go @@ -40,7 +40,7 @@ func resourceComputeInstance() *schema.Resource { Update: resourceComputeInstanceUpdate, Delete: resourceComputeInstanceDelete, - SchemaVersion: 5, + SchemaVersion: 6, MigrateState: resourceComputeInstanceMigrateState, Schema: map[string]*schema.Schema{ diff --git a/google/resource_compute_instance_migrate.go b/google/resource_compute_instance_migrate.go index 9e94e89043a..b52d28a87fa 100644 --- a/google/resource_compute_instance_migrate.go +++ b/google/resource_compute_instance_migrate.go @@ -56,7 +56,14 @@ func resourceComputeInstanceMigrateState( if err != nil { return is, err } - // when adding case 5, make sure to turn this into a fallthrough + fallthrough + case 5: + log.Println("[INFO] Found Compute Instance State v5; migrating to v6") + is, err = migrateStateV5toV6(is) + if err != nil { + return is, err + } + // when adding case 6, make sure to turn this into a fallthrough return is, err default: return is, fmt.Errorf("Unexpected schema version: %d", v) @@ -238,7 +245,7 @@ func migrateStateV3toV4(is *terraform.InstanceState, meta interface{}) (*terrafo is.Attributes["boot_disk.0.disk_encryption_key_raw"] = is.Attributes["disk.0.disk_encryption_key_raw"] is.Attributes["boot_disk.0.disk_encryption_key_sha256"] = is.Attributes["disk.0.disk_encryption_key_sha256"] - if is.Attributes["disk.0.size"] != "" { + if is.Attributes["disk.0.size"] != "" && is.Attributes["disk.0.size"] != "0" { is.Attributes["boot_disk.0.initialize_params.#"] = "1" is.Attributes["boot_disk.0.initialize_params.0.size"] = is.Attributes["disk.0.size"] } @@ -489,3 +496,20 @@ func getDiskFromAutoDeleteAndImage(config *Config, instance *compute.Instance, a return nil, fmt.Errorf("could not find attached disk with image %q", image) } + +func migrateStateV5toV6(is *terraform.InstanceState) (*terraform.InstanceState, error) { + log.Printf("[DEBUG] Attributes before migration: %#v", is.Attributes) + if is.Attributes["boot_disk.0.initialize_params.#"] == "1" { + if (is.Attributes["boot_disk.0.initialize_params.0.size"] == "0" || + is.Attributes["boot_disk.0.initialize_params.0.size"] == "") && + is.Attributes["boot_disk.0.initialize_params.0.type"] == "" && + is.Attributes["boot_disk.0.initialize_params.0.image"] == "" { + is.Attributes["boot_disk.0.initialize_params.#"] = "0" + delete(is.Attributes, "boot_disk.0.initialize_params.0.size") + delete(is.Attributes, "boot_disk.0.initialize_params.0.type") + delete(is.Attributes, "boot_disk.0.initialize_params.0.image") + } + } + log.Printf("[DEBUG] Attributes after migration: %#v", is.Attributes) + return is, nil +} diff --git a/google/resource_compute_instance_migrate_test.go b/google/resource_compute_instance_migrate_test.go index 8b28dd4226e..69028fcf5a8 100644 --- a/google/resource_compute_instance_migrate_test.go +++ b/google/resource_compute_instance_migrate_test.go @@ -65,6 +65,16 @@ func TestComputeInstanceMigrateState(t *testing.T) { "create_timeout": "4", }, }, + "remove empty initialize_params": { + StateVersion: 5, + Attributes: map[string]string{ + "boot_disk.0.initialize_params.#": "1", + "boot_disk.0.initialize_params.0.size": "0", + }, + Expected: map[string]string{ + "boot_disk.0.initialize_params.#": "0", + }, + }, } for tn, tc := range cases {