github.com/terramate-io/tf@v0.0.0-20230830114523-fce866b4dfcd/legacy/terraform/state_upgrade_v1_to_v2.go (about) 1 // Copyright (c) HashiCorp, Inc. 2 // SPDX-License-Identifier: MPL-2.0 3 4 package terraform 5 6 import ( 7 "fmt" 8 9 "github.com/mitchellh/copystructure" 10 ) 11 12 // upgradeStateV1ToV2 is used to upgrade a V1 state representation 13 // into a V2 state representation 14 func upgradeStateV1ToV2(old *stateV1) (*State, error) { 15 if old == nil { 16 return nil, nil 17 } 18 19 remote, err := old.Remote.upgradeToV2() 20 if err != nil { 21 return nil, fmt.Errorf("Error upgrading State V1: %v", err) 22 } 23 24 modules := make([]*ModuleState, len(old.Modules)) 25 for i, module := range old.Modules { 26 upgraded, err := module.upgradeToV2() 27 if err != nil { 28 return nil, fmt.Errorf("Error upgrading State V1: %v", err) 29 } 30 modules[i] = upgraded 31 } 32 if len(modules) == 0 { 33 modules = nil 34 } 35 36 newState := &State{ 37 Version: 2, 38 Serial: old.Serial, 39 Remote: remote, 40 Modules: modules, 41 } 42 43 newState.sort() 44 newState.init() 45 46 return newState, nil 47 } 48 49 func (old *remoteStateV1) upgradeToV2() (*RemoteState, error) { 50 if old == nil { 51 return nil, nil 52 } 53 54 config, err := copystructure.Copy(old.Config) 55 if err != nil { 56 return nil, fmt.Errorf("Error upgrading RemoteState V1: %v", err) 57 } 58 59 return &RemoteState{ 60 Type: old.Type, 61 Config: config.(map[string]string), 62 }, nil 63 } 64 65 func (old *moduleStateV1) upgradeToV2() (*ModuleState, error) { 66 if old == nil { 67 return nil, nil 68 } 69 70 pathRaw, err := copystructure.Copy(old.Path) 71 if err != nil { 72 return nil, fmt.Errorf("Error upgrading ModuleState V1: %v", err) 73 } 74 path, ok := pathRaw.([]string) 75 if !ok { 76 return nil, fmt.Errorf("Error upgrading ModuleState V1: path is not a list of strings") 77 } 78 if len(path) == 0 { 79 // We found some V1 states with a nil path. Assume root and catch 80 // duplicate path errors later (as part of Validate). 81 path = rootModulePath 82 } 83 84 // Outputs needs upgrading to use the new structure 85 outputs := make(map[string]*OutputState) 86 for key, output := range old.Outputs { 87 outputs[key] = &OutputState{ 88 Type: "string", 89 Value: output, 90 Sensitive: false, 91 } 92 } 93 94 resources := make(map[string]*ResourceState) 95 for key, oldResource := range old.Resources { 96 upgraded, err := oldResource.upgradeToV2() 97 if err != nil { 98 return nil, fmt.Errorf("Error upgrading ModuleState V1: %v", err) 99 } 100 resources[key] = upgraded 101 } 102 103 dependencies, err := copystructure.Copy(old.Dependencies) 104 if err != nil { 105 return nil, fmt.Errorf("Error upgrading ModuleState V1: %v", err) 106 } 107 108 return &ModuleState{ 109 Path: path, 110 Outputs: outputs, 111 Resources: resources, 112 Dependencies: dependencies.([]string), 113 }, nil 114 } 115 116 func (old *resourceStateV1) upgradeToV2() (*ResourceState, error) { 117 if old == nil { 118 return nil, nil 119 } 120 121 dependencies, err := copystructure.Copy(old.Dependencies) 122 if err != nil { 123 return nil, fmt.Errorf("Error upgrading ResourceState V1: %v", err) 124 } 125 126 primary, err := old.Primary.upgradeToV2() 127 if err != nil { 128 return nil, fmt.Errorf("Error upgrading ResourceState V1: %v", err) 129 } 130 131 deposed := make([]*InstanceState, len(old.Deposed)) 132 for i, v := range old.Deposed { 133 upgraded, err := v.upgradeToV2() 134 if err != nil { 135 return nil, fmt.Errorf("Error upgrading ResourceState V1: %v", err) 136 } 137 deposed[i] = upgraded 138 } 139 if len(deposed) == 0 { 140 deposed = nil 141 } 142 143 return &ResourceState{ 144 Type: old.Type, 145 Dependencies: dependencies.([]string), 146 Primary: primary, 147 Deposed: deposed, 148 Provider: old.Provider, 149 }, nil 150 } 151 152 func (old *instanceStateV1) upgradeToV2() (*InstanceState, error) { 153 if old == nil { 154 return nil, nil 155 } 156 157 attributes, err := copystructure.Copy(old.Attributes) 158 if err != nil { 159 return nil, fmt.Errorf("Error upgrading InstanceState V1: %v", err) 160 } 161 ephemeral, err := old.Ephemeral.upgradeToV2() 162 if err != nil { 163 return nil, fmt.Errorf("Error upgrading InstanceState V1: %v", err) 164 } 165 166 meta, err := copystructure.Copy(old.Meta) 167 if err != nil { 168 return nil, fmt.Errorf("Error upgrading InstanceState V1: %v", err) 169 } 170 171 newMeta := make(map[string]interface{}) 172 for k, v := range meta.(map[string]string) { 173 newMeta[k] = v 174 } 175 176 return &InstanceState{ 177 ID: old.ID, 178 Attributes: attributes.(map[string]string), 179 Ephemeral: *ephemeral, 180 Meta: newMeta, 181 }, nil 182 } 183 184 func (old *ephemeralStateV1) upgradeToV2() (*EphemeralState, error) { 185 connInfo, err := copystructure.Copy(old.ConnInfo) 186 if err != nil { 187 return nil, fmt.Errorf("Error upgrading EphemeralState V1: %v", err) 188 } 189 return &EphemeralState{ 190 ConnInfo: connInfo.(map[string]string), 191 }, nil 192 }