github.com/iaas-resource-provision/iaas-rpc@v1.0.7-0.20211021023331-ed21f798c408/internal/terraform/hook_stop.go (about) 1 package terraform 2 3 import ( 4 "errors" 5 "sync/atomic" 6 7 "github.com/zclconf/go-cty/cty" 8 9 "github.com/iaas-resource-provision/iaas-rpc/internal/addrs" 10 "github.com/iaas-resource-provision/iaas-rpc/internal/plans" 11 "github.com/iaas-resource-provision/iaas-rpc/internal/providers" 12 "github.com/iaas-resource-provision/iaas-rpc/internal/states" 13 ) 14 15 // stopHook is a private Hook implementation that Terraform uses to 16 // signal when to stop or cancel actions. 17 type stopHook struct { 18 stop uint32 19 } 20 21 var _ Hook = (*stopHook)(nil) 22 23 func (h *stopHook) PreApply(addr addrs.AbsResourceInstance, gen states.Generation, action plans.Action, priorState, plannedNewState cty.Value) (HookAction, error) { 24 return h.hook() 25 } 26 27 func (h *stopHook) PostApply(addr addrs.AbsResourceInstance, gen states.Generation, newState cty.Value, err error) (HookAction, error) { 28 return h.hook() 29 } 30 31 func (h *stopHook) PreDiff(addr addrs.AbsResourceInstance, gen states.Generation, priorState, proposedNewState cty.Value) (HookAction, error) { 32 return h.hook() 33 } 34 35 func (h *stopHook) PostDiff(addr addrs.AbsResourceInstance, gen states.Generation, action plans.Action, priorState, plannedNewState cty.Value) (HookAction, error) { 36 return h.hook() 37 } 38 39 func (h *stopHook) PreProvisionInstance(addr addrs.AbsResourceInstance, state cty.Value) (HookAction, error) { 40 return h.hook() 41 } 42 43 func (h *stopHook) PostProvisionInstance(addr addrs.AbsResourceInstance, state cty.Value) (HookAction, error) { 44 return h.hook() 45 } 46 47 func (h *stopHook) PreProvisionInstanceStep(addr addrs.AbsResourceInstance, typeName string) (HookAction, error) { 48 return h.hook() 49 } 50 51 func (h *stopHook) PostProvisionInstanceStep(addr addrs.AbsResourceInstance, typeName string, err error) (HookAction, error) { 52 return h.hook() 53 } 54 55 func (h *stopHook) ProvisionOutput(addr addrs.AbsResourceInstance, typeName string, line string) { 56 } 57 58 func (h *stopHook) PreRefresh(addr addrs.AbsResourceInstance, gen states.Generation, priorState cty.Value) (HookAction, error) { 59 return h.hook() 60 } 61 62 func (h *stopHook) PostRefresh(addr addrs.AbsResourceInstance, gen states.Generation, priorState cty.Value, newState cty.Value) (HookAction, error) { 63 return h.hook() 64 } 65 66 func (h *stopHook) PreImportState(addr addrs.AbsResourceInstance, importID string) (HookAction, error) { 67 return h.hook() 68 } 69 70 func (h *stopHook) PostImportState(addr addrs.AbsResourceInstance, imported []providers.ImportedResource) (HookAction, error) { 71 return h.hook() 72 } 73 74 func (h *stopHook) PostStateUpdate(new *states.State) (HookAction, error) { 75 return h.hook() 76 } 77 78 func (h *stopHook) hook() (HookAction, error) { 79 if h.Stopped() { 80 return HookActionHalt, errors.New("execution halted") 81 } 82 83 return HookActionContinue, nil 84 } 85 86 // reset should be called within the lock context 87 func (h *stopHook) Reset() { 88 atomic.StoreUint32(&h.stop, 0) 89 } 90 91 func (h *stopHook) Stop() { 92 atomic.StoreUint32(&h.stop, 1) 93 } 94 95 func (h *stopHook) Stopped() bool { 96 return atomic.LoadUint32(&h.stop) == 1 97 }