core: Add uuid() interpolate function.
Utilizes hashicorp's go-uuid library for proper random seeding setup.
This commit is contained in:
parent
ededbb55aa
commit
1e0b8ea478
|
@ -17,6 +17,7 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/apparentlymart/go-cidr/cidr"
|
"github.com/apparentlymart/go-cidr/cidr"
|
||||||
|
"github.com/hashicorp/go-uuid"
|
||||||
"github.com/hashicorp/hil/ast"
|
"github.com/hashicorp/hil/ast"
|
||||||
"github.com/mitchellh/go-homedir"
|
"github.com/mitchellh/go-homedir"
|
||||||
)
|
)
|
||||||
|
@ -42,6 +43,7 @@ func Funcs() map[string]ast.Function {
|
||||||
"length": interpolationFuncLength(),
|
"length": interpolationFuncLength(),
|
||||||
"lower": interpolationFuncLower(),
|
"lower": interpolationFuncLower(),
|
||||||
"md5": interpolationFuncMd5(),
|
"md5": interpolationFuncMd5(),
|
||||||
|
"uuid": interpolationFuncUUID(),
|
||||||
"replace": interpolationFuncReplace(),
|
"replace": interpolationFuncReplace(),
|
||||||
"sha1": interpolationFuncSha1(),
|
"sha1": interpolationFuncSha1(),
|
||||||
"sha256": interpolationFuncSha256(),
|
"sha256": interpolationFuncSha256(),
|
||||||
|
@ -682,3 +684,13 @@ func interpolationFuncBase64Sha256() ast.Function {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func interpolationFuncUUID() ast.Function {
|
||||||
|
return ast.Function{
|
||||||
|
ArgTypes: []ast.Type{},
|
||||||
|
ReturnType: ast.TypeString,
|
||||||
|
Callback: func(args []interface{}) (interface{}, error) {
|
||||||
|
return uuid.GenerateUUID()
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -945,6 +945,28 @@ func TestInterpolateFuncMd5(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestInterpolateFuncUUID(t *testing.T) {
|
||||||
|
results := make(map[string]bool)
|
||||||
|
|
||||||
|
for i := 0; i < 100; i++ {
|
||||||
|
ast, err := hil.Parse("${uuid()}")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("err: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
out, _, err := hil.Eval(ast, langEvalConfig(nil))
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("err: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if results[out.(string)] {
|
||||||
|
t.Fatalf("Got unexpected duplicate uuid: %s", out)
|
||||||
|
}
|
||||||
|
|
||||||
|
results[out.(string)] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
type testFunctionConfig struct {
|
type testFunctionConfig struct {
|
||||||
Cases []testFunctionCase
|
Cases []testFunctionCase
|
||||||
Vars map[string]ast.Variable
|
Vars map[string]ast.Variable
|
||||||
|
|
|
@ -198,6 +198,8 @@ The supported built-in functions are:
|
||||||
|
|
||||||
* `upper(string)` - Returns a copy of the string with all Unicode letters mapped to their upper case.
|
* `upper(string)` - Returns a copy of the string with all Unicode letters mapped to their upper case.
|
||||||
|
|
||||||
|
* `uuid()` - Returns a UUID string in RFC 4122 v4 format. This string will change with every invocation of the function, so in order to prevent diffs on every plan & apply, it must be used with the [`ignore_changes`](/docs/configuration/resources.html#ignore-changes) lifecycle attribute.
|
||||||
|
|
||||||
## Templates
|
## Templates
|
||||||
|
|
||||||
Long strings can be managed using templates. [Templates](/docs/providers/template/index.html) are [resources](/docs/configuration/resources.html) defined by a filename and some variables to use during interpolation. They have a computed `rendered` attribute containing the result.
|
Long strings can be managed using templates. [Templates](/docs/providers/template/index.html) are [resources](/docs/configuration/resources.html) defined by a filename and some variables to use during interpolation. They have a computed `rendered` attribute containing the result.
|
||||||
|
|
|
@ -68,6 +68,8 @@ The `lifecycle` block allows the following keys to be set:
|
||||||
destruction of a given resource. When this is set to `true`, any plan
|
destruction of a given resource. When this is set to `true`, any plan
|
||||||
that includes a destroy of this resource will return an error message.
|
that includes a destroy of this resource will return an error message.
|
||||||
|
|
||||||
|
<a id="ignore-changes"></a>
|
||||||
|
|
||||||
* `ignore_changes` (list of strings) - Customizes how diffs are evaluated for
|
* `ignore_changes` (list of strings) - Customizes how diffs are evaluated for
|
||||||
resources, allowing individual attributes to be ignored through changes.
|
resources, allowing individual attributes to be ignored through changes.
|
||||||
As an example, this can be used to ignore dynamic changes to the
|
As an example, this can be used to ignore dynamic changes to the
|
||||||
|
|
Loading…
Reference in New Issue