Commit 22dbafd0 by Belákovics Ádám

Merge instance_auth with DEV

parents 2e64ae8a 3a808815
Pipeline #823 failed with stage
in 1 minute 20 seconds
# IDEs # IDEs
.vscode/ .vscode/
.idea/ .idea/
...@@ -84,6 +83,3 @@ environment.sh ...@@ -84,6 +83,3 @@ environment.sh
# Cloud configure # Cloud configure
clouds.yaml clouds.yaml
image: python:3.6 image: python:3.6
stages:
- lint
- test
before_script: before_script:
- pip install pipenv
- pipenv install -d
- git submodule sync --recursive - git submodule sync --recursive
- git submodule update --init --recursive - git submodule update --init --recursive
flake8: flake8:
stage: lint
script: script:
- pipenv run flake8 - pip install flake8
- flake8
test: test:
script: script:
- pip install pipenv
- pipenv install -d
- cd recircle - cd recircle
- pipenv run python manage.py test - pipenv run python manage.py test
...@@ -8,16 +8,17 @@ httpie = "*" ...@@ -8,16 +8,17 @@ httpie = "*"
flake8 = "*" flake8 = "*"
django-rest-swagger = "*" django-rest-swagger = "*"
coverage = "*" coverage = "*"
django-nose = "*"
[packages] [packages]
django = "*" django = "*"
djangorestframework = "*" djangorestframework = "*"
djoser = "*"
django-cors-headers = "*" django-cors-headers = "*"
openstacksdk = "*" openstacksdk = "*"
python-novaclient = "*" python-novaclient = "*"
keystoneauth1 = "*" keystoneauth1 = "*"
django-guardian = "*" django-guardian = "*"
djoser = "*"
[requires] [requires]
python_version = "3.6" python_version = "3.6"
{ {
"_meta": { "_meta": {
"hash": { "hash": {
"sha256": "88d304c135bc5ea2cf22f54d5512de3aa8433ebd185ab2bcb50bc3b8c746d010" "sha256": "dd7bfbb33d07cbcc96d1f3b1f838538dba41f3eb0bf5279381714b4b9abf90d7"
}, },
"pipfile-spec": 6, "pipfile-spec": 6,
"requires": { "requires": {
...@@ -280,11 +280,11 @@ ...@@ -280,11 +280,11 @@
}, },
"openstacksdk": { "openstacksdk": {
"hashes": [ "hashes": [
"sha256:dc1232a58e30876ed6b28ee7bf5fee281b70048b187e88acd8a53cc3b63f9d8a", "sha256:ae521b4083ecc3395e27b6a7d0f119a737cefb2f76277f16dc5b626a3c4d5c52",
"sha256:f6e045d2e0a111d3a8dd157d111a04f1354ad6cc7819f6c1db073426bea7734f" "sha256:e3a1346a238d57d4f398f345a79d03b6705e229a4453f8b73acdcd00d04e6328"
], ],
"index": "pypi", "index": "pypi",
"version": "==0.31.2" "version": "==0.32.0"
}, },
"os-service-types": { "os-service-types": {
"hashes": [ "hashes": [
...@@ -316,10 +316,10 @@ ...@@ -316,10 +316,10 @@
}, },
"pbr": { "pbr": {
"hashes": [ "hashes": [
"sha256:0ca44dc9fd3b04a22297c2a91082d8df2894862e8f4c86a49dac69eae9e85ca0", "sha256:56e52299170b9492513c64be44736d27a512fa7e606f21942160b68ce510b4bc",
"sha256:4aed6c1b1fa5020def0f22aed663d87b81bb3235f112490b07d2643d7a98c5b5" "sha256:9b321c204a88d8ab5082699469f52cc94c5da45c51f114113d01b3d993c24cdf"
], ],
"version": "==5.4.1" "version": "==5.4.2"
}, },
"prettytable": { "prettytable": {
"hashes": [ "hashes": [
...@@ -508,6 +508,14 @@ ...@@ -508,6 +508,14 @@
"index": "pypi", "index": "pypi",
"version": "==4.5.4" "version": "==4.5.4"
}, },
"django-nose": {
"hashes": [
"sha256:58934a06a6932696e54c9e8af3fab49bf67ca9e9c840ad668cb7f51219808a07",
"sha256:f515d903cfaeda52c7a9198e0c8ed51563e82802b62a4e5fbd056fd830095318"
],
"index": "pypi",
"version": "==1.4.6"
},
"django-rest-swagger": { "django-rest-swagger": {
"hashes": [ "hashes": [
"sha256:48f6aded9937e90ae7cbe9e6c932b9744b8af80cc4e010088b3278c700e0685b", "sha256:48f6aded9937e90ae7cbe9e6c932b9744b8af80cc4e010088b3278c700e0685b",
...@@ -607,6 +615,14 @@ ...@@ -607,6 +615,14 @@
], ],
"version": "==0.6.1" "version": "==0.6.1"
}, },
"nose": {
"hashes": [
"sha256:9ff7c6cc443f8c51994b34a667bbcf45afd6d945be7477b52e97516fd17c53ac",
"sha256:dadcddc0aefbf99eea214e0f1232b94f2fa9bd98fa8353711dacb112bfcbbb2a",
"sha256:f1bffef9cbc82628f6e7d7b40d7e255aefaa1adb6a1b1d26c69a8b79e6208a98"
],
"version": "==1.3.7"
},
"openapi-codec": { "openapi-codec": {
"hashes": [ "hashes": [
"sha256:1bce63289edf53c601ea3683120641407ff6b708803b8954c8a876fe778d2145" "sha256:1bce63289edf53c601ea3683120641407ff6b708803b8954c8a876fe778d2145"
......
...@@ -82,7 +82,9 @@ class Image(models.Model): ...@@ -82,7 +82,9 @@ class Image(models.Model):
uploaded_by_user=False, uploaded_by_user=False,
description=description description=description
) )
return new_image for attr, value in new_image.__dict__.items():
setattr(remote_image, attr, value)
return remote_image
@classmethod @classmethod
def create_from_user(cls, description, file_format, image_file, name, user): def create_from_user(cls, description, file_format, image_file, name, user):
...@@ -96,4 +98,24 @@ class Image(models.Model): ...@@ -96,4 +98,24 @@ class Image(models.Model):
uploaded_by_user=True, uploaded_by_user=True,
description=description description=description
) )
return new_image for attr, value in new_image.__dict__.items():
setattr(remote_image, attr, value)
return remote_image
def delete(self):
interface = OpenstackImageManager(settings.CONNECTION)
if interface.delete(self.remote_id):
super().delete()
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()
return self.get()
...@@ -3,9 +3,15 @@ from rest_framework import serializers ...@@ -3,9 +3,15 @@ from rest_framework import serializers
from .models import Image from .models import Image
class ImageUpdateSerializer(serializers.Serializer):
name = serializers.CharField(required=False)
description = serializers.CharField(required=False)
class ImageSerializer(serializers.ModelSerializer): class ImageSerializer(serializers.ModelSerializer):
image_file = serializers.FileField(write_only=True) image_file = serializers.FileField(write_only=True)
file_format = serializers.CharField(max_length=10, write_only=True) file_format = serializers.CharField(max_length=10)
size = serializers.IntegerField()
class Meta: class Meta:
model = Image model = Image
...@@ -18,5 +24,7 @@ class ImageSerializer(serializers.ModelSerializer): ...@@ -18,5 +24,7 @@ class ImageSerializer(serializers.ModelSerializer):
"created_at", "created_at",
"uploaded_by_user", "uploaded_by_user",
"created_by", "created_by",
"id",
"size",
) )
read_only_fields = ("created_at", "uploaded_by_user", "created_by", "remote_id", ) read_only_fields = ("created_at", "uploaded_by_user", "created_by", "remote_id", "size", )
# from django.test import TestCase from django.test import TestCase
# Create your tests here.
class ImageTest(TestCase):
def test_test(self):
self.assertEqual("", "")
# from django.shortcuts import render # from django.shortcuts import render
from rest_framework.viewsets import ModelViewSet from rest_framework.viewsets import ViewSet
from rest_framework.response import Response from rest_framework.response import Response
from django.shortcuts import get_object_or_404
from rest_framework import status
from django.core.exceptions import ObjectDoesNotExist
from image.models import Image from image.models import Image
from image.serializers import ImageSerializer from image.serializers import ImageSerializer
from image.serializers import ImageUpdateSerializer
class ImageViewSet(ModelViewSet): class ImageViewSet(ViewSet):
serializer_class = ImageSerializer
queryset = Image.objects.all() def list(self, request):
# def list(self, request): image_list = []
# return HttpResponse("list") images = Image.objects.all()
for image in images:
image_list.append(image.get())
serializer = ImageSerializer(image_list, many=True)
return Response(serializer.data)
def create(self, request): def create(self, request):
serializer = ImageSerializer(data=request.data) serializer = ImageSerializer(data=request.data)
...@@ -26,14 +34,30 @@ class ImageViewSet(ModelViewSet): ...@@ -26,14 +34,30 @@ class ImageViewSet(ModelViewSet):
serializer = ImageSerializer(instance=new_image) serializer = ImageSerializer(instance=new_image)
return Response(serializer.data) return Response(serializer.data)
# def retrieve(self, request, pk=None): def retrieve(self, request, pk=None):
# return HttpResponse("retrive") queryset = Image.objects.all()
image = get_object_or_404(queryset, pk=pk)
serializer = ImageSerializer(instance=image)
image = image.get()
serializer = ImageSerializer(instance=image)
return Response(serializer.data)
# def update(self, request, pk=None): def update(self, request, pk=None):
# return HttpResponse("update") serializer = ImageUpdateSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
queryset = Image.objects.all()
image = get_object_or_404(queryset, pk=pk)
image = image.update(serializer.validated_data)
serializer = ImageSerializer(instance=image)
return Response(serializer.data)
# def partial_update(self, request, pk=None): def partial_update(self, request, pk=None):
# return HttpResponse("patch") return self.update(request, pk)
# def destroy(self, request, pk=None): def destroy(self, request, pk=None):
# return HttpResponse("delete") try:
image = Image.objects.get(id=pk)
image.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
except ObjectDoesNotExist:
return Response(status=status.HTTP_204_NO_CONTENT)
# Generated by Django 2.2.3 on 2019-07-15 09:29
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('instance', '0008_auto_20190704_1310'),
]
operations = [
migrations.AlterField(
model_name='instance',
name='flavor',
field=models.ForeignKey(help_text='Reasources given to the vm', on_delete='CASCADE', related_name='instances', to='instance.Flavor', verbose_name='flavor'),
),
migrations.AlterField(
model_name='instance',
name='lease',
field=models.ForeignKey(on_delete='CASCADE', related_name='instances', to='instance.Lease'),
),
]
# Generated by Django 2.2.3 on 2019-07-22 12:17 # Generated by Django 2.2.4 on 2019-08-08 10:41
from django.db import migrations, models from django.db import migrations, models
...@@ -6,8 +6,8 @@ from django.db import migrations, models ...@@ -6,8 +6,8 @@ from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('template', '0006_auto_20190719_1416'), ('template', '0007_basetemplate_network_id'),
('instance', '0010_merge_20190722_1216'), ('instance', '0009_auto_20190715_1354'),
] ]
operations = [ operations = [
......
# Generated by Django 2.2.3 on 2019-07-22 12:16
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('instance', '0009_auto_20190715_1354'),
('instance', '0009_auto_20190715_0929'),
]
operations = [
]
...@@ -155,12 +155,11 @@ class Instance(models.Model): ...@@ -155,12 +155,11 @@ class Instance(models.Model):
disks, networks, flavor): disks, networks, flavor):
# TODO: attach disks when the remote instance created # TODO: attach disks when the remote instance created
try: try:
remote_inst = interface.create_vm_from_template(params["name"], remote_id = interface.create_vm_from_template(params["name"],
template.image.remote_id, template.image.remote_id,
flavor.remote_id, flavor.remote_id,
networks, networks,
) )
remote_id = remote_inst.id
new_inst = cls.create(lease, owner, flavor, template, new_inst = cls.create(lease, owner, flavor, template,
remote_id, params) remote_id, params)
return new_inst return new_inst
......
# from django.test import TestCase from django.test import TestCase
# Create your tests here.
class InstanceTest(TestCase):
def test_test(self):
self.assertEqual("", "")
from instance.serializers import InstanceSerializer, FlavorSerializer, LeaseSerializer from instance.serializers import InstanceSerializer, FlavorSerializer, LeaseSerializer
from django.http import Http404 from django.http import Http404
from django.conf import settings
from rest_framework.viewsets import ViewSet, ModelViewSet from rest_framework.viewsets import ViewSet, ModelViewSet
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework import status from rest_framework import status
from rest_framework.decorators import action from rest_framework.decorators import action
from template.serializers import InstanceFromTemplateSerializer from template.serializers import InstanceFromTemplateSerializer
from interface_openstack.implementation.vm.instance import (
OSVirtualMachineManager
)
from instance.models import Instance, Flavor, Lease from instance.models import Instance, Flavor, Lease
from instance.serializers import InstanceSerializer, FlavorSerializer
from template.models import ImageTemplate from template.models import ImageTemplate
from template.serializers import ImageTemplateModelSerializer from template.serializers import ImageTemplateModelSerializer
from authorization.mixins import AuthorizationMixin from authorization.mixins import AuthorizationMixin
...@@ -49,6 +44,10 @@ class InstanceViewSet(AuthorizationMixin, ViewSet): ...@@ -49,6 +44,10 @@ class InstanceViewSet(AuthorizationMixin, ViewSet):
def create(self, request): def create(self, request):
data = request.data data = request.data
template = ImageTemplate.objects.get(pk=data["template"]) template = ImageTemplate.objects.get(pk=data["template"])
# TODO: if the user can select anouther lease and flavor
# That will be applied, not from the template
# flavor = Flavor.objects.get(pk=data["flavor"]) # flavor = Flavor.objects.get(pk=data["flavor"])
# lease = Lease.objects.get(pk=data["lease"]) # lease = Lease.objects.get(pk=data["lease"])
...@@ -61,7 +60,7 @@ class InstanceViewSet(AuthorizationMixin, ViewSet): ...@@ -61,7 +60,7 @@ class InstanceViewSet(AuthorizationMixin, ViewSet):
"system": data["system"], "system": data["system"],
}, },
lease=template.lease, lease=template.lease,
networks=[{"uuid": "7485b41f-2524-4399-a20b-4b2c7ee9fd01"}], networks=[{"uuid": template.network_id}],
template=template, template=template,
flavor=template.flavor, flavor=template.flavor,
owner=request.user, owner=request.user,
...@@ -72,8 +71,6 @@ class InstanceViewSet(AuthorizationMixin, ViewSet): ...@@ -72,8 +71,6 @@ class InstanceViewSet(AuthorizationMixin, ViewSet):
def retrieve(self, request, pk): def retrieve(self, request, pk):
instance = self.get_object(pk) instance = self.get_object(pk)
instanceDict = InstanceSerializer(instance).data instanceDict = InstanceSerializer(instance).data
print(instanceDict)
remoteInstance = instance.get_remote_instance() remoteInstance = instance.get_remote_instance()
remoteInstanceDict = remoteInstance.__dict__ remoteInstanceDict = remoteInstance.__dict__
......
Subproject commit e01d873c78ac17fed0438936f979de3cbaca6a5e Subproject commit 1a19e4355f4af1abb49a3f6e07dc3a6c3f8bdf47
...@@ -42,6 +42,7 @@ INSTALLED_APPS = [ ...@@ -42,6 +42,7 @@ INSTALLED_APPS = [
"rest_framework_swagger", "rest_framework_swagger",
"corsheaders", "corsheaders",
"guardian", "guardian",
"django_nose",
] ]
LOCAL_APPS = [ LOCAL_APPS = [
......
...@@ -13,3 +13,7 @@ ADMIN_ENABLED = True ...@@ -13,3 +13,7 @@ ADMIN_ENABLED = True
ALLOWED_HOSTS = ['*'] ALLOWED_HOSTS = ['*']
AUTH_PASSWORD_VALIDATORS = [] AUTH_PASSWORD_VALIDATORS = []
TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
NOSE_ARGS = LOCAL_APPS
# from django.test import TestCase from django.test import TestCase
# Create your tests here.
class StorageTest(TestCase):
def test_test(self):
self.assertEqual("", "")
# Generated by Django 2.2.3 on 2019-08-07 12:19
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('template', '0006_auto_20190719_1416'),
]
operations = [
migrations.AddField(
model_name='basetemplate',
name='network_id',
field=models.CharField(blank=True, help_text='The new instance will be in this network.', max_length=100, null=True, verbose_name='network_id'),
),
]
...@@ -44,6 +44,13 @@ class BaseTemplate(models.Model): ...@@ -44,6 +44,13 @@ class BaseTemplate(models.Model):
related_name='templates') related_name='templates')
lease = models.ForeignKey(Lease, on_delete="CASCADE", lease = models.ForeignKey(Lease, on_delete="CASCADE",
related_name='templates') related_name='templates')
network_id = models.CharField(
max_length=100,
verbose_name="network_id",
help_text="The new instance will be in this network.",
null=True,
blank=True
)
class DiskTemplate(BaseTemplate): class DiskTemplate(BaseTemplate):
......
# from django.test import TestCase from django.test import TestCase
# Create your tests here.
class TemplateTest(TestCase):
def test_test(self):
self.assertEqual("", "")
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