mirror of
https://github.com/opentofu/opentofu.git
synced 2024-12-30 10:47:14 -06:00
fcf3f643ce
Comments here indicate that this was erroneously returning an error but we accepted it anyway to get the tests passing again after other work. The tests over in the "terraform" package agree that cancelling should be a successful outcome rather than an error. I think that cancelling _should_ actually be an error, since Terraform did not complete the operation it set out to complete, but that's a change we'd need to make cautiously since automation wrapper scripts may be depending on the success-on-cancel behavior. Therefore this just fixes the command package test to agree with the Terraform package tests and adds some FIXME notes to capture the potential that we might want to update this later.
101 lines
3.0 KiB
Go
101 lines
3.0 KiB
Go
package terraform
|
|
|
|
import (
|
|
"sync/atomic"
|
|
|
|
"github.com/zclconf/go-cty/cty"
|
|
|
|
"github.com/hashicorp/terraform/addrs"
|
|
"github.com/hashicorp/terraform/plans"
|
|
"github.com/hashicorp/terraform/providers"
|
|
"github.com/hashicorp/terraform/states"
|
|
)
|
|
|
|
// stopHook is a private Hook implementation that Terraform uses to
|
|
// signal when to stop or cancel actions.
|
|
type stopHook struct {
|
|
stop uint32
|
|
}
|
|
|
|
var _ Hook = (*stopHook)(nil)
|
|
|
|
func (h *stopHook) PreApply(addr addrs.AbsResourceInstance, gen states.Generation, action plans.Action, priorState, plannedNewState cty.Value) (HookAction, error) {
|
|
return h.hook()
|
|
}
|
|
|
|
func (h *stopHook) PostApply(addr addrs.AbsResourceInstance, gen states.Generation, newState cty.Value, err error) (HookAction, error) {
|
|
return h.hook()
|
|
}
|
|
|
|
func (h *stopHook) PreDiff(addr addrs.AbsResourceInstance, gen states.Generation, priorState, proposedNewState cty.Value) (HookAction, error) {
|
|
return h.hook()
|
|
}
|
|
|
|
func (h *stopHook) PostDiff(addr addrs.AbsResourceInstance, gen states.Generation, action plans.Action, priorState, plannedNewState cty.Value) (HookAction, error) {
|
|
return h.hook()
|
|
}
|
|
|
|
func (h *stopHook) PreProvisionInstance(addr addrs.AbsResourceInstance, state cty.Value) (HookAction, error) {
|
|
return h.hook()
|
|
}
|
|
|
|
func (h *stopHook) PostProvisionInstance(addr addrs.AbsResourceInstance, state cty.Value) (HookAction, error) {
|
|
return h.hook()
|
|
}
|
|
|
|
func (h *stopHook) PreProvisionInstanceStep(addr addrs.AbsResourceInstance, typeName string) (HookAction, error) {
|
|
return h.hook()
|
|
}
|
|
|
|
func (h *stopHook) PostProvisionInstanceStep(addr addrs.AbsResourceInstance, typeName string, err error) (HookAction, error) {
|
|
return h.hook()
|
|
}
|
|
|
|
func (h *stopHook) ProvisionOutput(addr addrs.AbsResourceInstance, typeName string, line string) {
|
|
}
|
|
|
|
func (h *stopHook) PreRefresh(addr addrs.AbsResourceInstance, gen states.Generation, priorState cty.Value) (HookAction, error) {
|
|
return h.hook()
|
|
}
|
|
|
|
func (h *stopHook) PostRefresh(addr addrs.AbsResourceInstance, gen states.Generation, priorState cty.Value, newState cty.Value) (HookAction, error) {
|
|
return h.hook()
|
|
}
|
|
|
|
func (h *stopHook) PreImportState(addr addrs.AbsResourceInstance, importID string) (HookAction, error) {
|
|
return h.hook()
|
|
}
|
|
|
|
func (h *stopHook) PostImportState(addr addrs.AbsResourceInstance, imported []providers.ImportedResource) (HookAction, error) {
|
|
return h.hook()
|
|
}
|
|
|
|
func (h *stopHook) PostStateUpdate(new *states.State) (HookAction, error) {
|
|
return h.hook()
|
|
}
|
|
|
|
func (h *stopHook) hook() (HookAction, error) {
|
|
if h.Stopped() {
|
|
// FIXME: This should really return an error since stopping partway
|
|
// through is not a successful run-to-completion, but we'll need to
|
|
// introduce that cautiously since existing automation solutions may
|
|
// be depending on this behavior.
|
|
return HookActionHalt, nil
|
|
}
|
|
|
|
return HookActionContinue, nil
|
|
}
|
|
|
|
// reset should be called within the lock context
|
|
func (h *stopHook) Reset() {
|
|
atomic.StoreUint32(&h.stop, 0)
|
|
}
|
|
|
|
func (h *stopHook) Stop() {
|
|
atomic.StoreUint32(&h.stop, 1)
|
|
}
|
|
|
|
func (h *stopHook) Stopped() bool {
|
|
return atomic.LoadUint32(&h.stop) == 1
|
|
}
|