diff --git a/command/hook_count_test.go b/command/hook_count_test.go index 5f0b000e8..457460637 100644 --- a/command/hook_count_test.go +++ b/command/hook_count_test.go @@ -11,6 +11,31 @@ func TestCountHook_impl(t *testing.T) { var _ terraform.Hook = new(CountHook) } +func TestCountHookPostDiff_DestroyDeposed(t *testing.T) { + h := new(CountHook) + + resources := map[string]*terraform.InstanceDiff{ + "lorem": &terraform.InstanceDiff{DestroyDeposed: true}, + } + + n := &terraform.InstanceInfo{} // TODO + + for _, d := range resources { + h.PostDiff(n, d) + } + + expected := new(CountHook) + expected.ToAdd = 0 + expected.ToChange = 0 + expected.ToRemoveAndAdd = 0 + expected.ToRemove = 1 + + if !reflect.DeepEqual(expected, h) { + t.Fatalf("Expected %#v, got %#v instead.", + expected, h) + } +} + func TestCountHookPostDiff_DestroyOnly(t *testing.T) { h := new(CountHook) diff --git a/terraform/diff.go b/terraform/diff.go index 75fd1778a..c50d3cedb 100644 --- a/terraform/diff.go +++ b/terraform/diff.go @@ -534,6 +534,13 @@ func (d *InstanceDiff) GetDestroyDeposed() bool { return d.DestroyDeposed } +func (d *InstanceDiff) SetDestroyDeposed(b bool) { + d.mu.Lock() + defer d.mu.Unlock() + + d.DestroyDeposed = b +} + // These methods are properly locked, for use outside other InstanceDiff // methods but everywhere else within in the terraform package. // TODO refactor the locking scheme diff --git a/terraform/eval_diff.go b/terraform/eval_diff.go index 7152ea6f3..717d95105 100644 --- a/terraform/eval_diff.go +++ b/terraform/eval_diff.go @@ -69,6 +69,7 @@ func (n *EvalCompareDiff) Eval(ctx EvalContext) (interface{}, error) { // EvalDiff is an EvalNode implementation that does a refresh for // a resource. type EvalDiff struct { + Name string Info *InstanceInfo Config **ResourceConfig Provider *ResourceProvider @@ -112,6 +113,18 @@ func (n *EvalDiff) Eval(ctx EvalContext) (interface{}, error) { diff = new(InstanceDiff) } + // Set DestroyDeposed if we have deposed instances + _, err = readInstanceFromState(ctx, n.Name, nil, func(rs *ResourceState) (*InstanceState, error) { + if len(rs.Deposed) > 0 { + diff.DestroyDeposed = true + } + + return nil, nil + }) + if err != nil { + return nil, err + } + // Preserve the DestroyTainted flag if n.Diff != nil { diff.SetTainted((*n.Diff).GetDestroyTainted()) diff --git a/terraform/eval_diff_deposed.go b/terraform/eval_diff_deposed.go deleted file mode 100644 index c87369090..000000000 --- a/terraform/eval_diff_deposed.go +++ /dev/null @@ -1,37 +0,0 @@ -package terraform - -// EvalDiffDeposed is an EvalNode implementation that marks DestroyDeposed -// in a diff if a resource has deposed instances that need destruction. -type EvalDiffDeposed struct { - Name string - Diff **InstanceDiff -} - -// TODO: test -func (n *EvalDiffDeposed) Eval(ctx EvalContext) (interface{}, error) { - // Check if there are any deposed items in the state - deposed := false - _, err := readInstanceFromState(ctx, n.Name, nil, func(rs *ResourceState) (*InstanceState, error) { - if len(rs.Deposed) > 0 { - deposed = true - } - - return nil, nil - }) - if err != nil { - return nil, err - } - - // If no deposed items, just return - if !deposed { - return nil, nil - } - - // Set the flag to true - if *n.Diff == nil { - *n.Diff = new(InstanceDiff) - } - (*n.Diff).DestroyDeposed = true - - return nil, nil -} diff --git a/terraform/node_resource_plan_instance.go b/terraform/node_resource_plan_instance.go index b220e69e7..aeb57bbd1 100644 --- a/terraform/node_resource_plan_instance.go +++ b/terraform/node_resource_plan_instance.go @@ -169,6 +169,7 @@ func (n *NodePlannableResourceInstance) evalTreeManagedResource( Output: &state, }, &EvalDiff{ + Name: stateId, Info: info, Config: &resourceConfig, Resource: n.Config, @@ -177,10 +178,6 @@ func (n *NodePlannableResourceInstance) evalTreeManagedResource( OutputDiff: &diff, OutputState: &state, }, - &EvalDiffDeposed{ - Name: stateId, - Diff: &diff, - }, &EvalCheckPreventDestroy{ Resource: n.Config, Diff: &diff,