Browse Source

Moved rack units and device LLDP neighbors views into model viewsets

Jeremy Stretch 8 years ago
parent
commit
173a6eee03
2 changed files with 27 additions and 14 deletions
  1. 0 6
      netbox/dcim/api/urls.py
  2. 27 8
      netbox/dcim/api/views.py

+ 0 - 6
netbox/dcim/api/urls.py

@@ -55,12 +55,6 @@ urlpatterns = [
     url(r'', include(router.urls)),
     url(r'', include(router.urls)),
     url(r'^devices/(?P<pk>\d+)/', include(device_router.urls)),
     url(r'^devices/(?P<pk>\d+)/', include(device_router.urls)),
 
 
-    # Racks
-    url(r'^racks/(?P<pk>\d+)/rack-units/$', views.RackUnitListView.as_view(), name='rack_units'),
-
-    # Devices
-    url(r'^devices/(?P<pk>\d+)/lldp-neighbors/$', views.LLDPNeighborsView.as_view(), name='device_lldp-neighbors'),
-
     # Miscellaneous
     # Miscellaneous
     url(r'^related-connections/$', views.RelatedConnectionsView.as_view(), name='related_connections'),
     url(r'^related-connections/$', views.RelatedConnectionsView.as_view(), name='related_connections'),
     url(r'^topology-maps/(?P<slug>[\w-]+)/$', TopologyMapView.as_view(), name='topology_map'),
     url(r'^topology-maps/(?P<slug>[\w-]+)/$', TopologyMapView.as_view(), name='topology_map'),

+ 27 - 8
netbox/dcim/api/views.py

@@ -70,14 +70,11 @@ class RackViewSet(WritableSerializerMixin, CustomFieldModelViewSet):
     serializer_class = serializers.RackSerializer
     serializer_class = serializers.RackSerializer
     filter_class = filters.RackFilter
     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)
         rack = get_object_or_404(Rack, pk=pk)
         face = request.GET.get('face', 0)
         face = request.GET.get('face', 0)
         exclude_pk = request.GET.get('exclude', None)
         exclude_pk = request.GET.get('exclude', None)
@@ -149,6 +146,28 @@ class DeviceViewSet(WritableSerializerMixin, CustomFieldModelViewSet):
     filter_class = filters.DeviceFilter
     filter_class = filters.DeviceFilter
     renderer_classes = api_settings.DEFAULT_RENDERER_CLASSES + [BINDZoneRenderer, FlatJSONRenderer]
     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
 # Console Ports