mirror of
https://github.com/opentofu/opentofu.git
synced 2024-12-29 10:21:01 -06:00
c5d10bdef1
In order to include condition block results in the JSON plan output, we must store them in the plan and its serialization. Terraform can evaluate condition blocks multiple times, so we must be able to update the result. Accordingly, the plan.Conditions object is a map with keys representing the condition block's address. Condition blocks are not referenceable in any other context, so this address form cannot be used anywhere in the configuration. The commit includes a new test case for the JSON output of a refresh-only plan, which is currently the only way for a failing condition result to be rendered through this path.
87 lines
2.4 KiB
Go
87 lines
2.4 KiB
Go
package addrs
|
|
|
|
import "fmt"
|
|
|
|
// Check is the address of a check rule within a checkable object.
|
|
//
|
|
// This represents the check rule globally within a configuration, and is used
|
|
// during graph evaluation to identify a condition result object to update with
|
|
// the result of check rule evaluation.
|
|
//
|
|
// The check address is not distinct from resource traversals, and check rule
|
|
// values are not intended to be available to the language, so the address is
|
|
// not Referenceable.
|
|
//
|
|
// Note also that the check address is only relevant within the scope of a run,
|
|
// as reordering check blocks between runs will result in their addresses
|
|
// changing.
|
|
type Check struct {
|
|
Container Checkable
|
|
Type CheckType
|
|
Index int
|
|
}
|
|
|
|
func (c Check) String() string {
|
|
container := c.Container.String()
|
|
switch c.Type {
|
|
case ResourcePrecondition:
|
|
return fmt.Sprintf("%s.preconditions[%d]", container, c.Index)
|
|
case ResourcePostcondition:
|
|
return fmt.Sprintf("%s.postconditions[%d]", container, c.Index)
|
|
case OutputPrecondition:
|
|
return fmt.Sprintf("%s.preconditions[%d]", container, c.Index)
|
|
default:
|
|
// This should not happen
|
|
return fmt.Sprintf("%s.conditions[%d]", container, c.Index)
|
|
}
|
|
}
|
|
|
|
// Checkable is an interface implemented by all address types that can contain
|
|
// condition blocks.
|
|
type Checkable interface {
|
|
checkableSigil()
|
|
|
|
// Check returns the address of an individual check rule of a specified
|
|
// type and index within this checkable container.
|
|
Check(CheckType, int) Check
|
|
String() string
|
|
}
|
|
|
|
var (
|
|
_ Checkable = AbsResourceInstance{}
|
|
_ Checkable = AbsOutputValue{}
|
|
)
|
|
|
|
type checkable struct {
|
|
}
|
|
|
|
func (c checkable) checkableSigil() {
|
|
}
|
|
|
|
// CheckType describes the category of check.
|
|
//go:generate go run golang.org/x/tools/cmd/stringer -type=CheckType check.go
|
|
type CheckType int
|
|
|
|
const (
|
|
InvalidCondition CheckType = 0
|
|
ResourcePrecondition CheckType = 1
|
|
ResourcePostcondition CheckType = 2
|
|
OutputPrecondition CheckType = 3
|
|
)
|
|
|
|
// Description returns a human-readable description of the check type. This is
|
|
// presented in the user interface through a diagnostic summary.
|
|
func (c CheckType) Description() string {
|
|
switch c {
|
|
case ResourcePrecondition:
|
|
return "Resource precondition"
|
|
case ResourcePostcondition:
|
|
return "Resource postcondition"
|
|
case OutputPrecondition:
|
|
return "Module output value precondition"
|
|
default:
|
|
// This should not happen
|
|
return "Condition"
|
|
}
|
|
}
|