diff --git a/states/instance_object.go b/states/instance_object.go index 0a6454990..9335b6977 100644 --- a/states/instance_object.go +++ b/states/instance_object.go @@ -109,11 +109,12 @@ func (o *ResourceInstanceObject) Encode(ty cty.Type, schemaVersion uint64) (*Res } return &ResourceInstanceObjectSrc{ - SchemaVersion: schemaVersion, - AttrsJSON: src, - Private: o.Private, - Status: o.Status, - Dependencies: o.Dependencies, + SchemaVersion: schemaVersion, + AttrsJSON: src, + Private: o.Private, + Status: o.Status, + Dependencies: o.Dependencies, + CreateBeforeDestroy: o.CreateBeforeDestroy, }, nil } diff --git a/states/statefile/version4.go b/states/statefile/version4.go index b98f90f6d..865e8f818 100644 --- a/states/statefile/version4.go +++ b/states/statefile/version4.go @@ -130,7 +130,8 @@ func prepareStateV4(sV4 *stateV4) (*File, tfdiags.Diagnostics) { instAddr := rAddr.Instance(key) obj := &states.ResourceInstanceObjectSrc{ - SchemaVersion: isV4.SchemaVersion, + SchemaVersion: isV4.SchemaVersion, + CreateBeforeDestroy: isV4.CreateBeforeDestroy, } { @@ -484,15 +485,16 @@ func appendInstanceObjectStateV4(rs *states.Resource, is *states.ResourceInstanc } return append(isV4s, instanceObjectStateV4{ - IndexKey: rawKey, - Deposed: string(deposed), - Status: status, - SchemaVersion: obj.SchemaVersion, - AttributesFlat: obj.AttrsFlat, - AttributesRaw: obj.AttrsJSON, - PrivateRaw: privateRaw, - Dependencies: deps, - DependsOn: depOn, + IndexKey: rawKey, + Deposed: string(deposed), + Status: status, + SchemaVersion: obj.SchemaVersion, + AttributesFlat: obj.AttrsFlat, + AttributesRaw: obj.AttrsJSON, + PrivateRaw: privateRaw, + Dependencies: deps, + DependsOn: depOn, + CreateBeforeDestroy: obj.CreateBeforeDestroy, }), diags } @@ -544,6 +546,8 @@ type instanceObjectStateV4 struct { Dependencies []string `json:"dependencies,omitempty"` DependsOn []string `json:"depends_on,omitempty"` + + CreateBeforeDestroy bool `json:"create_before_destroy"` } // stateVersionV4 is a weird special type we use to produce our hard-coded diff --git a/terraform/eval_apply.go b/terraform/eval_apply.go index ed8e7bc10..fdea4488e 100644 --- a/terraform/eval_apply.go +++ b/terraform/eval_apply.go @@ -305,9 +305,10 @@ func (n *EvalApply) Eval(ctx EvalContext) (interface{}, error) { var newState *states.ResourceInstanceObject if !newVal.IsNull() { // null value indicates that the object is deleted, so we won't set a new state in that case newState = &states.ResourceInstanceObject{ - Status: newStatus, - Value: newVal, - Private: resp.Private, + Status: newStatus, + Value: newVal, + Private: resp.Private, + CreateBeforeDestroy: n.Config.Managed.CreateBeforeDestroy, } } diff --git a/terraform/eval_state.go b/terraform/eval_state.go index c19d37801..cb0416c97 100644 --- a/terraform/eval_state.go +++ b/terraform/eval_state.go @@ -228,6 +228,7 @@ func (n *EvalWriteState) Eval(ctx EvalContext) (interface{}, error) { log.Printf("[TRACE] EvalWriteState: removing state object for %s", absAddr) return nil, nil } + fmt.Printf("OBJ: %#v\n", obj) // store the new deps in the state if n.Dependencies != nil {