Merge pull request #755 from hashicorp/f-plan-remote-state
command/apply: Handle remote state in a plan file
This commit is contained in:
commit
58a4a0b253
|
@ -15,6 +15,7 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/hashicorp/terraform/remote"
|
||||||
"github.com/hashicorp/terraform/terraform"
|
"github.com/hashicorp/terraform/terraform"
|
||||||
"github.com/mitchellh/cli"
|
"github.com/mitchellh/cli"
|
||||||
)
|
)
|
||||||
|
@ -368,6 +369,70 @@ func TestApply_plan(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestApply_plan_remoteState(t *testing.T) {
|
||||||
|
// Disable test mode so input would be asked
|
||||||
|
test = false
|
||||||
|
defer func() { test = true }()
|
||||||
|
tmp, cwd := testCwd(t)
|
||||||
|
defer testFixCwd(t, tmp, cwd)
|
||||||
|
if err := remote.EnsureDirectory(); err != nil {
|
||||||
|
t.Fatalf("err: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set some default reader/writers for the inputs
|
||||||
|
defaultInputReader = new(bytes.Buffer)
|
||||||
|
defaultInputWriter = new(bytes.Buffer)
|
||||||
|
|
||||||
|
// Create a remote state
|
||||||
|
state := testState()
|
||||||
|
conf, srv := testRemoteState(t, state, 200)
|
||||||
|
defer srv.Close()
|
||||||
|
state.Remote = conf
|
||||||
|
|
||||||
|
planPath := testPlanFile(t, &terraform.Plan{
|
||||||
|
Module: testModule(t, "apply"),
|
||||||
|
State: state,
|
||||||
|
})
|
||||||
|
|
||||||
|
p := testProvider()
|
||||||
|
ui := new(cli.MockUi)
|
||||||
|
c := &ApplyCommand{
|
||||||
|
Meta: Meta{
|
||||||
|
ContextOpts: testCtxConfig(p),
|
||||||
|
Ui: ui,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
args := []string{
|
||||||
|
planPath,
|
||||||
|
}
|
||||||
|
if code := c.Run(args); code != 0 {
|
||||||
|
t.Fatalf("bad: %d\n\n%s", code, ui.ErrorWriter.String())
|
||||||
|
}
|
||||||
|
|
||||||
|
if p.InputCalled {
|
||||||
|
t.Fatalf("input should not be called for plans")
|
||||||
|
}
|
||||||
|
|
||||||
|
// State file should be not be installed
|
||||||
|
exists, err := remote.ExistsFile(DefaultStateFilename)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("err: %v", err)
|
||||||
|
}
|
||||||
|
if exists {
|
||||||
|
t.Fatalf("State path should not exist")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for remote state
|
||||||
|
output, _, err := remote.ReadLocalState()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("err: %v", err)
|
||||||
|
}
|
||||||
|
if output == nil {
|
||||||
|
t.Fatalf("missing remote state")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestApply_planWithVarFile(t *testing.T) {
|
func TestApply_planWithVarFile(t *testing.T) {
|
||||||
varFileDir := testTempDir(t)
|
varFileDir := testTempDir(t)
|
||||||
varFilePath := filepath.Join(varFileDir, "terraform.tfvars")
|
varFilePath := filepath.Join(varFileDir, "terraform.tfvars")
|
||||||
|
|
|
@ -106,6 +106,14 @@ func (m *Meta) Context(copts contextOpts) (*terraform.Context, bool, error) {
|
||||||
plan, err := terraform.ReadPlan(f)
|
plan, err := terraform.ReadPlan(f)
|
||||||
f.Close()
|
f.Close()
|
||||||
if err == nil {
|
if err == nil {
|
||||||
|
// Check if remote state is enabled, but do not refresh.
|
||||||
|
// Since a plan is supposed to lock-in the changes, we do not
|
||||||
|
// attempt a state refresh.
|
||||||
|
if plan.State.Remote != nil && plan.State.Remote.Type != "" {
|
||||||
|
log.Printf("[INFO] Enabling remote state from plan")
|
||||||
|
m.useRemoteState = true
|
||||||
|
}
|
||||||
|
|
||||||
if len(m.variables) > 0 {
|
if len(m.variables) > 0 {
|
||||||
return nil, false, fmt.Errorf(
|
return nil, false, fmt.Errorf(
|
||||||
"You can't set variables with the '-var' or '-var-file' flag\n" +
|
"You can't set variables with the '-var' or '-var-file' flag\n" +
|
||||||
|
|
Loading…
Reference in New Issue