diff --git a/config/interpolate_funcs.go b/config/interpolate_funcs.go index 532dd50d1..4859624f7 100644 --- a/config/interpolate_funcs.go +++ b/config/interpolate_funcs.go @@ -548,17 +548,32 @@ func interpolationFuncSplit() ast.Function { // dynamic lookups of map types within a Terraform configuration. func interpolationFuncLookup(vs map[string]ast.Variable) ast.Function { return ast.Function{ - ArgTypes: []ast.Type{ast.TypeMap, ast.TypeString}, - ReturnType: ast.TypeString, + ArgTypes: []ast.Type{ast.TypeMap, ast.TypeString}, + ReturnType: ast.TypeString, + Variadic: true, + VariadicType: ast.TypeString, Callback: func(args []interface{}) (interface{}, error) { + defaultValue := "" + defaultValueSet := false + if len(args) > 2 { + defaultValue = args[2].(string) + defaultValueSet = true + } + if len(args) > 3 { + return "", fmt.Errorf("lookup() takes no more than three arguments") + } index := args[1].(string) mapVar := args[0].(map[string]ast.Variable) v, ok := mapVar[index] if !ok { - return "", fmt.Errorf( - "lookup failed to find '%s'", - args[1].(string)) + if defaultValueSet { + return defaultValue, nil + } else { + return "", fmt.Errorf( + "lookup failed to find '%s'", + args[1].(string)) + } } if v.Type != ast.TypeString { return "", fmt.Errorf( diff --git a/config/interpolate_funcs_test.go b/config/interpolate_funcs_test.go index 5b99281f5..da12c22f5 100644 --- a/config/interpolate_funcs_test.go +++ b/config/interpolate_funcs_test.go @@ -713,12 +713,33 @@ func TestInterpolateFuncLookup(t *testing.T) { true, }, + // Supplied default with valid key + { + `${lookup(var.foo, "bar", "")}`, + "baz", + false, + }, + + // Supplied default with invalid key + { + `${lookup(var.foo, "zip", "")}`, + "", + false, + }, + // Too many args { - `${lookup(var.foo, "bar", "baz")}`, + `${lookup(var.foo, "bar", "", "abc")}`, nil, true, }, + + // Non-empty default + { + `${lookup(var.foo, "zap", "xyz")}`, + "xyz", + false, + }, }, }) }