diff --git a/terraform/state.go b/terraform/state.go index a2f116651..640f6d353 100644 --- a/terraform/state.go +++ b/terraform/state.go @@ -538,6 +538,12 @@ func ReadState(src io.Reader) (*State, error) { // WriteState writes a state somewhere in a binary format. func WriteState(d *State, dst io.Writer) error { + // Ensure the version is set + d.Version = textStateVersion + + // Always increment the serial number + d.Serial++ + enc := json.NewEncoder(dst) if err := enc.Encode(d); err != nil { return fmt.Errorf("Failed to write state: %v", err) diff --git a/terraform/state_test.go b/terraform/state_test.go index 5be330400..097abde91 100644 --- a/terraform/state_test.go +++ b/terraform/state_test.go @@ -125,6 +125,7 @@ func TestReadUpgradeState(t *testing.T) { func TestReadWriteState(t *testing.T) { state := &State{ + Serial: 9, Modules: []*ModuleState{ &ModuleState{ Path: rootModulePath, @@ -154,6 +155,20 @@ func TestReadWriteState(t *testing.T) { t.Fatalf("err: %s", err) } + // Verify that the version and serial are set + if state.Version != textStateVersion { + t.Fatalf("bad version number: %d", state.Version) + } + + // Verify the serial number is incremented + if state.Serial != 10 { + t.Fatalf("bad serial: %d", state.Serial) + } + + // Remove the changes or the checksum will fail + state.Version = 0 + state.Serial = 9 + // Checksum after the write chksumAfter := checksumStruct(t, state) if chksumAfter != chksum { @@ -165,6 +180,10 @@ func TestReadWriteState(t *testing.T) { t.Fatalf("err: %s", err) } + // Verify the changes came through + state.Version = textStateVersion + state.Serial = 10 + // ReadState should not restore sensitive information! mod := state.RootModule() mod.Resources["foo"].Primary.Ephemeral = EphemeralState{}