terraform/state/backup.go

79 lines
1.4 KiB
Go
Raw Normal View History

2015-02-22 02:34:58 +01:00
package state
import (
"github.com/hashicorp/terraform/terraform"
)
// BackupState wraps a State that backs up the state on the first time that
// a WriteState or PersistState is called.
//
// If Path exists, it will be overwritten.
type BackupState struct {
Real State
Path string
done bool
}
func (s *BackupState) State() *terraform.State {
return s.Real.State()
}
func (s *BackupState) RefreshState() error {
return s.Real.RefreshState()
}
func (s *BackupState) WriteState(state *terraform.State) error {
if !s.done {
if err := s.backup(); err != nil {
return err
}
}
return s.Real.WriteState(state)
}
func (s *BackupState) PersistState() error {
if !s.done {
if err := s.backup(); err != nil {
return err
}
}
return s.Real.PersistState()
}
// all states get wrapped by BackupState, so it has to be a Locker
func (s *BackupState) Lock(reason string) error {
if s, ok := s.Real.(Locker); ok {
return s.Lock(reason)
}
return nil
}
func (s *BackupState) Unlock() error {
if s, ok := s.Real.(Locker); ok {
return s.Unlock()
}
return nil
}
2015-02-22 02:34:58 +01:00
func (s *BackupState) backup() error {
state := s.Real.State()
if state == nil {
if err := s.Real.RefreshState(); err != nil {
return err
}
state = s.Real.State()
}
ls := &LocalState{Path: s.Path}
if err := ls.WriteState(state); err != nil {
return err
}
s.done = true
return nil
}