diff --git a/netbox_onboarding/onboard.py b/netbox_onboarding/onboard.py index 750ab1e..cbf71a3 100644 --- a/netbox_onboarding/onboard.py +++ b/netbox_onboarding/onboard.py @@ -20,6 +20,7 @@ from napalm.base.exceptions import ConnectionException, CommandErrorException from django.conf import settings +from django.utils.text import slugify from netmiko.ssh_autodetect import SSHDetect from netmiko.ssh_exception import NetMikoAuthenticationException @@ -336,14 +337,14 @@ def ensure_device_type( # instance. try: - self.manufacturer = Manufacturer.objects.get(slug=self.netdev.vendor.lower()) + self.manufacturer = Manufacturer.objects.get(slug=slugify(self.netdev.vendor)) except Manufacturer.DoesNotExist: if not create_manufacturer: raise OnboardException( reason="fail-config", message=f"ERROR manufacturer not found: {self.netdev.vendor}" ) - self.manufacturer = Manufacturer.objects.create(name=self.netdev.vendor, slug=self.netdev.vendor.lower()) + self.manufacturer = Manufacturer.objects.create(name=self.netdev.vendor, slug=slugify(self.netdev.vendor)) self.manufacturer.save() # Now see if the device type (slug) already exists, @@ -357,7 +358,7 @@ def ensure_device_type( logging.warning("device model is now: %s", self.netdev.model) try: - self.device_type = DeviceType.objects.get(slug=self.netdev.model.lower()) + self.device_type = DeviceType.objects.get(slug=slugify(self.netdev.model)) self.netdev.ot.device_type = self.device_type.slug self.netdev.ot.save() except DeviceType.DoesNotExist: @@ -368,7 +369,7 @@ def ensure_device_type( logging.info("CREATE: device-type: %s", self.netdev.model) self.device_type = DeviceType.objects.create( - slug=self.netdev.model.lower(), model=self.netdev.model.upper(), manufacturer=self.manufacturer + slug=slugify(self.netdev.model), model=self.netdev.model.upper(), manufacturer=self.manufacturer ) self.device_type.save() self.netdev.ot.device_type = self.device_type.slug @@ -400,14 +401,14 @@ def ensure_device_role( return try: - device_role = DeviceRole.objects.get(slug=default_device_role) + device_role = DeviceRole.objects.get(slug=slugify(default_device_role)) except DeviceRole.DoesNotExist: if not create_device_role: raise OnboardException( reason="fail-config", message=f"ERROR device role not found: {default_device_role}" ) - device_role = DeviceRole.objects.create(name=default_device_role, slug=default_device_role) + device_role = DeviceRole.objects.create(name=default_device_role, slug=slugify(default_device_role)) device_role.save() self.netdev.ot.role = device_role diff --git a/netbox_onboarding/tests/test_onboard.py b/netbox_onboarding/tests/test_onboard.py index 95c659f..c967f97 100644 --- a/netbox_onboarding/tests/test_onboard.py +++ b/netbox_onboarding/tests/test_onboard.py @@ -12,6 +12,7 @@ limitations under the License. """ from django.test import TestCase +from django.utils.text import slugify from dcim.models import Site, Device, Interface, Manufacturer, DeviceType, DeviceRole, Platform from ipam.models import IPAddress @@ -42,8 +43,8 @@ def setUp(self): self.ndk1 = NetdevKeeper(self.onboarding_task1) self.ndk1.hostname = "device1" - self.ndk1.vendor = "cisco" - self.ndk1.model = "csr1000v" + self.ndk1.vendor = "Cisco" + self.ndk1.model = "CSR1000v" self.ndk1.serial_number = "123456" self.ndk1.mgmt_ifname = "GigaEthernet0" self.ndk1.mgmt_pflen = 24 @@ -62,17 +63,19 @@ def test_ensure_device_type_missing(self): with self.assertRaises(OnboardException) as exc_info: nbk.ensure_device_type(create_manufacturer=False, create_device_type=False) - self.assertEqual(exc_info.exception.message, "ERROR manufacturer not found: cisco") + self.assertEqual(exc_info.exception.message, "ERROR manufacturer not found: Cisco") self.assertEqual(exc_info.exception.reason, "fail-config") with self.assertRaises(OnboardException) as exc_info: nbk.ensure_device_type(create_manufacturer=True, create_device_type=False) - self.assertEqual(exc_info.exception.message, "ERROR device type not found: csr1000v") + self.assertEqual(exc_info.exception.message, "ERROR device type not found: CSR1000v") self.assertEqual(exc_info.exception.reason, "fail-config") nbk.ensure_device_type(create_manufacturer=True, create_device_type=True) self.assertIsInstance(nbk.manufacturer, Manufacturer) self.assertIsInstance(nbk.device_type, DeviceType) + self.assertEqual(nbk.manufacturer.slug, slugify(self.ndk1.vendor)) + self.assertEqual(nbk.device_type.slug, slugify(self.ndk1.model)) def test_ensure_device_type_present(self): """Verify ensure_device_type function when Manufacturer and DeviceType object are already present.""" @@ -91,9 +94,10 @@ def test_ensure_device_role_not_exist(self): self.assertEqual(exc_info.exception.message, "ERROR device role not found: mytestrole") self.assertEqual(exc_info.exception.reason, "fail-config") - nbk.ensure_device_role(create_device_role=True, default_device_role="mytestrole") + role = "My-Test-Role" + nbk.ensure_device_role(create_device_role=True, default_device_role=role) self.assertIsInstance(nbk.netdev.ot.role, DeviceRole) - self.assertEqual(nbk.netdev.ot.role.slug, "mytestrole") + self.assertEqual(nbk.netdev.ot.role.slug, slugify(role)) def test_ensure_device_role_exist(self): """Verify ensure_device_role function when DeviceRole exist but is not assigned to the OT."""