Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
Gutyán Gábor
/
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
Commit
942db813
authored
Sep 04, 2013
by
tarokkk
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
refactor deploy()
parent
42fb490c
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
64 additions
and
39 deletions
+64
-39
circle/manager/manager.py
+1
-26
circle/vm/models.py
+63
-13
No files found.
circle/manager/manager.py
View file @
942db813
#!/usr/bin/env python
#!/usr/bin/env python
from
mancelery
import
celery
from
mancelery
import
celery
from
celery
import
current_task
import
scheduler
@celery.task
@celery.task
def
deploy
(
instance
):
def
deploy
(
instance
):
'''Create new virtual machine from VM class.
'''Create new virtual machine from VM class.
'''
'''
# Get info from scheduler (free space, node with enough cpu and ram)
instance
.
deploy
(
task_uuid
=
deploy
.
request
.
id
)
current_task
.
update_state
(
state
=
'PENDING'
)
instance
.
node
=
scheduler
.
get_node
()
# Create hard drives (storage)
current_task
.
update_state
(
state
=
'PREPARE'
)
for
disk
in
instance
.
disks
:
disk
.
deploy
()
# Create context
instance
.
create_context
()
# Create machine (vmdriver)
current_task
.
update_state
(
state
=
'DEPLOY VM'
)
instance
.
deploy_task
()
# Estabilish network connection (vmdriver)
current_task
.
update_state
(
state
=
'DEPLOY NET'
)
instance
.
deploy_net
()
# Resume machine (vmdriver)
current_task
.
update_state
(
state
=
'BOOT'
)
instance
.
resume
()
pass
def
delete
():
def
delete
():
...
...
circle/vm/models.py
View file @
942db813
...
@@ -5,6 +5,8 @@ import logging
...
@@ -5,6 +5,8 @@ import logging
from
.
import
tasks
from
.
import
tasks
from
manager
import
manager
,
scheduler
from
django.contrib.auth.models
import
User
from
django.contrib.auth.models
import
User
from
django.db
import
models
from
django.db
import
models
from
django.db.models.signals
import
pre_delete
from
django.db.models.signals
import
pre_delete
...
@@ -16,7 +18,6 @@ from model_utils.models import TimeStampedModel
...
@@ -16,7 +18,6 @@ from model_utils.models import TimeStampedModel
from
firewall.models
import
Vlan
,
Host
from
firewall.models
import
Vlan
,
Host
from
storage.models
import
Disk
from
storage.models
import
Disk
import
manager
logger
=
logging
.
getLogger
(
__name__
)
logger
=
logging
.
getLogger
(
__name__
)
pwgen
=
User
.
objects
.
make_random_password
pwgen
=
User
.
objects
.
make_random_password
...
@@ -31,6 +32,7 @@ ACCESS_METHODS = [(k, ap[0]) for k, ap in ACCESS_PROTOCOLS.iteritems()]
...
@@ -31,6 +32,7 @@ ACCESS_METHODS = [(k, ap[0]) for k, ap in ACCESS_PROTOCOLS.iteritems()]
class
BaseResourceConfigModel
(
models
.
Model
):
class
BaseResourceConfigModel
(
models
.
Model
):
"""Abstract base class for models with base resource configuration
"""Abstract base class for models with base resource configuration
parameters.
parameters.
"""
"""
...
@@ -48,6 +50,7 @@ class BaseResourceConfigModel(models.Model):
...
@@ -48,6 +50,7 @@ class BaseResourceConfigModel(models.Model):
class
NamedBaseResourceConfig
(
BaseResourceConfigModel
,
TimeStampedModel
):
class
NamedBaseResourceConfig
(
BaseResourceConfigModel
,
TimeStampedModel
):
"""Pre-created, named base resource configurations.
"""Pre-created, named base resource configurations.
"""
"""
name
=
models
.
CharField
(
max_length
=
50
,
unique
=
True
,
name
=
models
.
CharField
(
max_length
=
50
,
unique
=
True
,
...
@@ -58,6 +61,7 @@ class NamedBaseResourceConfig(BaseResourceConfigModel, TimeStampedModel):
...
@@ -58,6 +61,7 @@ class NamedBaseResourceConfig(BaseResourceConfigModel, TimeStampedModel):
class
Node
(
TimeStampedModel
):
class
Node
(
TimeStampedModel
):
"""A VM host machine.
"""A VM host machine.
"""
"""
name
=
models
.
CharField
(
max_length
=
50
,
unique
=
True
,
name
=
models
.
CharField
(
max_length
=
50
,
unique
=
True
,
...
@@ -82,7 +86,8 @@ class Node(TimeStampedModel):
...
@@ -82,7 +86,8 @@ class Node(TimeStampedModel):
class
NodeActivity
(
TimeStampedModel
):
class
NodeActivity
(
TimeStampedModel
):
activity_code
=
models
.
CharField
(
max_length
=
100
)
activity_code
=
models
.
CharField
(
max_length
=
100
)
task_uuid
=
models
.
CharField
(
max_length
=
50
,
unique
=
True
)
task_uuid
=
models
.
CharField
(
max_length
=
50
,
unique
=
True
,
null
=
True
,
blank
=
True
)
node
=
models
.
ForeignKey
(
Node
,
related_name
=
'activity_log'
)
node
=
models
.
ForeignKey
(
Node
,
related_name
=
'activity_log'
)
user
=
models
.
ForeignKey
(
User
,
blank
=
True
,
null
=
True
)
user
=
models
.
ForeignKey
(
User
,
blank
=
True
,
null
=
True
)
started
=
models
.
DateTimeField
(
blank
=
True
,
null
=
True
)
started
=
models
.
DateTimeField
(
blank
=
True
,
null
=
True
)
...
@@ -92,6 +97,7 @@ class NodeActivity(TimeStampedModel):
...
@@ -92,6 +97,7 @@ class NodeActivity(TimeStampedModel):
class
Lease
(
models
.
Model
):
class
Lease
(
models
.
Model
):
"""Lease times for VM instances.
"""Lease times for VM instances.
Specifies a time duration until suspension and deletion of a VM
Specifies a time duration until suspension and deletion of a VM
...
@@ -123,6 +129,7 @@ class Lease(models.Model):
...
@@ -123,6 +129,7 @@ class Lease(models.Model):
class
InstanceTemplate
(
BaseResourceConfigModel
,
TimeStampedModel
):
class
InstanceTemplate
(
BaseResourceConfigModel
,
TimeStampedModel
):
"""Virtual machine template.
"""Virtual machine template.
Every template has:
Every template has:
...
@@ -184,6 +191,7 @@ class InstanceTemplate(BaseResourceConfigModel, TimeStampedModel):
...
@@ -184,6 +191,7 @@ class InstanceTemplate(BaseResourceConfigModel, TimeStampedModel):
class
InterfaceTemplate
(
models
.
Model
):
class
InterfaceTemplate
(
models
.
Model
):
"""Network interface template for an instance template.
"""Network interface template for an instance template.
If the interface is managed, a host will be created for it.
If the interface is managed, a host will be created for it.
...
@@ -200,6 +208,7 @@ class InterfaceTemplate(models.Model):
...
@@ -200,6 +208,7 @@ class InterfaceTemplate(models.Model):
class
Instance
(
BaseResourceConfigModel
,
TimeStampedModel
):
class
Instance
(
BaseResourceConfigModel
,
TimeStampedModel
):
"""Virtual machine instance.
"""Virtual machine instance.
Every instance has:
Every instance has:
...
@@ -388,15 +397,8 @@ class Instance(BaseResourceConfigModel, TimeStampedModel):
...
@@ -388,15 +397,8 @@ class Instance(BaseResourceConfigModel, TimeStampedModel):
except
:
except
:
return
return
def
deploy
(
self
):
def
get_vm_desc
(
self
):
''' Launch celery task to handle asyncron jobs.
return
{
'''
manager
.
deploy
.
apply_async
(
self
)
def
deploy_task
(
self
):
''' Deploy virtual machine on remote node
'''
instance
=
{
'name'
:
'cloud-'
+
self
.
id
,
'name'
:
'cloud-'
+
self
.
id
,
'vcpu'
:
self
.
num_cores
,
'vcpu'
:
self
.
num_cores
,
'memory'
:
self
.
ram_size
,
'memory'
:
self
.
ram_size
,
...
@@ -413,7 +415,42 @@ class Instance(BaseResourceConfigModel, TimeStampedModel):
...
@@ -413,7 +415,42 @@ class Instance(BaseResourceConfigModel, TimeStampedModel):
'port'
:
self
.
get_vnc_port
()},
'port'
:
self
.
get_vnc_port
()},
'raw_data'
:
self
.
raw_data
'raw_data'
:
self
.
raw_data
}
}
tasks
.
create
.
apply_async
(
instance
,
queue
=
self
.
node
+
".vm"
)
.
get
()
def
deploy_async
(
self
):
''' Launch celery task to handle asyncron jobs.
'''
manager
.
deploy
.
apply_async
(
self
)
def
deploy
(
self
,
user
,
task_uuid
=
None
):
''' Deploy new virtual machine with network
1. Schedule
'''
act
=
InstanceActivity
(
user
=
user
,
task_uuid
=
task_uuid
)
# Schedule
act
.
update_state
(
"PENDING"
)
self
.
node
=
scheduler
.
get_node
()
# Create virtual images
act
.
update_state
(
"PREPARING DISKS"
)
for
disk
in
self
.
disks
:
disk
.
deploy
()
# Deploy VM on remote machine
act
.
update_state
(
"DEPLOYING VM"
)
tasks
.
create
.
apply_async
(
self
.
get_vm_desc
,
queue
=
self
.
node
+
".vm"
)
.
get
()
# Estabilish network connection (vmdriver)
act
.
update_state
(
"DEPLOYING NET"
)
for
net
in
self
.
interface_set
.
all
():
net
.
deploy
()
# Resume vm
act
.
update_state
(
"BOOTING"
)
tasks
.
resume
.
apply_async
(
"cloud-"
+
self
.
id
,
queue
=
self
.
node
+
".vm"
)
.
get
()
act
.
finish
()
def
stop
(
self
):
def
stop
(
self
):
# TODO implement
# TODO implement
...
@@ -476,7 +513,8 @@ def delete_instance_pre(sender, instance, using, **kwargs):
...
@@ -476,7 +513,8 @@ def delete_instance_pre(sender, instance, using, **kwargs):
class
InstanceActivity
(
TimeStampedModel
):
class
InstanceActivity
(
TimeStampedModel
):
activity_code
=
models
.
CharField
(
max_length
=
100
)
activity_code
=
models
.
CharField
(
max_length
=
100
)
task_uuid
=
models
.
CharField
(
max_length
=
50
,
unique
=
True
)
task_uuid
=
models
.
CharField
(
max_length
=
50
,
unique
=
True
,
null
=
True
,
blank
=
True
)
instance
=
models
.
ForeignKey
(
Instance
,
related_name
=
'activity_log'
)
instance
=
models
.
ForeignKey
(
Instance
,
related_name
=
'activity_log'
)
user
=
models
.
ForeignKey
(
User
,
blank
=
True
,
null
=
True
)
user
=
models
.
ForeignKey
(
User
,
blank
=
True
,
null
=
True
)
started
=
models
.
DateTimeField
(
blank
=
True
,
null
=
True
)
started
=
models
.
DateTimeField
(
blank
=
True
,
null
=
True
)
...
@@ -484,6 +522,18 @@ class InstanceActivity(TimeStampedModel):
...
@@ -484,6 +522,18 @@ class InstanceActivity(TimeStampedModel):
result
=
models
.
TextField
(
blank
=
True
,
null
=
True
)
result
=
models
.
TextField
(
blank
=
True
,
null
=
True
)
status
=
models
.
CharField
(
default
=
'PENDING'
,
max_length
=
50
)
status
=
models
.
CharField
(
default
=
'PENDING'
,
max_length
=
50
)
def
__init__
(
self
):
# TODO
pass
def
update_state
(
self
):
# TODO
pass
def
finish
(
self
):
# TODO
pass
class
Interface
(
models
.
Model
):
class
Interface
(
models
.
Model
):
...
...
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