github.com/pdecat/terraform@v0.11.9-beta1/backend/local/hook_count.go (about) 1 package local 2 3 import ( 4 "strings" 5 "sync" 6 7 "github.com/hashicorp/terraform/terraform" 8 ) 9 10 // CountHook is a hook that counts the number of resources 11 // added, removed, changed during the course of an apply. 12 type CountHook struct { 13 Added int 14 Changed int 15 Removed int 16 17 ToAdd int 18 ToChange int 19 ToRemove int 20 ToRemoveAndAdd int 21 22 pending map[string]countHookAction 23 24 sync.Mutex 25 terraform.NilHook 26 } 27 28 func (h *CountHook) Reset() { 29 h.Lock() 30 defer h.Unlock() 31 32 h.pending = nil 33 h.Added = 0 34 h.Changed = 0 35 h.Removed = 0 36 } 37 38 func (h *CountHook) PreApply( 39 n *terraform.InstanceInfo, 40 s *terraform.InstanceState, 41 d *terraform.InstanceDiff) (terraform.HookAction, error) { 42 h.Lock() 43 defer h.Unlock() 44 45 if d.Empty() { 46 return terraform.HookActionContinue, nil 47 } 48 49 if h.pending == nil { 50 h.pending = make(map[string]countHookAction) 51 } 52 53 action := countHookActionChange 54 if d.GetDestroy() { 55 action = countHookActionRemove 56 } else if s.ID == "" { 57 action = countHookActionAdd 58 } 59 60 h.pending[n.HumanId()] = action 61 62 return terraform.HookActionContinue, nil 63 } 64 65 func (h *CountHook) PostApply( 66 n *terraform.InstanceInfo, 67 s *terraform.InstanceState, 68 e error) (terraform.HookAction, error) { 69 h.Lock() 70 defer h.Unlock() 71 72 if h.pending != nil { 73 if a, ok := h.pending[n.HumanId()]; ok { 74 delete(h.pending, n.HumanId()) 75 76 if e == nil { 77 switch a { 78 case countHookActionAdd: 79 h.Added += 1 80 case countHookActionChange: 81 h.Changed += 1 82 case countHookActionRemove: 83 h.Removed += 1 84 } 85 } 86 } 87 } 88 89 return terraform.HookActionContinue, nil 90 } 91 92 func (h *CountHook) PostDiff( 93 n *terraform.InstanceInfo, d *terraform.InstanceDiff) ( 94 terraform.HookAction, error) { 95 h.Lock() 96 defer h.Unlock() 97 98 // We don't count anything for data sources 99 if strings.HasPrefix(n.Id, "data.") { 100 return terraform.HookActionContinue, nil 101 } 102 103 switch d.ChangeType() { 104 case terraform.DiffDestroyCreate: 105 h.ToRemoveAndAdd += 1 106 case terraform.DiffCreate: 107 h.ToAdd += 1 108 case terraform.DiffDestroy: 109 h.ToRemove += 1 110 case terraform.DiffUpdate: 111 h.ToChange += 1 112 } 113 114 return terraform.HookActionContinue, nil 115 }