Переглянути джерело

Implemented initial virtualization API

Jeremy Stretch 8 роки тому
батько
коміт
b67e3ff957

+ 1 - 0
netbox/netbox/urls.py

@@ -42,6 +42,7 @@ _patterns = [
     url(r'^api/ipam/', include('ipam.api.urls')),
     url(r'^api/secrets/', include('secrets.api.urls')),
     url(r'^api/tenancy/', include('tenancy.api.urls')),
+    url(r'^api/virtualization/', include('virtualization.api.urls')),
     url(r'^api/docs/', swagger_view, name='api_docs'),
 
     # Serving static media in Django to pipe it through LoginRequiredMiddleware

+ 0 - 0
netbox/virtualization/api/__init__.py


+ 139 - 0
netbox/virtualization/api/serializers.py

@@ -0,0 +1,139 @@
+from __future__ import unicode_literals
+
+from rest_framework import serializers
+
+from dcim.api.serializers import NestedPlatformSerializer
+from extras.api.customfields import CustomFieldModelSerializer
+from tenancy.api.serializers import NestedTenantSerializer
+from utilities.api import ModelValidationMixin
+from virtualization.models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface
+
+
+#
+# Cluster types
+#
+
+class ClusterTypeSerializer(ModelValidationMixin, serializers.ModelSerializer):
+
+    class Meta:
+        model = ClusterType
+        fields = ['id', 'name', 'slug']
+
+
+class NestedClusterTypeSerializer(serializers.ModelSerializer):
+    url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:clustertype-detail')
+
+    class Meta:
+        model = ClusterType
+        fields = ['id', 'url', 'name', 'slug']
+
+
+#
+# Cluster groups
+#
+
+class ClusterGroupSerializer(ModelValidationMixin, serializers.ModelSerializer):
+
+    class Meta:
+        model = ClusterGroup
+        fields = ['id', 'name', 'slug']
+
+
+class NestedClusterGroupSerializer(serializers.ModelSerializer):
+    url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:clustergroup-detail')
+
+    class Meta:
+        model = ClusterGroup
+        fields = ['id', 'url', 'name', 'slug']
+
+
+#
+# Clusters
+#
+
+class ClusterSerializer(CustomFieldModelSerializer):
+    type = NestedClusterTypeSerializer()
+    group = NestedClusterGroupSerializer()
+
+    class Meta:
+        model = Cluster
+        fields = ['id', 'name', 'type', 'group', 'comments', 'custom_fields']
+
+
+class NestedClusterSerializer(serializers.ModelSerializer):
+    url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:cluster-detail')
+
+    class Meta:
+        model = Cluster
+        fields = ['id', 'url', 'name']
+
+
+class WritableClusterSerializer(ModelValidationMixin, CustomFieldModelSerializer):
+
+    class Meta:
+        model = Cluster
+        fields = ['id', 'name', 'type', 'group', 'comments', 'custom_fields']
+
+
+#
+# Virtual machines
+#
+
+class VirtualMachineSerializer(CustomFieldModelSerializer):
+    cluster = NestedClusterSerializer()
+    tenant = NestedTenantSerializer()
+    platform = NestedPlatformSerializer()
+
+    class Meta:
+        model = VirtualMachine
+        fields = [
+            'id', 'name', 'cluster', 'tenant', 'platform', 'primary_ip4', 'primary_ip6', 'comments', 'custom_fields',
+        ]
+
+
+class NestedVirtualMachineSerializer(serializers.ModelSerializer):
+    url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:virtualmachine-detail')
+
+    class Meta:
+        model = VirtualMachine
+        fields = ['id', 'url', 'name']
+
+
+class WritableVirtualMachineSerializer(ModelValidationMixin, CustomFieldModelSerializer):
+
+    class Meta:
+        model = Cluster
+        fields = [
+            'id', 'name', 'cluster', 'tenant', 'platform', 'primary_ip4', 'primary_ip6', 'comments', 'custom_fields',
+        ]
+
+
+#
+# VM interfaces
+#
+
+class VMInterfaceSerializer(serializers.ModelSerializer):
+    virtual_machine = NestedVirtualMachineSerializer()
+
+    class Meta:
+        model = VMInterface
+        fields = [
+            'id', 'name', 'virtual_machine', 'enabled', 'mac_address', 'mtu', 'description',
+        ]
+
+
+class NestedVMInterfaceSerializer(serializers.ModelSerializer):
+    url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:vminterface-detail')
+
+    class Meta:
+        model = VMInterface
+        fields = ['id', 'url', 'name']
+
+
+class WritableVMInterfaceSerializer(ModelValidationMixin, serializers.ModelSerializer):
+
+    class Meta:
+        model = VMInterface
+        fields = [
+            'id', 'name', 'virtual_machine', 'enabled', 'mac_address', 'mtu', 'description',
+        ]

+ 29 - 0
netbox/virtualization/api/urls.py

@@ -0,0 +1,29 @@
+from __future__ import unicode_literals
+
+from rest_framework import routers
+
+from . import views
+
+
+class VirtualizationRootView(routers.APIRootView):
+    """
+    Virtualization API root view
+    """
+    def get_view_name(self):
+        return 'Virtualization'
+
+
+router = routers.DefaultRouter()
+router.APIRootView = VirtualizationRootView
+
+# Clusters
+router.register(r'cluster-types', views.ClusterTypeViewSet)
+router.register(r'cluster-groups', views.ClusterGroupViewSet)
+router.register(r'clusters', views.ClusterViewSet)
+
+# VirtualMachines
+router.register(r'virtual-machines', views.VirtualMachineViewSet)
+router.register(r'vm-interfaces', views.VMInterfaceViewSet)
+
+app_name = 'virtualization-api'
+urlpatterns = router.urls

+ 44 - 0
netbox/virtualization/api/views.py

@@ -0,0 +1,44 @@
+from __future__ import unicode_literals
+
+from rest_framework.viewsets import ModelViewSet
+
+from extras.api.views import CustomFieldModelViewSet
+from utilities.api import WritableSerializerMixin
+from virtualization.models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface
+from . import serializers
+
+
+#
+# Clusters
+#
+
+class ClusterTypeViewSet(ModelViewSet):
+    queryset = ClusterType.objects.all()
+    serializer_class = serializers.ClusterTypeSerializer
+
+
+class ClusterGroupViewSet(ModelViewSet):
+    queryset = ClusterGroup.objects.all()
+    serializer_class = serializers.ClusterGroupSerializer
+
+
+class ClusterViewSet(WritableSerializerMixin, CustomFieldModelViewSet):
+    queryset = Cluster.objects.select_related('type', 'group')
+    serializer_class = serializers.ClusterSerializer
+    write_serializer_class = serializers.WritableClusterSerializer
+
+
+#
+# Virtual machines
+#
+
+class VirtualMachineViewSet(WritableSerializerMixin, CustomFieldModelViewSet):
+    queryset = VirtualMachine.objects.all()
+    serializer_class = serializers.VirtualMachineSerializer
+    write_serializer_class = serializers.WritableVirtualMachineSerializer
+
+
+class VMInterfaceViewSet(WritableSerializerMixin, ModelViewSet):
+    queryset = VMInterface.objects.select_related('virtual_machine')
+    serializer_class = serializers.VMInterfaceSerializer
+    write_serializer_class = serializers.WritableVMInterfaceSerializer

+ 2 - 2
netbox/virtualization/tables.py

@@ -9,13 +9,13 @@ from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterf
 
 CLUSTERTYPE_ACTIONS = """
 {% if perms.virtualization.change_clustertype %}
-    <a href="{% url 'virtualization:clustertype_edit' pk=record.pk %}" class="btn btn-xs btn-warning"><i class="glyphicon glyphicon-pencil" aria-hidden="true"></i></a>
+    <a href="{% url 'virtualization:clustertype_edit' slug=record.slug %}" class="btn btn-xs btn-warning"><i class="glyphicon glyphicon-pencil" aria-hidden="true"></i></a>
 {% endif %}
 """
 
 CLUSTERGROUP_ACTIONS = """
 {% if perms.virtualization.change_clustergroup %}
-    <a href="{% url 'virtualization:clustergroup_edit' pk=record.pk %}" class="btn btn-xs btn-warning"><i class="glyphicon glyphicon-pencil" aria-hidden="true"></i></a>
+    <a href="{% url 'virtualization:clustergroup_edit' slug=record.slug %}" class="btn btn-xs btn-warning"><i class="glyphicon glyphicon-pencil" aria-hidden="true"></i></a>
 {% endif %}
 """