Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
Gelencsér Szabolcs
/
cloud
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
39025b6e
authored
Nov 09, 2016
by
Szabolcs Gelencser
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Divide SaveAsTemplateOperation to suboperations
parent
dceb22e2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
97 additions
and
76 deletions
+97
-76
circle/vm/operations.py
+93
-76
circle/vm/tasks/agent_tasks.py
+4
-0
No files found.
circle/vm/operations.py
View file @
39025b6e
...
...
@@ -718,15 +718,22 @@ class SaveAsTemplateOperation(InstanceOperation):
description
=
_
(
"Save virtual machine as a template so they can be shared "
"with users and groups. Anyone who has access to a "
"template (and to the networks it uses) will be able to "
"start an instance of it."
)
"start an instance of it.
\n
"
"For linux run 'sudo waagent -deprovision+user' "
"before this operation"
)
required_perms
=
(
'vm.create_template'
,
)
accept_states
=
(
'RUNNING'
,
'STOPPED'
)
async_queue
=
"localhost.man.slow"
accept_states
=
(
'RUNNING'
)
def
is_preferred
(
self
):
return
(
self
.
instance
.
is_base
and
self
.
instance
.
status
==
self
.
instance
.
STATUS
.
RUNNING
)
def
on_abort
(
self
,
activity
,
error
):
activity
.
resultant_state
=
'RUNNING'
def
on_commit
(
self
,
activity
):
activity
.
resultant_state
=
'STOPPED'
@staticmethod
def
_rename
(
name
):
m
=
search
(
r" v(\d+)$"
,
name
)
...
...
@@ -737,86 +744,96 @@ class SaveAsTemplateOperation(InstanceOperation):
v
=
1
return
"
%
s v
%
d"
%
(
name
,
v
)
def
on_abort
(
self
,
activity
,
error
):
if
hasattr
(
self
,
'disks'
):
for
disk
in
self
.
disks
:
disk
.
destroy
()
def
_operation
(
self
,
activity
,
user
,
system
,
name
=
None
,
with_shutdown
=
True
,
clone
=
False
,
task
=
None
,
**
kwargs
):
try
:
self
.
instance
.
_cleanup
(
parent_activity
=
activity
,
user
=
user
)
except
:
pass
self
.
instance
.
_deprovision
(
parent_activity
=
activity
)
self
.
instance
.
_for_template_shutdown
(
parent_activity
=
activity
)
self
.
instance
.
_capture
(
parent_activity
=
activity
,
name
=
name
,
user
=
user
,
kwargs
=
kwargs
,
clone
=
clone
)
if
with_shutdown
:
try
:
self
.
instance
.
shutdown
(
parent_activity
=
activity
,
user
=
user
,
task
=
task
)
except
Instance
.
WrongStateError
:
pass
@register_operation
class
DeprovisionOperation
(
SubOperationMixin
,
InstanceOperation
):
id
=
'_deprovision'
name
=
_
(
"deprovision"
)
# prepare parameters
params
=
{
'access_method'
:
self
.
instance
.
access_method
,
'arch'
:
self
.
instance
.
arch
,
'boot_menu'
:
self
.
instance
.
boot_menu
,
'description'
:
self
.
instance
.
description
,
'lease'
:
self
.
instance
.
lease
,
# Can be problem in new VM
'max_ram_size'
:
self
.
instance
.
max_ram_size
,
'name'
:
name
or
self
.
_rename
(
self
.
instance
.
name
),
'num_cores'
:
self
.
instance
.
num_cores
,
'owner'
:
user
,
'parent'
:
self
.
instance
.
template
or
None
,
# Can be problem
'priority'
:
self
.
instance
.
priority
,
'ram_size'
:
self
.
instance
.
ram_size
,
'raw_data'
:
self
.
instance
.
raw_data
,
'system'
:
self
.
instance
.
system
,
'azure_vm_size'
:
self
.
instance
.
azure_vm_size
,
'azure_template'
:
self
.
instance
.
azure_template
}
params
.
update
(
kwargs
)
params
.
pop
(
"parent_activity"
,
None
)
#TODO: create data disks
# create template and do additional setup
tmpl
=
InstanceTemplate
(
**
params
)
tmpl
.
full_clean
()
# Avoiding database errors.
tmpl
.
save
()
# Copy traits from the VM instance
tmpl
.
req_traits
.
add
(
*
self
.
instance
.
req_traits
.
all
())
if
clone
:
tmpl
.
clone_acl
(
self
.
instance
.
template
)
# Add permission for the original owner of the template
tmpl
.
set_level
(
self
.
instance
.
template
.
owner
,
'owner'
)
tmpl
.
set_level
(
user
,
'owner'
)
try
:
#TODO: add data disks
# create interface templates
for
i
in
self
.
instance
.
interface_set
.
all
():
i
.
save_as_template
(
tmpl
)
# create template in azure
def
_operation
(
self
):
agent_tasks
.
deprovision
.
apply_async
(
args
=
[
self
.
instance
.
name
],
queue
=
"localhost.localdomain.agent"
)
.
get
(
timeout
=
1200
)
@register_operation
class
ShutdownOperation
(
SubOperationMixin
,
InstanceOperation
):
id
=
'_for_template_shutdown'
name
=
_
(
"Shutdown"
)
def
_operation
(
self
):
vm_tasks
.
shutdown
.
apply_async
(
args
=
[
self
.
instance
.
name
],
queue
=
"localhost.vm.fast"
)
.
get
(
timeout
=
1200
)
@register_operation
class
CaptureOperation
(
SubOperationMixin
,
InstanceOperation
):
id
=
'_capture'
name
=
_
(
"capture"
)
def
_operation
(
self
,
name
,
user
,
kwargs
,
clone
):
# prepare parameters
params
=
{
'access_method'
:
self
.
instance
.
access_method
,
'arch'
:
self
.
instance
.
arch
,
'boot_menu'
:
self
.
instance
.
boot_menu
,
'description'
:
self
.
instance
.
description
,
'lease'
:
self
.
instance
.
lease
,
# Can be problem in new VM
'max_ram_size'
:
self
.
instance
.
max_ram_size
,
'name'
:
name
or
self
.
_rename
(
self
.
instance
.
name
),
'num_cores'
:
self
.
instance
.
num_cores
,
'owner'
:
user
,
'parent'
:
self
.
instance
.
template
or
None
,
# Can be problem
'priority'
:
self
.
instance
.
priority
,
'ram_size'
:
self
.
instance
.
ram_size
,
'raw_data'
:
self
.
instance
.
raw_data
,
'system'
:
self
.
instance
.
system
,
'azure_vm_size'
:
self
.
instance
.
azure_vm_size
,
'azure_template'
:
self
.
instance
.
azure_template
}
params
.
update
(
kwargs
)
params
.
pop
(
"parent_activity"
,
None
)
# create template and do additional setup
tmpl
=
InstanceTemplate
(
**
params
)
tmpl
.
full_clean
()
# Avoiding database errors.
tmpl
.
save
()
# Copy traits from the VM instance
tmpl
.
req_traits
.
add
(
*
self
.
instance
.
req_traits
.
all
())
if
clone
:
tmpl
.
clone_acl
(
self
.
instance
.
template
)
# Add permission for the original owner of the template
tmpl
.
set_level
(
self
.
instance
.
template
.
owner
,
'owner'
)
tmpl
.
set_level
(
user
,
'owner'
)
try
:
vhd_uri
=
vm_tasks
.
save_as_template
.
apply_async
(
args
=
[
self
.
instance
.
name
,
self
.
instance
.
pk
],
queue
=
"localhost.vm.fast"
)
.
get
(
timeout
=
1200
)
tmpl
.
vhd_uri
=
vhd_uri
tmpl
.
save
()
#TODO: delete VM (cannot start VM in Azure after generalization)
#self.instance.destroy()
# create interface templates
for
i
in
self
.
instance
.
interface_set
.
all
():
i
.
save_as_template
(
tmpl
)
# create template in azure
try
:
vhd_uri
=
vm_tasks
.
save_as_template
.
apply_async
(
args
=
[
self
.
instance
.
name
,
self
.
instance
.
pk
],
queue
=
"localhost.vm.fast"
)
.
get
(
timeout
=
1200
)
tmpl
.
vhd_uri
=
vhd_uri
tmpl
.
save
()
#TODO: delete VM (cannot start VM in Azure after generalization)
#self.instance.destroy()
except
:
raise
except
:
tmpl
.
delete
()
raise
except
:
tmpl
.
delete
()
raise
else
:
return
create_readable
(
ugettext_noop
(
"New template:
%(template)
s"
),
template
=
reverse
(
'dashboard.views.template-detail'
,
kwargs
=
{
'pk'
:
tmpl
.
pk
}))
else
:
return
create_readable
(
ugettext_noop
(
"New template:
%(template)
s"
),
template
=
reverse
(
'dashboard.views.template-detail'
,
kwargs
=
{
'pk'
:
tmpl
.
pk
}))
@register_operation
class
ShutdownOperation
(
InstanceOperation
):
...
...
circle/vm/tasks/agent_tasks.py
View file @
39025b6e
...
...
@@ -17,6 +17,10 @@
from
manager.mancelery
import
celery
@celery.task
(
name
=
'agent.deprovision'
)
def
deprovision
(
vm_name
):
pass
@celery.task
(
name
=
'agent.install_diagnostics_extension'
)
def
install_diagnostics_extension
(
vm_name
):
pass
...
...
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