From 9d1cc160b0cdcbea458317de44cd992d506de258 Mon Sep 17 00:00:00 2001 From: Guillaume Abrioux Date: Fri, 13 Oct 2017 15:16:18 +0200 Subject: [PATCH] ceph-defaults: fix handlers that are always triggered MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Handlers are always triggered in ceph-ansible because ceph.conf file is generated with a randomly order for the different keys/values pairs in sections. In python, a dict is not sorted. It means in our case each time we try to generate the ceph.conf file it will be rendered with a random order since the mecanism behind consist of rendering a file from a python dict with keys/values. Therefore, as a quick workaround, forcing this dict to be sorted before rendering the configuration file will ensure that it will be rendered always the same way. Signed-off-by: Guillaume Abrioux (cherry picked from commit ec042219e64a321fa67fce0384af76eeb238c645) Signed-off-by: Sébastien Han --- plugins/actions/_v1_config_template.py | 6 +++--- plugins/actions/_v2_config_template.py | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/plugins/actions/_v1_config_template.py b/plugins/actions/_v1_config_template.py index 579c7f89b..95de13ef1 100644 --- a/plugins/actions/_v1_config_template.py +++ b/plugins/actions/_v1_config_template.py @@ -26,7 +26,7 @@ from ansible import errors from ansible.runner.return_data import ReturnData from ansible import utils from ansible.utils import template - +from collections import OrderedDict CONFIG_TYPES = { 'ini': 'return_config_overrides_ini', @@ -145,14 +145,14 @@ class ConfigTemplateParser(ConfigParser.RawConfigParser): def write(self, fp): if self._defaults: fp.write("[%s]\n" % 'DEFAULT') - for key, value in self._defaults.items(): + for key, value in OrderedDict(sorted(self._defaults.items())).items(): self._write_check(fp, key=key, value=value) else: fp.write("\n") for section in self._sections: fp.write("[%s]\n" % section) - for key, value in self._sections[section].items(): + for key, value in OrderedDict(sorted(self._sections[section].items())).items(): self._write_check(fp, key=key, value=value, section=True) else: fp.write("\n") diff --git a/plugins/actions/_v2_config_template.py b/plugins/actions/_v2_config_template.py index a9bc2f580..787cd0f9f 100644 --- a/plugins/actions/_v2_config_template.py +++ b/plugins/actions/_v2_config_template.py @@ -37,7 +37,7 @@ from ansible.plugins.action import ActionBase from ansible.utils.unicode import to_bytes, to_unicode from ansible import constants as C from ansible import errors - +from collections import OrderedDict CONFIG_TYPES = { 'ini': 'return_config_overrides_ini', @@ -173,14 +173,14 @@ class ConfigTemplateParser(ConfigParser.RawConfigParser): def write(self, fp): if self._defaults: fp.write("[%s]\n" % 'DEFAULT') - for key, value in self._defaults.items(): + for key, value in OrderedDict(sorted(self._defaults.items())).items(): self._write_check(fp, key=key, value=value) else: fp.write("\n") for section in self._sections: fp.write("[%s]\n" % section) - for key, value in self._sections[section].items(): + for key, value in OrderedDict(sorted(self._sections[section].items())).items(): self._write_check(fp, key=key, value=value, section=True) else: fp.write("\n") -- 2.39.5