From 5485381cdee83ec34cb5f32210ef98e01562f7d7 Mon Sep 17 00:00:00 2001
From: karsa zoltan <karsazoltan@gmail.com>
Date: Tue, 30 Aug 2022 18:58:40 +0200
Subject: [PATCH] lease and template serializers and api points

---
 circle/dashboard/serializers.py    | 21 +++++++++++++++++++++
 circle/dashboard/urls.py           |  6 ++++--
 circle/dashboard/views/template.py | 47 ++++++++++++++++++++++++++++++++++++++++++++++-
 circle/dashboard/views/vm.py       | 15 +++++++++++++++
 4 files changed, 86 insertions(+), 3 deletions(-)
 create mode 100644 circle/dashboard/serializers.py

diff --git a/circle/dashboard/serializers.py b/circle/dashboard/serializers.py
new file mode 100644
index 0000000..d432894
--- /dev/null
+++ b/circle/dashboard/serializers.py
@@ -0,0 +1,21 @@
+from rest_framework.renderers import JSONRenderer
+from rest_framework import serializers
+
+from vm.models import InstanceTemplate, Lease
+
+
+class InstanceTemplateSerializer(serializers.ModelSerializer):
+    class Meta:
+        model = InstanceTemplate
+        resource_name = 'template'
+        fields = [ 'id', 'name', 'description', 'parent', 'owner', 'access_method', 'boot_menu', 
+                    'lease', 'raw_data', 'cloud_init', 'ci_meta_data', 'ci_user_data', 'system',
+                    'has_agent', 'num_cores', 'ram_size', 'max_ram_size', 'arch', 'priority']
+
+
+class LeaseSerializer(serializers.ModelSerializer):
+    class Meta:
+        model = Lease
+        resource_name = 'lease'
+        fields = [ 'id', 'name', 'suspend_interval_seconds', 'delete_interval_seconds']
+
diff --git a/circle/dashboard/urls.py b/circle/dashboard/urls.py
index 4e8b2e8..0c312bb 100644
--- a/circle/dashboard/urls.py
+++ b/circle/dashboard/urls.py
@@ -54,7 +54,7 @@ from .views import (
     TransferTemplateOwnershipView, TransferTemplateOwnershipConfirmView,
     OpenSearchDescriptionView,
     NodeActivityView,
-    UserList,
+    UserList, TemplateREST, LeaseREST,
     StorageDetail, DiskDetail,
     MessageList, MessageDetail, MessageCreate, MessageDelete,
     EnableTwoFactorView, DisableTwoFactorView,
@@ -65,7 +65,9 @@ from .views.node import node_ops
 from .views.vm import vm_ops, vm_mass_ops
 
 urlpatterns = [
-    path('acpi/vmlist', iac_vm_list),
+    path('acpi/vm/', iac_vm_list),
+    path('acpi/template/', TemplateREST.as_view()),
+    path('acpi/lease/', LeaseREST.as_view()),
     url(r'^$', IndexView.as_view(), name="dashboard.index"),
     url(r"^profile/list/$", UserList.as_view(),
         name="dashboard.views.user-list"),
diff --git a/circle/dashboard/views/template.py b/circle/dashboard/views/template.py
index b0e47ee..0409b2f 100644
--- a/circle/dashboard/views/template.py
+++ b/circle/dashboard/views/template.py
@@ -26,7 +26,7 @@ from django.contrib.messages.views import SuccessMessageMixin
 from django.urls import reverse, reverse_lazy
 from django.core.exceptions import PermissionDenied, SuspiciousOperation
 from django.db.models import Count
-from django.http import HttpResponse, HttpResponseRedirect
+from django.http import HttpResponse, HttpResponseRedirect, JsonResponse
 from django.shortcuts import redirect, get_object_or_404
 from django.utils import timezone
 from django.utils.translation import ugettext as _, ugettext_noop
@@ -56,6 +56,14 @@ from .util import (
     GraphMixin
 )
 
+from dashboard.serializers import InstanceTemplateSerializer, LeaseSerializer
+
+from rest_framework.authentication import TokenAuthentication, BasicAuthentication
+from rest_framework.permissions import IsAdminUser
+from rest_framework.views import APIView
+from rest_framework.response import Response
+from rest_framework.parsers import JSONParser
+
 try:
     # Python 2: "unicode" is built-in
     unicode
@@ -184,6 +192,43 @@ class TemplateCreate(SuccessMessageMixin, CreateView):
         return reverse_lazy("dashboard.views.template-list")
 
 
+
+class TemplateREST(APIView):
+    authentication_classes = [TokenAuthentication,BasicAuthentication]
+    permission_classes = [IsAdminUser]
+
+    def get(self, request, format=None):
+        templates = InstanceTemplate.objects.all()
+        serializer = InstanceTemplateSerializer(templates, many=True)
+        return JsonResponse({ 'templates': serializer.data}, safe=False)
+
+    def post(self, request, format=None):
+        data = JSONParser().parse(request)
+        serializer = InstanceTemplateSerializer(data=data)
+        if serializer.is_valid():
+            serializer.save()
+            return JsonResponse(serializer.data, status=201)
+        return JsonResponse(serializer.errors, status=400)
+
+
+class LeaseREST(APIView):
+    authentication_classes = [TokenAuthentication, BasicAuthentication]
+    permission_classes = [IsAdminUser]
+
+    def get(self, request, format=None):
+        templates = Lease.objects.all()
+        serializer = LeaseSerializer(templates, many=True)
+        return JsonResponse({ 'leases': serializer.data}, safe=False)
+
+    def post(self, request, format=None):
+        data = JSONParser().parse(request)
+        serializer = LeaseSerializer(data=data)
+        if serializer.is_valid():
+            serializer.save()
+            return JsonResponse(serializer.data, status=201)
+        return JsonResponse(serializer.errors, status=400)
+
+
 class TemplateAclUpdateView(AclUpdateView):
     model = InstanceTemplate
 
diff --git a/circle/dashboard/views/vm.py b/circle/dashboard/views/vm.py
index 53d0d5f..986d5c2 100644
--- a/circle/dashboard/views/vm.py
+++ b/circle/dashboard/views/vm.py
@@ -105,10 +105,25 @@ def iac_vm_list(request):
                 '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'])
+@authentication_classes([TokenAuthentication])
+@permission_classes([IsAdminUser])
+def iac_vm_create(request):
+    return Response()
+
+
 class VmDetailVncTokenView(CheckedDetailView):
     template_name = "dashboard/vm-detail.html"
     model = Instance
--
libgit2 0.26.0