예제 #1
0
파일: parse.go 프로젝트: hartzell/roster
func parse_aws_instance(rs *terraform.ResourceState) (*InstanceInfo, error) {
	info := InstanceInfo{}

	provider := aws.Provider().(*schema.Provider)
	instanceSchema := provider.ResourcesMap["aws_instance"].Schema
	stateReader := &schema.MapFieldReader{
		Schema: instanceSchema,
		Map:    schema.BasicMapReader(rs.Primary.Attributes),
	}

	// nameResult, err := stateReader.ReadField([]string{"id"})
	// if err != nil {
	// 	return nil, fmt.Errorf("Unable to read id field: %s", err)
	// }
	// info.Name = nameResult.ValueOrZero(instanceSchema["id"]).(string)
	info.Name = "moose"

	accessResult, err := stateReader.ReadField([]string{"public_ip"})
	if err != nil {
		return nil, fmt.Errorf("Unable to read a public_ip field: %s", err)
	}
	info.Address = accessResult.ValueOrZero(instanceSchema["public_ip"]).(string)
	if info.Address == "" {
		accessResult, err := stateReader.ReadField([]string{"private_ip"})
		if err != nil {
			return nil, fmt.Errorf("Unable to read a private_ip field: %s", err)
		}
		info.Address = accessResult.ValueOrZero(instanceSchema["private_ip"]).(string)
	}

	return &info, nil
}
func readV0Keys(
	is *terraform.InstanceState,
	res *schema.Resource,
) (*schema.Set, error) {
	reader := &schema.MapFieldReader{
		Schema: res.Schema,
		Map:    schema.BasicMapReader(is.Attributes),
	}
	result, err := reader.ReadField([]string{"key"})
	if err != nil {
		return nil, err
	}

	oldKeys, ok := result.Value.(*schema.Set)
	if !ok {
		return nil, fmt.Errorf("Got unexpected value from state: %#v", result.Value)
	}
	return oldKeys, nil
}
예제 #3
0
파일: parse.go 프로젝트: hartzell/roster
// Function parse_os_compute_instance_v2 uses terraform routines to
// parse info out of a terraform.ResourceState.
//
// HEADS UP: it's use of these routines is slightly underhanded (but
// better than reverse engineering the state file format...).
//
// Thanks to @apparentlymart for this bit of code.
// See: https://github.com/hashicorp/terraform/issues/3405
func parse_os_compute_instance_v2(rs *terraform.ResourceState) (*InstanceInfo, error) {
	info := InstanceInfo{}

	provider := openstack.Provider().(*schema.Provider)
	instanceSchema := provider.ResourcesMap["openstack_compute_instance_v2"].Schema
	stateReader := &schema.MapFieldReader{
		Schema: instanceSchema,
		Map:    schema.BasicMapReader(rs.Primary.Attributes),
	}

	metadataResult, err := stateReader.ReadField([]string{"metadata"})
	if err != nil {
		return nil, errors.New("Unable to read metadata from ResourceState")
	}
	m := metadataResult.ValueOrZero(instanceSchema["metadata"])
	for key, value := range m.(map[string]interface{}) {
		if key == "ansible_groups" {
			groups := splitOnComma(value.(string))
			info.Groups = append(info.Groups, groups...)
		} else if key == "ansible_hostvars" {
			info.HostVars, err = parseVars(value.(string))
			if err != nil {
				return nil, fmt.Errorf("Unable to parse host variables: %s", err)
			}
		}
	}

	nameResult, err := stateReader.ReadField([]string{"name"})
	if err != nil {
		return nil, fmt.Errorf("Unable to read name field: %s", err)
	}
	info.Name = nameResult.ValueOrZero(instanceSchema["name"]).(string)

	accessResult, err := stateReader.ReadField([]string{"access_ip_v4"})
	if err != nil {
		return nil, fmt.Errorf("Unable to read access_ip_v4 field: %s", err)
	}
	info.Address = accessResult.ValueOrZero(instanceSchema["access_ip_v4"]).(string)

	return &info, nil
}
예제 #4
0
파일: parse.go 프로젝트: hartzell/roster
func parse_digitalocean_droplet(rs *terraform.ResourceState) (*InstanceInfo, error) {
	info := InstanceInfo{}

	provider := digitalocean.Provider().(*schema.Provider)
	instanceSchema := provider.ResourcesMap["digitalocean_droplet"].Schema
	stateReader := &schema.MapFieldReader{
		Schema: instanceSchema,
		Map:    schema.BasicMapReader(rs.Primary.Attributes),
	}

	nameResult, err := stateReader.ReadField([]string{"name"})
	if err != nil {
		return nil, fmt.Errorf("Unable to read name field: %s", err)
	}
	info.Name = nameResult.ValueOrZero(instanceSchema["name"]).(string)

	accessResult, err := stateReader.ReadField([]string{"ipv4_address"})
	if err != nil {
		return nil, fmt.Errorf("Unable to read ipv4_address field: %s", err)
	}
	info.Address = accessResult.ValueOrZero(instanceSchema["ipv4_address"]).(string)

	return &info, nil
}