113 lines
4.2 KiB
Diff
113 lines
4.2 KiB
Diff
|
From 1e8f506827bcf32bfe7e87763fa854a13729f2c8 Mon Sep 17 00:00:00 2001
|
||
|
From: Alberto Planas <aplanas@suse.com>
|
||
|
Date: Tue, 31 Aug 2021 11:20:49 +0200
|
||
|
Subject: [PATCH] templates: move the globals up to the Environment
|
||
|
(Jinja2 3.0.0) (#418)
|
||
|
|
||
|
* jinja: fix TemplateNotFound missing name
|
||
|
|
||
|
The TemplateNotFound exception requires a parameter, name, that is
|
||
|
missing in one of the calls.
|
||
|
|
||
|
File "/usr/lib/python3.8/site-packages/salt/utils/jinja.py", line 158, in get_source
|
||
|
raise TemplateNotFound
|
||
|
TypeError: __init__() missing 1 required positional argument: 'name'
|
||
|
|
||
|
This patch add the missing parameter in the raise call.
|
||
|
|
||
|
Signed-off-by: Alberto Planas <aplanas@suse.com>
|
||
|
|
||
|
* templates: move the globals up to the Environment
|
||
|
|
||
|
When creating a Jinja2 environment, we populate the globals in the
|
||
|
Template object that we generate from the environment. This cause a
|
||
|
problem when there is a {% include "./file.sls" %} in the template, as
|
||
|
cannot find in the environment globals information like the "tpldir",
|
||
|
for example, making the relative path to be unresolved.
|
||
|
|
||
|
Seems that in Jinja2 2.X this behaviour is not present, so attaching the
|
||
|
globals to the Template will make the include to work, but since Jinja2
|
||
|
3.0.0 this is not the case. Maybe related with the re-architecture from
|
||
|
https://github.com/pallets/jinja/issues/295
|
||
|
|
||
|
This patch populate the globals in the Environment level, making this
|
||
|
and other variables reachable by the Jinja templates.
|
||
|
|
||
|
Fix #55159
|
||
|
|
||
|
Signed-off-by: Alberto Planas <aplanas@suse.com>
|
||
|
---
|
||
|
changelog/55159.fixed | 1 +
|
||
|
salt/utils/jinja.py | 2 +-
|
||
|
salt/utils/templates.py | 2 +-
|
||
|
tests/unit/utils/test_jinja.py | 16 ++++++++++++++++
|
||
|
4 files changed, 19 insertions(+), 2 deletions(-)
|
||
|
create mode 100644 changelog/55159.fixed
|
||
|
|
||
|
diff --git a/changelog/55159.fixed b/changelog/55159.fixed
|
||
|
new file mode 100644
|
||
|
index 0000000000..6ee1a78366
|
||
|
--- /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 997d4b1697..e1ac4657f9 100644
|
||
|
--- a/salt/utils/jinja.py
|
||
|
+++ b/salt/utils/jinja.py
|
||
|
@@ -155,7 +155,7 @@ class SaltCacheLoader(BaseLoader):
|
||
|
'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 1fda960b2e..f369da5c9e 100644
|
||
|
--- a/salt/utils/templates.py
|
||
|
+++ b/salt/utils/templates.py
|
||
|
@@ -492,9 +492,9 @@ def render_jinja_tmpl(tmplstr, context, tmplpath=None):
|
||
|
)
|
||
|
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 807e901afa..0219512097 100644
|
||
|
--- a/tests/unit/utils/test_jinja.py
|
||
|
+++ b/tests/unit/utils/test_jinja.py
|
||
|
@@ -612,6 +612,22 @@ class TestGetTemplate(TestCase):
|
||
|
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
|
||
|
--
|
||
|
2.33.0
|
||
|
|
||
|
|