Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
CIRCLE
/
cloud
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
94
Merge Requests
10
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
e521bceb
authored
Nov 26, 2014
by
Kálmán Viktor
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
occi: handle users
parent
53fedb73
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
58 additions
and
64 deletions
+58
-64
circle/occi/occi.py
+12
-46
circle/occi/views.py
+46
-18
No files found.
circle/occi/occi.py
View file @
e521bceb
...
...
@@ -94,7 +94,6 @@ class Category():
return
ret
[:
-
1
]
# trailing semicolon
# TODO related, entity_type, entities
class
Kind
(
Category
):
pass
...
...
@@ -150,9 +149,7 @@ class Compute(Resource):
self
.
init_attrs
()
@classmethod
def
create_object
(
cls
,
data
):
# TODO user
user
=
User
.
objects
.
get
(
username
=
"test"
)
def
create_object
(
cls
,
data
,
user
):
template
=
None
attributes
=
{}
links
=
[]
...
...
@@ -284,7 +281,7 @@ class Compute(Resource):
self
.
attrs
[
'occi.compute.state'
]
=
status
.
get
(
self
.
instance
.
status
,
"inactive"
)
def
trigger_action
(
self
,
data
):
def
trigger_action
(
self
,
data
,
user
):
method
=
None
action_term
=
None
for
d
in
data
:
...
...
@@ -311,9 +308,7 @@ class Compute(Resource):
user
=
User
.
objects
.
get
(
username
=
"test"
)
getattr
(
self
.
instance
,
operation
)
.
async
(
user
=
user
)
def
delete
(
self
):
# TODO
user
=
User
.
objects
.
get
(
username
=
"test"
)
def
delete
(
self
,
user
):
self
.
instance
.
destroy
(
user
=
user
)
...
...
@@ -349,7 +344,7 @@ class Storage(Resource):
self
.
init_attrs
()
@classmethod
def
create_object
(
cls
,
data
):
def
create_object
(
cls
,
data
,
user
):
attributes
=
{}
for
d
in
data
:
...
...
@@ -365,11 +360,8 @@ class Storage(Resource):
if
not
name
:
name
=
"disk create from OCCI at
%
s"
%
timezone
.
now
()
# TODO user
user
=
User
.
objects
.
get
(
username
=
"test"
)
params
=
{
'user'
:
user
,
'user'
:
user
,
# not used
'size'
:
int
(
float
(
size
)
*
1024
**
3
),
# GiB to byte
'type'
:
"qcow2-norm"
,
'name'
:
name
,
...
...
@@ -406,7 +398,7 @@ class Storage(Resource):
self
.
attrs
[
'occi.storage.state'
]
=
"online"
self
.
attrs
[
'occi.storage.size'
]
/=
1024
*
1024
*
1024.0
def
trigger_action
(
self
,
data
):
def
trigger_action
(
self
,
data
,
user
):
# TODO, this is copypaste ATM
method
=
None
action_term
=
None
...
...
@@ -430,14 +422,10 @@ class Storage(Resource):
action
=
compute_action_to_operation
.
get
(
action_term
)
operation
=
action
.
get
(
method
)
# TODO user
user
=
User
.
objects
.
get
(
username
=
"test"
)
getattr
(
self
.
instance
,
operation
)
.
async
(
user
=
user
)
def
delete
(
self
):
# TODO
user
=
User
.
objects
.
get
(
username
=
"test"
)
def
delete
(
self
,
user
):
# random deletes? template?
if
self
.
disk
.
instance_set
.
count
()
>
0
:
for
i
in
self
.
disk
.
instance_set
.
all
():
i
.
detach_disk
(
user
=
user
,
disk
=
self
.
disk
)
...
...
@@ -464,7 +452,7 @@ class StorageLink(Link):
self
.
disk
=
disk
@classmethod
def
create_object
(
cls
,
data
):
def
create_object
(
cls
,
data
,
user
):
attributes
=
{}
for
d
in
data
:
...
...
@@ -477,8 +465,6 @@ class StorageLink(Link):
if
not
(
source
and
target
):
return
None
# TODO user
user
=
User
.
objects
.
get
(
username
=
"test"
)
g
=
re
.
match
(
occi_attribute_link_regex
%
"storage"
,
target
)
disk_pk
=
g
.
group
(
"id"
)
g
=
re
.
match
(
occi_attribute_link_regex
%
"vm"
,
source
)
...
...
@@ -521,10 +507,7 @@ class StorageLink(Link):
'attrs'
:
self
.
attrs
,
})
def
delete
(
self
):
# TODO
user
=
User
.
objects
.
get
(
username
=
"test"
)
def
delete
(
self
,
user
):
if
self
.
disk
in
self
.
instance
.
disks
.
all
():
self
.
instance
.
detach_disk
(
user
=
user
,
disk
=
self
.
disk
)
...
...
@@ -633,7 +616,7 @@ class NetworkInterface(Link):
return
"eth
%
d"
%
index
@classmethod
def
create_object
(
cls
,
data
):
def
create_object
(
cls
,
data
,
user
):
attributes
=
{}
for
d
in
data
:
...
...
@@ -646,8 +629,6 @@ class NetworkInterface(Link):
if
not
(
source
and
target
):
return
None
# TODO user
user
=
User
.
objects
.
get
(
username
=
"test"
)
g
=
re
.
match
(
occi_attribute_link_regex
%
"network"
,
target
)
vlan_vid
=
g
.
group
(
"id"
)
g
=
re
.
match
(
occi_attribute_link_regex
%
"vm"
,
source
)
...
...
@@ -692,10 +673,7 @@ class NetworkInterface(Link):
'attrs'
:
self
.
attrs
,
})
def
delete
(
self
):
# TODO
user
=
User
.
objects
.
get
(
username
=
"test"
)
def
delete
(
self
,
user
):
interface
=
Interface
.
objects
.
get
(
vlan
=
self
.
vlan
,
instance
=
self
.
instance
)
self
.
instance
.
remove_interface
(
user
=
user
,
interface
=
interface
)
...
...
@@ -723,19 +701,7 @@ class IPNetworkInterface(Mixin):
})
"""predefined stuffs
storage attributes and actions
http://ogf.org/documents/GFD.184.pdf 3.3 (page 7)
storagelink attributes
http://ogf.org/documents/GFD.184.pdf 3.4.2 (page 10)
"""
# compute attributes and actions
# http://ogf.org/documents/GFD.184.pdf 3.1 (page 5)
COMPUTE_ATTRS
=
[
Attribute
(
"occi.compute.architecture"
),
Attribute
(
"occi.compute.cores"
),
...
...
circle/occi/views.py
View file @
e521bceb
import
logging
from
django.core.exceptions
import
PermissionDenied
from
django.http
import
HttpResponse
,
Http404
from
django.shortcuts
import
get_object_or_404
from
django.utils.decorators
import
method_decorator
...
...
@@ -5,7 +8,7 @@ from django.views.decorators.csrf import csrf_exempt
from
django.views.generic
import
View
,
DetailView
from
firewall.models
import
Vlan
from
vm.models
import
Instance
,
InstanceTemplate
from
vm.models
import
Instance
,
InstanceTemplate
,
Interface
from
storage.models
import
Disk
from
.occi
import
(
...
...
@@ -27,6 +30,8 @@ from .occi import (
IPNETWORK_INTERFACE_MIXIN
,
)
logger
=
logging
.
getLogger
(
__name__
)
class
CSRFExemptMixin
(
object
):
@method_decorator
(
csrf_exempt
)
...
...
@@ -77,7 +82,9 @@ class QueryInterface(CSRFExemptMixin, View):
for
c
in
COMPUTE_ACTIONS
:
response
+=
"Category:
%
s
\n
"
%
c
.
render_values
()
for
t
in
InstanceTemplate
.
objects
.
all
():
templates
=
InstanceTemplate
.
get_objects_with_level
(
"user"
,
self
.
request
.
user
)
for
t
in
templates
:
response
+=
OsTemplate
(
t
)
.
render_body
()
return
HttpResponse
(
...
...
@@ -93,8 +100,9 @@ class QueryInterface(CSRFExemptMixin, View):
class
ComputeInterface
(
CSRFExemptMixin
,
OCCIPostDataAsListMixin
,
View
):
def
get
(
self
,
request
,
*
args
,
**
kwargs
):
vms
=
Instance
.
get_objects_with_level
(
"user"
,
self
.
request
.
user
)
response
=
"
\n
"
.
join
([
Compute
(
instance
=
i
)
.
render_location
()
for
i
in
Instance
.
active
.
all
()
])
for
i
in
vms
])
return
HttpResponse
(
response
,
content_type
=
"text/plain"
,
...
...
@@ -103,7 +111,7 @@ class ComputeInterface(CSRFExemptMixin, OCCIPostDataAsListMixin, View):
def
post
(
self
,
request
,
*
args
,
**
kwargs
):
data
=
self
.
get_post_data
(
request
)
c
=
Compute
.
create_object
(
data
=
data
)
c
=
Compute
.
create_object
(
data
=
data
,
user
=
self
.
request
.
user
)
response
=
HttpResponse
(
"X-OCCI-Location:
%
s"
%
c
.
location
,
status
=
201
,
...
...
@@ -116,8 +124,11 @@ class VmInterface(CSRFExemptMixin, OCCIPostDataAsListMixin, DetailView):
model
=
Instance
def
get_object
(
self
):
return
get_object_or_404
(
Instance
.
objects
.
filter
(
destroyed_at
=
None
),
pk
=
self
.
kwargs
[
'pk'
])
vm
=
get_object_or_404
(
Instance
.
objects
.
filter
(
destroyed_at
=
None
),
pk
=
self
.
kwargs
[
'pk'
])
if
not
vm
.
has_level
(
self
.
request
.
user
,
"user"
):
raise
PermissionDenied
()
return
vm
def
get
(
self
,
request
,
*
args
,
**
kwargs
):
vm
=
self
.
get_object
()
...
...
@@ -132,12 +143,12 @@ class VmInterface(CSRFExemptMixin, OCCIPostDataAsListMixin, DetailView):
action
=
request
.
GET
.
get
(
"action"
)
vm
=
self
.
get_object
()
if
action
:
Compute
(
instance
=
vm
)
.
trigger_action
(
data
)
Compute
(
instance
=
vm
)
.
trigger_action
(
data
,
self
.
request
.
user
)
return
HttpResponse
()
def
delete
(
self
,
request
,
*
args
,
**
kwargs
):
vm
=
self
.
get_object
()
Compute
(
instance
=
vm
)
.
delete
()
Compute
(
instance
=
vm
)
.
delete
(
self
.
request
.
user
)
return
HttpResponse
()
...
...
@@ -145,8 +156,10 @@ class VmInterface(CSRFExemptMixin, OCCIPostDataAsListMixin, DetailView):
class
OsTplInterface
(
CSRFExemptMixin
,
View
):
def
get
(
self
,
request
,
*
args
,
**
kwargs
):
templates
=
InstanceTemplate
.
get_objects_with_level
(
"user"
,
self
.
request
.
user
)
response
=
"
\n
"
.
join
([
OsTemplate
(
template
=
t
)
.
render_location
()
for
t
in
InstanceTemplate
.
objects
.
all
()
])
for
t
in
templates
])
return
HttpResponse
(
response
,
content_type
=
"text/plain"
,
...
...
@@ -169,7 +182,7 @@ class StorageInterface(CSRFExemptMixin, OCCIPostDataAsListMixin, View):
def
post
(
self
,
request
,
*
args
,
**
kwargs
):
data
=
self
.
get_post_data
(
request
)
d
=
Storage
.
create_object
(
data
=
data
)
d
=
Storage
.
create_object
(
data
=
data
,
user
=
self
.
request
.
user
)
response
=
HttpResponse
(
"X-OCCI-Location:
%
s"
%
d
.
location
,
status
=
201
,
...
...
@@ -195,11 +208,11 @@ class DiskInterface(CSRFExemptMixin, OCCIPostDataAsListMixin, DetailView):
action
=
request
.
GET
.
get
(
"action"
)
disk
=
self
.
get_object
()
if
action
:
Storage
(
disk
=
disk
)
.
trigger_action
(
data
)
Storage
(
disk
=
disk
)
.
trigger_action
(
data
,
self
.
request
.
user
)
return
HttpResponse
()
def
delete
(
self
,
request
,
*
args
,
**
kwargs
):
Storage
(
disk
=
self
.
get_object
())
.
delete
()
Storage
(
disk
=
self
.
get_object
())
.
delete
(
self
.
request
.
user
)
return
HttpResponse
(
""
)
...
...
@@ -214,6 +227,9 @@ class StorageLinkInterface(CSRFExemptMixin, OCCIPostDataAsListMixin, View):
if
disk
not
in
vm
.
disks
.
all
():
raise
Http404
if
not
vm
.
has_level
(
self
.
request
.
user
,
"user"
):
raise
PermissionDenied
()
return
vm
,
disk
def
get
(
self
,
request
,
*
args
,
**
kwargs
):
...
...
@@ -231,7 +247,7 @@ class StorageLinkInterface(CSRFExemptMixin, OCCIPostDataAsListMixin, View):
return
HttpResponse
(
""
,
status
=
500
)
data
=
self
.
get_post_data
(
request
)
sl
=
StorageLink
.
create_object
(
data
=
data
)
sl
=
StorageLink
.
create_object
(
data
=
data
,
user
=
self
.
request
.
user
)
if
sl
:
response
=
HttpResponse
(
"X-OCCI-Location:
%
s"
%
sl
.
location
,
...
...
@@ -246,15 +262,16 @@ class StorageLinkInterface(CSRFExemptMixin, OCCIPostDataAsListMixin, View):
vm
,
disk
=
self
.
get_vm_and_disk
()
sl
=
StorageLink
(
instance
=
vm
,
disk
=
disk
)
sl
.
delete
()
sl
.
delete
(
user
=
self
.
request
.
user
)
return
HttpResponse
(
""
)
class
NetworkInterfaceView
(
CSRFExemptMixin
,
View
):
def
get
(
self
,
request
,
*
args
,
**
kwargs
):
vlans
=
Vlan
.
get_objects_with_level
(
"user"
,
self
.
request
.
user
)
response
=
"
\n
"
.
join
([
Network
(
vlan
=
v
)
.
render_location
()
for
v
in
Vlan
.
objects
.
all
()
])
for
v
in
vlans
])
return
HttpResponse
(
response
,
content_type
=
"text/plain"
,
...
...
@@ -269,6 +286,13 @@ class VlanInterface(CSRFExemptMixin, DetailView):
slug_field
=
'vid'
slug_url_kwarg
=
'vid'
def
get_object
(
self
):
vlan
=
get_object_or_404
(
Vlan
,
vid
=
self
.
kwargs
[
'vid'
])
if
not
vlan
.
has_level
(
self
.
request
.
user
,
"user"
):
raise
PermissionDenied
()
return
vlan
def
get
(
self
,
request
,
*
args
,
**
kwargs
):
vlan
=
self
.
get_object
()
c
=
Network
(
vlan
=
vlan
)
...
...
@@ -291,6 +315,11 @@ class CIRCLEInterface(CSRFExemptMixin, OCCIPostDataAsListMixin, View):
pk
=
self
.
kwargs
[
'vm_pk'
])
vlan
=
get_object_or_404
(
Vlan
,
vid
=
vlan_vid
)
if
not
vm
.
has_level
(
self
.
request
.
user
,
"user"
):
raise
PermissionDenied
()
get_object_or_404
(
Interface
,
vlan
=
vlan
,
instance
=
vm
)
return
vm
,
vlan
def
get
(
self
,
request
,
*
args
,
**
kwargs
):
...
...
@@ -303,12 +332,11 @@ class CIRCLEInterface(CSRFExemptMixin, OCCIPostDataAsListMixin, View):
def
post
(
self
,
request
,
*
args
,
**
kwargs
):
# we don't support actions for networkinterfaces
# (they don't even exist in the model)
if
request
.
GET
.
get
(
"action"
):
return
HttpResponse
(
""
,
status
=
500
)
data
=
self
.
get_post_data
(
request
)
sl
=
NetworkInterface
.
create_object
(
data
=
data
)
sl
=
NetworkInterface
.
create_object
(
data
=
data
,
user
=
self
.
request
.
user
)
if
sl
:
response
=
HttpResponse
(
"X-OCCI-Location:
%
s"
%
sl
.
location
,
...
...
@@ -323,5 +351,5 @@ class CIRCLEInterface(CSRFExemptMixin, OCCIPostDataAsListMixin, View):
vm
,
vlan
=
self
.
get_vm_and_vlan
()
ni
=
NetworkInterface
(
instance
=
vm
,
vlan
=
vlan
)
ni
.
delete
()
ni
.
delete
(
user
=
self
.
request
.
user
)
return
HttpResponse
(
""
)
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