fix strict remote.State lineage check

We can't check lineage in the remote state instance, because we may need
to overwrite a state with a new lineage. Whil it's tempting to add an
optional interface for this, like OverwriteState(), optional interfaces
are never _really_ optional, and will have to be implemented by any
wrapper types as well.

Another solution may be to add a State.Supersedes field to indicate that
we intend to replace an existing state, but that may not be worth the
extra check either.
This commit is contained in:
James Bardin 2017-08-01 17:51:35 -04:00
parent c3e943bed2
commit 32ae05c342
1 changed files with 5 additions and 2 deletions

View File

@ -2,7 +2,7 @@ package remote
import (
"bytes"
"fmt"
"log"
"sync"
"github.com/hashicorp/terraform/state"
@ -35,7 +35,10 @@ func (s *State) WriteState(state *terraform.State) error {
defer s.mu.Unlock()
if s.readState != nil && !state.SameLineage(s.readState) {
return fmt.Errorf("incompatible state lineage; given %s but want %s", state.Lineage, s.readState.Lineage)
// This can't error here, because we need to be able to overwrite the
// state in some cases, like `state push -force` or `workspace new
// -state=`
log.Printf("[WARN] incompatible state lineage; given %s but want %s", state.Lineage, s.readState.Lineage)
}
// We create a deep copy of the state here, because the caller also has