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 case 2: log.Println("[INFO] Found Compute Instance State v2; migrating to v3") is, err := migrateStateV2toV3(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() { 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 migrateVSphereVirtualMachineStateV0toV1(is *terraform.InstanceState) (*terraform.InstanceState, error) { if is.Empty() || is.Attributes == nil { log.Println("[DEBUG] Empty VSphere Virtual Machine State; nothing to migrate.") return is, nil } log.Printf("[DEBUG] Attributes before migration: %#v", is.Attributes) if is.Attributes["skip_customization"] == "" { is.Attributes["skip_customization"] = "false" } for k, _ := range is.Attributes { if strings.HasPrefix(k, "disk.") && strings.HasSuffix(k, ".size") { diskParts := strings.Split(k, ".") if len(diskParts) != 3 { continue } s := strings.Join([]string{diskParts[0], diskParts[1], "controller_type"}, ".") if _, ok := is.Attributes[s]; !ok { is.Attributes[s] = "scsi" } } } log.Printf("[DEBUG] Attributes after migration: %#v", is.Attributes) return is, nil }
func migrateRoute53RecordStateV0toV1(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) newName := strings.TrimSuffix(is.Attributes["name"], ".") is.Attributes["name"] = newName log.Printf("[DEBUG] Attributes after migration: %#v, new name: %s", is.Attributes, newName) return is, nil }
func migrateSpotFleetRequestV0toV1(is *terraform.InstanceState) (*terraform.InstanceState, error) { if is.Empty() { log.Println("[DEBUG] Empty Spot Fleet Request State; nothing to migrate.") return is, nil } log.Printf("[DEBUG] Attributes before migration: %#v", is.Attributes) is.Attributes["associate_public_ip_address"] = "false" 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 migrateBeanstalkEnvironmentStateV0toV1(is *terraform.InstanceState) (*terraform.InstanceState, error) { if is.Empty() || is.Attributes == nil { log.Println("[DEBUG] Empty Elastic Beanstalk Environment State; nothing to migrate.") return is, nil } log.Printf("[DEBUG] Attributes before migration: %#v", is.Attributes) if is.Attributes["tier"] == "" { is.Attributes["tier"] = "WebServer" } 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 }
func resourceVSphereVirtualMachineMigrateState( 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 := migrateVSphereVirtualMachineStateV0toV1(is) if err != nil { return is, err } return is, nil default: return is, fmt.Errorf("Unexpected schema version: %d", v) } }
func migrateRoute53RecordStateV1toV2(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) if is.Attributes["weight"] != "" && is.Attributes["weight"] != "-1" { is.Attributes["weighted_routing_policy.#"] = "1" key := fmt.Sprintf("weighted_routing_policy.0.weight") is.Attributes[key] = is.Attributes["weight"] } if is.Attributes["failover"] != "" { is.Attributes["failover_routing_policy.#"] = "1" key := fmt.Sprintf("failover_routing_policy.0.type") is.Attributes[key] = is.Attributes["failover"] } delete(is.Attributes, "weight") delete(is.Attributes, "failover") log.Printf("[DEBUG] Attributes after migration: %#v", is.Attributes) return is, nil }
func migrateKinesisFirehoseV0toV1(is *terraform.InstanceState) (*terraform.InstanceState, error) { if is.Empty() { log.Println("[DEBUG] Empty Kinesis Firehose Delivery State; nothing to migrate.") return is, nil } log.Printf("[DEBUG] Attributes before migration: %#v", is.Attributes) // migrate flate S3 configuration to a s3_configuration block // grab initial values is.Attributes["s3_configuration.#"] = "1" // Required parameters is.Attributes["s3_configuration.0.role_arn"] = is.Attributes["role_arn"] is.Attributes["s3_configuration.0.bucket_arn"] = is.Attributes["s3_bucket_arn"] // Optional parameters if is.Attributes["s3_buffer_size"] != "" { is.Attributes["s3_configuration.0.buffer_size"] = is.Attributes["s3_buffer_size"] } if is.Attributes["s3_data_compression"] != "" { is.Attributes["s3_configuration.0.compression_format"] = is.Attributes["s3_data_compression"] } if is.Attributes["s3_buffer_interval"] != "" { is.Attributes["s3_configuration.0.buffer_interval"] = is.Attributes["s3_buffer_interval"] } if is.Attributes["s3_prefix"] != "" { is.Attributes["s3_configuration.0.prefix"] = is.Attributes["s3_prefix"] } delete(is.Attributes, "role_arn") delete(is.Attributes, "s3_bucket_arn") delete(is.Attributes, "s3_buffer_size") delete(is.Attributes, "s3_data_compression") delete(is.Attributes, "s3_buffer_interval") delete(is.Attributes, "s3_prefix") log.Printf("[DEBUG] Attributes after migration: %#v", is.Attributes) return is, nil }
func resourceConsulKeysMigrateStateV0toV1(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) res := resourceConsulKeys() keys, err := readV0Keys(is, res) if err != nil { return is, err } if err := clearV0Keys(is); err != nil { return is, err } if err := writeV1Keys(is, res, keys); err != nil { return is, err } log.Printf("[DEBUG] Attributes after migration: %#v", is.Attributes) return is, nil }
func migrateCloudFlareRecordStateV0toV1(is *terraform.InstanceState, meta interface{}) (*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) client := meta.(*cloudflare.API) // look up new id based on attributes domain := is.Attributes["domain"] zoneId, err := client.ZoneIDByName(domain) if err != nil { return is, fmt.Errorf("Error finding zone %q: %s", domain, err) } // all other information is ignored in the DNSRecords call searchRecord := cloudflare.DNSRecord{ Type: is.Attributes["type"], Name: is.Attributes["hostname"], Content: is.Attributes["value"], } records, err := client.DNSRecords(zoneId, searchRecord) if err != nil { return is, err } for _, r := range records { if is.Attributes["ttl"] != "" { v, err := strconv.Atoi(is.Attributes["ttl"]) if err != nil { return is, fmt.Errorf("Error converting ttl to int in CloudFlare Record Migration") } if v != r.TTL { continue } } if is.Attributes["proxied"] != "" { b, err := strconv.ParseBool(is.Attributes["proxied"]) if err != nil { return is, fmt.Errorf("Error converting proxied to bool in CloudFlare Record Migration") } if b != r.Proxied { continue } } if is.Attributes["priority"] != "" { v, err := strconv.Atoi(is.Attributes["priority"]) if err != nil { return is, fmt.Errorf("Error converting priority to int in CloudFlare Record Migration") } if v != r.Priority { continue } } // assume record found is.Attributes["id"] = r.ID is.ID = r.ID log.Printf("[DEBUG] Attributes after migration: %#v", is.Attributes) return is, nil } // assume no record found log.Printf("[DEBUG] Attributes after no migration: %#v", is.Attributes) return is, fmt.Errorf("No matching Record found") }