mirror of
https://github.com/opentffoundation/opentf.git
synced 2026-05-01 10:00:39 -04:00
* command/show: adding functions to aid refactoring The planfile -> statefile -> state logic path was getting hard to follow with blurry human eyes. The getPlan... and getState... functions were added to help streamline the logic flow. Continued refactoring may follow. * command/show: use ctx.Config() instead of a config snapshot As originally written, the jsonconfig marshaller was getting an error when loading configs that included one or more modules. It's not clear if that was an error in the function call or in the configloader itself, but as a simpler solution existed I did not dig too far. * command/jsonplan: implement jsonplan.Marshal Split the `config` portion into a discrete package to aid in naming sanity (so we could have for example jsonconfig.Resource instead of jsonplan.ConfigResource) and to enable marshaling the config on it's own.
109 lines
3.1 KiB
Go
109 lines
3.1 KiB
Go
package jsonstate
|
|
|
|
import (
|
|
"encoding/json"
|
|
|
|
"github.com/hashicorp/terraform/states"
|
|
)
|
|
|
|
// FormatVersion represents the version of the json format and will be
|
|
// incremented for any change to this format that requires changes to a
|
|
// consuming parser.
|
|
const FormatVersion = "0.1"
|
|
|
|
// state is the top-level representation of the json format of a terraform
|
|
// state.
|
|
type state struct {
|
|
FormatVersion string `json:"format_version"`
|
|
Values stateValues `json:"values"`
|
|
}
|
|
|
|
// stateValues is the common representation of resolved values for both the prior
|
|
// state (which is always complete) and the planned new state.
|
|
type stateValues struct {
|
|
Outputs map[string]output
|
|
RootModule module
|
|
}
|
|
|
|
type output struct {
|
|
Sensitive bool
|
|
Value json.RawMessage
|
|
}
|
|
|
|
// module is the representation of a module in state. This can be the root module
|
|
// or a child module
|
|
type module struct {
|
|
Resources []resource
|
|
|
|
// Address is the absolute module address, omitted for the root module
|
|
Address string `json:"address,omitempty"`
|
|
|
|
// Each module object can optionally have its own nested "child_modules",
|
|
// recursively describing the full module tree.
|
|
ChildModules []module `json:"child_modules,omitempty"`
|
|
}
|
|
|
|
type moduleCall struct {
|
|
ResolvedSource string `json:"resolved_source"`
|
|
Expressions map[string]interface{} `json:"expressions,omitempty"`
|
|
CountExpression expression `json:"count_expression"`
|
|
ForEachExpression expression `json:"for_each_expression"`
|
|
Module module `json:"module"`
|
|
}
|
|
|
|
// Resource is the representation of a resource in the state.
|
|
type resource struct {
|
|
// Address is the absolute resource address
|
|
Address string `json:"address"`
|
|
|
|
// Mode can be "managed" or "data"
|
|
Mode string `json:"mode"`
|
|
|
|
Type string `json:"type"`
|
|
Name string `json:"name"`
|
|
|
|
// Index is omitted for a resource not using `count` or `for_each`.
|
|
Index int `json:"index,omitempty"`
|
|
|
|
// ProviderName allows the property "type" to be interpreted unambiguously
|
|
// in the unusual situation where a provider offers a resource type whose
|
|
// name does not start with its own name, such as the "googlebeta" provider
|
|
// offering "google_compute_instance".
|
|
ProviderName string `json:"provider_name"`
|
|
|
|
// SchemaVersion indicates which version of the resource type schema the
|
|
// "values" property conforms to.
|
|
SchemaVersion int `json:"schema_version"`
|
|
|
|
// Values is the JSON representation of the attribute values of the
|
|
// resource, whose structure depends on the resource type schema. Any
|
|
// unknown values are omitted or set to null, making them indistinguishable
|
|
// from absent values.
|
|
Values json.RawMessage `json:"values"`
|
|
}
|
|
|
|
type source struct {
|
|
FileName string `json:"filename"`
|
|
Start string `json:"start"`
|
|
End string `json:"end"`
|
|
}
|
|
|
|
// newState() returns a minimally-initialized state
|
|
func newState() *state {
|
|
return &state{
|
|
FormatVersion: FormatVersion,
|
|
}
|
|
}
|
|
|
|
// Marshal returns the json encoding of a terraform plan.
|
|
func Marshal(s *states.State) ([]byte, error) {
|
|
if s.Empty() {
|
|
return nil, nil
|
|
}
|
|
|
|
output := newState()
|
|
|
|
ret, err := json.Marshal(output)
|
|
return ret, err
|
|
}
|