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
e5e57a40
authored
Sep 18, 2013
by
Őry Máté
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
vm: reformat models
parent
31196920
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
161 additions
and
108 deletions
+161
-108
circle/circle/settings/base.py
+3
-4
circle/vm/models.py
+158
-104
No files found.
circle/circle/settings/base.py
View file @
e5e57a40
...
...
@@ -298,8 +298,7 @@ CRISPY_TEMPLATE_PACK = 'bootstrap3'
# format: id: (name, port, protocol)
VM_ACCESS_PROTOCOLS
=
loads
(
get_env_variable
(
'DJANGO_VM_ACCESS_PROTOCOLS'
,
'''{"nx": ["nx", 22, "tcp"],
"rdp": ["rdp", 3389, "tcp"],
"ssh": ["ssh", 22, "tcp"]}'''
))
'''{"nx": ["NX", 22, "tcp"],
"rdp": ["RDP", 3389, "tcp"],
"ssh": ["SSH", 22, "tcp"]}'''
))
VM_SCHEDULER
=
'manager.scheduler'
circle/vm/models.py
View file @
e5e57a40
...
...
@@ -4,7 +4,9 @@ import logging
import
django.conf
from
django.contrib.auth.models
import
User
from
django.db
import
models
from
django.db.models
import
(
Model
,
ForeignKey
,
ManyToManyField
,
IntegerField
,
DateTimeField
,
BooleanField
,
TextField
,
CharField
,
permalink
)
from
django.db.models.signals
import
pre_delete
from
django.dispatch
import
receiver
from
django.utils
import
timezone
...
...
@@ -22,22 +24,34 @@ logger = logging.getLogger(__name__)
pwgen
=
User
.
objects
.
make_random_password
scheduler
=
import_module
(
name
=
django
.
conf
.
settings
.
VM_SCHEDULER
)
ACCESS_PROTOCOLS
=
django
.
conf
.
settings
.
VM_ACCESS_PROTOCOLS
ACCESS_METHODS
=
[(
k
,
ap
[
0
])
for
k
,
ap
in
ACCESS_PROTOCOLS
.
iteritems
()]
ACCESS_METHODS
=
[(
key
,
name
)
for
key
,
(
name
,
port
,
transport
)
in
ACCESS_PROTOCOLS
.
iteritems
()]
ARCHITECTURES
=
((
'x86_64'
,
'x86-64 (64 bit)'
),
(
'i686'
,
'x86 (32 bit)'
))
class
BaseResourceConfigModel
(
models
.
Model
):
class
BaseResourceConfigModel
(
Model
):
"""Abstract base class for models with base resource configuration
parameters.
"""
num_cores
=
models
.
IntegerField
(
help_text
=
_
(
'Number of CPU cores.'
))
ram_size
=
models
.
IntegerField
(
help_text
=
_
(
'Mebibytes of memory.'
))
max_ram_size
=
models
.
IntegerField
(
help_text
=
_
(
'Upper memory size limit '
'for balloning.'
))
arch
=
models
.
CharField
(
max_length
=
10
,
verbose_name
=
_
(
'architecture'
))
priority
=
models
.
IntegerField
(
help_text
=
_
(
'instance priority'
))
boot_menu
=
models
.
BooleanField
(
default
=
False
)
raw_data
=
models
.
TextField
(
blank
=
True
)
num_cores
=
IntegerField
(
verbose_name
=
_
(
'number of cores'
),
help_text
=
_
(
'Number of virtual CPU cores '
'available to the virtual machine.'
))
ram_size
=
IntegerField
(
verbose_name
=
_
(
'RAM size'
),
help_text
=
_
(
'Mebibytes of memory.'
))
max_ram_size
=
IntegerField
(
verbose_name
=
_
(
'maximal RAM size'
),
help_text
=
_
(
'Upper memory size limit '
'for balloning.'
))
arch
=
CharField
(
max_length
=
10
,
verbose_name
=
_
(
'architecture'
),
choices
=
ARCHITECTURES
)
priority
=
IntegerField
(
verbose_name
=
_
(
'priority'
),
help_text
=
_
(
'CPU priority.'
))
boot_menu
=
BooleanField
(
verbose_name
=
_
(
'boot menu'
),
default
=
False
,
help_text
=
_
(
'Show boot device selection menu on boot.'
))
raw_data
=
TextField
(
verbose_name
=
_
(
'raw_data'
),
blank
=
True
,
help_text
=
_
(
'Additional libvirt domain parameters in XML format.'
))
class
Meta
:
abstract
=
True
...
...
@@ -47,8 +61,9 @@ class NamedBaseResourceConfig(BaseResourceConfigModel, TimeStampedModel):
"""Pre-created, named base resource configurations.
"""
name
=
models
.
CharField
(
max_length
=
50
,
unique
=
True
,
verbose_name
=
_
(
'name'
))
name
=
CharField
(
max_length
=
50
,
unique
=
True
,
verbose_name
=
_
(
'name'
),
help_text
=
_
(
'Name of base resource configuration.'
))
def
__unicode__
(
self
):
return
self
.
name
...
...
@@ -56,17 +71,23 @@ class NamedBaseResourceConfig(BaseResourceConfigModel, TimeStampedModel):
class
Node
(
TimeStampedModel
):
"""A VM host machine.
"""A VM host machine
, a hypervisor
.
"""
name
=
models
.
CharField
(
max_length
=
50
,
unique
=
True
,
verbose_name
=
_
(
'name'
))
num_cores
=
models
.
IntegerField
(
help_text
=
_
(
'Number of CPU cores.'
))
ram_size
=
models
.
IntegerField
(
help_text
=
_
(
'Mebibytes of memory.'
))
priority
=
models
.
IntegerField
(
help_text
=
_
(
'node usage priority'
))
host
=
models
.
ForeignKey
(
Host
)
enabled
=
models
.
BooleanField
(
default
=
False
,
help_text
=
_
(
'Indicates whether the node can '
'be used for hosting.'
))
name
=
CharField
(
max_length
=
50
,
unique
=
True
,
verbose_name
=
_
(
'name'
),
help_text
=
_
(
'Human readable name of node.'
))
num_cores
=
IntegerField
(
verbose_name
=
_
(
'number of cores'
),
help_text
=
_
(
'Number of CPU threads '
'available to the virtual machines.'
))
ram_size
=
IntegerField
(
verbose_name
=
_
(
'RAM size'
),
help_text
=
_
(
'Mebibytes of memory.'
))
priority
=
IntegerField
(
verbose_name
=
_
(
'priority'
),
help_text
=
_
(
'Node usage priority.'
))
host
=
ForeignKey
(
Host
,
verbose_name
=
_
(
'host'
),
help_text
=
_
(
'Host in firewall.'
))
enabled
=
BooleanField
(
verbose_name
=
_
(
'enabled'
),
default
=
False
,
help_text
=
_
(
'Indicates whether the node can '
'be used for hosting.'
))
class
Meta
:
permissions
=
()
...
...
@@ -82,28 +103,39 @@ class Node(TimeStampedModel):
class
NodeActivity
(
TimeStampedModel
):
activity_code
=
models
.
CharField
(
max_length
=
100
)
task_uuid
=
models
.
CharField
(
blank
=
True
,
max_length
=
50
,
null
=
True
,
unique
=
True
)
node
=
models
.
ForeignKey
(
Node
,
related_name
=
'activity_log'
)
user
=
models
.
ForeignKey
(
User
,
blank
=
True
,
null
=
True
)
started
=
models
.
DateTimeField
(
blank
=
True
,
null
=
True
)
finished
=
models
.
DateTimeField
(
blank
=
True
,
null
=
True
)
result
=
models
.
TextField
(
blank
=
True
,
null
=
True
)
status
=
models
.
CharField
(
default
=
'PENDING'
,
max_length
=
50
)
class
Lease
(
models
.
Model
):
activity_code
=
CharField
(
verbose_name
=
_
(
'activity code'
),
max_length
=
100
)
# TODO
task_uuid
=
CharField
(
verbose_name
=
_
(
'task_uuid'
),
blank
=
True
,
max_length
=
50
,
null
=
True
,
unique
=
True
,
help_text
=
_
(
'Celery task unique identifier.'
))
node
=
ForeignKey
(
Node
,
verbose_name
=
_
(
'node'
),
related_name
=
'activity_log'
,
help_text
=
_
(
'Node this activity works on.'
))
user
=
ForeignKey
(
User
,
verbose_name
=
_
(
'user'
),
blank
=
True
,
null
=
True
,
help_text
=
_
(
'The person who started this activity.'
))
started
=
DateTimeField
(
verbose_name
=
_
(
'started at'
),
blank
=
True
,
null
=
True
,
help_text
=
_
(
'Time of activity initiation.'
))
finished
=
DateTimeField
(
verbose_name
=
_
(
'finished at'
),
blank
=
True
,
null
=
True
,
help_text
=
_
(
'Time of activity finalization.'
))
result
=
TextField
(
verbose_name
=
_
(
'result'
),
blank
=
True
,
null
=
True
,
help_text
=
_
(
'Human readable result of activity.'
))
status
=
CharField
(
verbose_name
=
_
(
'status'
),
default
=
'PENDING'
,
max_length
=
50
,
help_text
=
_
(
'Actual state of activity'
))
class
Lease
(
Model
):
"""Lease times for VM instances.
Specifies a time duration until suspension and deletion of a VM
instance.
"""
name
=
models
.
CharField
(
max_length
=
100
,
unique
=
True
,
verbose_name
=
_
(
'name'
))
suspend_interval_seconds
=
models
.
IntegerField
(
)
delete_interval_seconds
=
models
.
IntegerField
(
)
name
=
CharField
(
max_length
=
100
,
unique
=
True
,
verbose_name
=
_
(
'name'
))
suspend_interval_seconds
=
IntegerField
(
verbose_name
=
_
(
'suspend interval'
)
)
delete_interval_seconds
=
IntegerField
(
verbose_name
=
_
(
'delete interval'
)
)
class
Meta
:
ordering
=
[
'name'
,
]
...
...
@@ -144,27 +176,31 @@ class InstanceTemplate(BaseResourceConfigModel, TimeStampedModel):
* lease times (suspension & deletion)
* time of creation and last modification
"""
STATES
=
[(
'NEW'
,
_
(
'new'
)),
# template has just been created
STATES
=
[(
'NEW'
,
_
(
'new'
)),
# template has just been created
(
'SAVING'
,
_
(
'saving'
)),
# changes are being saved
(
'READY'
,
_
(
'ready'
))]
# template is ready for instantiation
name
=
models
.
CharField
(
max_length
=
100
,
unique
=
True
,
verbose_name
=
_
(
'name'
))
description
=
models
.
TextField
(
verbose_name
=
_
(
'description'
),
blank
=
True
)
parent
=
models
.
ForeignKey
(
'self'
,
null
=
True
,
blank
=
True
,
verbose_name
=
_
(
'parent template'
))
system
=
models
.
TextField
(
verbose_name
=
_
(
'operating system'
),
blank
=
True
,
help_text
=
(
_
(
'Name of operating system in '
'format like "
%
s".'
)
%
'Ubuntu 12.04 LTS Desktop amd64'
))
access_method
=
models
.
CharField
(
max_length
=
10
,
choices
=
ACCESS_METHODS
,
verbose_name
=
_
(
'access method'
))
state
=
models
.
CharField
(
max_length
=
10
,
choices
=
STATES
,
default
=
'NEW'
)
disks
=
models
.
ManyToManyField
(
Disk
,
verbose_name
=
_
(
'disks'
),
related_name
=
'template_set'
)
lease
=
models
.
ForeignKey
(
Lease
,
related_name
=
'template_set'
)
(
'READY'
,
_
(
'ready'
))]
# template is ready for instantiation
name
=
CharField
(
max_length
=
100
,
unique
=
True
,
verbose_name
=
_
(
'name'
),
help_text
=
_
(
'Human readable name of template.'
))
description
=
TextField
(
verbose_name
=
_
(
'description'
),
blank
=
True
)
parent
=
ForeignKey
(
'self'
,
null
=
True
,
blank
=
True
,
verbose_name
=
_
(
'parent template'
),
help_text
=
_
(
'Template which this one is derived of.'
))
system
=
TextField
(
verbose_name
=
_
(
'operating system'
),
blank
=
True
,
help_text
=
(
_
(
'Name of operating system in '
'format like "
%
s".'
)
%
'Ubuntu 12.04 LTS Desktop amd64'
))
access_method
=
CharField
(
max_length
=
10
,
choices
=
ACCESS_METHODS
,
verbose_name
=
_
(
'access method'
),
help_text
=
_
(
'Primary remote access method.'
))
state
=
CharField
(
max_length
=
10
,
choices
=
STATES
,
default
=
'NEW'
)
disks
=
ManyToManyField
(
Disk
,
verbose_name
=
_
(
'disks'
),
related_name
=
'template_set'
,
help_text
=
_
(
'Disks which are to be mounted.'
))
lease
=
ForeignKey
(
Lease
,
related_name
=
'template_set'
,
verbose_name
=
_
(
'lease'
),
help_text
=
_
(
'Expiration times.'
))
class
Meta
:
ordering
=
[
'name'
,
]
...
...
@@ -190,16 +226,20 @@ class InstanceTemplate(BaseResourceConfigModel, TimeStampedModel):
return
'linux'
class
InterfaceTemplate
(
models
.
Model
):
class
InterfaceTemplate
(
Model
):
"""Network interface template for an instance template.
If the interface is managed, a host will be created for it.
"""
vlan
=
models
.
ForeignKey
(
Vlan
)
managed
=
models
.
BooleanField
(
default
=
True
)
template
=
models
.
ForeignKey
(
InstanceTemplate
,
related_name
=
'interface_set'
)
vlan
=
ForeignKey
(
Vlan
,
verbose_name
=
_
(
'vlan'
),
help_text
=
_
(
'Network the interface belongs to.'
))
managed
=
BooleanField
(
verbose_name
=
_
(
'managed'
),
default
=
True
,
help_text
=
_
(
'If a firewall host (i.e. IP address '
'association) should be generated.'
))
template
=
ForeignKey
(
InstanceTemplate
,
verbose_name
=
_
(
'template'
),
related_name
=
'interface_set'
,
help_text
=
_
())
class
Meta
:
permissions
=
()
...
...
@@ -233,32 +273,42 @@ class Instance(BaseResourceConfigModel, TimeStampedModel):
(
'SHUTOFF'
,
_
(
'shutoff'
)),
(
'CRASHED'
,
_
(
'crashed'
)),
(
'PMSUSPENDED'
,
_
(
'pmsuspended'
))]
# libvirt domain states
name
=
models
.
CharField
(
blank
=
True
,
max_length
=
100
,
verbose_name
=
_
(
'name'
))
description
=
models
.
TextField
(
blank
=
True
,
verbose_name
=
_
(
'description'
))
template
=
models
.
ForeignKey
(
InstanceTemplate
,
blank
=
True
,
null
=
True
,
related_name
=
'instance_set'
,
verbose_name
=
_
(
'template'
))
pw
=
models
.
CharField
(
help_text
=
_
(
'Original password of instance'
),
max_length
=
20
,
verbose_name
=
_
(
'password'
))
time_of_suspend
=
models
.
DateTimeField
(
blank
=
True
,
default
=
None
,
null
=
True
,
verbose_name
=
_
(
'time of suspend'
))
time_of_delete
=
models
.
DateTimeField
(
blank
=
True
,
default
=
None
,
null
=
True
,
verbose_name
=
_
(
'time of delete'
))
active_since
=
models
.
DateTimeField
(
blank
=
True
,
null
=
True
,
help_text
=
_
(
'Time stamp of successful '
'boot report.'
),
verbose_name
=
_
(
'active since'
))
node
=
models
.
ForeignKey
(
Node
,
blank
=
True
,
null
=
True
,
related_name
=
'instance_set'
,
verbose_name
=
_
(
'host node'
))
state
=
models
.
CharField
(
choices
=
STATES
,
default
=
'NOSTATE'
,
max_length
=
20
)
disks
=
models
.
ManyToManyField
(
Disk
,
related_name
=
'instance_set'
,
verbose_name
=
_
(
'disks'
))
lease
=
models
.
ForeignKey
(
Lease
)
access_method
=
models
.
CharField
(
max_length
=
10
,
choices
=
ACCESS_METHODS
,
verbose_name
=
_
(
'access method'
))
vnc_port
=
models
.
IntegerField
()
owner
=
models
.
ForeignKey
(
User
)
name
=
CharField
(
blank
=
True
,
max_length
=
100
,
verbose_name
=
_
(
'name'
),
help_text
=
_
(
'Human readable name of instance.'
))
description
=
TextField
(
blank
=
True
,
verbose_name
=
_
(
'description'
))
template
=
ForeignKey
(
InstanceTemplate
,
blank
=
True
,
null
=
True
,
related_name
=
'instance_set'
,
help_text
=
_
(
'Template the instance derives from.'
),
verbose_name
=
_
(
'template'
))
pw
=
CharField
(
help_text
=
_
(
'Original password of the instance.'
),
max_length
=
20
,
verbose_name
=
_
(
'password'
))
time_of_suspend
=
DateTimeField
(
blank
=
True
,
default
=
None
,
null
=
True
,
verbose_name
=
_
(
'time of suspend'
),
help_text
=
_
(
'Proposed time of automatic '
'suspension.'
))
time_of_delete
=
DateTimeField
(
blank
=
True
,
default
=
None
,
null
=
True
,
verbose_name
=
_
(
'time of delete'
),
help_text
=
_
(
'Proposed time of automatic '
'suspension.'
))
active_since
=
DateTimeField
(
blank
=
True
,
null
=
True
,
help_text
=
_
(
'Time stamp of successful '
'boot report.'
),
verbose_name
=
_
(
'active since'
))
node
=
ForeignKey
(
Node
,
blank
=
True
,
null
=
True
,
related_name
=
'instance_set'
,
help_text
=
_
(
'Current hypervisor of this instance.'
),
verbose_name
=
_
(
'host node'
))
state
=
CharField
(
choices
=
STATES
,
default
=
'NOSTATE'
,
max_length
=
20
)
disks
=
ManyToManyField
(
Disk
,
related_name
=
'instance_set'
,
help_text
=
_
(
'Set of mounted disks.'
),
verbose_name
=
_
(
'disks'
))
lease
=
ForeignKey
(
Lease
,
help_text
=
_
(
'Preferred expiration periods.'
))
access_method
=
CharField
(
max_length
=
10
,
choices
=
ACCESS_METHODS
,
help_text
=
_
(
'Primary remote access method.'
),
verbose_name
=
_
(
'access method'
))
vnc_port
=
IntegerField
(
verbose_name
=
_
(
'vnc_port'
),
help_text
=
_
(
'TCP port where VNC console listens.'
))
owner
=
ForeignKey
(
User
)
class
Meta
:
ordering
=
[
'pk'
,
]
...
...
@@ -307,7 +357,7 @@ class Instance(BaseResourceConfigModel, TimeStampedModel):
return
inst
@
models.
permalink
@permalink
def
get_absolute_url
(
self
):
return
(
'dashboard.views.detail'
,
None
,
{
'id'
:
self
.
id
})
...
...
@@ -560,15 +610,17 @@ def delete_instance_pre(sender, instance, using, **kwargs):
class
InstanceActivity
(
TimeStampedModel
):
activity_code
=
models
.
CharField
(
max_length
=
100
)
task_uuid
=
models
.
CharField
(
blank
=
True
,
max_length
=
50
,
null
=
True
,
unique
=
True
)
instance
=
models
.
ForeignKey
(
Instance
,
related_name
=
'activity_log'
)
user
=
models
.
ForeignKey
(
User
,
blank
=
True
,
null
=
True
)
started
=
models
.
DateTimeField
(
blank
=
True
,
null
=
True
)
finished
=
models
.
DateTimeField
(
blank
=
True
,
null
=
True
)
result
=
models
.
TextField
(
blank
=
True
,
null
=
True
)
state
=
models
.
CharField
(
default
=
'PENDING'
,
max_length
=
50
)
activity_code
=
CharField
(
verbose_name
=
_
(
'activity_code'
),
max_length
=
100
)
task_uuid
=
CharField
(
verbose_name
=
_
(
'task_uuid'
),
blank
=
True
,
max_length
=
50
,
null
=
True
,
unique
=
True
)
instance
=
ForeignKey
(
Instance
,
verbose_name
=
_
(
'instance'
),
related_name
=
'activity_log'
)
user
=
ForeignKey
(
User
,
verbose_name
=
_
(
'user'
),
blank
=
True
,
null
=
True
)
started
=
DateTimeField
(
verbose_name
=
_
(
'started'
),
blank
=
True
,
null
=
True
)
finished
=
DateTimeField
(
verbose_name
=
_
(
'finished'
),
blank
=
True
,
null
=
True
)
result
=
TextField
(
verbose_name
=
_
(
'result'
),
blank
=
True
,
null
=
True
)
state
=
CharField
(
verbose_name
=
_
(
'state'
),
default
=
'PENDING'
,
max_length
=
50
)
def
update_state
(
self
,
new_state
):
self
.
state
=
new_state
...
...
@@ -581,13 +633,15 @@ class InstanceActivity(TimeStampedModel):
self
.
save
()
class
Interface
(
models
.
Model
):
class
Interface
(
Model
):
"""Network interface for an instance.
"""
vlan
=
models
.
ForeignKey
(
Vlan
,
related_name
=
"vm_interface"
)
host
=
models
.
ForeignKey
(
Host
,
blank
=
True
,
null
=
True
)
instance
=
models
.
ForeignKey
(
Instance
,
related_name
=
'interface_set'
)
vlan
=
ForeignKey
(
Vlan
,
verbose_name
=
_
(
'vlan'
),
related_name
=
"vm_interface"
)
host
=
ForeignKey
(
Host
,
verbose_name
=
_
(
'host'
),
blank
=
True
,
null
=
True
)
instance
=
ForeignKey
(
Instance
,
verbose_name
=
_
(
'instance'
),
related_name
=
'interface_set'
)
@property
def
mac
(
self
):
...
...
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