Skip to content

Commit

Permalink
Merge pull request #13825 from hashicorp/jbardin/reconfigure
Browse files Browse the repository at this point in the history
add init -reconfigure flag
  • Loading branch information
jbardin committed Apr 21, 2017
2 parents 214a212 + bb6ef3f commit dca8951
Show file tree
Hide file tree
Showing 5 changed files with 73 additions and 5 deletions.
9 changes: 6 additions & 3 deletions command/init.go
Expand Up @@ -30,6 +30,7 @@ func (c *InitCommand) Run(args []string) int {
cmdFlags.BoolVar(&c.forceInitCopy, "force-copy", false, "suppress prompts about copying state data")
cmdFlags.BoolVar(&c.Meta.stateLock, "lock", true, "lock state")
cmdFlags.DurationVar(&c.Meta.stateLockTimeout, "lock-timeout", 0, "lock timeout")
cmdFlags.BoolVar(&c.reconfigure, "reconfigure", false, "reconfigure")

cmdFlags.Usage = func() { c.Ui.Error(c.Help()) }
if err := cmdFlags.Parse(args); err != nil {
Expand Down Expand Up @@ -223,6 +224,10 @@ Options:
times. The backend type must be in the configuration
itself.
-force-copy Suppress prompts about copying state data. This is
equivalent to providing a "yes" to all confirmation
prompts.
-get=true Download any modules for this configuration.
-input=true Ask for input if necessary. If false, will error if
Expand All @@ -234,9 +239,7 @@ Options:
-no-color If specified, output won't contain any color.
-force-copy Suppress prompts about copying state data. This is
equivalent to providing a "yes" to all confirmation
prompts.
-reconfigure Reconfigure the backend, ignoring any saved configuration.
`
return strings.TrimSpace(helpText)
}
Expand Down
3 changes: 3 additions & 0 deletions command/meta.go
Expand Up @@ -95,6 +95,8 @@ type Meta struct {
//
// forceInitCopy suppresses confirmation for copying state data during
// init.
//
// reconfigure forces init to ignore any stored configuration.
statePath string
stateOutPath string
backupPath string
Expand All @@ -104,6 +106,7 @@ type Meta struct {
stateLock bool
stateLockTimeout time.Duration
forceInitCopy bool
reconfigure bool
}

// initStatePaths is used to initialize the default values for
Expand Down
7 changes: 7 additions & 0 deletions command/meta_backend.go
Expand Up @@ -352,6 +352,13 @@ func (m *Meta) backendFromConfig(opts *BackendOpts) (backend.Backend, error) {
s = terraform.NewState()
}

// if we want to force reconfiguration of the backend, we set the backend
// state to nil on this copy. This will direct us through the correct
// configuration path in the switch statement below.
if m.reconfigure {
s.Backend = nil
}

// Upon return, we want to set the state we're using in-memory so that
// we can access it for commands.
m.backendState = nil
Expand Down
53 changes: 53 additions & 0 deletions command/meta_backend_test.go
Expand Up @@ -983,6 +983,59 @@ func TestMetaBackend_configuredChange(t *testing.T) {
}
}

// Reconfiguring with an already configured backend.
// This should ignore the existing backend config, and configure the new
// backend is if this is the first time.
func TestMetaBackend_reconfigureChange(t *testing.T) {
// Create a temporary working directory that is empty
td := tempDir(t)
copy.CopyDir(testFixturePath("backend-change-single-to-single"), td)
defer os.RemoveAll(td)
defer testChdir(t, td)()

// Register the single-state backend
backendinit.Set("local-single", backendlocal.TestNewLocalSingle)
defer backendinit.Set("local-single", nil)

// Setup the meta
m := testMetaBackend(t, nil)

// this should not ask for input
m.input = false

// cli flag -reconfigure
m.reconfigure = true

// Get the backend
b, err := m.Backend(&BackendOpts{Init: true})
if err != nil {
t.Fatalf("bad: %s", err)
}

// Check the state
s, err := b.State(backend.DefaultStateName)
if err != nil {
t.Fatalf("bad: %s", err)
}
if err := s.RefreshState(); err != nil {
t.Fatalf("bad: %s", err)
}
newState := s.State()
if newState != nil || !newState.Empty() {
t.Fatal("state should be nil/empty after forced reconfiguration")
}

// verify that the old state is still there
s = (&state.LocalState{Path: "local-state.tfstate"})
if err := s.RefreshState(); err != nil {
t.Fatal(err)
}
oldState := s.State()
if oldState == nil || oldState.Empty() {
t.Fatal("original state should be untouched")
}
}

// Changing a configured backend, copying state
func TestMetaBackend_configuredChangeCopy(t *testing.T) {
// Create a temporary working directory that is empty
Expand Down
6 changes: 4 additions & 2 deletions website/source/docs/commands/init.html.markdown
Expand Up @@ -49,6 +49,9 @@ The command-line flags are all optional. The list of available flags are:
for the backend. This can be specified multiple times. Flags specified
later in the line override those specified earlier if they conflict.

* `-force-copy` - Suppress prompts about copying state data. This is equivalent
to providing a "yes" to all confirmation prompts.

* `-get=true` - Download any modules for this configuration.

* `-input=true` - Ask for input interactively if necessary. If this is false
Expand All @@ -60,8 +63,7 @@ The command-line flags are all optional. The list of available flags are:

* `-no-color` - If specified, output won't contain any color.

* `-force-copy` - Suppress prompts about copying state data. This is equivalent
to providing a "yes" to all confirmation prompts.
* `-reconfigure` - Reconfigure the backend, ignoring any saved configuration.

## Backend Config

Expand Down

0 comments on commit dca8951

Please sign in to comment.