Implemented initial virtualization API

This commit is contained in:
Jeremy Stretch 2017-08-08 16:33:34 -04:00
parent d06813f528
commit b67e3ff957
6 changed files with 215 additions and 2 deletions

View File

@ -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

View File

View File

@ -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',
]

View File

@ -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

View File

@ -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

View File

@ -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 %}
"""