Commit 39db4eb2 by Karsa Zoltán István

template deploy

parent 355ad49c
...@@ -31,7 +31,7 @@ class GroupSerializer(serializers.ModelSerializer): ...@@ -31,7 +31,7 @@ class GroupSerializer(serializers.ModelSerializer):
class UserSerializer(serializers.ModelSerializer): class UserSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = User model = User
fields = ('id', 'username', 'email', 'is_staff', 'groups') fields = ('id', 'username', 'email', 'is_staff', 'groups', 'is_superuser', 'first_name', 'last_name')
class NodeSerializer(serializers.ModelSerializer): class NodeSerializer(serializers.ModelSerializer):
...@@ -121,6 +121,9 @@ class DownloadDiskSerializer(serializers.Serializer): ...@@ -121,6 +121,9 @@ class DownloadDiskSerializer(serializers.Serializer):
url = serializers.CharField(max_length=500) url = serializers.CharField(max_length=500)
name = serializers.CharField(max_length=100) name = serializers.CharField(max_length=100)
class CreateTemplateSerializer(serializers.Serializer):
name = serializers.CharField(max_length=100)
class DestroyDiskSerializer(serializers.Serializer): class DestroyDiskSerializer(serializers.Serializer):
disk = serializers.IntegerField() disk = serializers.IntegerField()
instance = serializers.IntegerField(required=False) instance = serializers.IntegerField(required=False)
......
...@@ -59,10 +59,10 @@ from .views import ( ...@@ -59,10 +59,10 @@ from .views import (
DownloadDiskREST, GetInstanceREST, GetInterfaceREST, ShutdownInstanceREST, DownloadDiskREST, GetInstanceREST, GetInterfaceREST, ShutdownInstanceREST,
GetLeaseREST, GetDiskRest, DeployInstanceREST, CreateDiskREST, GetLeaseREST, GetDiskRest, DeployInstanceREST, CreateDiskREST,
VlanREST, ResizeDiskREST, GetVlanREST, DestroyDiskREST, VlanREST, ResizeDiskREST, GetVlanREST, DestroyDiskREST,
StorageDetail, DiskDetail, UserREST, GroupREST, StorageDetail, DiskDetail, UserREST, GroupREST, CreateTemplateREST,
InstanceActivityREST, GetInstanceActivityREST, GetGroupREST, GetUserREST, InstanceActivityREST, GetInstanceActivityREST, GetGroupREST, GetUserREST,
SleepInstanceREST, WakeUpInstanceREST, DownloadPersistentDiskREST, SleepInstanceREST, WakeUpInstanceREST, DownloadPersistentDiskREST,
CreatePersistentDiskREST, GetStorageActivityREST, CreatePersistentDiskREST, GetStorageActivityREST, GetTemplateREST,
MessageList, MessageDetail, MessageCreate, MessageDelete, MessageList, MessageDetail, MessageCreate, MessageDelete,
EnableTwoFactorView, DisableTwoFactorView, EnableTwoFactorView, DisableTwoFactorView,
AclUserGroupAutocomplete, AclUserAutocomplete, AclUserGroupAutocomplete, AclUserAutocomplete,
...@@ -85,6 +85,7 @@ urlpatterns = [ ...@@ -85,6 +85,7 @@ urlpatterns = [
path('acpi/node/', NodeREST.as_view()), path('acpi/node/', NodeREST.as_view()),
path('acpi/node/<int:pk>/', GetNodeREST.as_view()), path('acpi/node/<int:pk>/', GetNodeREST.as_view()),
path('acpi/vm/<int:pk>/', GetInstanceREST.as_view()), path('acpi/vm/<int:pk>/', GetInstanceREST.as_view()),
path('acpi/template/<int:pk>/', GetTemplateREST.as_view()),
path('acpi/template/', TemplateREST.as_view()), path('acpi/template/', TemplateREST.as_view()),
path('acpi/ft/', InstanceFromTemplateREST.as_view()), path('acpi/ft/', InstanceFromTemplateREST.as_view()),
path('acpi/lease/', LeaseREST.as_view()), path('acpi/lease/', LeaseREST.as_view()),
...@@ -104,6 +105,7 @@ urlpatterns = [ ...@@ -104,6 +105,7 @@ urlpatterns = [
path('acpi/vm/<int:pk>/wakeup/', WakeUpInstanceREST.as_view()), path('acpi/vm/<int:pk>/wakeup/', WakeUpInstanceREST.as_view()),
path('acpi/vm/<int:pk>/resizedisk/', ResizeDiskREST.as_view()), path('acpi/vm/<int:pk>/resizedisk/', ResizeDiskREST.as_view()),
path('acpi/vm/<int:pk>/destroydisk/', DestroyDiskREST.as_view()), path('acpi/vm/<int:pk>/destroydisk/', DestroyDiskREST.as_view()),
path('acpi/vm/<int:pk>/saveastemplate/', CreateTemplateREST.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"),
......
...@@ -211,6 +211,18 @@ class TemplateREST(APIView): ...@@ -211,6 +211,18 @@ class TemplateREST(APIView):
return JsonResponse(serializer.data, status=201) return JsonResponse(serializer.data, status=201)
return JsonResponse(serializer.errors, status=400) return JsonResponse(serializer.errors, status=400)
class GetTemplateREST(APIView):
authentication_classes = [TokenAuthentication,BasicAuthentication]
permission_classes = [IsAdminUser]
def get(self, request, pk, format=None):
templates = InstanceTemplate.objects.get(pk=pk)
serializer = InstanceTemplateSerializer(templates, many=False)
return JsonResponse(serializer.data, safe=False)
def delete(self, request, pk, format=None):
return JsonResponse(status=400)
class InstanceFromTemplateREST(APIView): class InstanceFromTemplateREST(APIView):
authentication_classes = [TokenAuthentication,BasicAuthentication] authentication_classes = [TokenAuthentication,BasicAuthentication]
......
...@@ -49,7 +49,7 @@ from braces.views import SuperuserRequiredMixin, LoginRequiredMixin ...@@ -49,7 +49,7 @@ from braces.views import SuperuserRequiredMixin, LoginRequiredMixin
from storage.tasks import storage_tasks from storage.tasks import storage_tasks
from vm.tasks.local_tasks import abortable_async_downloaddisk_operation from vm.tasks.local_tasks import abortable_async_downloaddisk_operation
from vm.operations import (DeployOperation, DestroyOperation, DownloadDiskOperation, ShutdownOperation, RenewOperation, from vm.operations import (DeployOperation, DestroyOperation, DownloadDiskOperation, ShutdownOperation, RenewOperation,
ResizeDiskOperation, RemoveDiskOperation, SleepOperation, WakeUpOperation, AddPortOperation, ResizeDiskOperation, RemoveDiskOperation, SleepOperation, WakeUpOperation, AddPortOperation, SaveAsTemplateOperation,
) )
from common.models import ( from common.models import (
...@@ -103,7 +103,7 @@ from rest_framework.authentication import TokenAuthentication, BasicAuthenticati ...@@ -103,7 +103,7 @@ from rest_framework.authentication import TokenAuthentication, BasicAuthenticati
from rest_framework.permissions import IsAdminUser from rest_framework.permissions import IsAdminUser
from dashboard.serializers import ( from dashboard.serializers import (
DiskSerializer, InstanceSerializer, InterfaceSerializer, CreateDiskSerializer, DownloadDiskSerializer, CreateTemplateSerializer, DiskSerializer, InstanceSerializer, InterfaceSerializer, CreateDiskSerializer, DownloadDiskSerializer,
VMDeploySerializer, VlanSerializer, ResizeDiskSerializer, InstanceActivitySerializer, DestroyDiskSerializer, StorageActivitySerializer, VMDeploySerializer, VlanSerializer, ResizeDiskSerializer, InstanceActivitySerializer, DestroyDiskSerializer, StorageActivitySerializer,
AddPortSerializer, AddPortSerializer,
) )
...@@ -219,6 +219,7 @@ class InstanceREST(APIView): ...@@ -219,6 +219,7 @@ class InstanceREST(APIView):
data['pw'] = pwgen() data['pw'] = pwgen()
req_deploy = False req_deploy = False
if 'status' in data: if 'status' in data:
logger.debug(' vm-status: ' + data['status'])
req_deploy = data['status'] == "RUNNING" req_deploy = data['status'] == "RUNNING"
data['status'] = 'STOPPED' data['status'] = 'STOPPED'
if 'owner' not in data: if 'owner' not in data:
...@@ -255,8 +256,9 @@ class InstanceREST(APIView): ...@@ -255,8 +256,9 @@ class InstanceREST(APIView):
disk.dev_num = devnums.pop(0) disk.dev_num = devnums.pop(0)
disk.save() disk.save()
if req_deploy: if req_deploy:
DeployOperation(inst).call(node=None, user=inst.owner) DeployOperation(inst).call(node=None, user=inst.owner)
return JsonResponse(serializer.data, status=201) return JsonResponse(serializer.data, status=201)
return JsonResponse(serializer.errors, status=400) return JsonResponse(serializer.errors, status=400)
...@@ -375,6 +377,23 @@ class DownloadDiskREST(APIView): ...@@ -375,6 +377,23 @@ class DownloadDiskREST(APIView):
return JsonResponse(serializer.data, status=201) return JsonResponse(serializer.data, status=201)
return JsonResponse(serializer.errors, status=400) return JsonResponse(serializer.errors, status=400)
class CreateTemplateREST(APIView):
authentication_classes = [TokenAuthentication,BasicAuthentication]
permission_classes = [IsAdminUser]
def post(self, request, pk, format=None):
data = JSONParser().parse(request)
serializer = CreateTemplateSerializer(data=data)
if serializer.is_valid():
vm_id = pk
template_name = str(data['name'])
instance = Instance.objects.get(pk=vm_id)
SaveAsTemplateOperation(instance)._async(name=template_name, user=instance.owner)
act = instance.get_latest_activity_in_progress()
serializer = InstanceActivitySerializer(act, many=False)
return JsonResponse(serializer.data, status=201)
return JsonResponse(serializer.errors, status=400)
class CreateDiskREST(APIView): class CreateDiskREST(APIView):
authentication_classes = [TokenAuthentication,BasicAuthentication] authentication_classes = [TokenAuthentication,BasicAuthentication]
permission_classes = [IsAdminUser] permission_classes = [IsAdminUser]
......
...@@ -36,7 +36,7 @@ from django.urls import reverse ...@@ -36,7 +36,7 @@ from django.urls import reverse
from django.db.models import Q from django.db.models import Q
from django.utils import timezone from django.utils import timezone
from django.utils.translation import ugettext as _, ugettext_noop from django.utils.translation import ugettext as _, ugettext_noop
from re import search from re import search, template
from sizefield.utils import filesizeformat from sizefield.utils import filesizeformat
from common.models import ( from common.models import (
...@@ -929,8 +929,8 @@ class SaveAsTemplateOperation(InstanceOperation): ...@@ -929,8 +929,8 @@ class SaveAsTemplateOperation(InstanceOperation):
raise raise
else: else:
return create_readable( return create_readable(
ugettext_noop("New template: %(template)s"), ugettext_noop("New template: %(template)s (%(template_id)s)"),
template=reverse('dashboard.views.template-detail', template_id=tmpl.id, template=reverse('dashboard.views.template-detail',
kwargs={'pk': tmpl.pk})) kwargs={'pk': tmpl.pk}))
......
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