terraform: add reason to diff mismatch error
Helps with debugging those pesky "diffs did not match" errors.
This commit is contained in:
parent
eeb46e4642
commit
d168cc1bd1
|
@ -357,18 +357,20 @@ func (d *InstanceDiff) RequiresNew() bool {
|
||||||
// we say "same", it is not necessarily exactly equal. Instead, it is
|
// we say "same", it is not necessarily exactly equal. Instead, it is
|
||||||
// just checking that the same attributes are changing, a destroy
|
// just checking that the same attributes are changing, a destroy
|
||||||
// isn't suddenly happening, etc.
|
// isn't suddenly happening, etc.
|
||||||
func (d *InstanceDiff) Same(d2 *InstanceDiff) bool {
|
func (d *InstanceDiff) Same(d2 *InstanceDiff) (bool, string) {
|
||||||
if d == nil && d2 == nil {
|
if d == nil && d2 == nil {
|
||||||
return true
|
return true, ""
|
||||||
} else if d == nil || d2 == nil {
|
} else if d == nil || d2 == nil {
|
||||||
return false
|
return false, "both nil"
|
||||||
}
|
}
|
||||||
|
|
||||||
if d.Destroy != d2.Destroy {
|
if d.Destroy != d2.Destroy {
|
||||||
return false
|
return false, fmt.Sprintf(
|
||||||
|
"diff: Destroy; old: %t, new: %t", d.Destroy, d2.Destroy)
|
||||||
}
|
}
|
||||||
if d.RequiresNew() != d2.RequiresNew() {
|
if d.RequiresNew() != d2.RequiresNew() {
|
||||||
return false
|
return false, fmt.Sprintf(
|
||||||
|
"diff RequiresNew; old: %t, new: %t", d.RequiresNew(), d2.RequiresNew())
|
||||||
}
|
}
|
||||||
|
|
||||||
// Go through the old diff and make sure the new diff has all the
|
// Go through the old diff and make sure the new diff has all the
|
||||||
|
@ -420,7 +422,7 @@ func (d *InstanceDiff) Same(d2 *InstanceDiff) bool {
|
||||||
}
|
}
|
||||||
re, err := regexp.Compile("^" + strings.Join(parts2, `\.`) + "$")
|
re, err := regexp.Compile("^" + strings.Join(parts2, `\.`) + "$")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false
|
return false, fmt.Sprintf("regexp failed to compile; err: %#v", err)
|
||||||
}
|
}
|
||||||
for k2, _ := range checkNew {
|
for k2, _ := range checkNew {
|
||||||
if re.MatchString(k2) {
|
if re.MatchString(k2) {
|
||||||
|
@ -452,7 +454,7 @@ func (d *InstanceDiff) Same(d2 *InstanceDiff) bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
if !ok {
|
if !ok {
|
||||||
return false
|
return false, fmt.Sprintf("attribute mismatch: %s", k)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -477,8 +479,13 @@ func (d *InstanceDiff) Same(d2 *InstanceDiff) bool {
|
||||||
|
|
||||||
// Check for leftover attributes
|
// Check for leftover attributes
|
||||||
if len(checkNew) > 0 {
|
if len(checkNew) > 0 {
|
||||||
return false
|
extras := make([]string, 0, len(checkNew))
|
||||||
|
for attr, _ := range checkNew {
|
||||||
|
extras = append(extras, attr)
|
||||||
|
}
|
||||||
|
return false,
|
||||||
|
fmt.Sprintf("extra attributes: %s", strings.Join(extras, ", "))
|
||||||
}
|
}
|
||||||
|
|
||||||
return true
|
return true, ""
|
||||||
}
|
}
|
||||||
|
|
|
@ -361,29 +361,34 @@ func TestInstanceDiffSame(t *testing.T) {
|
||||||
cases := []struct {
|
cases := []struct {
|
||||||
One, Two *InstanceDiff
|
One, Two *InstanceDiff
|
||||||
Same bool
|
Same bool
|
||||||
|
Reason string
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
&InstanceDiff{},
|
&InstanceDiff{},
|
||||||
&InstanceDiff{},
|
&InstanceDiff{},
|
||||||
true,
|
true,
|
||||||
|
"",
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
nil,
|
nil,
|
||||||
nil,
|
nil,
|
||||||
true,
|
true,
|
||||||
|
"",
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
&InstanceDiff{Destroy: false},
|
&InstanceDiff{Destroy: false},
|
||||||
&InstanceDiff{Destroy: true},
|
&InstanceDiff{Destroy: true},
|
||||||
false,
|
false,
|
||||||
|
"diff: Destroy; old: false, new: true",
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
&InstanceDiff{Destroy: true},
|
&InstanceDiff{Destroy: true},
|
||||||
&InstanceDiff{Destroy: true},
|
&InstanceDiff{Destroy: true},
|
||||||
true,
|
true,
|
||||||
|
"",
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@ -398,6 +403,7 @@ func TestInstanceDiffSame(t *testing.T) {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
true,
|
true,
|
||||||
|
"",
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@ -412,6 +418,7 @@ func TestInstanceDiffSame(t *testing.T) {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
false,
|
false,
|
||||||
|
"attribute mismatch: bar",
|
||||||
},
|
},
|
||||||
|
|
||||||
// Extra attributes
|
// Extra attributes
|
||||||
|
@ -428,6 +435,7 @@ func TestInstanceDiffSame(t *testing.T) {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
false,
|
false,
|
||||||
|
"extra attributes: bar",
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@ -442,6 +450,7 @@ func TestInstanceDiffSame(t *testing.T) {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
false,
|
false,
|
||||||
|
"diff RequiresNew; old: true, new: false",
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@ -463,6 +472,7 @@ func TestInstanceDiffSame(t *testing.T) {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
true,
|
true,
|
||||||
|
"",
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@ -491,6 +501,7 @@ func TestInstanceDiffSame(t *testing.T) {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
true,
|
true,
|
||||||
|
"",
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@ -506,14 +517,19 @@ func TestInstanceDiffSame(t *testing.T) {
|
||||||
Attributes: map[string]*ResourceAttrDiff{},
|
Attributes: map[string]*ResourceAttrDiff{},
|
||||||
},
|
},
|
||||||
true,
|
true,
|
||||||
|
"",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for i, tc := range cases {
|
for i, tc := range cases {
|
||||||
actual := tc.One.Same(tc.Two)
|
same, reason := tc.One.Same(tc.Two)
|
||||||
if actual != tc.Same {
|
if same != tc.Same {
|
||||||
t.Fatalf("%d:\n\n%#v\n\n%#v", i, tc.One, tc.Two)
|
t.Fatalf("%d:\n\n%#v\n\n%#v", i, tc.One, tc.Two)
|
||||||
}
|
}
|
||||||
|
if reason != tc.Reason {
|
||||||
|
t.Fatalf(
|
||||||
|
"%d: bad reason\n\nexpected: %#v\n\ngot: %#v", i, tc.Reason, reason)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -38,8 +38,9 @@ func (n *EvalCompareDiff) Eval(ctx EvalContext) (interface{}, error) {
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
if !one.Same(two) {
|
if same, reason := one.Same(two); !same {
|
||||||
log.Printf("[ERROR] %s: diff's didn't match", n.Info.Id)
|
log.Printf("[ERROR] %s: diffs didn't match", n.Info.Id)
|
||||||
|
log.Printf("[ERROR] %s: reason: %s", n.Info.Id, reason)
|
||||||
log.Printf("[ERROR] %s: diff one: %#v", n.Info.Id, one)
|
log.Printf("[ERROR] %s: diff one: %#v", n.Info.Id, one)
|
||||||
log.Printf("[ERROR] %s: diff two: %#v", n.Info.Id, two)
|
log.Printf("[ERROR] %s: diff two: %#v", n.Info.Id, two)
|
||||||
return nil, fmt.Errorf(
|
return nil, fmt.Errorf(
|
||||||
|
|
Loading…
Reference in New Issue