Commit e638f2fd by Bodor Máté

Create template views

parent 47e13094
from django.contrib import admin from django.contrib import admin
from image.models import Image from image.models import Image
from image.models import Disk
admin.site.register(Image) admin.site.register(Image)
admin.site.register(Disk)
...@@ -3,6 +3,7 @@ from django.contrib.auth.models import User ...@@ -3,6 +3,7 @@ from django.contrib.auth.models import User
from django.conf import settings from django.conf import settings
from interface_openstack.implementation.vm.instance import OSVirtualMachineManager from interface_openstack.implementation.vm.instance import OSVirtualMachineManager
from interface_openstack.implementation.image.openstack_image_manager import OpenstackImageManager
class Disk(models.Model): class Disk(models.Model):
...@@ -70,9 +71,9 @@ class Image(models.Model): ...@@ -70,9 +71,9 @@ class Image(models.Model):
@classmethod @classmethod
def create_from_instance(cls, user, instance_remote_id, description): def create_from_instance(cls, user, instance, description):
interface = OSVirtualMachineManager(settings.CONNECTION) interface = OSVirtualMachineManager(settings.CONNECTION)
remote_image = interface.create_image(instance_remote_id) remote_image = interface.create_image(instance.remote_id)
remote_id = remote_image.id remote_id = remote_image.id
name = remote_image.name name = remote_image.name
new_image = cls.create( new_image = cls.create(
...@@ -83,3 +84,16 @@ class Image(models.Model): ...@@ -83,3 +84,16 @@ class Image(models.Model):
description=description description=description
) )
return new_image return new_image
@classmethod
def create_from_user(cls, description, file_format, image_file, name, user):
interface = OpenstackImageManager(settings.CONNECTION)
remote_image = interface.upload_file(name=name, path=image_file.temporary_file_path(), format=file_format)
new_image = cls.create(
name=name,
remote_id=remote_image.id,
created_by=user,
uploaded_by_user=True,
description=description
)
return new_image
from rest_framework import serializers from rest_framework import serializers
from .models import Disk from .models import Image
class DiskSerializer(serializers.ModelSerializer): class ImageSerializer(serializers.ModelSerializer):
image_file = serializers.FileField(write_only=True)
file_format = serializers.CharField(max_length=10, write_only=True)
class Meta: class Meta:
model = Disk model = Image
fields = ("name", "remote_ID") fields = (
"name",
"remote_id",
"description",
"image_file",
"file_format",
"created_at",
"uploaded_by_user",
"created_by",
)
read_only_fields = ("created_at", "uploaded_by_user", "created_by", "remote_id", )
from django.urls import path from rest_framework import routers
from rest_framework.urlpatterns import format_suffix_patterns
from image import views from image import views
urlpatterns = [path("", views.DiskList.as_view())] router = routers.DefaultRouter()
router.register(r"images", views.ImageViewSet, basename="image")
urlpatterns = format_suffix_patterns(urlpatterns) urlpatterns = router.urls
# from django.shortcuts import render # from django.shortcuts import render
from rest_framework.views import APIView from rest_framework.viewsets import ModelViewSet
from rest_framework.response import Response from rest_framework.response import Response
from django.conf import settings from django.http import HttpResponse
from image.serializers import DiskSerializer from image.models import Image
from image.models import Disk from image.serializers import ImageSerializer
from interface_openstack.implementation.image.openstack_image_manager import (
OpenstackImageManager
)
class DiskList(APIView): class ImageViewSet(ModelViewSet):
def get(self, request, format=None): serializer_class=ImageSerializer
# OpenStack queryset=Image.objects.all()
interface = OpenstackImageManager(settings.CONNECTION) # def list(self, request):
return Response([disk.__dict__ for disk in interface.list()]) # return HttpResponse("list")
# Create response def create(self, request):
disks = Disk.object.all() serializer = ImageSerializer(data=request.data)
serializer = DiskSerializer(disks, many=True) serializer.is_valid(raise_exception=True)
data = serializer.validated_data
new_image =Image.create_from_user(
description=data['description'],
file_format=data['file_format'],
image_file=data['image_file'],
name=data['name'],
user=request.user
)
serializer = ImageSerializer(instance=new_image)
return Response(serializer.data) return Response(serializer.data)
# def retrieve(self, request, pk=None):
# return HttpResponse("retrive")
# def update(self, request, pk=None):
# return HttpResponse("update")
# def partial_update(self, request, pk=None):
# return HttpResponse("patch")
# def destroy(self, request, pk=None):
# return HttpResponse("delete")
from instance.serializers import InstanceSerializer, FlavorSerializer
from django.http import Http404 from django.http import Http404
from django.conf import settings from django.conf import settings
from rest_framework.views import APIView from rest_framework.views import APIView
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework import status from rest_framework import status
from interface_openstack.implementation.vm.instance import ( from interface_openstack.implementation.vm.instance import (
OSVirtualMachineManager OSVirtualMachineManager
) )
from template.models import ImageTemplate
from instance.models import Instance, Flavor, Lease from instance.models import Instance, Flavor, Lease
from instance.serializers import InstanceSerializer, FlavorSerializer
class InstanceList(APIView): class InstanceList(APIView):
......
...@@ -21,7 +21,7 @@ from rest_framework_swagger.views import get_swagger_view ...@@ -21,7 +21,7 @@ from rest_framework_swagger.views import get_swagger_view
schema_view = get_swagger_view(title="RECIRCLE API") schema_view = get_swagger_view(title="RECIRCLE API")
urlpatterns = [ urlpatterns = [
path("images/", include("image.urls")), path("api/v1/", include("image.urls")),
path("api/v1/", include("instance.urls")), path("api/v1/", include("instance.urls")),
path("api/v1/", include("template.urls")), path("api/v1/", include("template.urls")),
path("admin/", admin.site.urls), path("admin/", admin.site.urls),
......
# Generated by Django 2.2.3 on 2019-07-19 14:16
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('template', '0005_auto_20190717_0948'),
]
operations = [
migrations.AlterField(
model_name='imagetemplate',
name='type',
field=models.CharField(choices=[('U', 'User create the template from image'), ('I', 'Template created from instance'), ('P', '"Pure" template')], default='U', max_length=10),
),
]
...@@ -76,7 +76,7 @@ class ImageTemplate(BaseTemplate): ...@@ -76,7 +76,7 @@ class ImageTemplate(BaseTemplate):
TYPES = ( TYPES = (
('U', 'User create the template from image'), ('U', 'User create the template from image'),
('I', 'Template created from instance'), ('I', 'Template created from instance'),
('D', 'Default "Pure" template'), ('P', '"Pure" template'),
) )
...@@ -86,11 +86,11 @@ class ImageTemplate(BaseTemplate): ...@@ -86,11 +86,11 @@ class ImageTemplate(BaseTemplate):
on_delete=models.CASCADE, on_delete=models.CASCADE,
help_text="" help_text=""
) )
type = models.CharField(max_length=10, choices=TYPES) type = models.CharField(max_length=10, choices=TYPES, default="U")
@classmethod @classmethod
def create(cls, name, description, image, lease, flavor, created_by): def create(cls, name, description, image, lease, flavor, created_by, type='U'):
inst = cls(name=name, description=description, image=image, lease=lease, flavor=flavor, created_by=created_by) inst = cls(name=name, description=description, image=image, lease=lease, flavor=flavor, created_by=created_by, type=type)
inst.full_clean() inst.full_clean()
inst.save() inst.save()
...@@ -98,14 +98,15 @@ class ImageTemplate(BaseTemplate): ...@@ -98,14 +98,15 @@ class ImageTemplate(BaseTemplate):
@classmethod @classmethod
def create_from_instance(cls, name, description, instance_remote_id, lease, flavor, user): def create_from_instance(cls, name, description, instance, user):
image = Image.create_from_instance(user, instance_remote_id, description) image = Image.create_from_instance(user, instance, description)
new_template = cls.create( new_template = cls.create(
name=name, name=name,
description=description, description=description,
created_by=user, created_by=user,
image = image, image = image,
lease=lease, lease=instance.lease,
flavor=flavor flavor=instance.flavor,
type="I"
) )
return new_template return new_template
...@@ -3,12 +3,26 @@ from rest_framework import serializers ...@@ -3,12 +3,26 @@ from rest_framework import serializers
from template.models import ImageTemplate from template.models import ImageTemplate
class InstanceTemplateSerializer(serializers.Serializer): class InstanceFromTemplateSerializer(serializers.Serializer):
name = serializers.CharField() name = serializers.CharField()
description = serializers.CharField() description = serializers.CharField()
instance_remote_id = serializers.CharField()
class ImageTemplateModelSerializer(serializers.ModelSerializer): class ImageTemplateModelSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = ImageTemplate model = ImageTemplate
fields = ("name", "description", "created_at", "created_by", "image") fields = (
"name",
"description",
"created_at",
"created_by",
"image",
"flavor",
"lease",
"type",
)
read_only_fields = (
"created_at",
"created_by",
"type",
)
from django.urls import path from rest_framework import routers
from rest_framework.urlpatterns import format_suffix_patterns
from template import views from template import views
urlpatterns = [ router = routers.DefaultRouter()
path("template/", views.TemplateList.as_view()), router.register(r"templates/image-templates", views.ImageTemplateViewSet, basename="image-template")
# path("template/<int:pk>/", views.TemplateDetail.as_view()),
# path('instances/<int:pk>/action/', views.InstanceAction.as_view())
]
urlpatterns = format_suffix_patterns(urlpatterns) urlpatterns = router.urls
\ No newline at end of file
# from django.shortcuts import render # from django.shortcuts import render
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.views import APIView from rest_framework.viewsets import ModelViewSet
from django.http import HttpResponse from rest_framework.decorators import action
from template.serializers import InstanceTemplateSerializer from template.serializers import InstanceFromTemplateSerializer
from template.serializers import ImageTemplateModelSerializer from template.serializers import ImageTemplateModelSerializer
from template.models import ImageTemplate from template.models import ImageTemplate
class TemplateList(APIView): class ImageTemplateViewSet(ModelViewSet):
def post(self, request, format=None): serializer_class=ImageTemplateModelSerializer
serializer = InstanceTemplateSerializer(data=request.data) queryset=ImageTemplate.objects.all()
serializer.is_valid()
def create(self, request):
serializer = ImageTemplateModelSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
data = serializer.validated_data
new_template = ImageTemplate.create(
name=data["name"],
description=data["description"],
created_by=request.user,
image = data["image"],
lease=data["lease"],
flavor=data["flavor"],
type="U"
)
serializer = ImageTemplateModelSerializer(instance=new_template)
return Response(serializer.data)
def update(self, request, *args, **kwargs):
# only the name, description, lease, flavor can be updated
allowed_keys = ["name", "description", "lease", "flavor"]
#delete not allowed key
for key in request.data.keys():
if key not in allowed_keys:
request.data.pop(key, None)
return super(QuestionViewSet, self).update(request, partial=True)
@action(detail=True, methods=["post"])
def template(self, request, pk):
instance = self.get_object(pk)
serializer = InstanceFromTemplateSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
data = serializer.validated_data data = serializer.validated_data
new_template = ImageTemplate.create_from_instance(data["name"], data["description"], data["instance_remote_id"], request.user) new_template = ImageTemplate.create_from_instance(data["name"], data["description"], instance, request.user)
serializer = ImageTemplateModelSerializer(instance=new_template) serializer = ImageTemplateModelSerializer(instance=new_template)
return Response(serializer.data) return Response(serializer.data)
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