github.com/leeprovoost/terraform@v0.6.10-0.20160119085442-96f3f76118e7/terraform/hook.go (about) 1 package terraform 2 3 // HookAction is an enum of actions that can be taken as a result of a hook 4 // callback. This allows you to modify the behavior of Terraform at runtime. 5 type HookAction byte 6 7 const ( 8 // HookActionContinue continues with processing as usual. 9 HookActionContinue HookAction = iota 10 11 // HookActionHalt halts immediately: no more hooks are processed 12 // and the action that Terraform was about to take is cancelled. 13 HookActionHalt 14 ) 15 16 // Hook is the interface that must be implemented to hook into various 17 // parts of Terraform, allowing you to inspect or change behavior at runtime. 18 // 19 // There are MANY hook points into Terraform. If you only want to implement 20 // some hook points, but not all (which is the likely case), then embed the 21 // NilHook into your struct, which implements all of the interface but does 22 // nothing. Then, override only the functions you want to implement. 23 type Hook interface { 24 // PreApply and PostApply are called before and after a single 25 // resource is applied. The error argument in PostApply is the 26 // error, if any, that was returned from the provider Apply call itself. 27 PreApply(*InstanceInfo, *InstanceState, *InstanceDiff) (HookAction, error) 28 PostApply(*InstanceInfo, *InstanceState, error) (HookAction, error) 29 30 // PreDiff and PostDiff are called before and after a single resource 31 // resource is diffed. 32 PreDiff(*InstanceInfo, *InstanceState) (HookAction, error) 33 PostDiff(*InstanceInfo, *InstanceDiff) (HookAction, error) 34 35 // Provisioning hooks 36 // 37 // All should be self-explanatory. ProvisionOutput is called with 38 // output sent back by the provisioners. This will be called multiple 39 // times as output comes in, but each call should represent a line of 40 // output. The ProvisionOutput method cannot control whether the 41 // hook continues running. 42 PreProvisionResource(*InstanceInfo, *InstanceState) (HookAction, error) 43 PostProvisionResource(*InstanceInfo, *InstanceState) (HookAction, error) 44 PreProvision(*InstanceInfo, string) (HookAction, error) 45 PostProvision(*InstanceInfo, string) (HookAction, error) 46 ProvisionOutput(*InstanceInfo, string, string) 47 48 // PreRefresh and PostRefresh are called before and after a single 49 // resource state is refreshed, respectively. 50 PreRefresh(*InstanceInfo, *InstanceState) (HookAction, error) 51 PostRefresh(*InstanceInfo, *InstanceState) (HookAction, error) 52 53 // PostStateUpdate is called after the state is updated. 54 PostStateUpdate(*State) (HookAction, error) 55 } 56 57 // NilHook is a Hook implementation that does nothing. It exists only to 58 // simplify implementing hooks. You can embed this into your Hook implementation 59 // and only implement the functions you are interested in. 60 type NilHook struct{} 61 62 func (*NilHook) PreApply(*InstanceInfo, *InstanceState, *InstanceDiff) (HookAction, error) { 63 return HookActionContinue, nil 64 } 65 66 func (*NilHook) PostApply(*InstanceInfo, *InstanceState, error) (HookAction, error) { 67 return HookActionContinue, nil 68 } 69 70 func (*NilHook) PreDiff(*InstanceInfo, *InstanceState) (HookAction, error) { 71 return HookActionContinue, nil 72 } 73 74 func (*NilHook) PostDiff(*InstanceInfo, *InstanceDiff) (HookAction, error) { 75 return HookActionContinue, nil 76 } 77 78 func (*NilHook) PreProvisionResource(*InstanceInfo, *InstanceState) (HookAction, error) { 79 return HookActionContinue, nil 80 } 81 82 func (*NilHook) PostProvisionResource(*InstanceInfo, *InstanceState) (HookAction, error) { 83 return HookActionContinue, nil 84 } 85 86 func (*NilHook) PreProvision(*InstanceInfo, string) (HookAction, error) { 87 return HookActionContinue, nil 88 } 89 90 func (*NilHook) PostProvision(*InstanceInfo, string) (HookAction, error) { 91 return HookActionContinue, nil 92 } 93 94 func (*NilHook) ProvisionOutput( 95 *InstanceInfo, string, string) { 96 } 97 98 func (*NilHook) PreRefresh(*InstanceInfo, *InstanceState) (HookAction, error) { 99 return HookActionContinue, nil 100 } 101 102 func (*NilHook) PostRefresh(*InstanceInfo, *InstanceState) (HookAction, error) { 103 return HookActionContinue, nil 104 } 105 106 func (*NilHook) PostStateUpdate(*State) (HookAction, error) { 107 return HookActionContinue, nil 108 } 109 110 // handleHook turns hook actions into panics. This lets you use the 111 // panic/recover mechanism in Go as a flow control mechanism for hook 112 // actions. 113 func handleHook(a HookAction, err error) { 114 if err != nil { 115 // TODO: handle errors 116 } 117 118 switch a { 119 case HookActionContinue: 120 return 121 case HookActionHalt: 122 panic(HookActionHalt) 123 } 124 }