From 04c42dfc023a523f59609cab23d3df7532e946e2 Mon Sep 17 00:00:00 2001 From: Michal Fiedorowicz Date: Tue, 23 Jul 2024 18:10:53 +0100 Subject: [PATCH 1/5] fix: GHA lint and tests workflow - matrix python Signed-off-by: Michal Fiedorowicz --- .github/workflows/lint-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint-tests.yml b/.github/workflows/lint-tests.yml index ca51299..e47f24f 100644 --- a/.github/workflows/lint-tests.yml +++ b/.github/workflows/lint-tests.yml @@ -21,7 +21,7 @@ jobs: timeout-minutes: 10 strategy: matrix: - python-version: [ "3.10" ] + python: [ "3.10" ] steps: - name: Checkout uses: actions/checkout@v4 From fbf7c7416e4537808d9a572a80aee98bab158e77 Mon Sep 17 00:00:00 2001 From: Michal Fiedorowicz Date: Tue, 23 Jul 2024 18:17:38 +0100 Subject: [PATCH 2/5] fix: rename environment variable Signed-off-by: Michal Fiedorowicz --- docker/netbox/env/netbox.env | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docker/netbox/env/netbox.env b/docker/netbox/env/netbox.env index 57e0a52..b31b8a7 100644 --- a/docker/netbox/env/netbox.env +++ b/docker/netbox/env/netbox.env @@ -39,5 +39,6 @@ WEBHOOKS_ENABLED=true RELOAD_NETBOX_ON_DIODE_PLUGIN_CHANGE=false DIODE_TO_NETBOX_API_KEY=1368dbad13e418d5a443d93cf255edde03a2a754 NETBOX_TO_DIODE_API_KEY=1e99338b8cab5fc637bc55f390bda1446f619c42 -INGESTION_API_KEY=5a52c45ee8231156cb620d193b0291912dd15433 +DIODE_API_KEY=5a52c45ee8231156cb620d193b0291912dd15433 BASE_PATH=netbox/ +DEBUG=true From 189faaef1a60a63c65285ee3fe16e6ccc61a2d9c Mon Sep 17 00:00:00 2001 From: Michal Fiedorowicz Date: Tue, 23 Jul 2024 18:19:46 +0100 Subject: [PATCH 3/5] fix: revert DEBUG mode Signed-off-by: Michal Fiedorowicz --- docker/netbox/env/netbox.env | 1 - 1 file changed, 1 deletion(-) diff --git a/docker/netbox/env/netbox.env b/docker/netbox/env/netbox.env index b31b8a7..45993fc 100644 --- a/docker/netbox/env/netbox.env +++ b/docker/netbox/env/netbox.env @@ -41,4 +41,3 @@ DIODE_TO_NETBOX_API_KEY=1368dbad13e418d5a443d93cf255edde03a2a754 NETBOX_TO_DIODE_API_KEY=1e99338b8cab5fc637bc55f390bda1446f619c42 DIODE_API_KEY=5a52c45ee8231156cb620d193b0291912dd15433 BASE_PATH=netbox/ -DEBUG=true From 5d8240f3b4116bfee0e095c3d4aea8b78717a42b Mon Sep 17 00:00:00 2001 From: Leonardo Parente <23251360+leoparente@users.noreply.github.com> Date: Wed, 24 Jul 2024 13:38:31 -0300 Subject: [PATCH 4/5] fix: ObjectStateView failing for IP address --- netbox_diode_plugin/api/views.py | 12 +++++++--- .../tests/test_object_state.py | 22 +++++++++++++++++-- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/netbox_diode_plugin/api/views.py b/netbox_diode_plugin/api/views.py index c2ab257..f5697e9 100644 --- a/netbox_diode_plugin/api/views.py +++ b/netbox_diode_plugin/api/views.py @@ -127,9 +127,15 @@ def get(self, request, *args, **kwargs): }, ) - if len(serializer.data) > 0: - return Response(serializer.data[0]) - return Response({}) + try: + if len(serializer.data) > 0: + return Response(serializer.data[0]) + return Response({}) + except AttributeError as e: + return Response( + {"errors": [f"Serializer error: {e.args[0]}"]}, + status=status.HTTP_400_BAD_REQUEST, + ) def _additional_attributes_query_filter(self): """Get the additional attributes query filter.""" diff --git a/netbox_diode_plugin/tests/test_object_state.py b/netbox_diode_plugin/tests/test_object_state.py index 58d1e14..952e97a 100644 --- a/netbox_diode_plugin/tests/test_object_state.py +++ b/netbox_diode_plugin/tests/test_object_state.py @@ -300,6 +300,14 @@ def test_common_user_with_permissions_get_device_state(self): response = self.client.get(self.url, query_parameters, **self.user_header) self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.json().get("object_type"), "dcim.device") + self.assertEqual( + response.json().get("object").get("name"), self.devices[0].name + ) + self.assertEqual( + response.json().get("object").get("site").get("name"), self.sites[0].name + ) + def test_common_user_with_permissions_get_interface_state(self): """Test searching for interface using q parameter.""" query_parameters = { @@ -312,10 +320,19 @@ def test_common_user_with_permissions_get_interface_state(self): response = self.client.get(self.url, query_parameters, **self.user_header) self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.json().get("object_type"), "dcim.interface") + self.assertEqual( + response.json().get("object").get("name"), self.interfaces[0].name + ) + self.assertEqual( + response.json().get("object").get("device").get("name"), + self.devices[0].name, + ) + def test_common_user_with_permissions_get_ip_state(self): """Test searching for ip using q parameter.""" query_parameters = { - "q": self.ip_addresses[0].address.ip, + "q": self.ip_addresses[0].address.__str__(), "object_type": "ipam.ipaddress", "interface": self.interfaces[0].id, "interface__device": self.devices[0].id, @@ -323,4 +340,5 @@ def test_common_user_with_permissions_get_ip_state(self): } response = self.client.get(self.url, query_parameters, **self.user_header) - self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + self.assertIn("Site 223", response.json()) From 1c4be020e2dd9a317ce3ef318cf46aff9f9ae01b Mon Sep 17 00:00:00 2001 From: Leonardo Parente <23251360+leoparente@users.noreply.github.com> Date: Wed, 24 Jul 2024 15:51:46 -0300 Subject: [PATCH 5/5] fix: correct ip lookup --- netbox_diode_plugin/api/views.py | 6 ++- .../tests/test_object_state.py | 47 +++++++++++++++++-- 2 files changed, 47 insertions(+), 6 deletions(-) diff --git a/netbox_diode_plugin/api/views.py b/netbox_diode_plugin/api/views.py index f5697e9..173a97d 100644 --- a/netbox_diode_plugin/api/views.py +++ b/netbox_diode_plugin/api/views.py @@ -49,7 +49,11 @@ def _get_lookups(self, object_type_model: str) -> tuple: """ if "'ipam.models.ip.ipaddress'" in object_type_model: - return "interface", "interface__device", "interface__device__site" + return ( + "assigned_object", + "assigned_object__device", + "assigned_object__device__site", + ) if "'dcim.models.device_components.interface'" in object_type_model: return "device", "device__site" if "'dcim.models.devices.device'" in object_type_model: diff --git a/netbox_diode_plugin/tests/test_object_state.py b/netbox_diode_plugin/tests/test_object_state.py index 952e97a..e56b556 100644 --- a/netbox_diode_plugin/tests/test_object_state.py +++ b/netbox_diode_plugin/tests/test_object_state.py @@ -289,7 +289,31 @@ def test_invalid_object_state_using_q_objects_and_wrong_additional_attributes_re self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) - def test_common_user_with_permissions_get_device_state(self): + def test_common_user_with_permissions_get_ip_state_using_id(self): + """Test searching for ip using id.""" + query_parameters = { + "id": self.ip_addresses[0].id, + "object_type": "ipam.ipaddress", + } + + response = self.client.get(self.url, query_parameters, **self.user_header) + self.assertEqual(response.status_code, status.HTTP_200_OK) + + self.assertEqual(response.json().get("object_type"), "ipam.ipaddress") + self.assertEqual( + response.json().get("object").get("address"), + self.ip_addresses[0].address.__str__(), + ) + self.assertEqual( + response.json() + .get("object") + .get("assigned_object") + .get("interface") + .get("name"), + self.interfaces[0].name, + ) + + def test_common_user_with_permissions_get_device_state_using_q_objects(self): """Test searching for device using q parameter.""" query_parameters = { "q": self.devices[0].name, @@ -308,7 +332,7 @@ def test_common_user_with_permissions_get_device_state(self): response.json().get("object").get("site").get("name"), self.sites[0].name ) - def test_common_user_with_permissions_get_interface_state(self): + def test_common_user_with_permissions_get_interface_state_using_q_objects(self): """Test searching for interface using q parameter.""" query_parameters = { "q": self.interfaces[0].name, @@ -329,7 +353,7 @@ def test_common_user_with_permissions_get_interface_state(self): self.devices[0].name, ) - def test_common_user_with_permissions_get_ip_state(self): + def test_common_user_with_permissions_get_ip_state_using_q_objects(self): """Test searching for ip using q parameter.""" query_parameters = { "q": self.ip_addresses[0].address.__str__(), @@ -340,5 +364,18 @@ def test_common_user_with_permissions_get_ip_state(self): } response = self.client.get(self.url, query_parameters, **self.user_header) - self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) - self.assertIn("Site 223", response.json()) + self.assertEqual(response.status_code, status.HTTP_200_OK) + + self.assertEqual(response.json().get("object_type"), "ipam.ipaddress") + self.assertEqual( + response.json().get("object").get("address"), + self.ip_addresses[0].address.__str__(), + ) + self.assertEqual( + response.json() + .get("object") + .get("assigned_object") + .get("interface") + .get("name"), + self.interfaces[0].name, + )