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  }