diff --git a/salt/payload.py b/salt/payload.py index 44b23c8a01b3..e6b95f2a51b7 100644 --- a/salt/payload.py +++ b/salt/payload.py @@ -13,6 +13,7 @@ import salt.log import salt.crypt from salt.exceptions import SaltReqTimeoutError +from salt.utils.odict import OrderedDict import six # Import third party libs @@ -92,7 +93,11 @@ def loads(self, msg): Run the correct loads serialization format ''' try: - return msgpack.loads(msg, use_list=True) + # msgpack >= 0.2.0 supports object_pairs_hook parameter to return an OrderedDict + if msgpack.version >= (0, 2, 0): + return msgpack.loads(msg, use_list=True, object_pairs_hook=OrderedDict) + else: + return msgpack.loads(msg, use_list=True) except Exception as exc: log.critical('Could not deserialize msgpack message: {0}' 'This often happens when trying to read a file not in binary mode.' diff --git a/salt/pillar/__init__.py b/salt/pillar/__init__.py index 4bc5e8c4a896..e5f353a66d26 100644 --- a/salt/pillar/__init__.py +++ b/salt/pillar/__init__.py @@ -441,7 +441,7 @@ def render_pillar(self, matches): Extract the sls pillar files from the matches and render them into the pillar ''' - pillar = {} + pillar = OrderedDict() errors = [] for saltenv, pstates in matches.items(): mods = set() @@ -578,7 +578,7 @@ def compile_pillar(self, ext=True, pillar_dirs=None): top, terrors = self.get_top() if ext: if self.opts.get('ext_pillar_first', False): - self.opts['pillar'] = self.ext_pillar({}, pillar_dirs) + self.opts['pillar'] = self.ext_pillar(OrderedDict(), pillar_dirs) matches = self.top_matches(top) pillar, errors = self.render_pillar(matches) pillar = self.merge_sources(pillar, self.opts['pillar']) diff --git a/salt/utils/dictupdate.py b/salt/utils/dictupdate.py index 4108de20fc4e..428da58a0884 100644 --- a/salt/utils/dictupdate.py +++ b/salt/utils/dictupdate.py @@ -9,11 +9,13 @@ import collections import six +# Import salt libs +from salt.utils.odict import OrderedDict def update(dest, upd): for key, val in six.iteritems(upd): if isinstance(val, collections.Mapping): - ret = update(dest.get(key, {}), val) + ret = update(dest.get(key, OrderedDict()), val) dest[key] = ret else: dest[key] = upd[key]