config: interpolationWalker detects functions
This commit is contained in:
parent
8b5cc5d534
commit
7578fb8bdc
|
@ -98,6 +98,12 @@ func NewInterpolation(v string) (Interpolation, error) {
|
||||||
|
|
||||||
args := make([]InterpolatedVariable, 0, len(match)-2)
|
args := make([]InterpolatedVariable, 0, len(match)-2)
|
||||||
for i := 2; i < len(match); i++ {
|
for i := 2; i < len(match); i++ {
|
||||||
|
// This can be empty if we have a single argument
|
||||||
|
// due to the format of the regexp.
|
||||||
|
if match[i] == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
v, err := NewInterpolatedVariable(match[i])
|
v, err := NewInterpolatedVariable(match[i])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -196,6 +202,12 @@ func (i *VariableInterpolation) Variables() map[string]InterpolatedVariable {
|
||||||
|
|
||||||
func NewResourceVariable(key string) (*ResourceVariable, error) {
|
func NewResourceVariable(key string) (*ResourceVariable, error) {
|
||||||
parts := strings.SplitN(key, ".", 3)
|
parts := strings.SplitN(key, ".", 3)
|
||||||
|
if len(parts) < 3 {
|
||||||
|
return nil, fmt.Errorf(
|
||||||
|
"%s: resource variables must be three parts: type.name.attr",
|
||||||
|
key)
|
||||||
|
}
|
||||||
|
|
||||||
field := parts[2]
|
field := parts[2]
|
||||||
multi := false
|
multi := false
|
||||||
var index int
|
var index int
|
||||||
|
|
|
@ -10,7 +10,7 @@ import (
|
||||||
|
|
||||||
// interpRegexp is a regexp that matches interpolations such as ${foo.bar}
|
// interpRegexp is a regexp that matches interpolations such as ${foo.bar}
|
||||||
var interpRegexp *regexp.Regexp = regexp.MustCompile(
|
var interpRegexp *regexp.Regexp = regexp.MustCompile(
|
||||||
`(?i)(\$+)\{([*-.a-z0-9_]+)\}`)
|
`(?i)(\$+)\{([\s*-.,\(\)a-z0-9_]+)\}`)
|
||||||
|
|
||||||
// interpolationWalker implements interfaces for the reflectwalk package
|
// interpolationWalker implements interfaces for the reflectwalk package
|
||||||
// (github.com/mitchellh/reflectwalk) that can be used to automatically
|
// (github.com/mitchellh/reflectwalk) that can be used to automatically
|
||||||
|
|
|
@ -33,6 +33,24 @@ func TestInterpolationWalker_detect(t *testing.T) {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
Input: map[string]interface{}{
|
||||||
|
"foo": "${lookup(var.foo)}",
|
||||||
|
},
|
||||||
|
Result: []Interpolation{
|
||||||
|
&FunctionInterpolation{
|
||||||
|
Func: nil,
|
||||||
|
Args: []InterpolatedVariable{
|
||||||
|
&UserVariable{
|
||||||
|
Name: "foo",
|
||||||
|
key: "var.foo",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
key: "lookup(var.foo)",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for i, tc := range cases {
|
for i, tc := range cases {
|
||||||
|
@ -48,6 +66,14 @@ func TestInterpolationWalker_detect(t *testing.T) {
|
||||||
t.Fatalf("err: %s", err)
|
t.Fatalf("err: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for _, a := range actual {
|
||||||
|
// This is jank, but reflect.DeepEqual never has functions
|
||||||
|
// being the same.
|
||||||
|
if f, ok := a.(*FunctionInterpolation); ok {
|
||||||
|
f.Func = nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if !reflect.DeepEqual(actual, tc.Result) {
|
if !reflect.DeepEqual(actual, tc.Result) {
|
||||||
t.Fatalf("%d: bad:\n\n%#v", i, actual)
|
t.Fatalf("%d: bad:\n\n%#v", i, actual)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue