Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
Gelencsér Szabolcs
/
circlestack
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
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
A prog2-höz tartozó friss repo anyagok itt elérhetőek:
https://git.iit.bme.hu/
Commit
e4964aff
authored
May 17, 2018
by
Szabolcs Gelencser
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Implement lease request creation
parent
bad98db4
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
77 additions
and
52 deletions
+77
-52
circle/dashboard/migrations/0009_auto_20180517_1630.py
+49
-0
circle/dashboard/templates/dashboard/_vm-renew.html
+1
-1
circle/dashboard/views/vm.py
+4
-1
circle/request/models.py
+14
-11
circle/request/urls.py
+1
-1
circle/request/views.py
+8
-38
No files found.
circle/dashboard/migrations/0009_auto_20180517_1630.py
0 → 100644
View file @
e4964aff
# -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2018-05-17 14:30
from
__future__
import
unicode_literals
from
django.db
import
migrations
,
models
class
Migration
(
migrations
.
Migration
):
dependencies
=
[
(
'dashboard'
,
'0008_auto_20180420_1054'
),
]
operations
=
[
migrations
.
RemoveField
(
model_name
=
'profile'
,
name
=
'disk_quota'
,
),
migrations
.
RemoveField
(
model_name
=
'profile'
,
name
=
'instance_limit'
,
),
migrations
.
RemoveField
(
model_name
=
'profile'
,
name
=
'network_limit'
,
),
migrations
.
RemoveField
(
model_name
=
'profile'
,
name
=
'org_id'
,
),
migrations
.
RemoveField
(
model_name
=
'profile'
,
name
=
'smb_password'
,
),
migrations
.
RemoveField
(
model_name
=
'profile'
,
name
=
'two_factor_secret'
,
),
migrations
.
RemoveField
(
model_name
=
'profile'
,
name
=
'user'
,
),
migrations
.
AddField
(
model_name
=
'profile'
,
name
=
'user_id'
,
field
=
models
.
CharField
(
default
=
0
,
max_length
=
100
,
unique
=
True
),
preserve_default
=
False
,
),
]
circle/dashboard/templates/dashboard/_vm-renew.html
View file @
e4964aff
...
...
@@ -8,7 +8,7 @@
<a
class=
"btn btn-default"
href=
"{{object.get_absolute_url}}"
data-dismiss=
"modal"
>
{% trans "Cancel" %}
</a>
{% if
object.active and
lease_types and not request.token_user %}
{% if lease_types and not request.token_user %}
<a
class=
"btn btn-primary"
id=
"vm-renew-request-lease-button"
href=
"{% url "
request
.
views
.
request-lease
"
vm_pk=
object.id
%}"
>
<i
class=
"fa fa-forward"
></i>
...
...
circle/dashboard/views/vm.py
View file @
e4964aff
...
...
@@ -732,7 +732,10 @@ class VmRenewView(FormOperationMixin, VmOperationView):
# Lease.objects.filter(pk=default.pk).distinct())
val
=
super
(
VmRenewView
,
self
)
.
get_form_kwargs
()
val
.
update
({
'choices'
:
choices
,
'default'
:
default
})
val
.
update
({
'choices'
:
choices
,
'default'
:
default
,
})
return
val
def
get_response_data
(
self
,
result
,
done
,
extra
=
None
,
**
kwargs
):
...
...
circle/request/models.py
View file @
e4964aff
...
...
@@ -31,6 +31,7 @@ from django.utils.translation import (
from
django.core.urlresolvers
import
reverse
import
requests
from
openstack_api.nova
import
Server
from
sizefield.models
import
FileSizeField
from
model_utils.models
import
TimeStampedModel
from
model_utils
import
Choices
...
...
@@ -79,7 +80,7 @@ class Request(TimeStampedModel):
)
status
=
CharField
(
choices
=
STATUSES
,
default
=
STATUSES
.
PENDING
,
max_length
=
10
)
user
=
ForeignKey
(
User
,
related_name
=
"user"
)
user
_id
=
CharField
(
blank
=
False
,
max_length
=
100
)
closed_by
=
ForeignKey
(
User
,
related_name
=
"closed_by"
,
null
=
True
)
TYPES
=
Choices
(
(
'resource'
,
_
(
'resource request'
)),
...
...
@@ -219,22 +220,23 @@ class ResourceChangeAction(RequestAction):
class
ExtendLeaseAction
(
RequestAction
):
instance
=
ForeignKey
(
Instance
)
os_server_id
=
CharField
(
blank
=
False
,
max_length
=
100
)
lease_type
=
ForeignKey
(
LeaseType
)
def
accept
(
self
,
user
):
self
.
instance
.
renew
(
lease
=
self
.
lease_type
.
lease
,
save
=
True
,
force
=
True
,
user
=
user
)
pass
# self.instance.renew(lease=self.lease_type.lease, save=True, force=True,
user=user)
@property
def
accept_msg
(
self
):
return
_
(
'The lease of <a href="
%(url)
s">
%(name)
s</a> got extended. '
'(suspend:
%(suspend)
s, remove:
%(remove)
s)'
)
%
{
'name'
:
self
.
instance
.
name
,
'url'
:
self
.
instance
.
get_absolute_url
(),
'suspend'
:
self
.
lease_type
.
lease
.
get_readable_suspend_time
(),
'remove'
:
self
.
lease_type
.
lease
.
get_readable_delete_time
(),
}
# return _(
# 'The lease of <a href="%(url)s">%(name)s</a> got extended. '
# '(suspend: %(suspend)s, remove: %(remove)s)'
# ) % {'name': self.instance.name,
# 'url': self.instance.get_absolute_url(),
# 'suspend': self.lease_type.lease.get_readable_suspend_time(),
# 'remove': self.lease_type.lease.get_readable_delete_time(), }
return
"got extended"
class
TemplateAccessAction
(
RequestAction
):
...
...
@@ -288,6 +290,7 @@ class DiskResizeAction(RequestAction):
def
send_notifications
(
sender
,
instance
,
created
,
**
kwargs
):
return
#TODO
if
not
created
:
return
...
...
circle/request/urls.py
View file @
e4964aff
...
...
@@ -29,7 +29,7 @@ from .views import (
urlpatterns
=
[
url
(
r'^list/$'
,
RequestList
.
as_view
(),
name
=
"request.views.request-list"
),
url
(
r'^(?P<pk>
[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}
)/$'
,
RequestDetail
.
as_view
(),
url
(
r'^(?P<pk>
\d+
)/$'
,
RequestDetail
.
as_view
(),
name
=
"request.views.request-detail"
),
url
(
r'^type/list/$'
,
RequestTypeList
.
as_view
(),
...
...
circle/request/views.py
View file @
e4964aff
...
...
@@ -16,6 +16,7 @@
# with CIRCLE. If not, see <http://www.gnu.org/licenses/>.
from
__future__
import
unicode_literals
,
absolute_import
import
openstack_api
from
braces.views._access
import
AccessMixin
from
django.views.generic
import
(
UpdateView
,
TemplateView
,
DetailView
,
CreateView
,
FormView
,
DeleteView
,
...
...
@@ -211,38 +212,7 @@ class TemplateRequestView(LoginRequiredMixin, FormView):
return
redirect
(
reverse
(
"dashboard.index"
))
class
VmRequestMixin
(
LoginRequiredMixin
,
object
):
def
get_vm
(
self
):
return
get_object_or_404
(
Instance
,
pk
=
self
.
kwargs
[
'vm_pk'
])
def
dispatch
(
self
,
*
args
,
**
kwargs
):
vm
=
self
.
get_vm
()
user
=
self
.
request
.
user
if
not
vm
.
has_level
(
user
,
self
.
user_level
):
raise
PermissionDenied
()
if
vm
.
destroyed_at
:
message
=
_
(
"Instance
%(instance)
s has already been destroyed."
)
messages
.
error
(
self
.
request
,
message
%
{
'instance'
:
vm
.
name
})
return
redirect
(
vm
.
get_absolute_url
())
return
super
(
VmRequestMixin
,
self
)
.
dispatch
(
*
args
,
**
kwargs
)
def
get_context_data
(
self
,
**
kwargs
):
context
=
super
(
VmRequestMixin
,
self
)
.
get_context_data
(
**
kwargs
)
context
[
'vm'
]
=
self
.
get_vm
()
return
context
def
get_form_kwargs
(
self
):
kwargs
=
super
(
VmRequestMixin
,
self
)
.
get_form_kwargs
()
kwargs
[
'request'
]
=
self
.
request
return
kwargs
def
form_valid
(
self
,
form
):
raise
NotImplementedError
class
LeaseRequestView
(
VmRequestMixin
,
FormView
):
class
LeaseRequestView
(
LoginRequiredMixin
,
FormView
):
form_class
=
LeaseRequestForm
template_name
=
"request/request-lease.html"
user_level
=
"operator"
...
...
@@ -251,16 +221,16 @@ class LeaseRequestView(VmRequestMixin, FormView):
def
form_valid
(
self
,
form
):
data
=
form
.
cleaned_data
user
=
self
.
request
.
user
vm
=
self
.
get_vm
()
vm
=
openstack_api
.
nova
.
server_get
(
self
.
request
,
self
.
kwargs
[
'vm_pk'
])
# to check priviliges
el
=
ExtendLeaseAction
(
lease_type
=
data
[
'lease'
],
instance
=
vm
,
os_server_id
=
vm
.
id
,
)
el
.
save
()
req
=
Request
(
user
=
user
,
user
_id
=
user
.
id
,
message
=
data
[
'message'
],
type
=
Request
.
TYPES
.
lease
,
action
=
el
...
...
@@ -268,10 +238,10 @@ class LeaseRequestView(VmRequestMixin, FormView):
req
.
save
()
messages
.
success
(
self
.
request
,
self
.
success_message
)
return
redirect
(
vm
.
get_absolute_url
(
))
return
redirect
(
reverse
(
'dashboard.views.detail'
,
args
=
[
self
.
kwargs
[
'vm_pk'
]]
))
class
ResourceRequestView
(
VmRequest
Mixin
,
FormView
):
class
ResourceRequestView
(
LoginRequired
Mixin
,
FormView
):
form_class
=
ResourceRequestForm
template_name
=
"request/request-resource.html"
user_level
=
"user"
...
...
@@ -316,7 +286,7 @@ class ResourceRequestView(VmRequestMixin, FormView):
return
redirect
(
vm
.
get_absolute_url
())
class
ResizeRequestView
(
VmRequest
Mixin
,
FormView
):
class
ResizeRequestView
(
LoginRequired
Mixin
,
FormView
):
form_class
=
ResizeRequestForm
template_name
=
"request/_request-resize-form.html"
user_level
=
"owner"
...
...
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