mirror of
https://github.com/opentofu/opentofu.git
synced 2024-12-28 01:41:48 -06:00
331cb07a05
For historical reasons sometimes we have nil state in situations where we'd still like to persist state snapshots to a store. To make life easier for those callers, we'll substitute an empty state if we are given a nil one, thus allowing us to still generate a valid serialization that will load back in as an empty state.
63 lines
1.9 KiB
Go
63 lines
1.9 KiB
Go
package statefile
|
|
|
|
import (
|
|
version "github.com/hashicorp/go-version"
|
|
|
|
"github.com/hashicorp/terraform/states"
|
|
tfversion "github.com/hashicorp/terraform/version"
|
|
)
|
|
|
|
// File is the in-memory representation of a state file. It includes the state
|
|
// itself along with various metadata used to track changing state files for
|
|
// the same configuration over time.
|
|
type File struct {
|
|
// TerraformVersion is the version of Terraform that wrote this state file.
|
|
TerraformVersion *version.Version
|
|
|
|
// Serial is incremented on any operation that modifies
|
|
// the State file. It is used to detect potentially conflicting
|
|
// updates.
|
|
Serial uint64
|
|
|
|
// Lineage is set when a new, blank state file is created and then
|
|
// never updated. This allows us to determine whether the serials
|
|
// of two states can be meaningfully compared.
|
|
// Apart from the guarantee that collisions between two lineages
|
|
// are very unlikely, this value is opaque and external callers
|
|
// should only compare lineage strings byte-for-byte for equality.
|
|
Lineage string
|
|
|
|
// State is the actual state represented by this file.
|
|
State *states.State
|
|
}
|
|
|
|
func New(state *states.State, lineage string, serial uint64) *File {
|
|
// To make life easier on callers, we'll accept a nil state here and just
|
|
// allocate an empty one, which is required for this file to be successfully
|
|
// written out.
|
|
if state == nil {
|
|
state = states.NewState()
|
|
}
|
|
|
|
return &File{
|
|
TerraformVersion: tfversion.SemVer,
|
|
State: state,
|
|
Lineage: lineage,
|
|
Serial: serial,
|
|
}
|
|
}
|
|
|
|
// DeepCopy is a convenience method to create a new File object whose state
|
|
// is a deep copy of the receiver's, as implemented by states.State.DeepCopy.
|
|
func (f *File) DeepCopy() *File {
|
|
if f == nil {
|
|
return nil
|
|
}
|
|
return &File{
|
|
TerraformVersion: f.TerraformVersion,
|
|
Serial: f.Serial,
|
|
Lineage: f.Lineage,
|
|
State: f.State.DeepCopy(),
|
|
}
|
|
}
|