Revision 35f2fc07
b/snf-cyclades-app/synnefo/api/management/commands/server-modify.py | ||
---|---|---|
1 |
# Copyright 2012 GRNET S.A. All rights reserved.
|
|
1 |
# Copyright 2013 GRNET S.A. All rights reserved.
|
|
2 | 2 |
# |
3 | 3 |
# Redistribution and use in source and binary forms, with or |
4 | 4 |
# without modification, are permitted provided that the following |
... | ... | |
35 | 35 |
|
36 | 36 |
from django.db import transaction |
37 | 37 |
from django.core.management.base import BaseCommand, CommandError |
38 |
from synnefo.management.common import get_vm, get_flavor, convert_api_faults |
|
38 |
from synnefo.management.common import (get_vm, get_flavor, convert_api_faults, |
|
39 |
wait_server_task) |
|
39 | 40 |
from synnefo.webproject.management.utils import parse_bool |
40 |
from synnefo.logic import servers, backend as backend_mod |
|
41 |
from synnefo.logic import servers |
|
42 |
|
|
43 |
|
|
44 |
ACTIONS = ["start", "stop", "reboot_hard", "reboot_soft"] |
|
41 | 45 |
|
42 | 46 |
|
43 | 47 |
class Command(BaseCommand): |
... | ... | |
49 | 53 |
'--name', |
50 | 54 |
dest='name', |
51 | 55 |
metavar='NAME', |
52 |
help="Rename server"), |
|
56 |
help="Rename server."),
|
|
53 | 57 |
make_option( |
54 | 58 |
'--owner', |
55 | 59 |
dest='owner', |
... | ... | |
68 | 72 |
metavar="FLAVOR_ID", |
69 | 73 |
help="Resize a server by modifying its flavor. The new flavor" |
70 | 74 |
" must have the same disk size and disk template."), |
75 |
make_option( |
|
76 |
"--action", |
|
77 |
dest="action", |
|
78 |
choices=ACTIONS, |
|
79 |
metavar="|".join(ACTIONS), |
|
80 |
help="Perform one of the allowed actions."), |
|
81 |
make_option( |
|
82 |
"--wait", |
|
83 |
dest="wait", |
|
84 |
default="True", |
|
85 |
choices=["True", "False"], |
|
86 |
metavar="True|False", |
|
87 |
help="Wait for Ganeti jobs to complete."), |
|
71 | 88 |
) |
72 | 89 |
|
73 | 90 |
@transaction.commit_on_success |
... | ... | |
103 | 120 |
msg = "Changed the owner of server '%s' from '%s' to '%s'.\n" |
104 | 121 |
self.stdout.write(msg % (server, old_owner, new_owner)) |
105 | 122 |
|
123 |
wait = parse_bool(options["wait"]) |
|
106 | 124 |
new_flavor_id = options.get("flavor") |
107 | 125 |
if new_flavor_id is not None: |
108 | 126 |
new_flavor = get_flavor(new_flavor_id) |
... | ... | |
110 | 128 |
msg = "Resizing server '%s' from flavor '%s' to '%s'.\n" |
111 | 129 |
self.stdout.write(msg % (server, old_flavor, new_flavor)) |
112 | 130 |
server = servers.resize(server, new_flavor) |
113 |
jobID = server.task_job_id |
|
114 |
msg = "Issued job '%s'. Waiting to complete...\n" |
|
115 |
self.stdout.write(msg % jobID) |
|
116 |
client = server.get_client() |
|
117 |
status, error = backend_mod.wait_for_job(client, jobID) |
|
118 |
if status == "success": |
|
119 |
self.stdout.write("Job finished successfully.\n") |
|
131 |
wait_server_task(server, wait, stdout=self.stdout) |
|
132 |
|
|
133 |
action = options.get("action") |
|
134 |
if action is not None: |
|
135 |
if action == "start": |
|
136 |
server = servers.start(server) |
|
137 |
elif action == "stop": |
|
138 |
server = servers.stop(server) |
|
139 |
elif action == "reboot_hard": |
|
140 |
server = servers.reboot(server, reboot_type="HARD") |
|
141 |
elif action == "reboot_stof": |
|
142 |
server = servers.reboot(server, reboot_type="SOFT") |
|
120 | 143 |
else: |
121 |
self.stdout.write("Job failed! Error: %s\n" % error) |
|
144 |
raise CommandError("Unknown action.") |
|
145 |
wait_server_task(server, wait, stdout=self.stdout) |
b/snf-cyclades-app/synnefo/api/management/commands/server-remove.py | ||
---|---|---|
34 | 34 |
from optparse import make_option |
35 | 35 |
|
36 | 36 |
from django.core.management.base import BaseCommand, CommandError |
37 |
from synnefo.management.common import get_vm, convert_api_faults |
|
38 |
from synnefo.logic import servers, backend as backend_mod |
|
37 |
from synnefo.management.common import (get_vm, convert_api_faults, |
|
38 |
wait_server_task) |
|
39 |
from synnefo.logic import servers |
|
39 | 40 |
from snf_django.management.utils import parse_bool |
40 | 41 |
|
41 | 42 |
|
... | ... | |
63 | 64 |
self.stdout.write("Trying to remove server '%s' from backend '%s'\n" % |
64 | 65 |
(server.backend_vm_id, server.backend)) |
65 | 66 |
|
66 |
servers.destroy(server) |
|
67 |
server = servers.destroy(server)
|
|
67 | 68 |
jobID = server.task_job_id |
68 | 69 |
|
69 | 70 |
self.stdout.write("Issued OP_INSTANCE_REMOVE with id: %s\n" % jobID) |
70 | 71 |
|
71 | 72 |
wait = parse_bool(options["wait"]) |
72 |
if wait: |
|
73 |
self.stdout.write("Waiting for job to complete...\n") |
|
74 |
client = server.get_client() |
|
75 |
status, error = backend_mod.wait_for_job(client, jobID) |
|
76 |
if status == "success": |
|
77 |
self.stdout.write("Job '%s' completed successfully.\n" % jobID) |
|
78 |
else: |
|
79 |
self.stdout.write("Job '%s' failed: %s\n" % (jobID, error)) |
|
73 |
wait_server_task(server, wait, self.stdout) |
b/snf-cyclades-app/synnefo/management/common.py | ||
---|---|---|
37 | 37 |
|
38 | 38 |
from snf_django.lib.api import faults |
39 | 39 |
from synnefo.api import util |
40 |
from synnefo.logic import backend as backend_mod |
|
40 | 41 |
from synnefo.logic.rapi import GanetiApiError, GanetiRapiClient |
41 | 42 |
from synnefo.logic.utils import (id_from_instance_name, |
42 | 43 |
id_from_network_name) |
... | ... | |
166 | 167 |
|
167 | 168 |
class Omit(object): |
168 | 169 |
pass |
170 |
|
|
171 |
|
|
172 |
def wait_server_task(server, wait, stdout): |
|
173 |
jobID = server.task_job_id |
|
174 |
if wait: |
|
175 |
msg = "Issued job '%s'. Waiting to complete...\n" |
|
176 |
stdout.write(msg % jobID) |
|
177 |
client = server.get_client() |
|
178 |
wait_ganeti_job(client, jobID, stdout) |
|
179 |
else: |
|
180 |
msg = "Issued job '%s'.\n" |
|
181 |
stdout.write(msg % jobID) |
|
182 |
|
|
183 |
|
|
184 |
def wait_ganeti_job(client, jobID, stdout): |
|
185 |
status, error = backend_mod.wait_for_job(client, jobID) |
|
186 |
if status == "success": |
|
187 |
stdout.write("Job finished successfully.\n") |
|
188 |
else: |
|
189 |
raise CommandError("Job failed! Error: %s\n" % error) |
Also available in: Unified diff