|
|
|
|
@ -136,133 +136,130 @@ func (n *NodeDestroyResourceInstance) Execute(ctx EvalContext, op walkOperation)
|
|
|
|
|
var state *states.ResourceInstanceObject
|
|
|
|
|
var provisionerErr error
|
|
|
|
|
|
|
|
|
|
switch op {
|
|
|
|
|
case walkApply, walkDestroy:
|
|
|
|
|
provider, providerSchema, err := GetProvider(ctx, n.ResolvedProvider)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
provider, providerSchema, err := GetProvider(ctx, n.ResolvedProvider)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
changeApply, err = n.readDiff(ctx, providerSchema)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
changeApply, err = n.readDiff(ctx, providerSchema)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
evalReduceDiff := &EvalReduceDiff{
|
|
|
|
|
Addr: addr.Resource,
|
|
|
|
|
InChange: &changeApply,
|
|
|
|
|
Destroy: true,
|
|
|
|
|
OutChange: &changeApply,
|
|
|
|
|
}
|
|
|
|
|
_, err = evalReduceDiff.Eval(ctx)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
evalReduceDiff := &EvalReduceDiff{
|
|
|
|
|
Addr: addr.Resource,
|
|
|
|
|
InChange: &changeApply,
|
|
|
|
|
Destroy: true,
|
|
|
|
|
OutChange: &changeApply,
|
|
|
|
|
}
|
|
|
|
|
_, err = evalReduceDiff.Eval(ctx)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// EvalReduceDiff may have simplified our planned change
|
|
|
|
|
// into a NoOp if it does not require destroying.
|
|
|
|
|
if changeApply == nil || changeApply.Action == plans.NoOp {
|
|
|
|
|
return EvalEarlyExitError{}
|
|
|
|
|
}
|
|
|
|
|
// EvalReduceDiff may have simplified our planned change
|
|
|
|
|
// into a NoOp if it does not require destroying.
|
|
|
|
|
if changeApply == nil || changeApply.Action == plans.NoOp {
|
|
|
|
|
return EvalEarlyExitError{}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
state, err = n.ReadResourceInstanceState(ctx, addr)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
state, err = n.ReadResourceInstanceState(ctx, addr)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Exit early if the state object is null after reading the state
|
|
|
|
|
if state == nil || state.Value.IsNull() {
|
|
|
|
|
return EvalEarlyExitError{}
|
|
|
|
|
}
|
|
|
|
|
// Exit early if the state object is null after reading the state
|
|
|
|
|
if state == nil || state.Value.IsNull() {
|
|
|
|
|
return EvalEarlyExitError{}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
evalApplyPre := &EvalApplyPre{
|
|
|
|
|
Addr: addr.Resource,
|
|
|
|
|
State: &state,
|
|
|
|
|
Change: &changeApply,
|
|
|
|
|
evalApplyPre := &EvalApplyPre{
|
|
|
|
|
Addr: addr.Resource,
|
|
|
|
|
State: &state,
|
|
|
|
|
Change: &changeApply,
|
|
|
|
|
}
|
|
|
|
|
_, err = evalApplyPre.Eval(ctx)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Run destroy provisioners if not tainted
|
|
|
|
|
if state != nil && state.Status != states.ObjectTainted {
|
|
|
|
|
evalApplyProvisioners := &EvalApplyProvisioners{
|
|
|
|
|
Addr: addr.Resource,
|
|
|
|
|
State: &state,
|
|
|
|
|
ResourceConfig: n.Config,
|
|
|
|
|
Error: &provisionerErr,
|
|
|
|
|
When: configs.ProvisionerWhenDestroy,
|
|
|
|
|
}
|
|
|
|
|
_, err = evalApplyPre.Eval(ctx)
|
|
|
|
|
_, err := evalApplyProvisioners.Eval(ctx)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Run destroy provisioners if not tainted
|
|
|
|
|
if state != nil && state.Status != states.ObjectTainted {
|
|
|
|
|
evalApplyProvisioners := &EvalApplyProvisioners{
|
|
|
|
|
Addr: addr.Resource,
|
|
|
|
|
State: &state,
|
|
|
|
|
ResourceConfig: n.Config,
|
|
|
|
|
Error: &provisionerErr,
|
|
|
|
|
When: configs.ProvisionerWhenDestroy,
|
|
|
|
|
if provisionerErr != nil {
|
|
|
|
|
// If we have a provisioning error, then we just call
|
|
|
|
|
// the post-apply hook now.
|
|
|
|
|
evalApplyPost := &EvalApplyPost{
|
|
|
|
|
Addr: addr.Resource,
|
|
|
|
|
State: &state,
|
|
|
|
|
Error: &provisionerErr,
|
|
|
|
|
}
|
|
|
|
|
_, err := evalApplyProvisioners.Eval(ctx)
|
|
|
|
|
_, err = evalApplyPost.Eval(ctx)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
if provisionerErr != nil {
|
|
|
|
|
// If we have a provisioning error, then we just call
|
|
|
|
|
// the post-apply hook now.
|
|
|
|
|
evalApplyPost := &EvalApplyPost{
|
|
|
|
|
Addr: addr.Resource,
|
|
|
|
|
State: &state,
|
|
|
|
|
Error: &provisionerErr,
|
|
|
|
|
}
|
|
|
|
|
_, err = evalApplyPost.Eval(ctx)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Managed resources need to be destroyed, while data sources
|
|
|
|
|
// are only removed from state.
|
|
|
|
|
if addr.Resource.Resource.Mode == addrs.ManagedResourceMode {
|
|
|
|
|
evalApply := &EvalApply{
|
|
|
|
|
Addr: addr.Resource,
|
|
|
|
|
Config: nil, // No configuration because we are destroying
|
|
|
|
|
State: &state,
|
|
|
|
|
Change: &changeApply,
|
|
|
|
|
Provider: &provider,
|
|
|
|
|
ProviderAddr: n.ResolvedProvider,
|
|
|
|
|
ProviderMetas: n.ProviderMetas,
|
|
|
|
|
ProviderSchema: &providerSchema,
|
|
|
|
|
Output: &state,
|
|
|
|
|
Error: &provisionerErr,
|
|
|
|
|
}
|
|
|
|
|
_, err = evalApply.Eval(ctx)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
evalWriteState := &EvalWriteState{
|
|
|
|
|
Addr: addr.Resource,
|
|
|
|
|
ProviderAddr: n.ResolvedProvider,
|
|
|
|
|
ProviderSchema: &providerSchema,
|
|
|
|
|
State: &state,
|
|
|
|
|
}
|
|
|
|
|
_, err = evalWriteState.Eval(ctx)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
log.Printf("[TRACE] NodeDestroyResourceInstance: removing state object for %s", n.Addr)
|
|
|
|
|
state := ctx.State()
|
|
|
|
|
state.SetResourceInstanceCurrent(n.Addr, nil, n.ResolvedProvider)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
evalApplyPost := &EvalApplyPost{
|
|
|
|
|
Addr: addr.Resource,
|
|
|
|
|
State: &state,
|
|
|
|
|
Error: &provisionerErr,
|
|
|
|
|
// Managed resources need to be destroyed, while data sources
|
|
|
|
|
// are only removed from state.
|
|
|
|
|
if addr.Resource.Resource.Mode == addrs.ManagedResourceMode {
|
|
|
|
|
evalApply := &EvalApply{
|
|
|
|
|
Addr: addr.Resource,
|
|
|
|
|
Config: nil, // No configuration because we are destroying
|
|
|
|
|
State: &state,
|
|
|
|
|
Change: &changeApply,
|
|
|
|
|
Provider: &provider,
|
|
|
|
|
ProviderAddr: n.ResolvedProvider,
|
|
|
|
|
ProviderMetas: n.ProviderMetas,
|
|
|
|
|
ProviderSchema: &providerSchema,
|
|
|
|
|
Output: &state,
|
|
|
|
|
Error: &provisionerErr,
|
|
|
|
|
}
|
|
|
|
|
_, err = evalApplyPost.Eval(ctx)
|
|
|
|
|
_, err = evalApply.Eval(ctx)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = UpdateStateHook(ctx)
|
|
|
|
|
evalWriteState := &EvalWriteState{
|
|
|
|
|
Addr: addr.Resource,
|
|
|
|
|
ProviderAddr: n.ResolvedProvider,
|
|
|
|
|
ProviderSchema: &providerSchema,
|
|
|
|
|
State: &state,
|
|
|
|
|
}
|
|
|
|
|
_, err = evalWriteState.Eval(ctx)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
log.Printf("[TRACE] NodeDestroyResourceInstance: removing state object for %s", n.Addr)
|
|
|
|
|
state := ctx.State()
|
|
|
|
|
state.SetResourceInstanceCurrent(n.Addr, nil, n.ResolvedProvider)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
evalApplyPost := &EvalApplyPost{
|
|
|
|
|
Addr: addr.Resource,
|
|
|
|
|
State: &state,
|
|
|
|
|
Error: &provisionerErr,
|
|
|
|
|
}
|
|
|
|
|
_, err = evalApplyPost.Eval(ctx)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = UpdateStateHook(ctx)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
|