From a504f5f309dfae02ce567c233fb3daf28b457b4d Mon Sep 17 00:00:00 2001 From: John Anderson Date: Tue, 10 Mar 2020 19:15:24 -0400 Subject: [PATCH] closes #4340 - Enforce unique constraints for device and virtual machine names in the API --- docs/release-notes/version-2.7.md | 6 ++++++ netbox/dcim/tests/test_api.py | 14 ++++++++++++++ netbox/utilities/api.py | 1 + netbox/virtualization/tests/test_api.py | 12 ++++++++++++ 4 files changed, 33 insertions(+) diff --git a/docs/release-notes/version-2.7.md b/docs/release-notes/version-2.7.md index 69be137d7..4ebae5f76 100644 --- a/docs/release-notes/version-2.7.md +++ b/docs/release-notes/version-2.7.md @@ -1,5 +1,11 @@ # NetBox v2.7 Release Notes +## v2.7.11 (FUTURE) + +### Bug Fixes + +* [#4340](https://github.com/netbox-community/netbox/issues/4340) - Enforce unique constraints for device and virtual machine names in the API + ## v2.7.10 (2020-03-10) **Note:** If your deployment requires any non-core Python packages (such as `napalm`, `django-storages`, or `django-auth-ldap`), list them in a file named `local_requirements.txt` in the NetBox root directory (alongside `requirements.txt`). This will ensure they are detected and re-installed by the upgrade script when the Python virtual environment is rebuilt. diff --git a/netbox/dcim/tests/test_api.py b/netbox/dcim/tests/test_api.py index ad893bec6..09de27d92 100644 --- a/netbox/dcim/tests/test_api.py +++ b/netbox/dcim/tests/test_api.py @@ -2089,6 +2089,20 @@ class DeviceTest(APITestCase): self.assertFalse('config_context' in response.data['results'][0]) + def test_unique_name_per_site_constraint(self): + + data = { + 'device_type': self.devicetype1.pk, + 'device_role': self.devicerole1.pk, + 'name': 'Test Device 1', + 'site': self.site1.pk, + } + + url = reverse('dcim-api:device-list') + response = self.client.post(url, data, format='json', **self.header) + + self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST) + class ConsolePortTest(APITestCase): diff --git a/netbox/utilities/api.py b/netbox/utilities/api.py index 72a5735de..a34d7983a 100644 --- a/netbox/utilities/api.py +++ b/netbox/utilities/api.py @@ -234,6 +234,7 @@ class ValidatedModelSerializer(ModelSerializer): for k, v in attrs.items(): setattr(instance, k, v) instance.clean() + instance.validate_unique() return data diff --git a/netbox/virtualization/tests/test_api.py b/netbox/virtualization/tests/test_api.py index 719954c10..fa425c460 100644 --- a/netbox/virtualization/tests/test_api.py +++ b/netbox/virtualization/tests/test_api.py @@ -501,6 +501,18 @@ class VirtualMachineTest(APITestCase): self.assertFalse('config_context' in response.data['results'][0]) + def test_unique_name_per_cluster_constraint(self): + + data = { + 'name': 'Test Virtual Machine 1', + 'cluster': self.cluster1.pk, + } + + url = reverse('virtualization-api:virtualmachine-list') + response = self.client.post(url, data, format='json', **self.header) + + self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST) + class InterfaceTest(APITestCase):