// updateRemoteConfig is used to update the configuration of the // remote state store func (c *RemoteConfigCommand) updateRemoteConfig() int { // Validate the remote configuration if err := c.validateRemoteConfig(); err != nil { return 1 } // Read in the local state, which is just the cache of the remote state remote := c.stateResult.Remote.Cache // Update the configuration state := remote.State() state.Remote = &c.remoteConf if err := remote.WriteState(state); err != nil { c.Ui.Error(fmt.Sprintf("%s", err)) return 1 } if err := remote.PersistState(); err != nil { c.Ui.Error(fmt.Sprintf("%s", err)) return 1 } // Success! c.Ui.Output("Remote configuration updated") return 0 }
// initBlank state is used to initialize a blank state that is // remote enabled func (c *RemoteConfigCommand) initBlankState() int { // Validate the remote configuration if err := c.validateRemoteConfig(); err != nil { return 1 } // Make a blank state, attach the remote configuration blank := terraform.NewState() blank.Remote = &c.remoteConf // Persist the state remote := &state.LocalState{Path: c.stateResult.RemotePath} if err := remote.WriteState(blank); err != nil { c.Ui.Error(fmt.Sprintf("Failed to initialize state file: %v", err)) return 1 } if err := remote.PersistState(); err != nil { c.Ui.Error(fmt.Sprintf("Failed to initialize state file: %v", err)) return 1 } // Success! c.Ui.Output("Initialized blank state with remote state enabled!") return 0 }
// enableRemoteState is used to enable remote state management // and to move a state file into place func (c *RemoteConfigCommand) enableRemoteState() int { // Validate the remote configuration if err := c.validateRemoteConfig(); err != nil { return 1 } // Read the local state local := c.stateResult.Local if err := local.RefreshState(); err != nil { c.Ui.Error(fmt.Sprintf("Failed to read local state: %s", err)) return 1 } // Backup the state file before we modify it backupPath := c.conf.backupPath if backupPath != "-" { // Provide default backup path if none provided if backupPath == "" { backupPath = c.conf.statePath + DefaultBackupExtension } log.Printf("[INFO] Writing backup state to: %s", backupPath) backup := &state.LocalState{Path: backupPath} if err := backup.WriteState(local.State()); err != nil { c.Ui.Error(fmt.Sprintf("Error writing backup state file: %s", err)) return 1 } if err := backup.PersistState(); err != nil { c.Ui.Error(fmt.Sprintf("Error writing backup state file: %s", err)) return 1 } } // Update the local configuration, move into place state := local.State() state.Remote = &c.remoteConf remote := c.stateResult.Remote if err := remote.WriteState(state); err != nil { c.Ui.Error(fmt.Sprintf("%s", err)) return 1 } if err := remote.PersistState(); err != nil { c.Ui.Error(fmt.Sprintf("%s", err)) return 1 } // Remove the original, local state file log.Printf("[INFO] Removing state file: %s", c.conf.statePath) if err := os.Remove(c.conf.statePath); err != nil { c.Ui.Error(fmt.Sprintf("Failed to remove state file '%s': %v", c.conf.statePath, err)) return 1 } // Success! c.Ui.Output("Remote state management enabled") return 0 }