github.com/cycloidio/terraform@v1.1.10-0.20220513142504-76d5c768dc63/command/views/json/change.go (about) 1 package json 2 3 import ( 4 "fmt" 5 6 "github.com/cycloidio/terraform/plans" 7 ) 8 9 func NewResourceInstanceChange(change *plans.ResourceInstanceChangeSrc) *ResourceInstanceChange { 10 c := &ResourceInstanceChange{ 11 Resource: newResourceAddr(change.Addr), 12 Action: changeAction(change.Action), 13 Reason: changeReason(change.ActionReason), 14 } 15 if !change.Addr.Equal(change.PrevRunAddr) { 16 if c.Action == ActionNoOp { 17 c.Action = ActionMove 18 } 19 pr := newResourceAddr(change.PrevRunAddr) 20 c.PreviousResource = &pr 21 } 22 23 return c 24 } 25 26 type ResourceInstanceChange struct { 27 Resource ResourceAddr `json:"resource"` 28 PreviousResource *ResourceAddr `json:"previous_resource,omitempty"` 29 Action ChangeAction `json:"action"` 30 Reason ChangeReason `json:"reason,omitempty"` 31 } 32 33 func (c *ResourceInstanceChange) String() string { 34 return fmt.Sprintf("%s: Plan to %s", c.Resource.Addr, c.Action) 35 } 36 37 type ChangeAction string 38 39 const ( 40 ActionNoOp ChangeAction = "noop" 41 ActionMove ChangeAction = "move" 42 ActionCreate ChangeAction = "create" 43 ActionRead ChangeAction = "read" 44 ActionUpdate ChangeAction = "update" 45 ActionReplace ChangeAction = "replace" 46 ActionDelete ChangeAction = "delete" 47 ) 48 49 func changeAction(action plans.Action) ChangeAction { 50 switch action { 51 case plans.NoOp: 52 return ActionNoOp 53 case plans.Create: 54 return ActionCreate 55 case plans.Read: 56 return ActionRead 57 case plans.Update: 58 return ActionUpdate 59 case plans.DeleteThenCreate, plans.CreateThenDelete: 60 return ActionReplace 61 case plans.Delete: 62 return ActionDelete 63 default: 64 return ActionNoOp 65 } 66 } 67 68 type ChangeReason string 69 70 const ( 71 ReasonNone ChangeReason = "" 72 ReasonTainted ChangeReason = "tainted" 73 ReasonRequested ChangeReason = "requested" 74 ReasonCannotUpdate ChangeReason = "cannot_update" 75 ReasonUnknown ChangeReason = "unknown" 76 77 ReasonDeleteBecauseNoResourceConfig ChangeReason = "delete_because_no_resource_config" 78 ReasonDeleteBecauseWrongRepetition ChangeReason = "delete_because_wrong_repetition" 79 ReasonDeleteBecauseCountIndex ChangeReason = "delete_because_count_index" 80 ReasonDeleteBecauseEachKey ChangeReason = "delete_because_each_key" 81 ReasonDeleteBecauseNoModule ChangeReason = "delete_because_no_module" 82 ) 83 84 func changeReason(reason plans.ResourceInstanceChangeActionReason) ChangeReason { 85 switch reason { 86 case plans.ResourceInstanceChangeNoReason: 87 return ReasonNone 88 case plans.ResourceInstanceReplaceBecauseTainted: 89 return ReasonTainted 90 case plans.ResourceInstanceReplaceByRequest: 91 return ReasonRequested 92 case plans.ResourceInstanceReplaceBecauseCannotUpdate: 93 return ReasonCannotUpdate 94 case plans.ResourceInstanceDeleteBecauseNoResourceConfig: 95 return ReasonDeleteBecauseNoResourceConfig 96 case plans.ResourceInstanceDeleteBecauseWrongRepetition: 97 return ReasonDeleteBecauseWrongRepetition 98 case plans.ResourceInstanceDeleteBecauseCountIndex: 99 return ReasonDeleteBecauseCountIndex 100 case plans.ResourceInstanceDeleteBecauseEachKey: 101 return ReasonDeleteBecauseEachKey 102 case plans.ResourceInstanceDeleteBecauseNoModule: 103 return ReasonDeleteBecauseNoModule 104 default: 105 // This should never happen, but there's no good way to guarantee 106 // exhaustive handling of the enum, so a generic fall back is better 107 // than a misleading result or a panic 108 return ReasonUnknown 109 } 110 }