Merge pull request #6833 from hashicorp/jbardin/fix-interpolation
Interpolate variable during Input and Validate
This commit is contained in:
commit
3f7197622a
|
@ -569,3 +569,26 @@ func TestContext2Input_varPartiallyComputed(t *testing.T) {
|
||||||
t.Fatalf("err: %s", err)
|
t.Fatalf("err: %s", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Module variables weren't being interpolated during the Input walk.
|
||||||
|
// https://github.com/hashicorp/terraform/issues/5322
|
||||||
|
func TestContext2Input_interpolateVar(t *testing.T) {
|
||||||
|
input := new(MockUIInput)
|
||||||
|
|
||||||
|
m := testModule(t, "input-interpolate-var")
|
||||||
|
p := testProvider("null")
|
||||||
|
p.ApplyFn = testApplyFn
|
||||||
|
p.DiffFn = testDiffFn
|
||||||
|
|
||||||
|
ctx := testContext2(t, &ContextOpts{
|
||||||
|
Module: m,
|
||||||
|
Providers: map[string]ResourceProviderFactory{
|
||||||
|
"template": testProviderFuncFixed(p),
|
||||||
|
},
|
||||||
|
UIInput: input,
|
||||||
|
})
|
||||||
|
|
||||||
|
if err := ctx.Input(InputModeStd); err != nil {
|
||||||
|
t.Fatalf("err: %s", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -749,3 +749,57 @@ func TestContext2Validate_varRefFilled(t *testing.T) {
|
||||||
t.Fatalf("bad: %#v", value)
|
t.Fatalf("bad: %#v", value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Module variables weren't being interpolated during Validate phase.
|
||||||
|
// related to https://github.com/hashicorp/terraform/issues/5322
|
||||||
|
func TestContext2Validate_interpolateVar(t *testing.T) {
|
||||||
|
input := new(MockUIInput)
|
||||||
|
|
||||||
|
m := testModule(t, "input-interpolate-var")
|
||||||
|
p := testProvider("null")
|
||||||
|
p.ApplyFn = testApplyFn
|
||||||
|
p.DiffFn = testDiffFn
|
||||||
|
|
||||||
|
ctx := testContext2(t, &ContextOpts{
|
||||||
|
Module: m,
|
||||||
|
Providers: map[string]ResourceProviderFactory{
|
||||||
|
"template": testProviderFuncFixed(p),
|
||||||
|
},
|
||||||
|
UIInput: input,
|
||||||
|
})
|
||||||
|
|
||||||
|
w, e := ctx.Validate()
|
||||||
|
if w != nil {
|
||||||
|
t.Log("warnings:", w)
|
||||||
|
}
|
||||||
|
if e != nil {
|
||||||
|
t.Fatal("err:", e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// When module vars reference something that is actually computed, this
|
||||||
|
// shouldn't cause validation to fail.
|
||||||
|
func TestContext2Validate_interpolateComputedModuleVarDef(t *testing.T) {
|
||||||
|
input := new(MockUIInput)
|
||||||
|
|
||||||
|
m := testModule(t, "validate-computed-module-var-ref")
|
||||||
|
p := testProvider("aws")
|
||||||
|
p.ApplyFn = testApplyFn
|
||||||
|
p.DiffFn = testDiffFn
|
||||||
|
|
||||||
|
ctx := testContext2(t, &ContextOpts{
|
||||||
|
Module: m,
|
||||||
|
Providers: map[string]ResourceProviderFactory{
|
||||||
|
"aws": testProviderFuncFixed(p),
|
||||||
|
},
|
||||||
|
UIInput: input,
|
||||||
|
})
|
||||||
|
|
||||||
|
w, e := ctx.Validate()
|
||||||
|
if w != nil {
|
||||||
|
t.Log("warnings:", w)
|
||||||
|
}
|
||||||
|
if e != nil {
|
||||||
|
t.Fatal("err:", e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -291,6 +291,7 @@ func (ctx *BuiltinEvalContext) Interpolate(
|
||||||
Path: ctx.Path(),
|
Path: ctx.Path(),
|
||||||
Resource: r,
|
Resource: r,
|
||||||
}
|
}
|
||||||
|
|
||||||
vs, err := ctx.Interpolater.Values(scope, cfg.Variables)
|
vs, err := ctx.Interpolater.Values(scope, cfg.Variables)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
package terraform
|
package terraform
|
||||||
|
|
||||||
import (
|
import "github.com/hashicorp/terraform/config"
|
||||||
"github.com/hashicorp/terraform/config"
|
|
||||||
)
|
|
||||||
|
|
||||||
// EvalInterpolate is an EvalNode implementation that takes a raw
|
// EvalInterpolate is an EvalNode implementation that takes a raw
|
||||||
// configuration and interpolates it.
|
// configuration and interpolates it.
|
||||||
|
|
|
@ -44,7 +44,8 @@ func (n *GraphNodeConfigOutput) DependentOn() []string {
|
||||||
// GraphNodeEvalable impl.
|
// GraphNodeEvalable impl.
|
||||||
func (n *GraphNodeConfigOutput) EvalTree() EvalNode {
|
func (n *GraphNodeConfigOutput) EvalTree() EvalNode {
|
||||||
return &EvalOpFilter{
|
return &EvalOpFilter{
|
||||||
Ops: []walkOperation{walkRefresh, walkPlan, walkApply, walkDestroy},
|
Ops: []walkOperation{walkRefresh, walkPlan, walkApply,
|
||||||
|
walkDestroy, walkInput, walkValidate},
|
||||||
Node: &EvalSequence{
|
Node: &EvalSequence{
|
||||||
Nodes: []EvalNode{
|
Nodes: []EvalNode{
|
||||||
&EvalWriteOutput{
|
&EvalWriteOutput{
|
||||||
|
|
|
@ -129,15 +129,6 @@ func (i *Interpolater) valueModuleVar(
|
||||||
n string,
|
n string,
|
||||||
v *config.ModuleVariable,
|
v *config.ModuleVariable,
|
||||||
result map[string]ast.Variable) error {
|
result map[string]ast.Variable) error {
|
||||||
// If we're computing all dynamic fields, then module vars count
|
|
||||||
// and we mark it as computed.
|
|
||||||
if i.Operation == walkValidate {
|
|
||||||
result[n] = ast.Variable{
|
|
||||||
Value: config.UnknownVariableValue,
|
|
||||||
Type: ast.TypeString,
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Build the path to the child module we want
|
// Build the path to the child module we want
|
||||||
path := make([]string, len(scope.Path), len(scope.Path)+1)
|
path := make([]string, len(scope.Path), len(scope.Path)+1)
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
variable "list" { }
|
||||||
|
resource "template_file" "temp" {
|
||||||
|
count = "${length(split(",", var.list))}"
|
||||||
|
template = "foo"
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
module "source" {
|
||||||
|
source = "./source"
|
||||||
|
}
|
||||||
|
module "child" {
|
||||||
|
source = "./child"
|
||||||
|
list = "${module.source.list}"
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
output "list" { value = "foo,bar,baz" }
|
|
@ -0,0 +1,5 @@
|
||||||
|
variable "destin" { }
|
||||||
|
|
||||||
|
resource "aws_instance" "dest" {
|
||||||
|
attr = "${var.destin}"
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
module "source" {
|
||||||
|
source = "./source"
|
||||||
|
}
|
||||||
|
|
||||||
|
module "dest" {
|
||||||
|
source = "./dest"
|
||||||
|
destin = "${module.source.sourceout}"
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
resource "aws_instance" "source" { }
|
||||||
|
|
||||||
|
output "sourceout" { value = "${aws_instance.source.id}" }
|
Loading…
Reference in New Issue