Explorar el Código

Adds verification of device.name configured

Josh VanDeraa hace 5 años
padre
commit
cac48924ae
Se han modificado 1 ficheros con 7 adiciones y 5 borrados
  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'):
         if not request.user.has_perm('dcim.napalm_read'):
             return HttpResponseForbidden()
             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
         # Check for primary IP address from NetBox object
         if device.primary_ip:
         if device.primary_ip:
             host = str(device.primary_ip.address.ip)
             host = str(device.primary_ip.address.ip)
         else:
         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:
             try:
+                # Attempt to complete a DNS name resolution if no primary_ip is set
                 host = socket.gethostbyname(device.name)
                 host = socket.gethostbyname(device.name)
             except socket.gaierror:
             except socket.gaierror:
                 # Name lookup failure
                 # 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.")
                 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
         username = settings.NAPALM_USERNAME
         password = settings.NAPALM_PASSWORD
         password = settings.NAPALM_PASSWORD
         optional_args = settings.NAPALM_ARGS.copy()
         optional_args = settings.NAPALM_ARGS.copy()
@@ -432,6 +433,7 @@ class DeviceViewSet(CustomFieldModelViewSet):
             elif key:
             elif key:
                 optional_args[key.lower()] = request.headers[header]
                 optional_args[key.lower()] = request.headers[header]
 
 
+        # Connect to the device
         d = driver(
         d = driver(
             hostname=host,
             hostname=host,
             username=username,
             username=username,