From eb517e1a39e61306d9b26cd27595cc23b90c93ba Mon Sep 17 00:00:00 2001 From: Wayne Werner Date: Wed, 6 Mar 2019 14:00:03 -0600 Subject: [PATCH 1/3] Swap '/' for '.' when matching --- salt/pillar/__init__.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/salt/pillar/__init__.py b/salt/pillar/__init__.py index 94dd9695ca1d..6fe2b5f49e21 100644 --- a/salt/pillar/__init__.py +++ b/salt/pillar/__init__.py @@ -774,7 +774,10 @@ def render_pstate(self, sls, saltenv, mods, defaults=None): key = None try: - matched_pstates += fnmatch.filter(self.avail[saltenv], sub_sls) + matched_pstates.extend(fnmatch.filter( + self.avail[saltenv], + sub_sls.replace('/', '.'), + )) except KeyError: errors.extend( ['No matching pillar environment for environment ' From 29c676d24b3ab5c6e600bb08258b10a37b64925a Mon Sep 17 00:00:00 2001 From: Wayne Werner Date: Fri, 8 Mar 2019 12:56:25 -0600 Subject: [PATCH 2/3] Ensure _closing exists This was raising an ignored exception because _closing was set later in __init__. Not sure if it must be the last line in __init__. --- salt/pillar/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/salt/pillar/__init__.py b/salt/pillar/__init__.py index 6fe2b5f49e21..4899ac31fb7a 100644 --- a/salt/pillar/__init__.py +++ b/salt/pillar/__init__.py @@ -257,7 +257,7 @@ def compile_pillar(self): return ret_pillar def destroy(self): - if self._closing: + if hasattr(self, '_closing') and self._closing: return self._closing = True From ee3115fa9434c99d0ad6ff4d545b1ad61d3eee29 Mon Sep 17 00:00:00 2001 From: Wayne Werner Date: Mon, 11 Mar 2019 15:11:55 -0500 Subject: [PATCH 3/3] Allow leading dots and / as pillar separators --- salt/pillar/__init__.py | 2 +- tests/unit/test_pillar.py | 33 ++++++++++++++++++++++++++++++--- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/salt/pillar/__init__.py b/salt/pillar/__init__.py index 4899ac31fb7a..38225cac4e62 100644 --- a/salt/pillar/__init__.py +++ b/salt/pillar/__init__.py @@ -776,7 +776,7 @@ def render_pstate(self, sls, saltenv, mods, defaults=None): try: matched_pstates.extend(fnmatch.filter( self.avail[saltenv], - sub_sls.replace('/', '.'), + sub_sls.lstrip('.').replace('/', '.'), )) except KeyError: errors.extend( diff --git a/tests/unit/test_pillar.py b/tests/unit/test_pillar.py index 41dd00e89a9b..64c77b186ad7 100644 --- a/tests/unit/test_pillar.py +++ b/tests/unit/test_pillar.py @@ -659,14 +659,21 @@ def test_include(self, tempdir): 'oscodename': 'raring', 'osfullname': 'Ubuntu', 'osrelease': '13.04', - 'kernel': 'Linux' + 'kernel': 'Linux', } sls_files = self._setup_test_include_sls(tempdir) fc_mock = MockFileclient( cache_file=sls_files['top']['dest'], get_state=sls_files, - list_states=['top', 'test.init', 'test.sub1', - 'test.sub2', 'test.sub_wildcard_1'], + list_states=[ + 'top', + 'test.init', + 'test.sub1', + 'test.sub2', + 'test.sub_wildcard_1', + 'test.sub_with_init_dot', + 'test.sub.with.slashes', + ], ) with patch.object(salt.fileclient, 'get_file_client', MagicMock(return_value=fc_mock)): @@ -677,6 +684,8 @@ def test_include(self, tempdir): self.assertEqual(compiled_pillar['foo_wildcard'], 'bar_wildcard') self.assertEqual(compiled_pillar['foo1'], 'bar1') self.assertEqual(compiled_pillar['foo2'], 'bar2') + self.assertEqual(compiled_pillar['sub_with_slashes'], 'sub_slashes_worked') + self.assertEqual(compiled_pillar['sub_init_dot'], 'sub_with_init_dot_worked') def _setup_test_include_sls(self, tempdir): top_file = tempfile.NamedTemporaryFile(dir=tempdir, delete=False) @@ -695,6 +704,8 @@ def _setup_test_include_sls(self, tempdir): include: - test.sub1 - test.sub_wildcard* + - .test.sub_with_init_dot + - test/sub/with/slashes ''') init_sls.flush() sub1_sls = tempfile.NamedTemporaryFile(dir=tempdir, delete=False) @@ -717,12 +728,28 @@ def _setup_test_include_sls(self, tempdir): ''') sub_wildcard_1_sls.flush() + sub_with_init_dot_sls = tempfile.NamedTemporaryFile(dir=tempdir, delete=False) + sub_with_init_dot_sls.write(b''' +sub_init_dot: + sub_with_init_dot_worked +''') + sub_with_init_dot_sls.flush() + + sub_with_slashes_sls = tempfile.NamedTemporaryFile(dir=tempdir, delete=False) + sub_with_slashes_sls.write(b''' +sub_with_slashes: + sub_slashes_worked +''') + sub_with_slashes_sls.flush() + return { 'top': {'path': '', 'dest': top_file.name}, 'test': {'path': '', 'dest': init_sls.name}, 'test.sub1': {'path': '', 'dest': sub1_sls.name}, 'test.sub2': {'path': '', 'dest': sub2_sls.name}, 'test.sub_wildcard_1': {'path': '', 'dest': sub_wildcard_1_sls.name}, + 'test.sub_with_init_dot': {'path': '', 'dest': sub_with_init_dot_sls.name}, + 'test.sub.with.slashes': {'path': '', 'dest': sub_with_slashes_sls.name}, }