diff --git a/changelog/64280.fixed.md b/changelog/64280.fixed.md new file mode 100644 index 0000000000..5a9b905dd0 --- /dev/null +++ b/changelog/64280.fixed.md @@ -0,0 +1 @@ +Fixed file client private attribute reference on `SaltMakoTemplateLookup` diff --git a/salt/utils/mako.py b/salt/utils/mako.py index 037d5d86de..4397ae8cc7 100644 --- a/salt/utils/mako.py +++ b/salt/utils/mako.py @@ -99,8 +99,10 @@ def cache_file(self, fpath): ) def destroy(self): - if self.client: + if self._file_client: + file_client = self._file_client + self._file_client = None try: - self.client.destroy() + file_client.destroy() except AttributeError: pass diff --git a/tests/pytests/unit/utils/test_mako.py b/tests/pytests/unit/utils/test_mako.py new file mode 100644 index 0000000000..952cf44652 --- /dev/null +++ b/tests/pytests/unit/utils/test_mako.py @@ -0,0 +1,28 @@ +import pytest + +from tests.support.mock import Mock, call, patch + +pytest.importorskip("mako") + +# This import needs to be after the above importorskip so that no ImportError +# is raised if Mako is not installed +from salt.utils.mako import SaltMakoTemplateLookup + + +def test_mako_template_lookup(minion_opts): + """ + The shudown method can be called without raising an exception when the + file_client does not have a destroy method + """ + # Test SaltCacheLoader creating and destroying the file client created + file_client = Mock() + with patch("salt.fileclient.get_file_client", return_value=file_client): + loader = SaltMakoTemplateLookup(minion_opts) + assert loader._file_client is None + assert loader.file_client() is file_client + assert loader._file_client is file_client + try: + loader.destroy() + except AttributeError: + pytest.fail("Regression when calling SaltMakoTemplateLookup.destroy()") + assert file_client.mock_calls == [call.destroy()]