diff --git a/terraform/context_apply_test.go b/terraform/context_apply_test.go index d3b77298ec3d..bd7e8049d60a 100644 --- a/terraform/context_apply_test.go +++ b/terraform/context_apply_test.go @@ -465,6 +465,65 @@ func TestContext2Apply_createBeforeDestroyUpdate(t *testing.T) { } } +func TestContext2Apply_createBeforeDestroy_hook(t *testing.T) { + h := new(MockHook) + m := testModule(t, "apply-good-create-before") + p := testProvider("aws") + p.ApplyFn = testApplyFn + p.DiffFn = testDiffFn + state := &State{ + Modules: []*ModuleState{ + &ModuleState{ + Path: rootModulePath, + Resources: map[string]*ResourceState{ + "aws_instance.bar": &ResourceState{ + Type: "aws_instance", + Primary: &InstanceState{ + ID: "bar", + Attributes: map[string]string{ + "require_new": "abc", + }, + }, + }, + }, + }, + }, + } + + var actual []string + var actualLock sync.Mutex + h.PostApplyFn = func(n *InstanceInfo, s *InstanceState, e error) (HookAction, error) { + actualLock.Lock() + defer actualLock.Unlock() + actual = append(actual, n.Id) + return HookActionContinue, nil + } + + ctx := testContext2(t, &ContextOpts{ + Module: m, + Hooks: []Hook{h}, + Providers: map[string]ResourceProviderFactory{ + "aws": testProviderFuncFixed(p), + }, + State: state, + }) + + if p, err := ctx.Plan(); err != nil { + t.Fatalf("err: %s", err) + } else { + t.Logf(p.String()) + } + + if _, err := ctx.Apply(); err != nil { + t.Fatalf("err: %s", err) + } + + expected := []string{"aws_instance.bar", "aws_instance.bar (deposed #0)"} + if !reflect.DeepEqual(actual, expected) { + t.Fatalf("bad: %#v", actual) + } +} + func TestContext2Apply_destroyComputed(t *testing.T) { m := testModule(t, "apply-destroy-computed") p := testProvider("aws") diff --git a/terraform/hook_mock.go b/terraform/hook_mock.go index 3797a1e15157..b0bb94e5764d 100644 --- a/terraform/hook_mock.go +++ b/terraform/hook_mock.go @@ -20,6 +20,7 @@ type MockHook struct { PostApplyError error PostApplyReturn HookAction PostApplyReturnError error + PostApplyFn func(*InstanceInfo, *InstanceState, error) (HookAction, error) PreDiffCalled bool PreDiffInfo *InstanceInfo @@ -111,6 +112,11 @@ func (h *MockHook) PostApply(n *InstanceInfo, s *InstanceState, e error) (HookAc h.PostApplyInfo = n h.PostApplyState = s h.PostApplyError = e + + if h.PostApplyFn != nil { + return h.PostApplyFn(n, s, e) + } + return h.PostApplyReturn, h.PostApplyReturnError } diff --git a/terraform/transform_deposed.go b/terraform/transform_deposed.go index 635fc99eb5e2..456e8bfd3598 100644 --- a/terraform/transform_deposed.go +++ b/terraform/transform_deposed.go @@ -145,6 +145,11 @@ func (n *graphNodeDeposedResource) EvalTree() EvalNode { State: &state, Index: n.Index, }, + &EvalApplyPost{ + Info: info, + State: &state, + Error: &err, + }, &EvalReturnError{ Error: &err, },