mirror of
https://github.com/opentofu/opentofu.git
synced 2024-12-28 18:01:01 -06:00
f40800b3a4
This is part of a general effort to move all of Terraform's non-library package surface under internal in order to reinforce that these are for internal use within Terraform only. If you were previously importing packages under this prefix into an external codebase, you could pin to an earlier release tag as an interim solution until you've make a plan to achieve the same functionality some other way.
173 lines
3.9 KiB
Go
173 lines
3.9 KiB
Go
package statefile
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
|
|
"github.com/mitchellh/copystructure"
|
|
)
|
|
|
|
// upgradeStateV1ToV2 is used to upgrade a V1 state representation
|
|
// into a V2 state representation
|
|
func upgradeStateV1ToV2(old *stateV1) (*stateV2, error) {
|
|
log.Printf("[TRACE] statefile.Read: upgrading format from v1 to v2")
|
|
if old == nil {
|
|
return nil, nil
|
|
}
|
|
|
|
remote, err := old.Remote.upgradeToV2()
|
|
if err != nil {
|
|
return nil, fmt.Errorf("Error upgrading State V1: %v", err)
|
|
}
|
|
|
|
modules := make([]*moduleStateV2, len(old.Modules))
|
|
for i, module := range old.Modules {
|
|
upgraded, err := module.upgradeToV2()
|
|
if err != nil {
|
|
return nil, fmt.Errorf("Error upgrading State V1: %v", err)
|
|
}
|
|
modules[i] = upgraded
|
|
}
|
|
if len(modules) == 0 {
|
|
modules = nil
|
|
}
|
|
|
|
newState := &stateV2{
|
|
Version: 2,
|
|
Serial: old.Serial,
|
|
Remote: remote,
|
|
Modules: modules,
|
|
}
|
|
|
|
return newState, nil
|
|
}
|
|
|
|
func (old *remoteStateV1) upgradeToV2() (*remoteStateV2, error) {
|
|
if old == nil {
|
|
return nil, nil
|
|
}
|
|
|
|
config, err := copystructure.Copy(old.Config)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("Error upgrading RemoteState V1: %v", err)
|
|
}
|
|
|
|
return &remoteStateV2{
|
|
Type: old.Type,
|
|
Config: config.(map[string]string),
|
|
}, nil
|
|
}
|
|
|
|
func (old *moduleStateV1) upgradeToV2() (*moduleStateV2, error) {
|
|
if old == nil {
|
|
return nil, nil
|
|
}
|
|
|
|
pathRaw, err := copystructure.Copy(old.Path)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("Error upgrading ModuleState V1: %v", err)
|
|
}
|
|
path, ok := pathRaw.([]string)
|
|
if !ok {
|
|
return nil, fmt.Errorf("Error upgrading ModuleState V1: path is not a list of strings")
|
|
}
|
|
if len(path) == 0 {
|
|
// We found some V1 states with a nil path. Assume root.
|
|
path = []string{"root"}
|
|
}
|
|
|
|
// Outputs needs upgrading to use the new structure
|
|
outputs := make(map[string]*outputStateV2)
|
|
for key, output := range old.Outputs {
|
|
outputs[key] = &outputStateV2{
|
|
Type: "string",
|
|
Value: output,
|
|
Sensitive: false,
|
|
}
|
|
}
|
|
|
|
resources := make(map[string]*resourceStateV2)
|
|
for key, oldResource := range old.Resources {
|
|
upgraded, err := oldResource.upgradeToV2()
|
|
if err != nil {
|
|
return nil, fmt.Errorf("Error upgrading ModuleState V1: %v", err)
|
|
}
|
|
resources[key] = upgraded
|
|
}
|
|
|
|
dependencies, err := copystructure.Copy(old.Dependencies)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("Error upgrading ModuleState V1: %v", err)
|
|
}
|
|
|
|
return &moduleStateV2{
|
|
Path: path,
|
|
Outputs: outputs,
|
|
Resources: resources,
|
|
Dependencies: dependencies.([]string),
|
|
}, nil
|
|
}
|
|
|
|
func (old *resourceStateV1) upgradeToV2() (*resourceStateV2, error) {
|
|
if old == nil {
|
|
return nil, nil
|
|
}
|
|
|
|
dependencies, err := copystructure.Copy(old.Dependencies)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("Error upgrading ResourceState V1: %v", err)
|
|
}
|
|
|
|
primary, err := old.Primary.upgradeToV2()
|
|
if err != nil {
|
|
return nil, fmt.Errorf("Error upgrading ResourceState V1: %v", err)
|
|
}
|
|
|
|
deposed := make([]*instanceStateV2, len(old.Deposed))
|
|
for i, v := range old.Deposed {
|
|
upgraded, err := v.upgradeToV2()
|
|
if err != nil {
|
|
return nil, fmt.Errorf("Error upgrading ResourceState V1: %v", err)
|
|
}
|
|
deposed[i] = upgraded
|
|
}
|
|
if len(deposed) == 0 {
|
|
deposed = nil
|
|
}
|
|
|
|
return &resourceStateV2{
|
|
Type: old.Type,
|
|
Dependencies: dependencies.([]string),
|
|
Primary: primary,
|
|
Deposed: deposed,
|
|
Provider: old.Provider,
|
|
}, nil
|
|
}
|
|
|
|
func (old *instanceStateV1) upgradeToV2() (*instanceStateV2, error) {
|
|
if old == nil {
|
|
return nil, nil
|
|
}
|
|
|
|
attributes, err := copystructure.Copy(old.Attributes)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("Error upgrading InstanceState V1: %v", err)
|
|
}
|
|
|
|
meta, err := copystructure.Copy(old.Meta)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("Error upgrading InstanceState V1: %v", err)
|
|
}
|
|
|
|
newMeta := make(map[string]interface{})
|
|
for k, v := range meta.(map[string]string) {
|
|
newMeta[k] = v
|
|
}
|
|
|
|
return &instanceStateV2{
|
|
ID: old.ID,
|
|
Attributes: attributes.(map[string]string),
|
|
Meta: newMeta,
|
|
}, nil
|
|
}
|