// StateOutPath returns the true output path for the state file func (m *Meta) StateOutPath() string { m.initStatePaths() if m.useRemoteState { path, _ := remote.HiddenStatePath() return path } return m.stateOutPath }
// disableRemoteState is used to disable remote state management, // and move the state file into place. func (c *RemoteCommand) disableRemoteState() int { // Get the local state local, _, err := remote.ReadLocalState() if err != nil { c.Ui.Error(fmt.Sprintf("Failed to read local state: %v", err)) return 1 } // Ensure we have the latest state before disabling if c.conf.pullOnDisable { log.Printf("[INFO] Refreshing local state from remote server") change, err := remote.RefreshState(local.Remote) if err != nil { c.Ui.Error(fmt.Sprintf( "Failed to refresh from remote state: %v", err)) return 1 } // Exit if we were unable to update if !change.SuccessfulPull() { c.Ui.Error(fmt.Sprintf("%s", change)) return 1 } else { log.Printf("[INFO] %s", change) } // Reload the local state after the refresh local, _, err = remote.ReadLocalState() if err != nil { c.Ui.Error(fmt.Sprintf("Failed to read local state: %v", err)) return 1 } } // Clear the remote management, and copy into place local.Remote = nil fh, err := os.Create(c.conf.statePath) if err != nil { c.Ui.Error(fmt.Sprintf("Failed to create state file '%s': %v", c.conf.statePath, err)) return 1 } defer fh.Close() if err := terraform.WriteState(local, fh); err != nil { c.Ui.Error(fmt.Sprintf("Failed to encode state file '%s': %v", c.conf.statePath, err)) return 1 } // Remove the old state file path, err := remote.HiddenStatePath() if err != nil { c.Ui.Error(fmt.Sprintf("Failed to get local state path: %v", err)) return 1 } if err := os.Remove(path); err != nil { c.Ui.Error(fmt.Sprintf("Failed to remove the local state file: %v", err)) return 1 } return 0 }