func resourceComputeInstanceMigrateState( v int, is *terraform.InstanceState, meta interface{}) (*terraform.InstanceState, error) { if is.Empty() { log.Println("[DEBUG] Empty InstanceState; nothing to migrate.") return is, nil } switch v { case 0: log.Println("[INFO] Found Compute Instance State v0; migrating to v1") is, err := migrateStateV0toV1(is) if err != nil { return is, err } fallthrough case 1: log.Println("[INFO] Found Compute Instance State v1; migrating to v2") is, err := migrateStateV1toV2(is) if err != nil { return is, err } return is, nil default: return is, fmt.Errorf("Unexpected schema version: %d", v) } }
func migrateStateV0toV1(is *terraform.InstanceState) (*terraform.InstanceState, error) { if is.Empty() || is.Attributes == nil { log.Println("[DEBUG] Empty InstanceState; nothing to migrate.") return is, nil } log.Printf("[DEBUG] Attributes before migration: %#v", is.Attributes) // Delete old count delete(is.Attributes, "block_device.#") oldBds, err := readV0BlockDevices(is) if err != nil { return is, err } // seed count fields for new types is.Attributes["ebs_block_device.#"] = "0" is.Attributes["ephemeral_block_device.#"] = "0" // depending on if state was v0.3.7 or an earlier version, it might have // root_block_device defined already if _, ok := is.Attributes["root_block_device.#"]; !ok { is.Attributes["root_block_device.#"] = "0" } for _, oldBd := range oldBds { if err := writeV1BlockDevice(is, oldBd); err != nil { return is, err } } log.Printf("[DEBUG] Attributes after migration: %#v", is.Attributes) return is, nil }
func migrateKeyPairStateV0toV1(is *terraform.InstanceState) (*terraform.InstanceState, error) { if is.Empty() { log.Println("[DEBUG] Empty InstanceState; nothing to migrate.") return is, nil } log.Printf("[DEBUG] Attributes before migration: %#v", is.Attributes) // replace public_key with a stripped version, removing `\n` from the end // see https://github.com/hashicorp/terraform/issues/3455 is.Attributes["public_key"] = strings.TrimSpace(is.Attributes["public_key"]) log.Printf("[DEBUG] Attributes after migration: %#v", is.Attributes) return is, nil }
func migrateSGRuleStateV0toV1(is *terraform.InstanceState) (*terraform.InstanceState, error) { if is.Empty() { log.Println("[DEBUG] Empty InstanceState; nothing to migrate.") return is, nil } perm, err := migrateExpandIPPerm(is.Attributes) if err != nil { return nil, fmt.Errorf("[WARN] Error making new IP Permission in Security Group migration") } log.Printf("[DEBUG] Attributes before migration: %#v", is.Attributes) newID := ipPermissionIDHash(is.Attributes["security_group_id"], is.Attributes["type"], perm) is.Attributes["id"] = newID is.ID = newID log.Printf("[DEBUG] Attributes after migration: %#v, new id: %s", is.Attributes, newID) return is, nil }