terraform: support backends in the state
This commit is contained in:
parent
ad7b063262
commit
523801dcc2
|
@ -313,6 +313,13 @@ func (c *Context) ShadowError() error {
|
||||||
return c.shadowErr
|
return c.shadowErr
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// State returns a copy of the current state associated with this context.
|
||||||
|
//
|
||||||
|
// This cannot safely be called in parallel with any other Context function.
|
||||||
|
func (c *Context) State() *State {
|
||||||
|
return c.state.DeepCopy()
|
||||||
|
}
|
||||||
|
|
||||||
// Interpolater returns an Interpolater built on a copy of the state
|
// Interpolater returns an Interpolater built on a copy of the state
|
||||||
// that can be used to test interpolation values.
|
// that can be used to test interpolation values.
|
||||||
func (c *Context) Interpolater() *Interpolater {
|
func (c *Context) Interpolater() *Interpolater {
|
||||||
|
|
|
@ -20,6 +20,10 @@ func init() {
|
||||||
|
|
||||||
// Plan represents a single Terraform execution plan, which contains
|
// Plan represents a single Terraform execution plan, which contains
|
||||||
// all the information necessary to make an infrastructure change.
|
// all the information necessary to make an infrastructure change.
|
||||||
|
//
|
||||||
|
// A plan has to contain basically the entire state of the world
|
||||||
|
// necessary to make a change: the state, diff, config, backend config, etc.
|
||||||
|
// This is so that it can run alone without any other data.
|
||||||
type Plan struct {
|
type Plan struct {
|
||||||
Diff *Diff
|
Diff *Diff
|
||||||
Module *module.Tree
|
Module *module.Tree
|
||||||
|
@ -27,6 +31,9 @@ type Plan struct {
|
||||||
Vars map[string]interface{}
|
Vars map[string]interface{}
|
||||||
Targets []string
|
Targets []string
|
||||||
|
|
||||||
|
// Backend is the backend that this plan should use and store data with.
|
||||||
|
Backend *BackendState
|
||||||
|
|
||||||
once sync.Once
|
once sync.Once
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -79,6 +79,11 @@ type State struct {
|
||||||
// pull and push state files from a remote storage endpoint.
|
// pull and push state files from a remote storage endpoint.
|
||||||
Remote *RemoteState `json:"remote,omitempty"`
|
Remote *RemoteState `json:"remote,omitempty"`
|
||||||
|
|
||||||
|
// Backend tracks the configuration for the backend in use with
|
||||||
|
// this state. This is used to track any changes in the backend
|
||||||
|
// configuration.
|
||||||
|
Backend *BackendState `json:"backend,omitempty"`
|
||||||
|
|
||||||
// Modules contains all the modules in a breadth-first order
|
// Modules contains all the modules in a breadth-first order
|
||||||
Modules []*ModuleState `json:"modules"`
|
Modules []*ModuleState `json:"modules"`
|
||||||
|
|
||||||
|
@ -779,6 +784,22 @@ func (s *State) String() string {
|
||||||
return strings.TrimSpace(buf.String())
|
return strings.TrimSpace(buf.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// BackendState stores the configuration to connect to a remote backend.
|
||||||
|
type BackendState struct {
|
||||||
|
Type string `json:"type"` // Backend type
|
||||||
|
Config map[string]interface{} `json:"config"` // Backend raw config
|
||||||
|
|
||||||
|
// Hash is the hash code to uniquely identify the original source
|
||||||
|
// configuration. We use this to detect when there is a change in
|
||||||
|
// configuration even when "type" isn't changed.
|
||||||
|
Hash uint64 `json:"hash"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Empty returns true if BackendState has no state.
|
||||||
|
func (s *BackendState) Empty() bool {
|
||||||
|
return s == nil || s.Type == ""
|
||||||
|
}
|
||||||
|
|
||||||
// RemoteState is used to track the information about a remote
|
// RemoteState is used to track the information about a remote
|
||||||
// state store that we push/pull state to.
|
// state store that we push/pull state to.
|
||||||
type RemoteState struct {
|
type RemoteState struct {
|
||||||
|
|
|
@ -256,6 +256,9 @@ func TestStateDeepCopy(t *testing.T) {
|
||||||
cases := []struct {
|
cases := []struct {
|
||||||
State *State
|
State *State
|
||||||
}{
|
}{
|
||||||
|
// Nil
|
||||||
|
{nil},
|
||||||
|
|
||||||
// Version
|
// Version
|
||||||
{
|
{
|
||||||
&State{Version: 5},
|
&State{Version: 5},
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
package terraform
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
// TestStateFile writes the given state to the path.
|
||||||
|
func TestStateFile(t *testing.T, path string, state *State) {
|
||||||
|
f, err := os.Create(path)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("err: %s", err)
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
|
||||||
|
if err := WriteState(state, f); err != nil {
|
||||||
|
t.Fatalf("err: %s", err)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue