github.com/rstandt/terraform@v0.12.32-0.20230710220336-b1063613405c/states/statemgr/helper.go (about) 1 package statemgr 2 3 // The functions in this file are helper wrappers for common sequences of 4 // operations done against full state managers. 5 6 import ( 7 "github.com/hashicorp/terraform/states" 8 "github.com/hashicorp/terraform/states/statefile" 9 "github.com/hashicorp/terraform/version" 10 ) 11 12 // NewStateFile creates a new statefile.File object, with a newly-minted 13 // lineage identifier and serial 0, and returns a pointer to it. 14 func NewStateFile() *statefile.File { 15 return &statefile.File{ 16 Lineage: NewLineage(), 17 TerraformVersion: version.SemVer, 18 State: states.NewState(), 19 } 20 } 21 22 // RefreshAndRead refreshes the persistent snapshot in the given state manager 23 // and then returns it. 24 // 25 // This is a wrapper around calling RefreshState and then State on the given 26 // manager. 27 func RefreshAndRead(mgr Storage) (*states.State, error) { 28 err := mgr.RefreshState() 29 if err != nil { 30 return nil, err 31 } 32 return mgr.State(), nil 33 } 34 35 // WriteAndPersist writes a snapshot of the given state to the given state 36 // manager's transient store and then immediately persists it. 37 // 38 // The caller must ensure that the given state is not concurrently modified 39 // while this function is running, but it is safe to modify it after this 40 // function has returned. 41 // 42 // If an error is returned, it is undefined whether the state has been saved 43 // to the transient store or not, and so the only safe response is to bail 44 // out quickly with a user-facing error. In situations where more control 45 // is required, call WriteState and PersistState on the state manager directly 46 // and handle their errors. 47 func WriteAndPersist(mgr Storage, state *states.State) error { 48 err := mgr.WriteState(state) 49 if err != nil { 50 return err 51 } 52 return mgr.PersistState() 53 }