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
cbf6979a
authored
Sep 23, 2014
by
Őry Máté
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
vm: add new Node operations
parent
494dc514
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
82 additions
and
36 deletions
+82
-36
circle/vm/models/node.py
+3
-26
circle/vm/operations.py
+79
-10
No files found.
circle/vm/models/node.py
View file @
cbf6979a
...
@@ -27,7 +27,7 @@ from django.db.models import (
...
@@ -27,7 +27,7 @@ from django.db.models import (
FloatField
,
permalink
,
FloatField
,
permalink
,
)
)
from
django.utils
import
timezone
from
django.utils
import
timezone
from
django.utils.translation
import
ugettext_lazy
as
_
,
ugettext_noop
from
django.utils.translation
import
ugettext_lazy
as
_
from
celery.exceptions
import
TimeoutError
from
celery.exceptions
import
TimeoutError
from
model_utils.models
import
TimeStampedModel
from
model_utils.models
import
TimeStampedModel
...
@@ -37,7 +37,7 @@ from common.models import method_cache, WorkerNotFound, HumanSortField
...
@@ -37,7 +37,7 @@ from common.models import method_cache, WorkerNotFound, HumanSortField
from
common.operations
import
OperatedMixin
from
common.operations
import
OperatedMixin
from
firewall.models
import
Host
from
firewall.models
import
Host
from
..tasks
import
vm_tasks
from
..tasks
import
vm_tasks
from
.activity
import
node_activity
,
NodeActivity
from
.activity
import
NodeActivity
from
.common
import
Trait
from
.common
import
Trait
...
@@ -145,31 +145,8 @@ class Node(OperatedMixin, TimeStampedModel):
...
@@ -145,31 +145,8 @@ class Node(OperatedMixin, TimeStampedModel):
def
get_status_display
(
self
):
def
get_status_display
(
self
):
return
self
.
STATES
[
self
.
enabled
][
self
.
online
][
1
]
return
self
.
STATES
[
self
.
enabled
][
self
.
online
][
1
]
def
disable
(
self
,
user
=
None
,
base_activity
=
None
):
''' Disable the node.'''
if
self
.
enabled
:
if
base_activity
:
act_ctx
=
base_activity
.
sub_activity
(
'disable'
,
readable_name
=
ugettext_noop
(
"disable node"
))
else
:
act_ctx
=
node_activity
(
'disable'
,
node
=
self
,
user
=
user
,
readable_name
=
ugettext_noop
(
"disable node"
))
with
act_ctx
:
self
.
enabled
=
False
self
.
save
()
def
enable
(
self
,
user
=
None
,
base_activity
=
None
):
def
enable
(
self
,
user
=
None
,
base_activity
=
None
):
''' Enable the node. '''
raise
NotImplementedError
(
"Use activate or passivate instead."
)
if
self
.
enabled
is
not
True
:
if
base_activity
:
act_ctx
=
base_activity
.
sub_activity
(
'enable'
)
else
:
act_ctx
=
node_activity
(
'enable'
,
node
=
self
,
user
=
user
)
with
act_ctx
:
self
.
enabled
=
True
self
.
save
()
self
.
get_info
(
invalidate_cache
=
True
)
@property
@property
@node_available
@node_available
...
...
circle/vm/operations.py
View file @
cbf6979a
...
@@ -803,11 +803,20 @@ class ChangeStateOperation(InstanceOperation):
...
@@ -803,11 +803,20 @@ class ChangeStateOperation(InstanceOperation):
class
NodeOperation
(
Operation
):
class
NodeOperation
(
Operation
):
async_operation
=
abortable_async_node_operation
async_operation
=
abortable_async_node_operation
host_cls
=
Node
host_cls
=
Node
online_required
=
True
superuser_required
=
True
def
__init__
(
self
,
node
):
def
__init__
(
self
,
node
):
super
(
NodeOperation
,
self
)
.
__init__
(
subject
=
node
)
super
(
NodeOperation
,
self
)
.
__init__
(
subject
=
node
)
self
.
node
=
node
self
.
node
=
node
def
check_precond
(
self
):
super
(
NodeOperation
,
self
)
.
check_precond
()
if
self
.
online_required
and
not
self
.
node
.
online
:
raise
humanize_exception
(
ugettext_noop
(
"You cannot call this operation on an offline node."
),
Exception
())
def
create_activity
(
self
,
parent
,
user
,
kwargs
):
def
create_activity
(
self
,
parent
,
user
,
kwargs
):
name
=
self
.
get_activity_name
(
kwargs
)
name
=
self
.
get_activity_name
(
kwargs
)
if
parent
:
if
parent
:
...
@@ -833,20 +842,14 @@ class FlushOperation(NodeOperation):
...
@@ -833,20 +842,14 @@ class FlushOperation(NodeOperation):
activity_code_suffix
=
'flush'
activity_code_suffix
=
'flush'
id
=
'flush'
id
=
'flush'
name
=
_
(
"flush"
)
name
=
_
(
"flush"
)
description
=
_
(
"
Disabl
e node and move all instances to other ones."
)
description
=
_
(
"
Passivat
e node and move all instances to other ones."
)
required_perms
=
()
required_perms
=
()
superuser_required
=
True
async_queue
=
"localhost.man.slow"
async_queue
=
"localhost.man.slow"
def
on_abort
(
self
,
activity
,
error
):
from
manager.scheduler
import
TraitsUnsatisfiableException
if
isinstance
(
error
,
TraitsUnsatisfiableException
):
if
self
.
node_enabled
:
self
.
node
.
enable
(
activity
.
user
,
activity
)
def
_operation
(
self
,
activity
,
user
):
def
_operation
(
self
,
activity
,
user
):
self
.
node_enabled
=
self
.
node
.
enabled
if
self
.
node
.
schedule_enabled
:
self
.
node
.
disable
(
user
,
activity
)
PassivateOperation
(
self
.
node
)
.
call
(
parent_activity
=
activity
,
user
=
user
)
for
i
in
self
.
node
.
instance_set
.
all
():
for
i
in
self
.
node
.
instance_set
.
all
():
name
=
create_readable
(
ugettext_noop
(
name
=
create_readable
(
ugettext_noop
(
"migrate
%(instance)
s (
%(pk)
s)"
),
instance
=
i
.
name
,
pk
=
i
.
pk
)
"migrate
%(instance)
s (
%(pk)
s)"
),
instance
=
i
.
name
,
pk
=
i
.
pk
)
...
@@ -855,6 +858,72 @@ class FlushOperation(NodeOperation):
...
@@ -855,6 +858,72 @@ class FlushOperation(NodeOperation):
i
.
migrate
(
user
=
user
)
i
.
migrate
(
user
=
user
)
@register_operation
class
ActivateOperation
(
NodeOperation
):
activity_code_suffix
=
'activate'
id
=
'activate'
name
=
_
(
"activate"
)
description
=
_
(
"Make node active, i.e. scheduler is allowed to deploy "
"virtual machines to it."
)
required_perms
=
()
def
check_precond
(
self
):
super
(
ActivateOperation
,
self
)
.
check_precond
()
if
self
.
node
.
enabled
and
self
.
node
.
schedule_enabled
:
raise
humanize_exception
(
ugettext_noop
(
"You cannot activate an active node."
),
Exception
())
def
_operation
(
self
):
self
.
node
.
enabled
=
True
self
.
node
.
schedule_enabled
=
True
self
.
node
.
save
()
@register_operation
class
PassivateOperation
(
NodeOperation
):
activity_code_suffix
=
'passivate'
id
=
'passivate'
name
=
_
(
"passivate"
)
description
=
_
(
"Make node passive, i.e. scheduler is denied to deploy "
"virtual machines to it, but remaining instances and "
"the ones manually migrated will continue running."
)
required_perms
=
()
def
check_precond
(
self
):
if
self
.
node
.
enabled
and
not
self
.
node
.
schedule_enabled
:
raise
humanize_exception
(
ugettext_noop
(
"You cannot passivate a passive node."
),
Exception
())
super
(
PassivateOperation
,
self
)
.
check_precond
()
def
_operation
(
self
):
self
.
node
.
enabled
=
True
self
.
node
.
schedule_enabled
=
False
self
.
node
.
save
()
@register_operation
class
DisableOperation
(
NodeOperation
):
activity_code_suffix
=
'disable'
id
=
'disable'
name
=
_
(
"disable"
)
description
=
_
(
"Disable node."
)
required_perms
=
()
online_required
=
False
def
check_precond
(
self
):
if
not
self
.
node
.
enabled
:
raise
humanize_exception
(
ugettext_noop
(
"You cannot disable a disabled node."
),
Exception
())
if
self
.
node
.
instance_set
.
exists
():
raise
humanize_exception
(
ugettext_noop
(
"You cannot disable a node which is hosting instances."
),
Exception
())
super
(
DisableOperation
,
self
)
.
check_precond
()
def
_operation
(
self
):
self
.
node
.
enabled
=
False
self
.
node
.
schedule_enabled
=
False
self
.
node
.
save
()
@register_operation
@register_operation
...
...
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