Commit e638f2fd by Bodor Máté

Create template views

parent 47e13094
from django.contrib import admin
from image.models import Image
from image.models import Disk
admin.site.register(Image)
admin.site.register(Disk)
......@@ -3,6 +3,7 @@ from django.contrib.auth.models import User
from django.conf import settings
from interface_openstack.implementation.vm.instance import OSVirtualMachineManager
from interface_openstack.implementation.image.openstack_image_manager import OpenstackImageManager
class Disk(models.Model):
......@@ -70,9 +71,9 @@ class Image(models.Model):
@classmethod
def create_from_instance(cls, user, instance_remote_id, description):
def create_from_instance(cls, user, instance, description):
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
name = remote_image.name
new_image = cls.create(
......@@ -83,3 +84,16 @@ class Image(models.Model):
description=description
)
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 .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:
model = Disk
fields = ("name", "remote_ID")
model = Image
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.urlpatterns import format_suffix_patterns
from rest_framework import routers
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 rest_framework.views import APIView
from rest_framework.viewsets import ModelViewSet
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 Disk
from interface_openstack.implementation.image.openstack_image_manager import (
OpenstackImageManager
)
from image.models import Image
from image.serializers import ImageSerializer
class DiskList(APIView):
def get(self, request, format=None):
# OpenStack
interface = OpenstackImageManager(settings.CONNECTION)
return Response([disk.__dict__ for disk in interface.list()])
class ImageViewSet(ModelViewSet):
serializer_class=ImageSerializer
queryset=Image.objects.all()
# def list(self, request):
# return HttpResponse("list")
# Create response
disks = Disk.object.all()
serializer = DiskSerializer(disks, many=True)
def create(self, request):
serializer = ImageSerializer(data=request.data)
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)
# 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.conf import settings
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from interface_openstack.implementation.vm.instance import (
OSVirtualMachineManager
)
from template.models import ImageTemplate
from instance.models import Instance, Flavor, Lease
from instance.serializers import InstanceSerializer, FlavorSerializer
class InstanceList(APIView):
......
......@@ -21,7 +21,7 @@ from rest_framework_swagger.views import get_swagger_view
schema_view = get_swagger_view(title="RECIRCLE API")
urlpatterns = [
path("images/", include("image.urls")),
path("api/v1/", include("image.urls")),
path("api/v1/", include("instance.urls")),
path("api/v1/", include("template.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):
TYPES = (
('U', 'User create the template from image'),
('I', 'Template created from instance'),
('D', 'Default "Pure" template'),
('P', '"Pure" template'),
)
......@@ -86,11 +86,11 @@ class ImageTemplate(BaseTemplate):
on_delete=models.CASCADE,
help_text=""
)
type = models.CharField(max_length=10, choices=TYPES)
type = models.CharField(max_length=10, choices=TYPES, default="U")
@classmethod
def create(cls, name, description, image, lease, flavor, created_by):
inst = cls(name=name, description=description, image=image, lease=lease, flavor=flavor, created_by=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, type=type)
inst.full_clean()
inst.save()
......@@ -98,14 +98,15 @@ class ImageTemplate(BaseTemplate):
@classmethod
def create_from_instance(cls, name, description, instance_remote_id, lease, flavor, user):
image = Image.create_from_instance(user, instance_remote_id, description)
def create_from_instance(cls, name, description, instance, user):
image = Image.create_from_instance(user, instance, description)
new_template = cls.create(
name=name,
description=description,
created_by=user,
image = image,
lease=lease,
flavor=flavor
lease=instance.lease,
flavor=instance.flavor,
type="I"
)
return new_template
......@@ -3,12 +3,26 @@ from rest_framework import serializers
from template.models import ImageTemplate
class InstanceTemplateSerializer(serializers.Serializer):
class InstanceFromTemplateSerializer(serializers.Serializer):
name = serializers.CharField()
description = serializers.CharField()
instance_remote_id = serializers.CharField()
class ImageTemplateModelSerializer(serializers.ModelSerializer):
class Meta:
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.urlpatterns import format_suffix_patterns
from rest_framework import routers
from template import views
urlpatterns = [
path("template/", views.TemplateList.as_view()),
# path("template/<int:pk>/", views.TemplateDetail.as_view()),
# path('instances/<int:pk>/action/', views.InstanceAction.as_view())
]
router = routers.DefaultRouter()
router.register(r"templates/image-templates", views.ImageTemplateViewSet, basename="image-template")
urlpatterns = format_suffix_patterns(urlpatterns)
\ No newline at end of file
urlpatterns = router.urls
# from django.shortcuts import render
from rest_framework.response import Response
from rest_framework.views import APIView
from django.http import HttpResponse
from rest_framework.viewsets import ModelViewSet
from rest_framework.decorators import action
from template.serializers import InstanceTemplateSerializer
from template.serializers import InstanceFromTemplateSerializer
from template.serializers import ImageTemplateModelSerializer
from template.models import ImageTemplate
class TemplateList(APIView):
def post(self, request, format=None):
serializer = InstanceTemplateSerializer(data=request.data)
serializer.is_valid()
class ImageTemplateViewSet(ModelViewSet):
serializer_class=ImageTemplateModelSerializer
queryset=ImageTemplate.objects.all()
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
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)
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