command: StateHook for continous state updates
This commit is contained in:
parent
821536b1e9
commit
95cf69aa32
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
}
|
|
@ -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())
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue