From 12a7885da7927f719c93bd3a8b7c9b7b0d6dae47 Mon Sep 17 00:00:00 2001 From: Ken Celenza Date: Wed, 27 Sep 2023 22:00:43 -0400 Subject: [PATCH] Moved jinja to be locally scoped, this was causing issues with Jinja filters based on import order (#622) --------- Co-authored-by: Jordan Facibene --- docs/admin/release_notes/version_1.6.md | 6 ++++++ .../nornir_plays/config_intended.py | 16 ++++++---------- nautobot_golden_config/utilities/helper.py | 15 +++++++++++++++ pyproject.toml | 2 +- 4 files changed, 28 insertions(+), 11 deletions(-) diff --git a/docs/admin/release_notes/version_1.6.md b/docs/admin/release_notes/version_1.6.md index 04659ea4..1e047824 100755 --- a/docs/admin/release_notes/version_1.6.md +++ b/docs/admin/release_notes/version_1.6.md @@ -5,6 +5,12 @@ - Add functionality to compliance result to provide a Remediation plan. - Supports Nautobot >=1.6.1,<2.0.0. +## v1.6.2 - 2023-09 + +### Fixed + +- [#621](https://github.com/nautobot/nautobot-plugin-golden-config/pull/621) - Moved jinja to be locally scoped, this was causing issues with Jinja filters based on import order. + ## v1.6.1 - 2023-09 ### Changed diff --git a/nautobot_golden_config/nornir_plays/config_intended.py b/nautobot_golden_config/nornir_plays/config_intended.py index 1a08d7c1..f3e211dd 100644 --- a/nautobot_golden_config/nornir_plays/config_intended.py +++ b/nautobot_golden_config/nornir_plays/config_intended.py @@ -4,8 +4,6 @@ import os from datetime import datetime -from django.template import engines -from jinja2.sandbox import SandboxedEnvironment from nautobot_plugin_nornir.constants import NORNIR_SETTINGS from nautobot_plugin_nornir.plugins.inventory.nautobot_orm import NautobotORMInventory from nautobot_plugin_nornir.utils import get_dispatcher @@ -18,10 +16,10 @@ from nautobot_golden_config.models import GoldenConfig from nautobot_golden_config.nornir_plays.processor import ProcessGoldenConfig -from nautobot_golden_config.utilities.constant import JINJA_ENV from nautobot_golden_config.utilities.db_management import close_threaded_db_connections from nautobot_golden_config.utilities.graphql import graph_ql_query from nautobot_golden_config.utilities.helper import ( + get_django_env, get_device_to_settings_map, get_job_filter, render_jinja_template, @@ -31,16 +29,10 @@ InventoryPluginRegister.register("nautobot-inventory", NautobotORMInventory) LOGGER = logging.getLogger(__name__) -# Use a custom Jinja2 environment instead of Django's to avoid HTML escaping -jinja_env = SandboxedEnvironment(**JINJA_ENV) - -# Retrieve filters from the Django jinja template engine -jinja_env.filters = engines["jinja"].env.filters - @close_threaded_db_connections def run_template( # pylint: disable=too-many-arguments - task: Task, logger, device_to_settings_map, nautobot_job + task: Task, logger, device_to_settings_map, nautobot_job, jinja_env ) -> Result: """Render Jinja Template. @@ -120,6 +112,9 @@ def config_intended(nautobot_job, data): for settings in set(device_to_settings_map.values()): verify_settings(logger, settings, ["jinja_path_template", "intended_path_template", "sot_agg_query"]) + # Retrieve filters from the Django jinja template engine + jinja_env = get_django_env() + try: with InitNornir( runner=NORNIR_SETTINGS.get("runner"), @@ -144,6 +139,7 @@ def config_intended(nautobot_job, data): logger=logger, device_to_settings_map=device_to_settings_map, nautobot_job=nautobot_job, + jinja_env=jinja_env, ) except Exception as err: diff --git a/nautobot_golden_config/utilities/helper.py b/nautobot_golden_config/utilities/helper.py index cd7042dc..52dc2200 100644 --- a/nautobot_golden_config/utilities/helper.py +++ b/nautobot_golden_config/utilities/helper.py @@ -2,18 +2,21 @@ # pylint: disable=raise-missing-from import json +from django.template import engines from django.contrib import messages from django.db.models import Q from django.utils.html import format_html from django.urls import reverse from jinja2 import exceptions as jinja_errors +from jinja2.sandbox import SandboxedEnvironment from nautobot.dcim.filters import DeviceFilterSet from nautobot.dcim.models import Device from nautobot.utilities.utils import render_jinja2 from nornir_nautobot.exceptions import NornirNautobotException from nautobot_golden_config import models +from nautobot_golden_config.utilities.constant import JINJA_ENV FIELDS_PK = { "platform", @@ -96,6 +99,18 @@ def verify_settings(logger, global_settings, attrs): raise NornirNautobotException() +def get_django_env(): + """Load Django Jinja filters from the Django jinja template engine, and add them to the jinja_env. + + Returns: + SandboxedEnvironment + """ + # Use a custom Jinja2 environment instead of Django's to avoid HTML escaping + jinja_env = SandboxedEnvironment(**JINJA_ENV) + jinja_env.filters = engines["jinja"].env.filters + return jinja_env + + def render_jinja_template(obj, logger, template): """ Helper function to render Jinja templates. diff --git a/pyproject.toml b/pyproject.toml index 2c726551..8434a96a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "nautobot-golden-config" -version = "1.6.1" +version = "1.6.2" description = "A plugin for configuration on nautobot" authors = ["Network to Code, LLC", ""]