command/meta: always ask for unset variable input

Fixes #7975

This changes the InputMode for the CLI to always be:

    InputModeProvider | InputModeVar | InputModeVarUnset

Which means:

  * Ask for provider variables
  * Ask for user variables _that are not already set_

The change is the latter point. Before, we'd only ask for variables if
zero were given. This forces the user to either have no variables set
via the CLI, env vars, tfvars or ALL variables, but no in between. As
reported in #7975, this isn't expected behavior.

The new change makes is so that unset variables are always asked for.
Users can retain the previous behavior by setting `-input=false`. This
would ensure that variables set by external sources cover all cases.
This commit is contained in:
Mitchell Hashimoto 2016-11-01 19:16:43 -07:00
parent 61a1501731
commit 1248b147ac
No known key found for this signature in database
GPG Key ID: 744E147AA52F5B0A
5 changed files with 55 additions and 6 deletions

View File

@ -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(`
<no state>
Outputs:
bar = one
foo = foovalue
`)
testStateOutput(t, statePath, expected)
}
func TestApply_noArgs(t *testing.T) {
cwd, err := os.Getwd()
if err != nil {

View File

@ -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
}

View File

@ -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())
}
}

View File

@ -0,0 +1,5 @@
variable "foo" {}
variable "bar" {}
output "foo" { value = "${var.foo}" }
output "bar" { value = "${var.bar}" }

View File

@ -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