Commit a35f2402 by Bodor Máté

Reformat code and fix flake8 errors

parent 16394b7c
from django.contrib import admin # from django.contrib import admin
# Register your models here. # Register your models here.
...@@ -2,4 +2,4 @@ from django.apps import AppConfig ...@@ -2,4 +2,4 @@ from django.apps import AppConfig
class ImageConfig(AppConfig): class ImageConfig(AppConfig):
name = 'image' name = "image"
from django.db import models from django.db import models
class Disk(models.Model): class Disk(models.Model):
"""A virtual disk. """A virtual disk.
""" """
name = models.CharField(blank=True, max_length=100, verbose_name="name", help_text="Name of the disk") name = models.CharField(
remote_ID = models.CharField(max_length=40, unique=True, verbose_name="remote_ID", help_text="ID, which helps access the disk") blank=True, max_length=100, verbose_name="name", help_text="Name of the disk"
)
\ No newline at end of file remote_ID = models.CharField(
max_length=40,
unique=True,
verbose_name="remote_ID",
help_text="ID, which helps access the disk",
)
...@@ -2,7 +2,8 @@ from rest_framework import serializers ...@@ -2,7 +2,8 @@ from rest_framework import serializers
from .models import Disk from .models import Disk
class DiskSerializer(serializers.ModelSerializer): class DiskSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = Disk model = Disk
fields = ('name', 'remote_ID',) fields = ("name", "remote_ID")
from django.test import TestCase # from django.test import TestCase
# Create your tests here. # Create your tests here.
from django.urls import include, path from django.urls import path
from rest_framework.urlpatterns import format_suffix_patterns from rest_framework.urlpatterns import format_suffix_patterns
from image import views from image import views
urlpatterns = [ urlpatterns = [path("", views.DiskList.as_view())]
path('', views.DiskList.as_view()),
]
urlpatterns = format_suffix_patterns(urlpatterns) urlpatterns = format_suffix_patterns(urlpatterns)
\ No newline at end of file
from image.models import Disk from image.models import Disk
from image.serializers import DiskSerializer from image.serializers import DiskSerializer
from django.shortcuts import render # from django.shortcuts import render
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 interface_openstack.implementation.image.OpenstackImageManager import OpenstackImageManager from interface_openstack.implementation.image.OpenstackImageManager import (
OpenstackImageManager,
)
import openstack import openstack
conn = openstack.connect(cloud='openstack') conn = openstack.connect(cloud="openstack")
class DiskList(APIView): class DiskList(APIView):
def get(self, request, format=None): def get(self, request, format=None):
#OpenStack # OpenStack
interface = OpenstackImageManager(conn) interface = OpenstackImageManager(conn)
return Response([disk.__dict__ for disk in interface.list()]) return Response([disk.__dict__ for disk in interface.list()])
#Create response # Create response
disks = Disk.object.all() disks = Disk.object.all()
serializer = DiskSerializer(disks, many=True) serializer = DiskSerializer(disks, many=True)
return Response(serializer.data) return Response(serializer.data)
...@@ -2,4 +2,4 @@ from django.apps import AppConfig ...@@ -2,4 +2,4 @@ from django.apps import AppConfig
class InstanceConfig(AppConfig): class InstanceConfig(AppConfig):
name = 'instance' name = "instance"
...@@ -2,36 +2,44 @@ from django.db import models ...@@ -2,36 +2,44 @@ from django.db import models
from django.conf import settings from django.conf import settings
ACCESS_METHODS = tuple([(key, val[0]) ACCESS_METHODS = tuple(
for key, val in settings.VM_ACCESS_PROTOCOLS.items()]) [(key, val[0]) for key, val in settings.VM_ACCESS_PROTOCOLS.items()]
)
# Later stored in database # Later stored in database
LEASE_TYPES = tuple([(val["name"], val["verbose_name"]) LEASE_TYPES = tuple(
for val in settings.LEASE_TYPES]) [(val["name"], val["verbose_name"]) for val in settings.LEASE_TYPES]
)
class Instance(models.Model): class Instance(models.Model):
name = models.CharField(max_length=100, name = models.CharField(max_length=100, help_text="Human readable name of instance")
help_text="Human readable name of instance") remote_id = models.CharField(
remote_id = models.CharField(max_length=100, max_length=100, help_text="ID of the instance on the backend"
help_text="ID of the instance on the backend") )
description = models.TextField(blank=True, description = models.TextField(
help_text="The description of the instance") blank=True, help_text="The description of the instance"
access_method = models.CharField(max_length=10, choices=ACCESS_METHODS, )
help_text="Primary remote access method") access_method = models.CharField(
system = models.CharField(max_length=50, max_length=10, choices=ACCESS_METHODS, help_text="Primary remote access method"
help_text="Operating system type") )
password = models.CharField(max_length=50, system = models.CharField(max_length=50, help_text="Operating system type")
help_text="Original password of the instance") password = models.CharField(
lease = models.CharField(max_length=50, choices=LEASE_TYPES, max_length=50, help_text="Original password of the instance"
help_text="Expiration method") )
lease = models.CharField(
max_length=50, choices=LEASE_TYPES, help_text="Expiration method"
)
time_of_suspend = models.DateTimeField( time_of_suspend = models.DateTimeField(
help_text="After this point in time, the instance will be suspended") help_text="After this point in time, the instance will be suspended"
)
time_of_delete = models.DateTimeField( time_of_delete = models.DateTimeField(
help_text="After this point in time, the instance will be deleted!") help_text="After this point in time, the instance will be deleted!"
)
deleted = models.BooleanField( deleted = models.BooleanField(
help_text="Indicates if the instance is ready for garbage collection", help_text="Indicates if the instance is ready for garbage collection",
default=False) default=False,
)
# template # template
# disks # disks
# owner # owner
...@@ -4,7 +4,6 @@ from .models import Instance ...@@ -4,7 +4,6 @@ from .models import Instance
class InstanceSerializer(serializers.ModelSerializer): class InstanceSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = Instance model = Instance
fields = "__all__" fields = "__all__"
from django.test import TestCase # from django.test import TestCase
# Create your tests here. # Create your tests here.
...@@ -3,8 +3,8 @@ from rest_framework.urlpatterns import format_suffix_patterns ...@@ -3,8 +3,8 @@ from rest_framework.urlpatterns import format_suffix_patterns
from instance import views from instance import views
urlpatterns = [ urlpatterns = [
path('instances/', views.InstanceList.as_view()), path("instances/", views.InstanceList.as_view()),
path('instances/<int:pk>/', views.InstanceDetail.as_view()), path("instances/<int:pk>/", views.InstanceDetail.as_view()),
# path('instances/<int:pk>/action/', views.InstanceAction.as_view()) # path('instances/<int:pk>/action/', views.InstanceAction.as_view())
] ]
......
...@@ -10,7 +10,7 @@ import openstack ...@@ -10,7 +10,7 @@ import openstack
import datetime import datetime
conn = openstack.connect(cloud='openstack') conn = openstack.connect(cloud="openstack")
class InstanceList(APIView): class InstanceList(APIView):
...@@ -22,9 +22,11 @@ class InstanceList(APIView): ...@@ -22,9 +22,11 @@ class InstanceList(APIView):
data = request.data data = request.data
interface = OSVirtualMachineManager(conn) interface = OSVirtualMachineManager(conn)
imageId = "da51253f-867c-472d-8ce0-81e7b7126d60" imageId = "da51253f-867c-472d-8ce0-81e7b7126d60"
flavorId = '1' flavorId = "1"
networks = [{"uuid": "c03d0d4b-413e-4cc6-9ebe-c0b5ca0dac3a"}] networks = [{"uuid": "c03d0d4b-413e-4cc6-9ebe-c0b5ca0dac3a"}]
newBackendInstance = interface.create_vm_from_template("Integration test vm 2", imageId, flavorId, networks) newBackendInstance = interface.create_vm_from_template(
"Integration test vm 2", imageId, flavorId, networks
)
newInstance = Instance( newInstance = Instance(
name=data["name"], name=data["name"],
remote_id=newBackendInstance.id, remote_id=newBackendInstance.id,
...@@ -35,7 +37,7 @@ class InstanceList(APIView): ...@@ -35,7 +37,7 @@ class InstanceList(APIView):
lease=data["lease"], lease=data["lease"],
time_of_suspend=datetime.datetime.now(), time_of_suspend=datetime.datetime.now(),
time_of_delete=datetime.datetime.now(), time_of_delete=datetime.datetime.now(),
deleted=False deleted=False,
) )
newInstance.save() newInstance.save()
return Response(newInstance.pk) return Response(newInstance.pk)
......
...@@ -2,8 +2,8 @@ ...@@ -2,8 +2,8 @@
import os import os
import sys import sys
if __name__ == '__main__': if __name__ == "__main__":
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'recircle.settings') os.environ.setdefault("DJANGO_SETTINGS_MODULE", "recircle.settings")
try: try:
from django.core.management import execute_from_command_line from django.core.management import execute_from_command_line
except ImportError as exc: except ImportError as exc:
......
...@@ -20,72 +20,69 @@ BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) ...@@ -20,72 +20,69 @@ BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# See https://docs.djangoproject.com/en/2.1/howto/deployment/checklist/ # See https://docs.djangoproject.com/en/2.1/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret! # SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'xhe8=w50lz82gjb6+z%(rwk2c+1kd!%(iv_s^!tp)*5cnb=-^t' SECRET_KEY = "xhe8=w50lz82gjb6+z%(rwk2c+1kd!%(iv_s^!tp)*5cnb=-^t"
# SECURITY WARNING: don't run with debug turned on in production! # SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True DEBUG = True
ALLOWED_HOSTS = [ ALLOWED_HOSTS = ["vm.niif.cloud.bme.hu", "localhost"]
'vm.niif.cloud.bme.hu',
'localhost',
]
# Application definition # Application definition
INSTALLED_APPS = [ INSTALLED_APPS = [
'instance.apps.InstanceConfig', "instance.apps.InstanceConfig",
'image.apps.ImageConfig', "image.apps.ImageConfig",
'django.contrib.admin', "django.contrib.admin",
'django.contrib.auth', "django.contrib.auth",
'django.contrib.contenttypes', "django.contrib.contenttypes",
'django.contrib.sessions', "django.contrib.sessions",
'django.contrib.messages', "django.contrib.messages",
'django.contrib.staticfiles', "django.contrib.staticfiles",
'rest_framework', "rest_framework",
'djoser', "djoser",
'rest_framework_swagger', "rest_framework_swagger",
'corsheaders', "corsheaders",
] ]
MIDDLEWARE = [ MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware', "django.middleware.security.SecurityMiddleware",
'django.contrib.sessions.middleware.SessionMiddleware', "django.contrib.sessions.middleware.SessionMiddleware",
'corsheaders.middleware.CorsMiddleware', "corsheaders.middleware.CorsMiddleware",
'django.middleware.common.CommonMiddleware', "django.middleware.common.CommonMiddleware",
'django.middleware.csrf.CsrfViewMiddleware', "django.middleware.csrf.CsrfViewMiddleware",
'django.contrib.auth.middleware.AuthenticationMiddleware', "django.contrib.auth.middleware.AuthenticationMiddleware",
'django.contrib.messages.middleware.MessageMiddleware', "django.contrib.messages.middleware.MessageMiddleware",
'django.middleware.clickjacking.XFrameOptionsMiddleware', "django.middleware.clickjacking.XFrameOptionsMiddleware",
] ]
ROOT_URLCONF = 'recircle.urls' ROOT_URLCONF = "recircle.urls"
TEMPLATES = [ TEMPLATES = [
{ {
'BACKEND': 'django.template.backends.django.DjangoTemplates', "BACKEND": "django.template.backends.django.DjangoTemplates",
'DIRS': [], "DIRS": [],
'APP_DIRS': True, "APP_DIRS": True,
'OPTIONS': { "OPTIONS": {
'context_processors': [ "context_processors": [
'django.template.context_processors.debug', "django.template.context_processors.debug",
'django.template.context_processors.request', "django.template.context_processors.request",
'django.contrib.auth.context_processors.auth', "django.contrib.auth.context_processors.auth",
'django.contrib.messages.context_processors.messages', "django.contrib.messages.context_processors.messages",
], ]
}, },
}, }
] ]
WSGI_APPLICATION = 'recircle.wsgi.application' WSGI_APPLICATION = "recircle.wsgi.application"
# Database # Database
# https://docs.djangoproject.com/en/2.1/ref/settings/#databases # https://docs.djangoproject.com/en/2.1/ref/settings/#databases
DATABASES = { DATABASES = {
'default': { "default": {
'ENGINE': 'django.db.backends.sqlite3', "ENGINE": "django.db.backends.sqlite3",
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), "NAME": os.path.join(BASE_DIR, "db.sqlite3"),
} }
} }
...@@ -95,26 +92,20 @@ DATABASES = { ...@@ -95,26 +92,20 @@ DATABASES = {
AUTH_PASSWORD_VALIDATORS = [ AUTH_PASSWORD_VALIDATORS = [
{ {
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator"
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
}, },
{"NAME": "django.contrib.auth.password_validation.MinimumLengthValidator"},
{"NAME": "django.contrib.auth.password_validation.CommonPasswordValidator"},
{"NAME": "django.contrib.auth.password_validation.NumericPasswordValidator"},
] ]
# Internationalization # Internationalization
# https://docs.djangoproject.com/en/2.1/topics/i18n/ # https://docs.djangoproject.com/en/2.1/topics/i18n/
LANGUAGE_CODE = 'en-us' LANGUAGE_CODE = "en-us"
TIME_ZONE = 'UTC' TIME_ZONE = "UTC"
USE_I18N = True USE_I18N = True
...@@ -126,7 +117,7 @@ USE_TZ = True ...@@ -126,7 +117,7 @@ USE_TZ = True
# Static files (CSS, JavaScript, Images) # Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.1/howto/static-files/ # https://docs.djangoproject.com/en/2.1/howto/static-files/
STATIC_URL = '/static/' STATIC_URL = "/static/"
############################################################################### ###############################################################################
# RECIRCLE CONFIG # RECIRCLE CONFIG
...@@ -135,7 +126,7 @@ STATIC_URL = '/static/' ...@@ -135,7 +126,7 @@ STATIC_URL = '/static/'
# VM ACCESS PROTOCOLS # VM ACCESS PROTOCOLS
VM_ACCESS_PROTOCOLS = { VM_ACCESS_PROTOCOLS = {
"rdp": ["Remote Desktop Protocol", 3389, "tcp"], "rdp": ["Remote Desktop Protocol", 3389, "tcp"],
"ssh": ["Secure Shell", 22, "tcp"] "ssh": ["Secure Shell", 22, "tcp"],
} }
# LEASE TYPES # LEASE TYPES
...@@ -164,6 +155,4 @@ LEASE_TYPES = [ ...@@ -164,6 +155,4 @@ LEASE_TYPES = [
] ]
# CORS config for development version only # CORS config for development version only
CORS_ORIGIN_WHITELIST = ( CORS_ORIGIN_WHITELIST = ("http://localhost:3000",)
'http://localhost:3000',
)
...@@ -18,13 +18,13 @@ from django.urls import path, re_path, include ...@@ -18,13 +18,13 @@ from django.urls import path, re_path, include
from rest_framework_swagger.views import get_swagger_view 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("images/", include("image.urls")),
path('api/v1/', include('instance.urls')), path("api/v1/", include("instance.urls")),
path('admin/', admin.site.urls), path("admin/", admin.site.urls),
re_path(r'^auth/', include('djoser.urls')), re_path(r"^auth/", include("djoser.urls")),
re_path(r'^auth/', include('djoser.urls.authtoken')), re_path(r"^auth/", include("djoser.urls.authtoken")),
path(r'swagger', schema_view) path(r"swagger", schema_view),
] ]
...@@ -11,6 +11,6 @@ import os ...@@ -11,6 +11,6 @@ import os
from django.core.wsgi import get_wsgi_application from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'recircle.settings') os.environ.setdefault("DJANGO_SETTINGS_MODULE", "recircle.settings")
application = get_wsgi_application() application = get_wsgi_application()
from django.contrib import admin # from django.contrib import admin
# Register your models here. # Register your models here.
...@@ -2,4 +2,4 @@ from django.apps import AppConfig ...@@ -2,4 +2,4 @@ from django.apps import AppConfig
class StorageConfig(AppConfig): class StorageConfig(AppConfig):
name = 'storage' name = "storage"
from django.db import models from django.db import models
# Create your models here. # Create your models here.
class DataStore(): class DataStore:
"""Collection of virtual disks. """Collection of virtual disks.
""" """
name = models.CharField(max_length=100, unique=True, verbose_name="name", help_text="Name of the data store.") name = models.CharField(
remote_ID = models.CharField(max_length=40, unique=True, verbose_name="remote_ID", help_text="ID, which helps access the data store.") max_length=100,
#vm unique=True,
\ No newline at end of file verbose_name="name",
help_text="Name of the data store.",
)
remote_ID = models.CharField(
max_length=40,
unique=True,
verbose_name="remote_ID",
help_text="ID, which helps access the data store.",
)
# vm
...@@ -2,7 +2,8 @@ from rest_framework import serializers ...@@ -2,7 +2,8 @@ from rest_framework import serializers
from .models import DataStore from .models import DataStore
class DataStoreSerializer(serializers.ModelSerializer): class DataStoreSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = DataStore model = DataStore
fields = ('name', 'remote_ID',) fields = ("name", "remote_ID")
from django.test import TestCase # from django.test import TestCase
# Create your tests here. # Create your tests here.
from django.shortcuts import render # from django.shortcuts import render
# Create your views here. # Create your views here.
from django.contrib import admin # from django.contrib import admin
# Register your models here. # Register your models here.
...@@ -2,4 +2,4 @@ from django.apps import AppConfig ...@@ -2,4 +2,4 @@ from django.apps import AppConfig
class TemplateConfig(AppConfig): class TemplateConfig(AppConfig):
name = 'template' name = "template"
from django.db import models from django.db import models
class InstanceTemplate():
class InstanceTemplate:
"""Virtual machine template. """Virtual machine template.
""" """
name = models.CharField(max_length=100, verbose_name="name", name = models.CharField(
help_text="Human readable name of template.") max_length=100,
description = models.TextField(verbose_name="description", blank=True, help_text="Description of the template.") verbose_name="name",
#owner = models.ForeignKey(User) help_text="Human readable name of template.",
remote_ID = models.CharField(max_length=40, unique=True, verbose_name="remote_ID", help_text="ID, which helps access the template.") )
\ No newline at end of file description = models.TextField(
verbose_name="description", blank=True, help_text="Description of the template."
)
# owner = models.ForeignKey(User)
remote_ID = models.CharField(
max_length=40,
unique=True,
verbose_name="remote_ID",
help_text="ID, which helps access the template.",
)
...@@ -2,7 +2,8 @@ from rest_framework import serializers ...@@ -2,7 +2,8 @@ from rest_framework import serializers
from .models import InstanceTemplate from .models import InstanceTemplate
class InstanceTemplateSerializer(serializers.ModelSerializer): class InstanceTemplateSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = InstanceTemplate model = InstanceTemplate
fields = ('name', 'description', 'owner', 'remote_ID',) fields = ("name", "description", "owner", "remote_ID")
from django.test import TestCase # from django.test import TestCase
# Create your tests here. # Create your tests here.
from django.shortcuts import render # from django.shortcuts import render
# Create your views here. # Create your views here.
from instance.models import Instance
from instance.serializers import InstanceSerializer
from django.http import Http404
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from implementation.vm.instance import OSVirtualMachineManager
import openstack
conn = openstack.connect(cloud='openstack')
class InstanceList(APIView):
def get(self, request, format=None):
instances = Instance.objects.all()
# refresh OpenStack Attribs
interface = OSVirtualMachineManager(conn)
return Response([vm for vm in interface.list_all_vm()])
# create response
serializer = InstanceSerializer(instances, many=True)
return Response(serializer.data)
def post(self, request, format=None):
data = request.data
newId = 0
interface = OSVirtualMachineManager(conn)
imageId = "da51253f-867c-472d-8ce0-81e7b7126d60"
flavorId = {"name": 1}
networks = [{"uuid": "c03d0d4b-413e-4cc6-9ebe-c0b5ca0dac3a"}]
interface.create_vm_from_template("Integration test vm 1", imageId, flavorId, networks)
return Response(newId)
class InstanceDetail(APIView):
"""
Retrieve, update or delete a snippet instance.
"""
def get_object(self, pk):
try:
return Instance.objects.get(pk=pk)
except Instance.DoesNotExist:
raise Http404
def get(self, request, pk, format=None):
instance = self.get_object(pk)
serializer = InstanceSerializer(instance)
return Response(serializer.data)
def put(self, request, pk, format=None):
instance = self.get_object(pk)
serializer = InstanceSerializer(instance, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def delete(self, request, pk, format=None):
instance = self.get_object(pk)
instance.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
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