-
Notifications
You must be signed in to change notification settings - Fork 9.4k
/
state.go
104 lines (84 loc) · 3.51 KB
/
state.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package jsonformat
import (
"sort"
ctyjson "github.com/zclconf/go-cty/cty/json"
"github.com/hashicorp/terraform/internal/command/jsonformat/computed"
"github.com/hashicorp/terraform/internal/command/jsonformat/differ"
"github.com/hashicorp/terraform/internal/command/jsonprovider"
"github.com/hashicorp/terraform/internal/command/jsonstate"
)
type State struct {
StateFormatVersion string `json:"state_format_version"`
RootModule jsonstate.Module `json:"root"`
RootModuleOutputs map[string]jsonstate.Output `json:"root_module_outputs"`
ProviderFormatVersion string `json:"provider_format_version"`
ProviderSchemas map[string]*jsonprovider.Provider `json:"provider_schemas"`
}
func (state State) Empty() bool {
return len(state.RootModuleOutputs) == 0 && len(state.RootModule.Resources) == 0 && len(state.RootModule.ChildModules) == 0
}
func (state State) GetSchema(resource jsonstate.Resource) *jsonprovider.Schema {
switch resource.Mode {
case jsonstate.ManagedResourceMode:
return state.ProviderSchemas[resource.ProviderName].ResourceSchemas[resource.Type]
case jsonstate.DataResourceMode:
return state.ProviderSchemas[resource.ProviderName].DataSourceSchemas[resource.Type]
default:
panic("found unrecognized resource mode: " + resource.Mode)
}
}
func (state State) renderHumanStateModule(renderer Renderer, module jsonstate.Module, opts computed.RenderHumanOpts, first bool) {
if len(module.Resources) > 0 && !first {
renderer.Streams.Println()
}
for _, resource := range module.Resources {
if !first {
renderer.Streams.Println()
}
if first {
first = false
}
if len(resource.DeposedKey) > 0 {
renderer.Streams.Printf("# %s: (deposed object %s)", resource.Address, resource.DeposedKey)
} else if resource.Tainted {
renderer.Streams.Printf("# %s: (tainted)", resource.Address)
} else {
renderer.Streams.Printf("# %s:", resource.Address)
}
renderer.Streams.Println()
schema := state.GetSchema(resource)
switch resource.Mode {
case jsonstate.ManagedResourceMode:
renderer.Streams.Printf("resource %q %q %s", resource.Type, resource.Name, differ.FromJsonResource(resource).ComputeDiffForBlock(schema.Block).RenderHuman(0, opts))
case jsonstate.DataResourceMode:
renderer.Streams.Printf("data %q %q %s", resource.Type, resource.Name, differ.FromJsonResource(resource).ComputeDiffForBlock(schema.Block).RenderHuman(0, opts))
default:
panic("found unrecognized resource mode: " + resource.Mode)
}
renderer.Streams.Println()
}
for _, child := range module.ChildModules {
state.renderHumanStateModule(renderer, child, opts, first)
}
}
func (state State) renderHumanStateOutputs(renderer Renderer, opts computed.RenderHumanOpts) {
if len(state.RootModuleOutputs) > 0 {
renderer.Streams.Printf("\n\nOutputs:\n\n")
var keys []string
for key := range state.RootModuleOutputs {
keys = append(keys, key)
}
sort.Strings(keys)
for _, key := range keys {
output := state.RootModuleOutputs[key]
ctype, err := ctyjson.UnmarshalType(output.Type)
if err != nil {
// We can actually do this without the type, so even if we fail
// to work out the type let's just render this anyway.
renderer.Streams.Printf("%s = %s\n", key, differ.FromJsonOutput(state.RootModuleOutputs[key]).ComputeDiffForOutput().RenderHuman(0, opts))
} else {
renderer.Streams.Printf("%s = %s\n", key, differ.FromJsonOutput(state.RootModuleOutputs[key]).ComputeDiffForType(ctype).RenderHuman(0, opts))
}
}
}
}