config: DefaultsMap

This commit is contained in:
Mitchell Hashimoto 2014-07-22 07:41:55 -07:00
parent aeb085c5f0
commit c988be9ce7
2 changed files with 77 additions and 0 deletions

View File

@ -6,7 +6,9 @@ import (
"fmt"
"strings"
"github.com/hashicorp/terraform/flatmap"
"github.com/hashicorp/terraform/helper/multierror"
"github.com/mitchellh/mapstructure"
)
// Config is the configuration that comes from loading a collection
@ -63,6 +65,14 @@ type Output struct {
RawConfig *RawConfig
}
type VariableType byte
const (
VariableTypeUnknown VariableType = iota
VariableTypeString
VariableTypeMap
)
// ProviderConfigName returns the name of the provider configuration in
// the given mapping that maps to the proper provider configuration
// for this resource.
@ -271,6 +281,20 @@ func (r *Resource) mergerMerge(m merger) merger {
return &result
}
// DefaultsMap returns a map of default values for this variable.
func (v *Variable) DefaultsMap() map[string]string {
switch v.Type() {
case VariableTypeString:
return map[string]string{v.Name: v.Default.(string)}
case VariableTypeMap:
return flatmap.Flatten(map[string]interface{}{
v.Name: v.Default.(map[string]string),
})
default:
return nil
}
}
// Merge merges two variables to create a new third variable.
func (v *Variable) Merge(v2 *Variable) *Variable {
// Shallow copy the variable
@ -289,6 +313,27 @@ func (v *Variable) Merge(v2 *Variable) *Variable {
return &result
}
// Type returns the type of varialbe this is.
func (v *Variable) Type() VariableType {
if v.Default == nil {
return VariableTypeString
}
var strVal string
if err := mapstructure.WeakDecode(v.Default, &strVal); err == nil {
v.Default = strVal
return VariableTypeString
}
var m map[string]string
if err := mapstructure.WeakDecode(v.Default, &m); err == nil {
v.Default = m
return VariableTypeMap
}
return VariableTypeUnknown
}
func (v *Variable) mergerName() string {
return v.Name
}

View File

@ -2,6 +2,7 @@ package config
import (
"path/filepath"
"reflect"
"testing"
)
@ -96,6 +97,37 @@ func TestProviderConfigName(t *testing.T) {
}
}
func TestVariableDefaultsMap(t *testing.T) {
cases := []struct {
Default interface{}
Output map[string]string
}{
{
"foo",
map[string]string{"foo": "foo"},
},
{
map[interface{}]interface{}{
"foo": "bar",
"bar": "baz",
},
map[string]string{
"foo.foo": "bar",
"foo.bar": "baz",
},
},
}
for i, tc := range cases {
v := &Variable{Name: "foo", Default: tc.Default}
actual := v.DefaultsMap()
if !reflect.DeepEqual(actual, tc.Output) {
t.Fatalf("%d: bad: %#v", i, actual)
}
}
}
func testConfig(t *testing.T, name string) *Config {
c, err := Load(filepath.Join(fixtureDir, name, "main.tf"))
if err != nil {