From e14792f632b4c03e3da539c7314d7a7aec8c21ba Mon Sep 17 00:00:00 2001 From: Gary Snider <75227981+gsnider2195@users.noreply.github.com> Date: Wed, 13 Nov 2024 09:19:28 -0800 Subject: [PATCH] Added a web ui to render intended configurations (#827) Co-authored-by: Ken Celenza Co-authored-by: Jeff Kala <48843785+jeffkala@users.noreply.github.com> --- changes/827.added | 1 + .../generate-intended-config-ui-dark.png | Bin 0 -> 41359 bytes docs/images/generate-intended-config-ui.png | Bin 0 -> 41459 bytes docs/user/app_feature_intended.md | 20 ++-- nautobot_golden_config/api/serializers.py | 4 +- nautobot_golden_config/api/views.py | 25 +++-- nautobot_golden_config/forms.py | 10 ++ nautobot_golden_config/navigation.py | 11 ++ .../generate_intended_config.html | 96 ++++++++++++++++++ nautobot_golden_config/tests/test_api.py | 53 ++++------ nautobot_golden_config/urls.py | 1 + nautobot_golden_config/views.py | 16 ++- 12 files changed, 181 insertions(+), 56 deletions(-) create mode 100644 changes/827.added create mode 100644 docs/images/generate-intended-config-ui-dark.png create mode 100644 docs/images/generate-intended-config-ui.png create mode 100644 nautobot_golden_config/templates/nautobot_golden_config/generate_intended_config.html diff --git a/changes/827.added b/changes/827.added new file mode 100644 index 00000000..d2f8aec3 --- /dev/null +++ b/changes/827.added @@ -0,0 +1 @@ +Added a web ui for Jinja template developers to render intended configurations. diff --git a/docs/images/generate-intended-config-ui-dark.png b/docs/images/generate-intended-config-ui-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..7980b92c22ed5b8dfbc5a8e2a15f08187f66eeea GIT binary patch literal 41359 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 + .button-container { + margin-bottom: 24px; + } + +{% endblock extra_styles %} + +{% block content %} +
+
+
+
+
{% block title %}Generate Intended Configuration{% endblock title %}
+
+

+ This tool is intended for template developers. Production configuration generation should be initiated from the + Config Overview page. +

+

+ This will render the configuration for the selected device using Jinja templates from the golden config jinja_repository + Git repository for that device. + This feature allows developers to test their configuration templates without running a full "intended configuration" job. See the + + developing intended configuration templates + documentation for more information. +

+

+ Note: + This will perform a git pull on the golden config Jinja template repository to ensure the latest templates are used. +

+ {% render_field form.device %} + {% render_field form.git_repository %} +
+
+
+ + Cancel +
+
+
+
+
+ Intended Configuration + +
+
+ +
+
+
+
+
+{% endblock content %} + +{% block javascript %} + {{ block.super }} + +{% endblock javascript %} diff --git a/nautobot_golden_config/tests/test_api.py b/nautobot_golden_config/tests/test_api.py index 88ed0d8f..13855679 100644 --- a/nautobot_golden_config/tests/test_api.py +++ b/nautobot_golden_config/tests/test_api.py @@ -1,6 +1,5 @@ """Unit tests for nautobot_golden_config.""" -import uuid from copy import deepcopy from unittest.mock import patch @@ -431,15 +430,15 @@ def setUpTestData(cls): platform.network_driver = "arista_eos" platform.save() + cls.git_repository = GitRepository.objects.get(name="test-jinja-repo-1") cls.golden_config_setting = GoldenConfigSetting.objects.create( name="GoldenConfigSetting test api generate intended config", slug="goldenconfigsetting-test-api-generate-intended-config", sot_agg_query=GraphQLQuery.objects.get(name="GC-SoTAgg-Query-2"), dynamic_group=cls.dynamic_group, + jinja_repository=cls.git_repository, ) - cls.git_repository = GitRepository.objects.get(name="test-jinja-repo-1") - def _setup_mock_path(self, MockPath): # pylint: disable=invalid-name mock_path_instance = MockPath.return_value mock_path_instance.__str__.return_value = "test.j2" @@ -474,7 +473,7 @@ def _generate_config(task, *args, **kwargs): response = self.client.get( reverse("plugins-api:nautobot_golden_config-api:generate_intended_config"), - data={"device_id": self.device.pk, "git_repository_id": self.git_repository.pk}, + data={"device_id": self.device.pk}, **self.header, ) @@ -499,7 +498,7 @@ def test_generate_intended_config_failures(self, mock_dispatcher, MockPath, mock # test missing query parameters response = self.client.get( reverse("plugins-api:nautobot_golden_config-api:generate_intended_config"), - data={"git_repository_id": self.git_repository.pk}, + data={}, **self.header, ) self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST) @@ -509,24 +508,12 @@ def test_generate_intended_config_failures(self, mock_dispatcher, MockPath, mock "Parameter device_id is required", ) - response = self.client.get( - reverse("plugins-api:nautobot_golden_config-api:generate_intended_config"), - data={"device_id": self.device.pk}, - **self.header, - ) - self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST) - self.assertTrue("detail" in response.data) - self.assertEqual( - response.data["detail"], - "Parameter git_repository_id is required", - ) - # test git repo not present on filesystem mock_path_instance.is_file.return_value = False response = self.client.get( reverse("plugins-api:nautobot_golden_config-api:generate_intended_config"), - data={"device_id": self.device.pk, "git_repository_id": self.git_repository.pk}, + data={"device_id": self.device.pk}, **self.header, ) @@ -556,20 +543,23 @@ def _generate_config(task, *args, **kwargs): response = self.client.get( reverse("plugins-api:nautobot_golden_config-api:generate_intended_config"), - data={"device_id": self.device.pk, "git_repository_id": self.git_repository.pk}, + data={"device_id": self.device.pk}, **self.header, ) self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST) self.assertTrue("detail" in response.data) - self.assertEqual("Error rendering Jinja template", response.data["detail"]) + self.assertEqual( + response.data["detail"].strip(), + "Error rendering Jinja template: Subtask: GENERATE CONFIG (failed)", + ) # test ensure_git_repository failure mock_ensure_git_repository.side_effect = Exception("Test exception") response = self.client.get( reverse("plugins-api:nautobot_golden_config-api:generate_intended_config"), - data={"device_id": self.device.pk, "git_repository_id": self.git_repository.pk}, + data={"device_id": self.device.pk}, **self.header, ) @@ -577,37 +567,38 @@ def _generate_config(task, *args, **kwargs): self.assertTrue("detail" in response.data) self.assertEqual("Error trying to sync git repository", response.data["detail"]) - # test no sot_agg_query on GoldenConfigSetting - self.golden_config_setting.sot_agg_query = None + # test jinja_repository not set + self.golden_config_setting.jinja_repository = None self.golden_config_setting.save() - response = self.client.get( reverse("plugins-api:nautobot_golden_config-api:generate_intended_config"), - data={"device_id": self.device.pk, "git_repository_id": self.git_repository.pk}, + data={"device_id": self.device.pk}, **self.header, ) self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST) self.assertTrue("detail" in response.data) - self.assertEqual("Golden Config settings sot_agg_query not set", response.data["detail"]) + self.assertEqual(response.data["detail"], "Golden Config settings jinja_repository not set") + + # test no sot_agg_query on GoldenConfigSetting + self.golden_config_setting.sot_agg_query = None + self.golden_config_setting.save() - # test git_repository instance not found - invalid_uuid = uuid.uuid4() response = self.client.get( reverse("plugins-api:nautobot_golden_config-api:generate_intended_config"), - data={"device_id": self.device.pk, "git_repository_id": invalid_uuid}, + data={"device_id": self.device.pk}, **self.header, ) self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST) self.assertTrue("detail" in response.data) - self.assertEqual(f"GitRepository with id '{invalid_uuid}' not found", response.data["detail"]) + self.assertEqual("Golden Config settings sot_agg_query not set", response.data["detail"]) # test no GoldenConfigSetting found for device GoldenConfigSetting.objects.all().delete() response = self.client.get( reverse("plugins-api:nautobot_golden_config-api:generate_intended_config"), - data={"device_id": self.device.pk, "git_repository_id": self.git_repository.pk}, + data={"device_id": self.device.pk}, **self.header, ) diff --git a/nautobot_golden_config/urls.py b/nautobot_golden_config/urls.py index f6b55835..c66dd37e 100644 --- a/nautobot_golden_config/urls.py +++ b/nautobot_golden_config/urls.py @@ -23,5 +23,6 @@ urlpatterns = [ path("config-compliance/overview/", views.ConfigComplianceOverview.as_view(), name="configcompliance_overview"), path("config-plan/bulk_deploy/", views.ConfigPlanBulkDeploy.as_view(), name="configplan_bulk-deploy"), + path("generate-intended-config/", views.GenerateIntendedConfigView.as_view(), name="generate_intended_config"), path("docs/", RedirectView.as_view(url=static("nautobot_golden_config/docs/index.html")), name="docs"), ] + router.urls diff --git a/nautobot_golden_config/views.py b/nautobot_golden_config/views.py index 9826a845..024c2044 100644 --- a/nautobot_golden_config/views.py +++ b/nautobot_golden_config/views.py @@ -6,13 +6,14 @@ import yaml from django.contrib import messages +from django.contrib.auth.mixins import PermissionRequiredMixin from django.core.exceptions import ObjectDoesNotExist from django.db.models import Count, ExpressionWrapper, F, FloatField, Max, Q from django.shortcuts import redirect, render from django.urls import reverse from django.utils.html import format_html from django.utils.timezone import make_aware -from django.views.generic import View +from django.views.generic import TemplateView, View from django_pivot.pivot import pivot from nautobot.apps import views from nautobot.core.views import generic @@ -585,3 +586,16 @@ def post(self, request): **job.job_class.serialize_data(request), ) return redirect(job_result.get_absolute_url()) + + +class GenerateIntendedConfigView(PermissionRequiredMixin, TemplateView): + """View to generate the intended configuration.""" + + template_name = "nautobot_golden_config/generate_intended_config.html" + permission_required = ["dcim.view_device", "extras.view_gitrepository"] + + def get_context_data(self, **kwargs): + """Get the context data for the view.""" + context = super().get_context_data(**kwargs) + context["form"] = forms.GenerateIntendedConfigForm() + return context