diff --git a/changelog/55159.fixed b/changelog/55159.fixed new file mode 100644 index 00000000000..6ee1a783666 --- /dev/null +++ b/changelog/55159.fixed @@ -0,0 +1 @@ +Jinja renderer resolves wrong relative paths when importing subdirectories diff --git a/salt/utils/jinja.py b/salt/utils/jinja.py index 68a8646474f..3f27c2c7e14 100644 --- a/salt/utils/jinja.py +++ b/salt/utils/jinja.py @@ -148,7 +148,7 @@ def get_source(self, environment, template): 'Relative path "%s" cannot be resolved without an environment', template, ) - raise TemplateNotFound + raise TemplateNotFound(template) base_path = environment.globals["tpldir"] _template = os.path.normpath("/".join((base_path, _template))) if _template.split("/", 1)[0] == "..": diff --git a/salt/utils/templates.py b/salt/utils/templates.py index 0f705cfa377..4c59553bc85 100644 --- a/salt/utils/templates.py +++ b/salt/utils/templates.py @@ -494,9 +494,10 @@ def opt_jinja_env_helper(opts, optname): SLS_ENCODING, ) decoded_context[key] = salt.utils.data.decode(value) + + jinja_env.globals.update(decoded_context) try: template = jinja_env.from_string(tmplstr) - template.globals.update(decoded_context) output = template.render(**decoded_context) except jinja2.exceptions.UndefinedError as exc: trace = traceback.extract_tb(sys.exc_info()[2]) diff --git a/tests/unit/utils/test_jinja.py b/tests/unit/utils/test_jinja.py index fb67e17fa23..e23caf11aef 100644 --- a/tests/unit/utils/test_jinja.py +++ b/tests/unit/utils/test_jinja.py @@ -619,6 +619,22 @@ def test_render_with_undefined_variable_unicode(self): dict(opts=self.local_opts, saltenv="test", salt=self.local_salt), ) + def test_relative_include(self): + template = "{% include './hello_import' %}" + expected = "Hey world !a b !" + filename = os.path.join(self.template_dir, "hello_import") + with salt.utils.files.fopen(filename) as fp_: + out = render_jinja_tmpl( + template, + dict( + opts=self.local_opts, + saltenv="test", + salt=self.local_salt, + tpldir=self.template_dir, + ), + ) + self.assertEqual(out, expected) + class TestJinjaDefaultOptions(TestCase): @classmethod