core: store deeply nested modules in a consistent order in the state

We were only comparing the last element of the module, which meant that
deeply nested modules with the same name but different ancestry had an
undefined sort order, which could cause inconsistencies in state
storage and potentially break remote state MD5 checksumming.
This commit is contained in:
Paul Hinze 2015-10-20 14:33:28 -05:00
parent 68e0133da0
commit 05c0998d2d
2 changed files with 19 additions and 3 deletions

View File

@ -1207,9 +1207,8 @@ func (s moduleStateSort) Less(i, j int) bool {
return len(a.Path) < len(b.Path)
}
// Otherwise, compare by last path element
idx := len(a.Path) - 1
return a.Path[idx] < b.Path[idx]
// Otherwise, compare lexically
return strings.Join(a.Path, ".") < strings.Join(b.Path, ".")
}
func (s moduleStateSort) Swap(i, j int) {

View File

@ -40,6 +40,23 @@ func TestStateAddModule(t *testing.T) {
[]string{"root", "foo", "bar"},
},
},
// Same last element, different middle element
{
[][]string{
[]string{"root", "foo", "bar"}, // This one should sort after...
[]string{"root", "foo"},
[]string{"root"},
[]string{"root", "bar", "bar"}, // ...this one.
[]string{"root", "bar"},
},
[][]string{
[]string{"root"},
[]string{"root", "bar"},
[]string{"root", "foo"},
[]string{"root", "bar", "bar"},
[]string{"root", "foo", "bar"},
},
},
}
for _, tc := range cases {