mirror of
https://github.com/opentofu/opentofu.git
synced 2024-12-24 08:00:17 -06:00
ea558d9d4b
Signed-off-by: Nathan Baulch <nathan.baulch@gmail.com> Signed-off-by: Christian Mesh <christianmesh1@gmail.com> Co-authored-by: Christian Mesh <christianmesh1@gmail.com>
123 lines
4.4 KiB
Go
123 lines
4.4 KiB
Go
// Copyright (c) The OpenTofu Authors
|
|
// SPDX-License-Identifier: MPL-2.0
|
|
// Copyright (c) 2023 HashiCorp, Inc.
|
|
// SPDX-License-Identifier: MPL-2.0
|
|
|
|
package addrs
|
|
|
|
import "fmt"
|
|
|
|
// ResourceInstancePhase is a special kind of reference used only internally
|
|
// during graph building to represent resource instances that are in a
|
|
// non-primary state.
|
|
//
|
|
// Graph nodes can declare themselves referenceable via an instance phase
|
|
// or can declare that they reference an instance phase in order to accommodate
|
|
// secondary graph nodes dealing with, for example, destroy actions.
|
|
//
|
|
// This special reference type cannot be accessed directly by end-users, and
|
|
// should never be shown in the UI.
|
|
type ResourceInstancePhase struct {
|
|
referenceable
|
|
ResourceInstance ResourceInstance
|
|
Phase ResourceInstancePhaseType
|
|
}
|
|
|
|
var _ Referenceable = ResourceInstancePhase{}
|
|
|
|
// Phase returns a special "phase address" for the receiving instance. See the
|
|
// documentation of ResourceInstancePhase for the limited situations where this
|
|
// is intended to be used.
|
|
func (r ResourceInstance) Phase(rpt ResourceInstancePhaseType) ResourceInstancePhase {
|
|
return ResourceInstancePhase{
|
|
ResourceInstance: r,
|
|
Phase: rpt,
|
|
}
|
|
}
|
|
|
|
// ContainingResource returns an address for the same phase of the resource
|
|
// that this instance belongs to.
|
|
func (rp ResourceInstancePhase) ContainingResource() ResourcePhase {
|
|
return rp.ResourceInstance.Resource.Phase(rp.Phase)
|
|
}
|
|
|
|
func (rp ResourceInstancePhase) String() string {
|
|
// We use a different separator here than usual to ensure that we'll
|
|
// never conflict with any non-phased resource instance string. This
|
|
// is intentionally something that would fail parsing with ParseRef,
|
|
// because this special address type should never be exposed in the UI.
|
|
return fmt.Sprintf("%s#%s", rp.ResourceInstance, rp.Phase)
|
|
}
|
|
|
|
func (rp ResourceInstancePhase) UniqueKey() UniqueKey {
|
|
return rp // A ResourceInstancePhase is its own UniqueKey
|
|
}
|
|
|
|
func (rp ResourceInstancePhase) uniqueKeySigil() {}
|
|
|
|
// ResourceInstancePhaseType is an enumeration used with ResourceInstancePhase.
|
|
type ResourceInstancePhaseType string
|
|
|
|
const (
|
|
// ResourceInstancePhaseDestroy represents the "destroy" phase of a
|
|
// resource instance.
|
|
ResourceInstancePhaseDestroy ResourceInstancePhaseType = "destroy"
|
|
|
|
// ResourceInstancePhaseDestroyCBD is similar to ResourceInstancePhaseDestroy
|
|
// but is used for resources that have "create_before_destroy" set, thus
|
|
// requiring a different dependency ordering.
|
|
ResourceInstancePhaseDestroyCBD ResourceInstancePhaseType = "destroy-cbd"
|
|
)
|
|
|
|
func (rpt ResourceInstancePhaseType) String() string {
|
|
return string(rpt)
|
|
}
|
|
|
|
// ResourcePhase is a special kind of reference used only internally
|
|
// during graph building to represent resources that are in a
|
|
// non-primary state.
|
|
//
|
|
// Graph nodes can declare themselves referenceable via a resource phase
|
|
// or can declare that they reference a resource phase in order to accommodate
|
|
// secondary graph nodes dealing with, for example, destroy actions.
|
|
//
|
|
// Since resources (as opposed to instances) aren't actually phased, this
|
|
// address type is used only as an approximation during initial construction
|
|
// of the resource-oriented plan graph, under the assumption that resource
|
|
// instances with ResourceInstancePhase addresses will be created in dynamic
|
|
// subgraphs during the graph walk.
|
|
//
|
|
// This special reference type cannot be accessed directly by end-users, and
|
|
// should never be shown in the UI.
|
|
type ResourcePhase struct {
|
|
referenceable
|
|
Resource Resource
|
|
Phase ResourceInstancePhaseType
|
|
}
|
|
|
|
var _ Referenceable = ResourcePhase{}
|
|
|
|
// Phase returns a special "phase address" for the receiving instance. See the
|
|
// documentation of ResourceInstancePhase for the limited situations where this
|
|
// is intended to be used.
|
|
func (r Resource) Phase(rpt ResourceInstancePhaseType) ResourcePhase {
|
|
return ResourcePhase{
|
|
Resource: r,
|
|
Phase: rpt,
|
|
}
|
|
}
|
|
|
|
func (rp ResourcePhase) String() string {
|
|
// We use a different separator here than usual to ensure that we'll
|
|
// never conflict with any non-phased resource instance string. This
|
|
// is intentionally something that would fail parsing with ParseRef,
|
|
// because this special address type should never be exposed in the UI.
|
|
return fmt.Sprintf("%s#%s", rp.Resource, rp.Phase)
|
|
}
|
|
|
|
func (rp ResourcePhase) UniqueKey() UniqueKey {
|
|
return rp // A ResourcePhase is its own UniqueKey
|
|
}
|
|
|
|
func (rp ResourcePhase) uniqueKeySigil() {}
|