mirror of
https://github.com/opentofu/opentofu.git
synced 2025-02-14 01:13:59 -06:00
terraform: Adding deepcopy() to new state
This commit is contained in:
parent
6373b2b90b
commit
bb26c79421
@ -23,6 +23,18 @@ type State struct {
|
|||||||
Modules []*ModuleState `json:"modules"`
|
Modules []*ModuleState `json:"modules"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *State) deepcopy() *State {
|
||||||
|
n := &State{
|
||||||
|
Version: n.Version,
|
||||||
|
Serial: n.Serial,
|
||||||
|
Modules: make([]*ModuleState, 0, len(s.Modules)),
|
||||||
|
}
|
||||||
|
for _, mod := range s.Modules {
|
||||||
|
n.Modules = append(n.Modules, mod.deepcopy())
|
||||||
|
}
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
|
||||||
// ModuleState is used to track all the state relevant to a single
|
// ModuleState is used to track all the state relevant to a single
|
||||||
// module. Previous to Terraform 0.3, all state belonged to the "root"
|
// module. Previous to Terraform 0.3, all state belonged to the "root"
|
||||||
// module.
|
// module.
|
||||||
@ -43,6 +55,22 @@ type ModuleState struct {
|
|||||||
Resources map[string]*ResourceState `json:"resources"`
|
Resources map[string]*ResourceState `json:"resources"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *ModuleState) deepcopy() *ModuleState {
|
||||||
|
n := &ModuleState{
|
||||||
|
Path: make([]string, len(m.Path)),
|
||||||
|
Outputs: make(map[string]string, len(m.Outputs)),
|
||||||
|
Resources: make(map[string]*ResourceState, len(m.Resources)),
|
||||||
|
}
|
||||||
|
copy(n.Path, m.Path)
|
||||||
|
for k, v := range m.Outputs {
|
||||||
|
n.Outputs[k] = v
|
||||||
|
}
|
||||||
|
for k, v := range m.Resources {
|
||||||
|
n.Resources[k] = v.deepcopy()
|
||||||
|
}
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
|
||||||
// ResourceState holds the state of a resource that is used so that
|
// ResourceState holds the state of a resource that is used so that
|
||||||
// a provider can find and manage an existing resource as well as for
|
// a provider can find and manage an existing resource as well as for
|
||||||
// storing attributes that are used to populate variables of child
|
// storing attributes that are used to populate variables of child
|
||||||
@ -85,6 +113,19 @@ type ResourceState struct {
|
|||||||
Instances []*InstanceState `json:"instances"`
|
Instances []*InstanceState `json:"instances"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (r *ResourceState) deepcopy() *ResourceState {
|
||||||
|
n := &ResourceState{
|
||||||
|
Type: r.Type,
|
||||||
|
Dependencies: make([]string, len(r.Dependencies)),
|
||||||
|
Instances: make([]*Instances, 0, len(r.Instances)),
|
||||||
|
}
|
||||||
|
copy(n.Dependencies, r.Dependencies)
|
||||||
|
for _, inst := range r.Instances {
|
||||||
|
n.Instances = append(n.Instances, inst.deepcopy())
|
||||||
|
}
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
|
||||||
// InstanceState is used to track the unique state information belonging
|
// InstanceState is used to track the unique state information belonging
|
||||||
// to a given instance.
|
// to a given instance.
|
||||||
type InstanceState struct {
|
type InstanceState struct {
|
||||||
@ -108,6 +149,19 @@ type InstanceState struct {
|
|||||||
Ephemeral EphemeralState `json:"-"`
|
Ephemeral EphemeralState `json:"-"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (i *InstanceState) deepcopy() *InstanceState {
|
||||||
|
n := &InstanceState{
|
||||||
|
ID: i.ID,
|
||||||
|
Tainted: i.Tainted,
|
||||||
|
Attributes: make(map[string]string, len(i.Attributes)),
|
||||||
|
Ephemeral: *i.EphemeralState.deepcopy(),
|
||||||
|
}
|
||||||
|
for k, v := range i.Attributes {
|
||||||
|
n.Attributes[k] = v
|
||||||
|
}
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
|
||||||
// EphemeralState is used for transient state that is only kept in-memory
|
// EphemeralState is used for transient state that is only kept in-memory
|
||||||
type EphemeralState struct {
|
type EphemeralState struct {
|
||||||
// ConnInfo is used for the providers to export information which is
|
// ConnInfo is used for the providers to export information which is
|
||||||
@ -116,6 +170,16 @@ type EphemeralState struct {
|
|||||||
ConnInfo map[string]string `json:"-"`
|
ConnInfo map[string]string `json:"-"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (e *EphemeralState) deepcopy() *EphemeralState {
|
||||||
|
n := &EphemeralState{
|
||||||
|
ConnInfo: make(map[string]string, len(n.ConnInfo)),
|
||||||
|
}
|
||||||
|
for k, v := range e.ConnInfo {
|
||||||
|
n.ConnInfo[k] = v
|
||||||
|
}
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
|
||||||
// ReadState reads a state structure out of a reader in the format that
|
// ReadState reads a state structure out of a reader in the format that
|
||||||
// was written by WriteState.
|
// was written by WriteState.
|
||||||
func ReadState(src io.Reader) (*State, error) {
|
func ReadState(src io.Reader) (*State, error) {
|
||||||
|
Loading…
Reference in New Issue
Block a user