7 "github.com/mitchellh/copystructure"
10 // upgradeStateV1ToV2 is used to upgrade a V1 state representation
11 // into a V2 state representation
12 func upgradeStateV1ToV2(old *stateV1) (*stateV2, error) {
13 log.Printf("[TRACE] statefile.Read: upgrading format from v1 to v2")
18 remote, err := old.Remote.upgradeToV2()
20 return nil, fmt.Errorf("Error upgrading State V1: %v", err)
23 modules := make([]*moduleStateV2, len(old.Modules))
24 for i, module := range old.Modules {
25 upgraded, err := module.upgradeToV2()
27 return nil, fmt.Errorf("Error upgrading State V1: %v", err)
31 if len(modules) == 0 {
45 func (old *remoteStateV1) upgradeToV2() (*remoteStateV2, error) {
50 config, err := copystructure.Copy(old.Config)
52 return nil, fmt.Errorf("Error upgrading RemoteState V1: %v", err)
55 return &remoteStateV2{
57 Config: config.(map[string]string),
61 func (old *moduleStateV1) upgradeToV2() (*moduleStateV2, error) {
66 pathRaw, err := copystructure.Copy(old.Path)
68 return nil, fmt.Errorf("Error upgrading ModuleState V1: %v", err)
70 path, ok := pathRaw.([]string)
72 return nil, fmt.Errorf("Error upgrading ModuleState V1: path is not a list of strings")
75 // We found some V1 states with a nil path. Assume root.
76 path = []string{"root"}
79 // Outputs needs upgrading to use the new structure
80 outputs := make(map[string]*outputStateV2)
81 for key, output := range old.Outputs {
82 outputs[key] = &outputStateV2{
89 resources := make(map[string]*resourceStateV2)
90 for key, oldResource := range old.Resources {
91 upgraded, err := oldResource.upgradeToV2()
93 return nil, fmt.Errorf("Error upgrading ModuleState V1: %v", err)
95 resources[key] = upgraded
98 dependencies, err := copystructure.Copy(old.Dependencies)
100 return nil, fmt.Errorf("Error upgrading ModuleState V1: %v", err)
103 return &moduleStateV2{
106 Resources: resources,
107 Dependencies: dependencies.([]string),
111 func (old *resourceStateV1) upgradeToV2() (*resourceStateV2, error) {
116 dependencies, err := copystructure.Copy(old.Dependencies)
118 return nil, fmt.Errorf("Error upgrading ResourceState V1: %v", err)
121 primary, err := old.Primary.upgradeToV2()
123 return nil, fmt.Errorf("Error upgrading ResourceState V1: %v", err)
126 deposed := make([]*instanceStateV2, len(old.Deposed))
127 for i, v := range old.Deposed {
128 upgraded, err := v.upgradeToV2()
130 return nil, fmt.Errorf("Error upgrading ResourceState V1: %v", err)
132 deposed[i] = upgraded
134 if len(deposed) == 0 {
138 return &resourceStateV2{
140 Dependencies: dependencies.([]string),
143 Provider: old.Provider,
147 func (old *instanceStateV1) upgradeToV2() (*instanceStateV2, error) {
152 attributes, err := copystructure.Copy(old.Attributes)
154 return nil, fmt.Errorf("Error upgrading InstanceState V1: %v", err)
157 meta, err := copystructure.Copy(old.Meta)
159 return nil, fmt.Errorf("Error upgrading InstanceState V1: %v", err)
162 newMeta := make(map[string]interface{})
163 for k, v := range meta.(map[string]string) {
167 return &instanceStateV2{
169 Attributes: attributes.(map[string]string),