diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index 1493caec9..007217e44 100644 --- a/netbox/dcim/api/views.py +++ b/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,