opentofu/states/statefile/file.go
Martin Atkins 331cb07a05 states/statefile: Tolerate nil state in statefile.New
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.
2018-10-16 19:14:11 -07:00

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(),
}
}