Merge pull request #1316 from hashicorp/b-empty-instancestate-state-migrate-crash
providers/aws: handle empty instancestate in state migration
This commit is contained in:
commit
f2968b045c
|
@ -24,7 +24,13 @@ func resourceAwsInstanceMigrateState(
|
||||||
}
|
}
|
||||||
|
|
||||||
func migrateStateV0toV1(is *terraform.InstanceState) (*terraform.InstanceState, error) {
|
func migrateStateV0toV1(is *terraform.InstanceState) (*terraform.InstanceState, error) {
|
||||||
|
if is.Empty() {
|
||||||
|
log.Println("[DEBUG] Empty InstanceState; nothing to migrate.")
|
||||||
|
return is, nil
|
||||||
|
}
|
||||||
|
|
||||||
log.Printf("[DEBUG] Attributes before migration: %#v", is.Attributes)
|
log.Printf("[DEBUG] Attributes before migration: %#v", is.Attributes)
|
||||||
|
|
||||||
// Delete old count
|
// Delete old count
|
||||||
delete(is.Attributes, "block_device.#")
|
delete(is.Attributes, "block_device.#")
|
||||||
|
|
||||||
|
|
|
@ -115,6 +115,7 @@ func TestAWSInstanceMigrateState(t *testing.T) {
|
||||||
|
|
||||||
for tn, tc := range cases {
|
for tn, tc := range cases {
|
||||||
is := &terraform.InstanceState{
|
is := &terraform.InstanceState{
|
||||||
|
ID: "i-abc123",
|
||||||
Attributes: tc.Attributes,
|
Attributes: tc.Attributes,
|
||||||
}
|
}
|
||||||
is, err := resourceAwsInstanceMigrateState(
|
is, err := resourceAwsInstanceMigrateState(
|
||||||
|
@ -133,3 +134,26 @@ func TestAWSInstanceMigrateState(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestAWSInstanceMigrateState_empty(t *testing.T) {
|
||||||
|
var is *terraform.InstanceState
|
||||||
|
var meta interface{}
|
||||||
|
|
||||||
|
// should handle nil
|
||||||
|
is, err := resourceAwsInstanceMigrateState(0, is, meta)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("err: %#v", err)
|
||||||
|
}
|
||||||
|
if is != nil {
|
||||||
|
t.Fatalf("expected nil instancestate, got: %#v", is)
|
||||||
|
}
|
||||||
|
|
||||||
|
// should handle non-nil but empty
|
||||||
|
is = &terraform.InstanceState{}
|
||||||
|
is, err = resourceAwsInstanceMigrateState(0, is, meta)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("err: %#v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -889,6 +889,10 @@ func (i *InstanceState) deepcopy() *InstanceState {
|
||||||
return n
|
return n
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *InstanceState) Empty() bool {
|
||||||
|
return s == nil || s.ID == ""
|
||||||
|
}
|
||||||
|
|
||||||
func (s *InstanceState) Equal(other *InstanceState) bool {
|
func (s *InstanceState) Equal(other *InstanceState) bool {
|
||||||
// Short circuit some nil checks
|
// Short circuit some nil checks
|
||||||
if s == nil || other == nil {
|
if s == nil || other == nil {
|
||||||
|
|
|
@ -366,6 +366,34 @@ func TestResourceStateTaint(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestInstanceStateEmpty(t *testing.T) {
|
||||||
|
cases := map[string]struct {
|
||||||
|
In *InstanceState
|
||||||
|
Result bool
|
||||||
|
}{
|
||||||
|
"nil is empty": {
|
||||||
|
nil,
|
||||||
|
true,
|
||||||
|
},
|
||||||
|
"non-nil but without ID is empty": {
|
||||||
|
&InstanceState{},
|
||||||
|
true,
|
||||||
|
},
|
||||||
|
"with ID is not empty": {
|
||||||
|
&InstanceState{
|
||||||
|
ID: "i-abc123",
|
||||||
|
},
|
||||||
|
false,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for tn, tc := range cases {
|
||||||
|
if tc.In.Empty() != tc.Result {
|
||||||
|
t.Fatalf("%q expected %#v to be empty: %#v", tn, tc.In, tc.Result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestInstanceStateEqual(t *testing.T) {
|
func TestInstanceStateEqual(t *testing.T) {
|
||||||
cases := []struct {
|
cases := []struct {
|
||||||
Result bool
|
Result bool
|
||||||
|
|
Loading…
Reference in New Issue