diff --git a/netbox/dcim/api/urls.py b/netbox/dcim/api/urls.py index 27f3813f2..b10e857e8 100644 --- a/netbox/dcim/api/urls.py +++ b/netbox/dcim/api/urls.py @@ -55,12 +55,6 @@ urlpatterns = [ url(r'', include(router.urls)), url(r'^devices/(?P\d+)/', include(device_router.urls)), - # Racks - url(r'^racks/(?P\d+)/rack-units/$', views.RackUnitListView.as_view(), name='rack_units'), - - # Devices - url(r'^devices/(?P\d+)/lldp-neighbors/$', views.LLDPNeighborsView.as_view(), name='device_lldp-neighbors'), - # Miscellaneous url(r'^related-connections/$', views.RelatedConnectionsView.as_view(), name='related_connections'), url(r'^topology-maps/(?P[\w-]+)/$', TopologyMapView.as_view(), name='topology_map'), diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index 696b306aa..0ddc04b99 100644 --- a/netbox/dcim/api/views.py +++ b/netbox/dcim/api/views.py @@ -70,14 +70,11 @@ class RackViewSet(WritableSerializerMixin, CustomFieldModelViewSet): serializer_class = serializers.RackSerializer filter_class = filters.RackFilter - -class RackUnitListView(APIView): - """ - List rack units (by rack) - """ - - def get(self, request, pk): - + @detail_route(url_path='rack-units') + def rack_units(self, request, pk=None): + """ + List rack units (by rack) + """ rack = get_object_or_404(Rack, pk=pk) face = request.GET.get('face', 0) exclude_pk = request.GET.get('exclude', None) @@ -149,6 +146,28 @@ class DeviceViewSet(WritableSerializerMixin, CustomFieldModelViewSet): filter_class = filters.DeviceFilter renderer_classes = api_settings.DEFAULT_RENDERER_CLASSES + [BINDZoneRenderer, FlatJSONRenderer] + @detail_route(url_path='lldp-neighbors') + def lldp_neighbors(self, request, pk): + """ + Retrieve live LLDP neighbors of a device + """ + device = get_object_or_404(Device, pk=pk) + if not device.primary_ip: + raise ServiceUnavailable("No IP configured for this device.") + + RPC = device.get_rpc_client() + if not RPC: + raise ServiceUnavailable("No RPC client available for this platform ({}).".format(device.platform)) + + # Connect to device and retrieve inventory info + try: + with RPC(device, username=settings.NETBOX_USERNAME, password=settings.NETBOX_PASSWORD) as rpc_client: + lldp_neighbors = rpc_client.get_lldp_neighbors() + except: + raise ServiceUnavailable("Error connecting to the remote device.") + + return Response(lldp_neighbors) + # # Console Ports