Parcourir la source

Adds verification of device.name configured

Josh VanDeraa il y a 5 ans
Parent
commit
cac48924ae
1 fichiers modifiés avec 7 ajouts et 5 suppressions
  1. 7 5
      netbox/dcim/api/views.py

+ 7 - 5
netbox/dcim/api/views.py

@@ -398,21 +398,22 @@ class DeviceViewSet(CustomFieldModelViewSet):
         if not request.user.has_perm('dcim.napalm_read'):
             return HttpResponseForbidden()
 
-        # Connect to the device
-        napalm_methods = request.GET.getlist('method')
-        response = OrderedDict([(m, None) for m in napalm_methods])
-
         # Check for primary IP address from NetBox object
         if device.primary_ip:
             host = str(device.primary_ip.address.ip)
         else:
-            # Attempt to complete a DNS name resolution if no primary_ip is set
+            # Raise exception for no IP address and no Name if device.name does not exist
+            if not device.name:
+                raise ServiceUnavailable("This device does not have a primary IP address or device name to lookup configured.")
             try:
+                # Attempt to complete a DNS name resolution if no primary_ip is set
                 host = socket.gethostbyname(device.name)
             except socket.gaierror:
                 # Name lookup failure
                 raise ServiceUnavailable(f"Name lookup failure, unable to resolve IP address for {device.name}. Please set Primary IP or setup name resolution.")
 
+        napalm_methods = request.GET.getlist('method')
+        response = OrderedDict([(m, None) for m in napalm_methods])
         username = settings.NAPALM_USERNAME
         password = settings.NAPALM_PASSWORD
         optional_args = settings.NAPALM_ARGS.copy()
@@ -432,6 +433,7 @@ class DeviceViewSet(CustomFieldModelViewSet):
             elif key:
                 optional_args[key.lower()] = request.headers[header]
 
+        # Connect to the device
         d = driver(
             hostname=host,
             username=username,