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  }