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  }