From 24f6d3fe984e28219921169d4b70787b9178effd Mon Sep 17 00:00:00 2001 From: James Bardin Date: Fri, 1 Jul 2016 18:37:38 -0400 Subject: [PATCH] Return an error when there's no remote state When refreshing remote state, indicate when no state file was found with an ErrRemoteStateNotFound error. This prevents us from inadvertantly getting a nil state into a terraform.State where we assume there's always a root module. --- state/remote/remote_test.go | 18 ++++++++++++++++++ state/remote/state.go | 16 ++++++++++------ 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/state/remote/remote_test.go b/state/remote/remote_test.go index 6db877fbd..16afccdf1 100644 --- a/state/remote/remote_test.go +++ b/state/remote/remote_test.go @@ -41,3 +41,21 @@ func testClient(t *testing.T, c Client) { t.Fatalf("bad: %#v", p) } } + +func TestRemoteClient_noPayload(t *testing.T) { + s := &State{ + Client: nilClient{}, + } + if err := s.RefreshState(); err != ErrRemoteStateNotFound { + t.Fatal("expected ErrRemoteStateNotFound, got", err) + } +} + +// nilClient returns nil for everything +type nilClient struct{} + +func (nilClient) Get() (*Payload, error) { return nil, nil } + +func (c nilClient) Put([]byte) error { return nil } + +func (c nilClient) Delete() error { return nil } diff --git a/state/remote/state.go b/state/remote/state.go index e679b5d73..5f45129d6 100644 --- a/state/remote/state.go +++ b/state/remote/state.go @@ -2,10 +2,13 @@ package remote import ( "bytes" + "errors" "github.com/hashicorp/terraform/terraform" ) +var ErrRemoteStateNotFound = errors.New("no remote state found") + // State implements the State interfaces in the state package to handle // reading and writing the remote state. This State on its own does no // local caching so every persist will go to the remote storage and local @@ -34,12 +37,13 @@ func (s *State) RefreshState() error { return err } - var state *terraform.State - if payload != nil { - state, err = terraform.ReadState(bytes.NewReader(payload.Data)) - if err != nil { - return err - } + if payload == nil { + return ErrRemoteStateNotFound + } + + state, err := terraform.ReadState(bytes.NewReader(payload.Data)) + if err != nil { + return err } s.state = state