command: StateHook for continous state updates

This commit is contained in:
Mitchell Hashimoto 2015-02-23 21:57:17 -08:00
parent 821536b1e9
commit 95cf69aa32
3 changed files with 76 additions and 1 deletions

View File

@ -68,7 +68,8 @@ func (c *ApplyCommand) Run(args []string) int {
// Prepare the extra hooks to count resources // Prepare the extra hooks to count resources
countHook := new(CountHook) countHook := new(CountHook)
c.Meta.extraHooks = []terraform.Hook{countHook} stateHook := new(StateHook)
c.Meta.extraHooks = []terraform.Hook{countHook, stateHook}
if !c.Destroy && maybeInit { if !c.Destroy && maybeInit {
// Do a detect to determine if we need to do an init + apply. // Do a detect to determine if we need to do an init + apply.
@ -151,6 +152,18 @@ func (c *ApplyCommand) Run(args []string) int {
} }
} }
// Setup the state hook for continous state updates
{
state, err := c.State()
if err != nil {
c.Ui.Error(fmt.Sprintf(
"Error reading state: %s", err))
return 1
}
stateHook.State = state
}
// Start the apply in a goroutine so that we can be interrupted. // Start the apply in a goroutine so that we can be interrupted.
var state *terraform.State var state *terraform.State
var applyErr error var applyErr error

33
command/hook_state.go Normal file
View File

@ -0,0 +1,33 @@
package command
import (
"sync"
"github.com/hashicorp/terraform/state"
"github.com/hashicorp/terraform/terraform"
)
// StateHook is a hook that continuously updates the state by calling
// WriteState on a state.State.
type StateHook struct {
terraform.NilHook
sync.Mutex
State state.State
}
func (h *StateHook) PostStateUpdate(
s *terraform.State) (terraform.HookAction, error) {
h.Lock()
defer h.Unlock()
if h.State != nil {
// Write the new state
if err := h.State.WriteState(s); err != nil {
return terraform.HookActionHalt, err
}
}
// Continue forth
return terraform.HookActionContinue, nil
}

View File

@ -0,0 +1,29 @@
package command
import (
"testing"
"github.com/hashicorp/terraform/state"
"github.com/hashicorp/terraform/terraform"
)
func TestStateHook_impl(t *testing.T) {
var _ terraform.Hook = new(StateHook)
}
func TestStateHook(t *testing.T) {
is := &state.InmemState{}
var hook terraform.Hook = &StateHook{State: is}
s := state.TestStateInitial()
action, err := hook.PostStateUpdate(s)
if err != nil {
t.Fatalf("err: %s", err)
}
if action != terraform.HookActionContinue {
t.Fatalf("bad: %v", action)
}
if !is.State().Equal(s) {
t.Fatalf("bad state: %#v", is.State())
}
}