Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
RECIRCLE
/
portal
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
11
Merge Requests
0
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
e638f2fd
authored
Jul 21, 2019
by
Bodor Máté
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Create template views
parent
47e13094
Show whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
163 additions
and
56 deletions
+163
-56
recircle/image/admin.py
+2
-0
recircle/image/models.py
+16
-2
recircle/image/serializers.py
+17
-4
recircle/image/urls.py
+4
-4
recircle/image/views.py
+33
-15
recircle/instance/views.py
+2
-2
recircle/recircle/urls.py
+1
-1
recircle/template/migrations/0006_auto_20190719_1416.py
+18
-0
recircle/template/models.py
+9
-8
recircle/template/serializers.py
+17
-3
recircle/template/urls.py
+4
-9
recircle/template/views.py
+40
-8
No files found.
recircle/image/admin.py
View file @
e638f2fd
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
)
recircle/image/models.py
View file @
e638f2fd
...
@@ -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
recircle/image/serializers.py
View file @
e638f2fd
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"
,
)
recircle/image/urls.py
View file @
e638f2fd
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
recircle/image/views.py
View file @
e638f2fd
# from django.shortcuts import render
# from django.shortcuts import render
from
rest_framework.views
import
APIView
from
rest_framework.views
ets
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")
recircle/instance/views.py
View file @
e638f2fd
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
):
...
...
recircle/recircle/urls.py
View file @
e638f2fd
...
@@ -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
),
...
...
recircle/template/migrations/0006_auto_20190719_1416.py
0 → 100644
View file @
e638f2fd
# 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
),
),
]
recircle/template/models.py
View file @
e638f2fd
...
@@ -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
recircle/template/serializers.py
View file @
e638f2fd
...
@@ -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
Instance
From
TemplateSerializer
(
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"
,
)
recircle/template/urls.py
View file @
e638f2fd
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
recircle/template/views.py
View file @
e638f2fd
# 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.views
ets
import
ModelViewSet
from
django.http
import
HttpResponse
from
rest_framework.decorators
import
action
from
template.serializers
import
InstanceTemplateSerializer
from
template.serializers
import
Instance
From
TemplateSerializer
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
)
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment