Commit 80829ebb by Karsa Zoltán István

create instances via rest and add disk

parent bf49a963
from rest_framework.renderers import JSONRenderer from rest_framework.renderers import JSONRenderer
from rest_framework import serializers from rest_framework import serializers
from vm.models import InstanceTemplate, Lease from vm.models import Instance, InstanceTemplate, Lease, Interface
from firewall.models import Vlan
from storage.models import Disk from storage.models import Disk
...@@ -24,3 +25,33 @@ class DiskSerializer(serializers.ModelSerializer): ...@@ -24,3 +25,33 @@ class DiskSerializer(serializers.ModelSerializer):
model = Disk model = Disk
fields = ['id', 'name', 'filename', 'datastore', 'type', 'bus', 'size', 'base', fields = ['id', 'name', 'filename', 'datastore', 'type', 'bus', 'size', 'base',
'dev_num', 'destroyed', 'ci_disk', 'is_ready'] 'dev_num', 'destroyed', 'ci_disk', 'is_ready']
class InstanceSerializer(serializers.ModelSerializer):
ipv4addr = serializers.SerializerMethodField('get_ipv4')
ipv6addr = serializers.SerializerMethodField('get_ipv6')
def get_ipv4(self, i):
return str(i.ipv4)
def get_ipv6(self, i):
return str(i.ipv6)
class Meta:
model = Instance
fields = ['id', 'name', 'description', 'status', 'owner', 'access_method', 'boot_menu', 'pw', 'is_base',
'lease', 'raw_data', 'cloud_init', 'ci_meta_data', 'ci_user_data', 'system', 'req_traits',
'has_agent', 'num_cores', 'ram_size', 'max_ram_size', 'arch', 'priority', 'disks', 'node', 'ipv4addr', 'ipv6addr']
extra_kwargs = {'disks': {'required': False}}
class InterfaceSerializer(serializers.ModelSerializer):
class Meta:
model = Interface
fields = ['id', 'vlan', 'host', 'instance', 'model']
class VlanSerializer(serializers.ModelSerializer):
class Meta:
model = Vlan
fields = ['id', 'vid', 'name', 'description', 'comment', 'domain']
\ No newline at end of file
...@@ -54,21 +54,22 @@ from .views import ( ...@@ -54,21 +54,22 @@ from .views import (
TransferTemplateOwnershipView, TransferTemplateOwnershipConfirmView, TransferTemplateOwnershipView, TransferTemplateOwnershipConfirmView,
OpenSearchDescriptionView, OpenSearchDescriptionView,
NodeActivityView, NodeActivityView,
UserList, TemplateREST, LeaseREST, DiskRest, UserList, TemplateREST, LeaseREST, DiskRest, InstanceREST, InterfaceREST,
StorageDetail, DiskDetail, StorageDetail, DiskDetail,
MessageList, MessageDetail, MessageCreate, MessageDelete, MessageList, MessageDetail, MessageCreate, MessageDelete,
EnableTwoFactorView, DisableTwoFactorView, EnableTwoFactorView, DisableTwoFactorView,
AclUserGroupAutocomplete, AclUserAutocomplete, AclUserGroupAutocomplete, AclUserAutocomplete,
RescheduleView, GroupImportView, GroupExportView, iac_vm_list RescheduleView, GroupImportView, GroupExportView,
) )
from .views.node import node_ops from .views.node import node_ops
from .views.vm import vm_ops, vm_mass_ops from .views.vm import vm_ops, vm_mass_ops
urlpatterns = [ urlpatterns = [
path('acpi/vm/', iac_vm_list), path('acpi/vm/', InstanceREST.as_view()),
path('acpi/template/', TemplateREST.as_view()), path('acpi/template/', TemplateREST.as_view()),
path('acpi/lease/', LeaseREST.as_view()), path('acpi/lease/', LeaseREST.as_view()),
path('acpi/disk/', DiskRest.as_view()), path('acpi/disk/', DiskRest.as_view()),
path('acpi/interface/', InterfaceREST.as_view()),
url(r'^$', IndexView.as_view(), name="dashboard.index"), url(r'^$', IndexView.as_view(), name="dashboard.index"),
url(r"^profile/list/$", UserList.as_view(), url(r"^profile/list/$", UserList.as_view(),
name="dashboard.views.user-list"), name="dashboard.views.user-list"),
......
...@@ -74,7 +74,7 @@ from ..forms import ( ...@@ -74,7 +74,7 @@ from ..forms import (
from django.views.generic.edit import FormMixin from django.views.generic.edit import FormMixin
from request.models import TemplateAccessType, LeaseType from request.models import TemplateAccessType, LeaseType
from request.forms import LeaseRequestForm, TemplateRequestForm from request.forms import LeaseRequestForm, TemplateRequestForm
from ..models import Favourite from ..models import Favourite, pwgen
from manager.scheduler import has_traits from manager.scheduler import has_traits
...@@ -88,40 +88,64 @@ logger = logging.getLogger(__name__) ...@@ -88,40 +88,64 @@ logger = logging.getLogger(__name__)
from rest_framework import status from rest_framework import status
from rest_framework.views import APIView
from rest_framework.decorators import api_view, authentication_classes, permission_classes from rest_framework.decorators import api_view, authentication_classes, permission_classes
from rest_framework.response import Response from rest_framework.parsers import JSONParser
from rest_framework.authentication import TokenAuthentication from rest_framework.authentication import TokenAuthentication, BasicAuthentication
from rest_framework.permissions import IsAdminUser from rest_framework.permissions import IsAdminUser
@api_view(['GET']) from dashboard.serializers import InstanceSerializer, InterfaceSerializer
@authentication_classes([TokenAuthentication])
@permission_classes([IsAdminUser])
def iac_vm_list(request):
instances = Instance.objects.all()
instances = [{
'pk': i.pk,
'url': reverse('dashboard.views.detail', args=[i.pk]),
'name': i.name,
'host': i.short_hostname,
'status': i.get_status_display(),
'owner': (i.owner.profile.get_display_name()),
'node': i.node,
'timesuspend': i.time_of_suspend,
'timedelete': i.time_of_delete,
'timedestroy': i.destroyed_at,
'userdata': i.get_user_data,
'metadata': i.get_meta_data,
'template': i.template.pk if i.template else None,
'users': list({ 'username': u.username, 'level': l } for u, l in i.get_users_with_level()),
} for i in instances]
return Response(instances)
@api_view(['POST']) class InterfaceREST(APIView):
@authentication_classes([TokenAuthentication]) authentication_classes = [TokenAuthentication,BasicAuthentication]
@permission_classes([IsAdminUser]) permission_classes = [IsAdminUser]
def iac_vm_create(request):
return Response() def get(self, request, format=None):
templates = Interface.objects.all()
serializer = InterfaceSerializer(templates, many=True)
return JsonResponse({ 'interfaces': serializer.data}, safe=False)
class InstanceREST(APIView):
authentication_classes = [TokenAuthentication,BasicAuthentication]
permission_classes = [IsAdminUser]
def get(self, request, format=None):
templates = Instance.objects.all()
serializer = InstanceSerializer(templates, many=True)
return JsonResponse({ 'instances': serializer.data}, safe=False)
def post(self, request, format=None):
data = JSONParser().parse(request)
data['pw'] = pwgen()
data['status'] = 'STOPPED'
serializer = InstanceSerializer(data=data)
if serializer.is_valid():
inst = serializer.save()
networks = []
for v in data['vlans']:
v = Vlan.objects.filter(vid=v).get()
if not v.has_level(request.user, "user"):
raise PermissionDenied()
networks.append(InterfaceTemplate(vlan=v, managed=v.managed))
def __on_commit(activity):
activity.resultant_state = 'PENDING'
with inst.activity(code_suffix='create',
readable_name=ugettext_noop("create instance (REST)"),
on_commit=__on_commit, user=inst.owner) as act:
for net in networks:
Interface.create(instance=inst, vlan=net.vlan,
owner=inst.owner, managed=net.managed,
base_activity=act)
if 'create_disk' in data:
inst.create_disk(size=data['createdisk']['size'], user=inst.owner,
name=data['createdisk']['name'], activity=None)
return JsonResponse(serializer.data, status=201)
return JsonResponse(serializer.errors, status=400)
class VmDetailVncTokenView(CheckedDetailView): class VmDetailVncTokenView(CheckedDetailView):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment