2015-02-23 11:53:20 -06:00
|
|
|
package state
|
|
|
|
|
|
|
|
import (
|
2017-04-03 10:00:45 -05:00
|
|
|
"errors"
|
|
|
|
"sync"
|
|
|
|
"time"
|
|
|
|
|
2015-02-23 11:53:20 -06:00
|
|
|
"github.com/hashicorp/terraform/terraform"
|
|
|
|
)
|
|
|
|
|
|
|
|
// InmemState is an in-memory state storage.
|
|
|
|
type InmemState struct {
|
2017-05-25 10:05:48 -05:00
|
|
|
mu sync.Mutex
|
2015-02-23 11:53:20 -06:00
|
|
|
state *terraform.State
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *InmemState) State() *terraform.State {
|
2017-05-25 10:05:48 -05:00
|
|
|
s.mu.Lock()
|
|
|
|
defer s.mu.Unlock()
|
|
|
|
|
2015-02-23 23:36:35 -06:00
|
|
|
return s.state.DeepCopy()
|
2015-02-23 11:53:20 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
func (s *InmemState) RefreshState() error {
|
2017-05-25 10:05:48 -05:00
|
|
|
s.mu.Lock()
|
|
|
|
defer s.mu.Unlock()
|
|
|
|
|
2015-02-23 11:53:20 -06:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *InmemState) WriteState(state *terraform.State) error {
|
2017-05-25 10:05:48 -05:00
|
|
|
s.mu.Lock()
|
|
|
|
defer s.mu.Unlock()
|
|
|
|
|
2017-07-05 14:34:30 -05:00
|
|
|
state = state.DeepCopy()
|
|
|
|
|
|
|
|
if s.state != nil {
|
|
|
|
state.Serial = s.state.Serial
|
|
|
|
|
|
|
|
if !s.state.MarshalEqual(state) {
|
|
|
|
state.Serial++
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-02-23 11:53:20 -06:00
|
|
|
s.state = state
|
2017-07-05 14:34:30 -05:00
|
|
|
|
2015-02-23 11:53:20 -06:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *InmemState) PersistState() error {
|
|
|
|
return nil
|
|
|
|
}
|
2017-03-31 15:30:51 -05:00
|
|
|
|
|
|
|
func (s *InmemState) Lock(*LockInfo) (string, error) {
|
|
|
|
return "", nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *InmemState) Unlock(string) error {
|
|
|
|
return nil
|
|
|
|
}
|
2017-04-03 10:00:45 -05:00
|
|
|
|
|
|
|
// inmemLocker is an in-memory State implementation for testing locks.
|
|
|
|
type inmemLocker struct {
|
|
|
|
*InmemState
|
|
|
|
|
|
|
|
mu sync.Mutex
|
|
|
|
lockInfo *LockInfo
|
|
|
|
// count the calls to Lock
|
|
|
|
lockCounter int
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *inmemLocker) Lock(info *LockInfo) (string, error) {
|
|
|
|
s.mu.Lock()
|
|
|
|
defer s.mu.Unlock()
|
|
|
|
s.lockCounter++
|
|
|
|
|
|
|
|
lockErr := &LockError{
|
|
|
|
Info: &LockInfo{},
|
|
|
|
}
|
|
|
|
|
|
|
|
if s.lockInfo != nil {
|
|
|
|
lockErr.Err = errors.New("state locked")
|
|
|
|
*lockErr.Info = *s.lockInfo
|
|
|
|
return "", lockErr
|
|
|
|
}
|
|
|
|
|
|
|
|
info.Created = time.Now().UTC()
|
|
|
|
s.lockInfo = info
|
|
|
|
return s.lockInfo.ID, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *inmemLocker) Unlock(id string) error {
|
|
|
|
s.mu.Lock()
|
|
|
|
defer s.mu.Unlock()
|
|
|
|
|
|
|
|
lockErr := &LockError{
|
|
|
|
Info: &LockInfo{},
|
|
|
|
}
|
|
|
|
|
|
|
|
if id != s.lockInfo.ID {
|
|
|
|
lockErr.Err = errors.New("invalid lock id")
|
|
|
|
*lockErr.Info = *s.lockInfo
|
|
|
|
return lockErr
|
|
|
|
}
|
|
|
|
|
|
|
|
s.lockInfo = nil
|
|
|
|
return nil
|
|
|
|
}
|