models.py 3.93 KB
Newer Older
1
from django.db import models
2 3 4 5
from django.contrib.auth.models import User
from django.conf import settings

from interface_openstack.implementation.vm.instance import OSVirtualMachineManager
Bodor Máté committed
6
from interface_openstack.implementation.image.openstack_image_manager import OpenstackImageManager
7

8

Gazdag Péter committed
9
class Disk(models.Model):
10 11 12
    """A virtual disk.
    """

13
    name = models.CharField(
Bodor Máté committed
14 15 16 17
        blank=True,
        max_length=100,
        verbose_name="name",
        help_text="Name of the disk"
18
    )
19
    remote_id = models.CharField(
20 21 22 23 24
        max_length=40,
        unique=True,
        verbose_name="remote_ID",
        help_text="ID, which helps access the disk",
    )
Bodor Máté committed
25 26


Bodor Máté committed
27
class Image(models.Model):
Bodor Máté committed
28 29
    """A virtual image.
    """
Bodor Máté committed
30

Bodor Máté committed
31 32 33 34 35 36 37 38 39 40
    name = models.CharField(
        max_length=100,
        verbose_name="name",
        help_text="Human readable name of image."
    )
    description = models.TextField(
        verbose_name="description",
        blank=True,
        help_text="Description of the image."
    )
41
    remote_id = models.CharField(
Bodor Máté committed
42 43 44 45 46 47 48 49 50 51
        max_length=40,
        unique=True,
        verbose_name="remote_ID",
        help_text="ID, which helps access the image."
    )
    created_at = models.DateTimeField(
        auto_now_add=True,
        editable=False,
        help_text="Date, when the image created."
    )
52 53 54 55 56 57 58 59 60 61 62 63 64 65
    uploaded_by_user = models.BooleanField(
        default=True,
        editable=False,
        help_text="The field is false if the image created from instance"
    )
    created_by = models.ForeignKey(
        User,
        on_delete=models.DO_NOTHING,
        related_name="created_images",
        help_text="The user, who create the image"
    )

    @classmethod
    def create(cls, name, description, remote_id, uploaded_by_user, created_by):
Bodor Máté committed
66 67
        inst = cls(name=name, description=description,
                   uploaded_by_user=uploaded_by_user,
68 69 70 71 72 73 74
                   remote_id=remote_id, created_by=created_by)
        inst.full_clean()
        inst.save()

        return inst

    @classmethod
Bodor Máté committed
75
    def create_from_instance(cls, user, instance, description):
76
        interface = OSVirtualMachineManager(settings.CONNECTION)
Bodor Máté committed
77
        remote_image = interface.create_image(instance.remote_id)
78 79
        remote_id = remote_image.id
        name = remote_image.name
80 81 82 83 84 85
        new_image = Image.objects.create(name=name,
                                         remote_id=remote_id,
                                         created_by=user,
                                         uploaded_by_user=False,
                                         description=description)
        return new_image
Bodor Máté committed
86

Bodor Máté committed
87
    @classmethod
Bodor Máté committed
88 89
    def create_from_user(cls, description,
                         file_format, image_file, name, user):
Bodor Máté committed
90
        interface = OpenstackImageManager(settings.CONNECTION)
Bodor Máté committed
91 92
        remote_image = interface.upload_file(name=name,
                                             path=image_file.temporary_file_path(),
Bodor Máté committed
93
                                             format=file_format)
94 95 96 97 98
        new_image = Image.objects.create(name=name,
                                         remote_id=remote_image.id,
                                         created_by=user,
                                         uploaded_by_user=True,
                                         description=description)
99 100 101
        for attr, value in new_image.__dict__.items():
            setattr(remote_image, attr, value)
        return remote_image
Bodor Máté committed
102

103
    def delete(self, **kwargs):
104 105 106
        interface = OpenstackImageManager(settings.CONNECTION)
        if interface.delete(self.remote_id):
            super().delete()
Bodor Máté committed
107

108 109 110 111 112 113 114 115 116 117 118
    def get(self):
        interface = OpenstackImageManager(settings.CONNECTION)
        image = interface.get(self.remote_id)
        for attr, value in self.__dict__.items():
            setattr(image, attr, value)
        return image

    def update(self, data):
        for (key, value) in data.items():
            setattr(self, key, value)
        self.save()
Bodor Máté committed
119
        return self.get()