diff --git a/command/apply_test.go b/command/apply_test.go index 150c6d014a13..31f60fb55c78 100644 --- a/command/apply_test.go +++ b/command/apply_test.go @@ -407,6 +407,47 @@ func TestApply_input(t *testing.T) { } } +// When only a partial set of the variables are set, Terraform +// should still ask for the unset ones by default (with -input=true) +func TestApply_inputPartial(t *testing.T) { + // Disable test mode so input would be asked + test = false + defer func() { test = true }() + + // Set some default reader/writers for the inputs + defaultInputReader = bytes.NewBufferString("one\ntwo\n") + defaultInputWriter = new(bytes.Buffer) + + statePath := testTempFile(t) + + p := testProvider() + ui := new(cli.MockUi) + c := &ApplyCommand{ + Meta: Meta{ + ContextOpts: testCtxConfig(p), + Ui: ui, + }, + } + + args := []string{ + "-state", statePath, + "-var", "foo=foovalue", + testFixturePath("apply-input-partial"), + } + if code := c.Run(args); code != 0 { + t.Fatalf("bad: %d\n\n%s", code, ui.ErrorWriter.String()) + } + + expected := strings.TrimSpace(` + +Outputs: + +bar = one +foo = foovalue + `) + testStateOutput(t, statePath, expected) +} + func TestApply_noArgs(t *testing.T) { cwd, err := os.Getwd() if err != nil { diff --git a/command/meta.go b/command/meta.go index 6c2b62852c88..28d5484cc9d3 100644 --- a/command/meta.go +++ b/command/meta.go @@ -221,10 +221,8 @@ func (m *Meta) InputMode() terraform.InputMode { var mode terraform.InputMode mode |= terraform.InputModeProvider - if len(m.variables) == 0 { - mode |= terraform.InputModeVar - mode |= terraform.InputModeVarUnset - } + mode |= terraform.InputModeVar + mode |= terraform.InputModeVarUnset return mode } diff --git a/command/meta_test.go b/command/meta_test.go index 781c664dc3fd..5dde0f1ffcc4 100644 --- a/command/meta_test.go +++ b/command/meta_test.go @@ -175,7 +175,11 @@ func TestMetaInputMode_vars(t *testing.T) { t.Fatalf("err: %s", err) } - if m.InputMode()&terraform.InputModeVar != 0 { + if m.InputMode()&terraform.InputModeVar == 0 { + t.Fatalf("bad: %#v", m.InputMode()) + } + + if m.InputMode()&terraform.InputModeVarUnset == 0 { t.Fatalf("bad: %#v", m.InputMode()) } } diff --git a/command/test-fixtures/apply-input-partial/main.tf b/command/test-fixtures/apply-input-partial/main.tf new file mode 100644 index 000000000000..8c80dd09cb1c --- /dev/null +++ b/command/test-fixtures/apply-input-partial/main.tf @@ -0,0 +1,5 @@ +variable "foo" {} +variable "bar" {} + +output "foo" { value = "${var.foo}" } +output "bar" { value = "${var.bar}" } diff --git a/terraform/context.go b/terraform/context.go index c8aac252d00e..97cb93ea3e32 100644 --- a/terraform/context.go +++ b/terraform/context.go @@ -22,7 +22,8 @@ const ( // InputModeVar asks for all variables InputModeVar InputMode = 1 << iota - // InputModeVarUnset asks for variables which are not set yet + // InputModeVarUnset asks for variables which are not set yet. + // InputModeVar must be set for this to have an effect. InputModeVarUnset // InputModeProvider asks for provider variables