diff --git a/terraform/context_plan_test.go b/terraform/context_plan_test.go index f2b473623..dc6af4acb 100644 --- a/terraform/context_plan_test.go +++ b/terraform/context_plan_test.go @@ -1309,6 +1309,26 @@ func TestContext2Plan_countComputed(t *testing.T) { } } +func TestContext2Plan_countComputedModule(t *testing.T) { + m := testModule(t, "plan-count-computed-module") + p := testProvider("aws") + p.DiffFn = testDiffFn + ctx := testContext2(t, &ContextOpts{ + Module: m, + Providers: map[string]ResourceProviderFactory{ + "aws": testProviderFuncFixed(p), + }, + }) + + _, err := ctx.Plan() + + expectedErr := "aws_instance.bar: value of 'count'" + if !strings.Contains(fmt.Sprintf("%s", err), expectedErr) { + t.Fatalf("expected err would contain %q\nerr: %s\n", + expectedErr, err) + } +} + func TestContext2Plan_countIndex(t *testing.T) { m := testModule(t, "plan-count-index") p := testProvider("aws") diff --git a/terraform/eval_count_computed.go b/terraform/eval_count_computed.go new file mode 100644 index 000000000..54a8333e0 --- /dev/null +++ b/terraform/eval_count_computed.go @@ -0,0 +1,25 @@ +package terraform + +import ( + "fmt" + + "github.com/hashicorp/terraform/config" +) + +// EvalCountCheckComputed is an EvalNode that checks if a resource count +// is computed and errors if so. This can possibly happen across a +// module boundary and we don't yet support this. +type EvalCountCheckComputed struct { + Resource *config.Resource +} + +// TODO: test +func (n *EvalCountCheckComputed) Eval(ctx EvalContext) (interface{}, error) { + if n.Resource.RawCount.Value() == unknownValue() { + return nil, fmt.Errorf( + "%s: value of 'count' cannot be computed", + n.Resource.Id()) + } + + return nil, nil +} diff --git a/terraform/graph_config_node_resource.go b/terraform/graph_config_node_resource.go index db4e6626c..b160f6ddd 100644 --- a/terraform/graph_config_node_resource.go +++ b/terraform/graph_config_node_resource.go @@ -215,6 +215,7 @@ func (n *GraphNodeConfigResource) EvalTree() EvalNode { return &EvalSequence{ Nodes: []EvalNode{ &EvalInterpolate{Config: n.Resource.RawCount}, + &EvalCountCheckComputed{Resource: n.Resource}, &EvalOpFilter{ Ops: []walkOperation{walkValidate}, Node: &EvalValidateCount{Resource: n.Resource}, diff --git a/terraform/node_resource_plan.go b/terraform/node_resource_plan.go index c9e53e02c..dc5f653b8 100644 --- a/terraform/node_resource_plan.go +++ b/terraform/node_resource_plan.go @@ -31,6 +31,7 @@ func (n *NodePlannableResource) EvalTree() EvalNode { // into the proper number of instances. &EvalInterpolate{Config: n.Config.RawCount}, + &EvalCountCheckComputed{Resource: n.Config}, &EvalCountFixZeroOneBoundary{Resource: n.Config}, }, } diff --git a/terraform/test-fixtures/plan-count-computed-module/child/main.tf b/terraform/test-fixtures/plan-count-computed-module/child/main.tf new file mode 100644 index 000000000..f80d699d9 --- /dev/null +++ b/terraform/test-fixtures/plan-count-computed-module/child/main.tf @@ -0,0 +1,5 @@ +variable "value" {} + +resource "aws_instance" "bar" { + count = "${var.value}" +} diff --git a/terraform/test-fixtures/plan-count-computed-module/main.tf b/terraform/test-fixtures/plan-count-computed-module/main.tf new file mode 100644 index 000000000..c87beb5f8 --- /dev/null +++ b/terraform/test-fixtures/plan-count-computed-module/main.tf @@ -0,0 +1,8 @@ +resource "aws_instance" "foo" { + compute = "foo" +} + +module "child" { + source = "./child" + value = "${aws_instance.foo.foo}" +}