diff --git a/config/interpolate_funcs.go b/config/interpolate_funcs.go index 4962d4f37..f1f97b04e 100644 --- a/config/interpolate_funcs.go +++ b/config/interpolate_funcs.go @@ -81,6 +81,7 @@ func Funcs() map[string]ast.Function { "jsonencode": interpolationFuncJSONEncode(), "length": interpolationFuncLength(), "list": interpolationFuncList(), + "log": interpolationFuncLog(), "lower": interpolationFuncLower(), "map": interpolationFuncMap(), "max": interpolationFuncMax(), @@ -489,6 +490,17 @@ func interpolationFuncCeil() ast.Function { } } +// interpolationFuncLog returns the logarithnm. +func interpolationFuncLog() ast.Function { + return ast.Function{ + ArgTypes: []ast.Type{ast.TypeFloat, ast.TypeFloat}, + ReturnType: ast.TypeFloat, + Callback: func(args []interface{}) (interface{}, error) { + return math.Log(args[0].(float64)) / math.Log(args[1].(float64)), nil + }, + } +} + // interpolationFuncChomp removes trailing newlines from the given string func interpolationFuncChomp() ast.Function { newlines := regexp.MustCompile(`(?:\r\n?|\n)*\z`) diff --git a/config/interpolate_funcs_test.go b/config/interpolate_funcs_test.go index b0c7bafff..6ed65a6f4 100644 --- a/config/interpolate_funcs_test.go +++ b/config/interpolate_funcs_test.go @@ -370,6 +370,34 @@ func TestInterpolateFuncCeil(t *testing.T) { }) } +func TestInterpolateFuncLog(t *testing.T) { + testFunction(t, testFunctionConfig{ + Cases: []testFunctionCase{ + { + `${log(1, 10)}`, + "0", + false, + }, + { + `${log(10, 10)}`, + "1", + false, + }, + + { + `${log(0, 10)}`, + "-Inf", + false, + }, + { + `${log(10, 0)}`, + "-0", + false, + }, + }, + }) +} + func TestInterpolateFuncChomp(t *testing.T) { testFunction(t, testFunctionConfig{ Cases: []testFunctionCase{ diff --git a/website/source/docs/configuration/interpolation.html.md b/website/source/docs/configuration/interpolation.html.md index 3b855cdee..b8e38e9f0 100644 --- a/website/source/docs/configuration/interpolation.html.md +++ b/website/source/docs/configuration/interpolation.html.md @@ -278,6 +278,8 @@ The supported built-in functions are: * `${list("a", "b", "c")}` returns a list of `"a", "b", "c"`. * `${list()}` returns an empty list. + * `log(x, base)` - Returns the logarithm of `x`. + * `lookup(map, key, [default])` - Performs a dynamic lookup into a map variable. The `map` parameter should be another variable, such as `var.amis`. If `key` does not exist in `map`, the interpolation will