From de5f1733ddba4889c9496ef1a97b436e30bc9883 Mon Sep 17 00:00:00 2001 From: bile0026 Date: Sun, 18 Aug 2024 11:59:39 -0500 Subject: [PATCH 1/5] =?UTF-8?q?feat:=20=E2=9C=A8=20add=20view=20for=20disc?= =?UTF-8?q?overedgroup=20objects?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nautobot_device_onboarding/navigation.py | 2 +- .../discoveredgroup_detail.html | 17 +++++++++++++++++ nautobot_device_onboarding/urls.py | 6 +++++- nautobot_device_onboarding/views.py | 10 ++++++++++ 4 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 nautobot_device_onboarding/templates/nautobot_device_onboarding/discoveredgroup_detail.html diff --git a/nautobot_device_onboarding/navigation.py b/nautobot_device_onboarding/navigation.py index 2d3f9e44..e1edf68a 100644 --- a/nautobot_device_onboarding/navigation.py +++ b/nautobot_device_onboarding/navigation.py @@ -22,7 +22,7 @@ menu_items = ( NavMenuTab( - name="Discovered Network", + name="Device Onboarding", weight=1000, groups=(NavMenuGroup(name="Discovered Models", weight=100, items=items),), ), diff --git a/nautobot_device_onboarding/templates/nautobot_device_onboarding/discoveredgroup_detail.html b/nautobot_device_onboarding/templates/nautobot_device_onboarding/discoveredgroup_detail.html new file mode 100644 index 00000000..67a8387f --- /dev/null +++ b/nautobot_device_onboarding/templates/nautobot_device_onboarding/discoveredgroup_detail.html @@ -0,0 +1,17 @@ +{% extends 'generic/object_detail.html' %} +{% load static %} +{% block content_left_page %} +
+
+ Discovered Group +
+

{{ object.name }}

+

{{ object.description }}

+

Associated IP Addresses

+ +
+{% endblock %} \ No newline at end of file diff --git a/nautobot_device_onboarding/urls.py b/nautobot_device_onboarding/urls.py index 2d1b7f4f..a6fd376e 100644 --- a/nautobot_device_onboarding/urls.py +++ b/nautobot_device_onboarding/urls.py @@ -1,5 +1,7 @@ """Urls.""" +from django.urls import path + from nautobot.core.views.routers import NautobotUIViewSetRouter from . import views @@ -11,4 +13,6 @@ router.register("discovered-ipaddresses", views.DiscoveredIPAddressUIViewSet) router.register("discovered-ports", views.DiscoveredPortUIViewSet) -urlpatterns = router.urls +urlpatterns = [ + path("discovered-groups//", views.DiscoveredGroupView.as_view(), name="discoveredgroup-detail"), +] + router.urls diff --git a/nautobot_device_onboarding/views.py b/nautobot_device_onboarding/views.py index 730cf3b9..7a39e049 100644 --- a/nautobot_device_onboarding/views.py +++ b/nautobot_device_onboarding/views.py @@ -1,6 +1,8 @@ """Model UI Viewset.""" +from nautobot.core.views import generic from nautobot.core.views.viewsets import NautobotUIViewSet +from nautobot.core.views.generic import ObjectView from . import filters, tables from .api import serializers @@ -16,6 +18,14 @@ class DiscoveredGroupUIViewSet(NautobotUIViewSet): table_class = tables.DiscoveredGroupTable +class DiscoveredGroupView(ObjectView): + """Detail view for a DiscoveredGroup.""" + + queryset = DiscoveredGroup.objects.all() + model = DiscoveredGroup + template_name = "nautobot_device_onboarding/discoveredgroup_detail.html" + + class DiscoveredIPAddressUIViewSet(NautobotUIViewSet): """DiscoveredIPAddress UI ViewSet.""" From fdf1037e8660e3c61e082f5a5c06fe2c39984e43 Mon Sep 17 00:00:00 2001 From: bile0026 Date: Sun, 18 Aug 2024 12:40:12 -0500 Subject: [PATCH 2/5] =?UTF-8?q?feat:=20=E2=9C=A8=20override=20list=20view?= =?UTF-8?q?=20for=20discoveredipaddress=20objects?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nautobot_device_onboarding/tables.py | 31 +++++++++++++++---- .../discoveredipaddress_detail.html | 14 +++++++++ .../discoveredipaddress_list.html | 31 +++++++++++++++++++ nautobot_device_onboarding/urls.py | 1 + nautobot_device_onboarding/views.py | 9 +++++- 5 files changed, 79 insertions(+), 7 deletions(-) create mode 100644 nautobot_device_onboarding/templates/nautobot_device_onboarding/discoveredipaddress_detail.html create mode 100644 nautobot_device_onboarding/templates/nautobot_device_onboarding/discoveredipaddress_list.html diff --git a/nautobot_device_onboarding/tables.py b/nautobot_device_onboarding/tables.py index 7cfad399..1e450895 100644 --- a/nautobot_device_onboarding/tables.py +++ b/nautobot_device_onboarding/tables.py @@ -1,6 +1,10 @@ """Tables.""" +import json + import django_tables2 as tables +from django.utils.html import format_html + from nautobot.core.tables import ( BaseTable, ButtonsColumn, @@ -10,6 +14,18 @@ from .models import DiscoveredGroup, DiscoveredIPAddress, DiscoveredPort +class JSONExpandColumn(tables.Column): + def render(self, value): + # Convert JSON to a formatted string + formatted_json = json.dumps(value, indent=2) + # Return HTML with a hidden JSON blob and a button to toggle its visibility + return format_html( + '' + '', + formatted_json + ) + + class DiscoveredGroupTable(BaseTable): """DiscoverdGroup Table.""" @@ -25,19 +41,22 @@ class Meta(BaseTable.Meta): default_columns = ("pk", "name", "actions") -class DiscoveredIPAddressGroupTable(BaseTable): - """DiscoverdIPAddress Table.""" +class DiscoveredIPAddressTable(BaseTable): + """DiscoveredIPAddress Table.""" pk = ToggleColumn() - discovered_group = tables.Column(linkify=True) + discovered_group = tables.Column(linkify=True, verbose_name="Discovered Group") ip_address = tables.Column(linkify=True) + marked_for_onboarding = tables.BooleanColumn() + extra_info = JSONExpandColumn() class Meta(BaseTable.Meta): - """Meta.""" + """Meta options.""" model = DiscoveredIPAddress - fields = ("pk", "discovered_group", "ip_address") - default_columns = ("pk", "name", "ip_address") + fields = ("pk", "ip_address", "discovered_group", "marked_for_onboarding", "extra_info") + default_columns = ("pk", "ip_address", "discovered_group", "marked_for_onboarding", "extra_info") + template = "nautobot_device_onboarding/" class DiscoveredPortTable(BaseTable): diff --git a/nautobot_device_onboarding/templates/nautobot_device_onboarding/discoveredipaddress_detail.html b/nautobot_device_onboarding/templates/nautobot_device_onboarding/discoveredipaddress_detail.html new file mode 100644 index 00000000..5725b75d --- /dev/null +++ b/nautobot_device_onboarding/templates/nautobot_device_onboarding/discoveredipaddress_detail.html @@ -0,0 +1,14 @@ +{% extends 'generic/object_detail.html' %} +{% load static %} +{% block content_left_page %} +
+
+ Discovered IP Address +
+

{{ object.ip_address }}

+

Marked for onboarding: {{ object.marked_for_onboarding }}

+

Extra Info

+
{{ object.extra_info|default_if_none:"No extra information available" }}
+ +
+{% endblock %} \ No newline at end of file diff --git a/nautobot_device_onboarding/templates/nautobot_device_onboarding/discoveredipaddress_list.html b/nautobot_device_onboarding/templates/nautobot_device_onboarding/discoveredipaddress_list.html new file mode 100644 index 00000000..a958016e --- /dev/null +++ b/nautobot_device_onboarding/templates/nautobot_device_onboarding/discoveredipaddress_list.html @@ -0,0 +1,31 @@ +{% extends 'generic/object_list.html' %} +{% load static %} + +{% block javascript %} + {{ block.super }} + +{% endblock javascript %} + + + + + + + diff --git a/nautobot_device_onboarding/urls.py b/nautobot_device_onboarding/urls.py index a6fd376e..1c71aebc 100644 --- a/nautobot_device_onboarding/urls.py +++ b/nautobot_device_onboarding/urls.py @@ -15,4 +15,5 @@ urlpatterns = [ path("discovered-groups//", views.DiscoveredGroupView.as_view(), name="discoveredgroup-detail"), + path("discovered-ipaddresses//", views.DiscoveredIPAddressView.as_view(), name="discoveredipaddress-detail"), ] + router.urls diff --git a/nautobot_device_onboarding/views.py b/nautobot_device_onboarding/views.py index 7a39e049..dd4103a1 100644 --- a/nautobot_device_onboarding/views.py +++ b/nautobot_device_onboarding/views.py @@ -32,7 +32,14 @@ class DiscoveredIPAddressUIViewSet(NautobotUIViewSet): filterset_class = filters.DiscoveredIPAddressFilterSet queryset = DiscoveredIPAddress.objects.all() serializer_class = serializers.DiscoveredIPAddressSerializer - table_class = tables.DiscoveredIPAddressGroupTable + table_class = tables.DiscoveredIPAddressTable + + +class DiscoveredIPAddressView(ObjectView): + """View for displaying the details of a DiscoveredIPAddress.""" + + queryset = DiscoveredIPAddress.objects.all() + template_name = "nautobot_device_onboarding/discoveredipaddress_detail.html" class DiscoveredPortUIViewSet(NautobotUIViewSet): From c5d882613d8b69eb1a814cf494cfdba74d875d32 Mon Sep 17 00:00:00 2001 From: bile0026 Date: Sun, 18 Aug 2024 12:43:28 -0500 Subject: [PATCH 3/5] =?UTF-8?q?fix:=20=F0=9F=90=9B=20fix=20discovered=20po?= =?UTF-8?q?rts=20table?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nautobot_device_onboarding/tables.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/nautobot_device_onboarding/tables.py b/nautobot_device_onboarding/tables.py index 1e450895..78985b51 100644 --- a/nautobot_device_onboarding/tables.py +++ b/nautobot_device_onboarding/tables.py @@ -60,10 +60,7 @@ class Meta(BaseTable.Meta): class DiscoveredPortTable(BaseTable): - """DiscoverdPort Table.""" - - pk = ToggleColumn() - discovered_ip_address = tables.Column(linkify=True) + discovered_ip_address = tables.Column(linkify=True, verbose_name="Discovered IP Address", accessor="discovered_ip_address.ip_address") protocol = tables.Column() port_id = tables.Column() state = tables.Column() @@ -71,8 +68,7 @@ class DiscoveredPortTable(BaseTable): reason_ttl = tables.Column() class Meta(BaseTable.Meta): - """Meta.""" - model = DiscoveredPort - fields = ("pk", "discovered_ip_address", "protocol", "port_id", "state", "reason", "reason_ttl") - default_columns = ("pk", "discovered_ip_address", "protocol", "port_id", "state", "reason", "reason_ttl") + fields = ("discovered_ip_address", "protocol", "port_id", "state", "reason", "reason_ttl") + default_columns = ("discovered_ip_address", "protocol", "port_id", "state", "reason", "reason_ttl") + From d5f1df24aedf6f744729eecefb21176a0bea7cbd Mon Sep 17 00:00:00 2001 From: bile0026 Date: Sun, 18 Aug 2024 21:07:47 -0500 Subject: [PATCH 4/5] =?UTF-8?q?fix:=20=F0=9F=90=9B=20fix=20ip=20address=20?= =?UTF-8?q?format?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nautobot_device_onboarding/jobs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nautobot_device_onboarding/jobs.py b/nautobot_device_onboarding/jobs.py index 383c2c29..8b18e650 100755 --- a/nautobot_device_onboarding/jobs.py +++ b/nautobot_device_onboarding/jobs.py @@ -789,7 +789,7 @@ def run( _discovered_ips = DiscoveredIPAddress.objects.filter( discovered_group=discovered_group, marked_for_onboarding=True ).values_list("ip_address", flat=True) - self.ip_addresses = [ip for ip in _discovered_ips] + self.ip_addresses = [str(IPAddress.objects.get(id=ip).address) for ip in _discovered_ips] self.set_mgmt_only = set_mgmt_only self.update_devices_without_primary_ip = update_devices_without_primary_ip self.device_role = device_role From cd4aba5eaf4b4667e75684fe06c3b22b090a9b5d Mon Sep 17 00:00:00 2001 From: bile0026 Date: Sun, 18 Aug 2024 21:17:16 -0500 Subject: [PATCH 5/5] =?UTF-8?q?fix:=20=F0=9F=90=9B=20add=20logging?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nautobot_device_onboarding/jobs.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/nautobot_device_onboarding/jobs.py b/nautobot_device_onboarding/jobs.py index 8b18e650..8f0de0d7 100755 --- a/nautobot_device_onboarding/jobs.py +++ b/nautobot_device_onboarding/jobs.py @@ -801,6 +801,8 @@ def run( self.secrets_group = secrets_group self.platform = platform + self.logger.info(f"IP Addresses: {self.ip_addresses}") + self.job_result.task_kwargs = { "debug": debug, "location": location,