github.com/eliastor/durgaform@v0.0.0-20220816172711-d0ab2d17673e/internal/command/views/json/change.go (about) 1 package json 2 3 import ( 4 "fmt" 5 6 "github.com/eliastor/durgaform/internal/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 ReasonReplaceTriggeredBy ChangeReason = "replace_triggered_by" 75 ReasonCannotUpdate ChangeReason = "cannot_update" 76 ReasonUnknown ChangeReason = "unknown" 77 78 ReasonDeleteBecauseNoResourceConfig ChangeReason = "delete_because_no_resource_config" 79 ReasonDeleteBecauseWrongRepetition ChangeReason = "delete_because_wrong_repetition" 80 ReasonDeleteBecauseCountIndex ChangeReason = "delete_because_count_index" 81 ReasonDeleteBecauseEachKey ChangeReason = "delete_because_each_key" 82 ReasonDeleteBecauseNoModule ChangeReason = "delete_because_no_module" 83 ReasonReadBecauseConfigUnknown ChangeReason = "read_because_config_unknown" 84 ReasonReadBecauseDependencyPending ChangeReason = "read_because_dependency_pending" 85 ) 86 87 func changeReason(reason plans.ResourceInstanceChangeActionReason) ChangeReason { 88 switch reason { 89 case plans.ResourceInstanceChangeNoReason: 90 return ReasonNone 91 case plans.ResourceInstanceReplaceBecauseTainted: 92 return ReasonTainted 93 case plans.ResourceInstanceReplaceByRequest: 94 return ReasonRequested 95 case plans.ResourceInstanceReplaceBecauseCannotUpdate: 96 return ReasonCannotUpdate 97 case plans.ResourceInstanceReplaceByTriggers: 98 return ReasonReplaceTriggeredBy 99 case plans.ResourceInstanceDeleteBecauseNoResourceConfig: 100 return ReasonDeleteBecauseNoResourceConfig 101 case plans.ResourceInstanceDeleteBecauseWrongRepetition: 102 return ReasonDeleteBecauseWrongRepetition 103 case plans.ResourceInstanceDeleteBecauseCountIndex: 104 return ReasonDeleteBecauseCountIndex 105 case plans.ResourceInstanceDeleteBecauseEachKey: 106 return ReasonDeleteBecauseEachKey 107 case plans.ResourceInstanceDeleteBecauseNoModule: 108 return ReasonDeleteBecauseNoModule 109 case plans.ResourceInstanceReadBecauseConfigUnknown: 110 return ReasonReadBecauseConfigUnknown 111 case plans.ResourceInstanceReadBecauseDependencyPending: 112 return ReasonReadBecauseDependencyPending 113 default: 114 // This should never happen, but there's no good way to guarantee 115 // exhaustive handling of the enum, so a generic fall back is better 116 // than a misleading result or a panic 117 return ReasonUnknown 118 } 119 }