mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-24 17:38:37 -06:00
Implemented initial virtualization API
This commit is contained in:
parent
d06813f528
commit
b67e3ff957
@ -42,6 +42,7 @@ _patterns = [
|
|||||||
url(r'^api/ipam/', include('ipam.api.urls')),
|
url(r'^api/ipam/', include('ipam.api.urls')),
|
||||||
url(r'^api/secrets/', include('secrets.api.urls')),
|
url(r'^api/secrets/', include('secrets.api.urls')),
|
||||||
url(r'^api/tenancy/', include('tenancy.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'),
|
url(r'^api/docs/', swagger_view, name='api_docs'),
|
||||||
|
|
||||||
# Serving static media in Django to pipe it through LoginRequiredMiddleware
|
# Serving static media in Django to pipe it through LoginRequiredMiddleware
|
||||||
|
0
netbox/virtualization/api/__init__.py
Normal file
0
netbox/virtualization/api/__init__.py
Normal file
139
netbox/virtualization/api/serializers.py
Normal file
139
netbox/virtualization/api/serializers.py
Normal 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',
|
||||||
|
]
|
29
netbox/virtualization/api/urls.py
Normal file
29
netbox/virtualization/api/urls.py
Normal 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
|
44
netbox/virtualization/api/views.py
Normal file
44
netbox/virtualization/api/views.py
Normal 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
|
@ -9,13 +9,13 @@ from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterf
|
|||||||
|
|
||||||
CLUSTERTYPE_ACTIONS = """
|
CLUSTERTYPE_ACTIONS = """
|
||||||
{% if perms.virtualization.change_clustertype %}
|
{% 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 %}
|
{% endif %}
|
||||||
"""
|
"""
|
||||||
|
|
||||||
CLUSTERGROUP_ACTIONS = """
|
CLUSTERGROUP_ACTIONS = """
|
||||||
{% if perms.virtualization.change_clustergroup %}
|
{% 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 %}
|
{% endif %}
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user