Revision bf5c82dc
b/snf-cyclades-app/synnefo/api/actions.py | ||
---|---|---|
49 | 49 |
from synnefo.logic import backend |
50 | 50 |
from synnefo.logic.utils import get_rsapi_state |
51 | 51 |
|
52 |
from logging import getLogger |
|
53 |
log = getLogger(__name__) |
|
54 |
|
|
52 | 55 |
|
53 | 56 |
server_actions = {} |
54 | 57 |
network_actions = {} |
... | ... | |
90 | 93 |
|
91 | 94 |
raise ServiceUnavailable('Changing password is not supported.') |
92 | 95 |
|
96 |
|
|
93 | 97 |
@server_action('reboot') |
94 | 98 |
def reboot(request, vm, args): |
95 | 99 |
# Normal Response Code: 202 |
... | ... | |
102 | 106 |
# buildInProgress (409), |
103 | 107 |
# overLimit (413) |
104 | 108 |
|
109 |
log.info("Reboot VM %s", vm) |
|
105 | 110 |
reboot_type = args.get('type', '') |
106 | 111 |
if reboot_type not in ('SOFT', 'HARD'): |
107 | 112 |
raise BadRequest('Malformed Request.') |
108 | 113 |
backend.reboot_instance(vm, reboot_type.lower()) |
109 | 114 |
return HttpResponse(status=202) |
110 | 115 |
|
116 |
|
|
111 | 117 |
@server_action('start') |
112 | 118 |
def start(request, vm, args): |
113 | 119 |
# Normal Response Code: 202 |
114 | 120 |
# Error Response Codes: serviceUnavailable (503), |
115 | 121 |
# itemNotFound (404) |
116 | 122 |
|
123 |
log.info("Start VM %s", vm) |
|
117 | 124 |
if args: |
118 | 125 |
raise BadRequest('Malformed Request.') |
119 | 126 |
backend.startup_instance(vm) |
120 | 127 |
return HttpResponse(status=202) |
121 | 128 |
|
129 |
|
|
122 | 130 |
@server_action('shutdown') |
123 | 131 |
def shutdown(request, vm, args): |
124 | 132 |
# Normal Response Code: 202 |
125 | 133 |
# Error Response Codes: serviceUnavailable (503), |
126 | 134 |
# itemNotFound (404) |
127 | 135 |
|
136 |
log.info("Shutdown VM %s", vm) |
|
128 | 137 |
if args: |
129 | 138 |
raise BadRequest('Malformed Request.') |
130 | 139 |
backend.shutdown_instance(vm) |
131 | 140 |
return HttpResponse(status=202) |
132 | 141 |
|
142 |
|
|
133 | 143 |
@server_action('rebuild') |
134 | 144 |
def rebuild(request, vm, args): |
135 | 145 |
# Normal Response Code: 202 |
... | ... | |
145 | 155 |
|
146 | 156 |
raise ServiceUnavailable('Rebuild not supported.') |
147 | 157 |
|
158 |
|
|
148 | 159 |
@server_action('resize') |
149 | 160 |
def resize(request, vm, args): |
150 | 161 |
# Normal Response Code: 202 |
... | ... | |
161 | 172 |
|
162 | 173 |
raise ServiceUnavailable('Resize not supported.') |
163 | 174 |
|
175 |
|
|
164 | 176 |
@server_action('confirmResize') |
165 | 177 |
def confirm_resize(request, vm, args): |
166 | 178 |
# Normal Response Code: 204 |
... | ... | |
177 | 189 |
|
178 | 190 |
raise ServiceUnavailable('Resize not supported.') |
179 | 191 |
|
192 |
|
|
180 | 193 |
@server_action('revertResize') |
181 | 194 |
def revert_resize(request, vm, args): |
182 | 195 |
# Normal Response Code: 202 |
... | ... | |
216 | 229 |
# buildInProgress (409), |
217 | 230 |
# overLimit (413) |
218 | 231 |
|
232 |
log.info("Get console VM %s", vm) |
|
233 |
|
|
219 | 234 |
console_type = args.get('type', '') |
220 | 235 |
if console_type != 'vnc': |
221 | 236 |
raise BadRequest('Type can only be "vnc".') |
... | ... | |
284 | 299 |
# overLimit (413) |
285 | 300 |
|
286 | 301 |
profile = args.get('profile', '') |
302 |
log.info("Set VM %s firewall %s", vm, profile) |
|
287 | 303 |
if profile not in [x[0] for x in NetworkInterface.FIREWALL_PROFILES]: |
288 | 304 |
raise BadRequest("Unsupported firewall profile") |
289 | 305 |
backend.set_firewall_profile(vm, profile) |
... | ... | |
307 | 323 |
raise BadRequest('Malformed Request.') |
308 | 324 |
vm = get_vm(server_id, request.user_uniq) |
309 | 325 |
|
326 |
log.info("Connect VM %s to Network %s", vm, net) |
|
327 |
|
|
310 | 328 |
net = Network.objects.get(id=net.id) |
311 | 329 |
|
312 | 330 |
if net.state != 'ACTIVE': |
... | ... | |
318 | 336 |
except EmptyPool: |
319 | 337 |
raise ServiceUnavailable('Network is full') |
320 | 338 |
|
339 |
log.info("Connecting VM %s to Network %s(%s)", vm, net, address) |
|
340 |
|
|
321 | 341 |
backend.connect_to_network(vm, net, address) |
322 | 342 |
return HttpResponse(status=202) |
323 | 343 |
|
... | ... | |
347 | 367 |
vm = get_vm(server_id, request.user_uniq) |
348 | 368 |
nic = get_nic_from_index(vm, nic_index) |
349 | 369 |
|
370 |
log.info("Disconnect VM %s NIC %s", vm, str(nic.index)) |
|
371 |
|
|
350 | 372 |
if nic.dirty: |
351 | 373 |
raise BuildInProgress('Machine is busy.') |
352 | 374 |
else: |
b/snf-cyclades-app/synnefo/api/images.py | ||
---|---|---|
113 | 113 |
# badRequest (400), |
114 | 114 |
# overLimit (413) |
115 | 115 |
|
116 |
log.debug('list_images detail=%s', detail)
|
|
116 |
log.info('list_images detail=%s', detail)
|
|
117 | 117 |
backend = ImageBackend(request.user_uniq) |
118 | 118 |
|
119 | 119 |
since = isoparse(request.GET.get('changes-since')) |
... | ... | |
167 | 167 |
# itemNotFound (404), |
168 | 168 |
# overLimit (413) |
169 | 169 |
|
170 |
log.debug('get_image_details %s', image_id)
|
|
170 |
log.info('get_image_details %s', image_id)
|
|
171 | 171 |
image = util.get_image(image_id, request.user_uniq) |
172 | 172 |
reply = image_to_dict(image) |
173 | 173 |
|
... | ... | |
188 | 188 |
# itemNotFound (404), |
189 | 189 |
# overLimit (413) |
190 | 190 |
|
191 |
log.debug('delete_image %s', image_id)
|
|
191 |
log.info('delete_image %s', image_id)
|
|
192 | 192 |
backend = ImageBackend(request.user_uniq) |
193 | 193 |
backend.delete(image_id) |
194 | 194 |
backend.close() |
... | ... | |
205 | 205 |
# badRequest (400), |
206 | 206 |
# overLimit (413) |
207 | 207 |
|
208 |
log.debug('list_image_metadata %s', image_id)
|
|
208 |
log.info('list_image_metadata %s', image_id)
|
|
209 | 209 |
image = util.get_image(image_id, request.user_uniq) |
210 | 210 |
metadata = image['properties'] |
211 | 211 |
return util.render_metadata(request, metadata, use_values=True, status=200) |
... | ... | |
223 | 223 |
# overLimit (413) |
224 | 224 |
|
225 | 225 |
req = util.get_request_dict(request) |
226 |
log.debug('update_image_metadata %s %s', image_id, req)
|
|
226 |
log.info('update_image_metadata %s %s', image_id, req)
|
|
227 | 227 |
image = util.get_image(image_id, request.user_uniq) |
228 | 228 |
try: |
229 | 229 |
metadata = req['metadata'] |
... | ... | |
251 | 251 |
# badRequest (400), |
252 | 252 |
# overLimit (413) |
253 | 253 |
|
254 |
log.debug('get_image_metadata_item %s %s', image_id, key)
|
|
254 |
log.info('get_image_metadata_item %s %s', image_id, key)
|
|
255 | 255 |
image = util.get_image(image_id, request.user_uniq) |
256 | 256 |
val = image['properties'].get(key) |
257 | 257 |
if val is None: |
... | ... | |
272 | 272 |
# overLimit (413) |
273 | 273 |
|
274 | 274 |
req = util.get_request_dict(request) |
275 |
log.debug('create_image_metadata_item %s %s %s', image_id, key, req)
|
|
275 |
log.info('create_image_metadata_item %s %s %s', image_id, key, req)
|
|
276 | 276 |
try: |
277 | 277 |
metadict = req['meta'] |
278 | 278 |
assert isinstance(metadict, dict) |
... | ... | |
305 | 305 |
# badMediaType(415), |
306 | 306 |
# overLimit (413), |
307 | 307 |
|
308 |
log.debug('delete_image_metadata_item %s %s', image_id, key)
|
|
308 |
log.info('delete_image_metadata_item %s %s', image_id, key)
|
|
309 | 309 |
image = util.get_image(image_id, request.user_uniq) |
310 | 310 |
properties = image['properties'] |
311 | 311 |
properties.pop(key, None) |
b/snf-cyclades-app/synnefo/api/networks.py | ||
---|---|---|
118 | 118 |
# badRequest (400), |
119 | 119 |
# overLimit (413) |
120 | 120 |
|
121 |
log.debug('list_networks detail=%s', detail)
|
|
121 |
log.info('list_networks detail=%s', detail)
|
|
122 | 122 |
since = util.isoparse(request.GET.get('changes-since')) |
123 | 123 |
user_networks = Network.objects.filter(Q(userid=request.user_uniq) | |
124 | 124 |
Q(public=True)) |
... | ... | |
155 | 155 |
# overLimit (413) |
156 | 156 |
|
157 | 157 |
req = util.get_request_dict(request) |
158 |
log.debug('create_network %s', req)
|
|
158 |
log.info('create_network %s', req)
|
|
159 | 159 |
|
160 | 160 |
try: |
161 | 161 |
d = req['network'] |
... | ... | |
223 | 223 |
# itemNotFound (404), |
224 | 224 |
# overLimit (413) |
225 | 225 |
|
226 |
log.debug('get_network_details %s', network_id)
|
|
226 |
log.info('get_network_details %s', network_id)
|
|
227 | 227 |
net = util.get_network(network_id, request.user_uniq) |
228 | 228 |
netdict = network_to_dict(net, request.user_uniq) |
229 | 229 |
return render_network(request, netdict) |
... | ... | |
241 | 241 |
# overLimit (413) |
242 | 242 |
|
243 | 243 |
req = util.get_request_dict(request) |
244 |
log.debug('update_network_name %s', network_id)
|
|
244 |
log.info('update_network_name %s', network_id)
|
|
245 | 245 |
|
246 | 246 |
try: |
247 | 247 |
name = req['network']['name'] |
... | ... | |
267 | 267 |
# unauthorized (401), |
268 | 268 |
# overLimit (413) |
269 | 269 |
|
270 |
log.debug('delete_network %s', network_id)
|
|
270 |
log.info('delete_network %s', network_id)
|
|
271 | 271 |
net = util.get_network(network_id, request.user_uniq, for_update=True) |
272 | 272 |
if net.public: |
273 | 273 |
raise Unauthorized('Can not delete the public network.') |
... | ... | |
285 | 285 |
@util.api_method('POST') |
286 | 286 |
def network_action(request, network_id): |
287 | 287 |
req = util.get_request_dict(request) |
288 |
log.debug('network_action %s %s', network_id, req)
|
|
288 |
log.info('network_action %s %s', network_id, req)
|
|
289 | 289 |
if len(req) != 1: |
290 | 290 |
raise BadRequest('Malformed request.') |
291 | 291 |
|
b/snf-cyclades-app/synnefo/api/servers.py | ||
---|---|---|
32 | 32 |
# or implied, of GRNET S.A. |
33 | 33 |
|
34 | 34 |
from base64 import b64decode |
35 |
from logging import getLogger |
|
36 | 35 |
|
37 | 36 |
from django.conf import settings |
38 | 37 |
from django.conf.urls.defaults import patterns |
... | ... | |
44 | 43 |
from synnefo.api import faults, util |
45 | 44 |
from synnefo.api.actions import server_actions |
46 | 45 |
from synnefo.api.common import method_not_allowed |
47 |
from synnefo.db.models import Backend, VirtualMachine, VirtualMachineMetadata
|
|
46 |
from synnefo.db.models import VirtualMachine, VirtualMachineMetadata |
|
48 | 47 |
from synnefo.logic.backend import create_instance, delete_instance |
49 | 48 |
from synnefo.logic.utils import get_rsapi_state |
50 | 49 |
from synnefo.util.rapi import GanetiApiError |
51 | 50 |
from synnefo.logic.backend_allocator import BackendAllocator |
52 | 51 |
|
53 |
from django.utils import importlib |
|
54 |
|
|
55 |
|
|
56 | 52 |
|
53 |
from logging import getLogger |
|
57 | 54 |
log = getLogger('synnefo.api') |
58 | 55 |
|
59 | 56 |
urlpatterns = patterns('synnefo.api.servers', |
... | ... | |
162 | 159 |
# badRequest (400), |
163 | 160 |
# overLimit (413) |
164 | 161 |
|
165 |
log.debug('list_servers detail=%s', detail)
|
|
162 |
log.info('list_servers detail=%s', detail)
|
|
166 | 163 |
user_vms = VirtualMachine.objects.filter(userid=request.user_uniq) |
167 | 164 |
|
168 | 165 |
since = util.isoparse(request.GET.get('changes-since')) |
... | ... | |
202 | 199 |
# serverCapacityUnavailable (503), |
203 | 200 |
# overLimit (413) |
204 | 201 |
req = util.get_request_dict(request) |
205 |
log.debug('create_server %s', req)
|
|
202 |
log.info('create_server %s', req)
|
|
206 | 203 |
|
207 | 204 |
try: |
208 | 205 |
server = req['server'] |
... | ... | |
285 | 282 |
imageid=image_id, |
286 | 283 |
flavor=flavor) |
287 | 284 |
|
285 |
log.info("Create VM %s, with NIC %s, on Backend %s", vm, nic, backend) |
|
286 |
|
|
288 | 287 |
try: |
289 | 288 |
jobID = create_instance(vm, nic, flavor, image, password, personality) |
290 | 289 |
except GanetiApiError: |
... | ... | |
323 | 322 |
# itemNotFound (404), |
324 | 323 |
# overLimit (413) |
325 | 324 |
|
326 |
log.debug('get_server_details %s', server_id)
|
|
325 |
log.info('get_server_details %s', server_id)
|
|
327 | 326 |
vm = util.get_vm(server_id, request.user_uniq) |
328 | 327 |
server = vm_to_dict(vm, detail=True) |
329 | 328 |
return render_server(request, server) |
... | ... | |
342 | 341 |
# overLimit (413) |
343 | 342 |
|
344 | 343 |
req = util.get_request_dict(request) |
345 |
log.debug('update_server_name %s %s', server_id, req)
|
|
344 |
log.info('update_server_name %s %s', server_id, req)
|
|
346 | 345 |
|
347 | 346 |
try: |
348 | 347 |
name = req['server']['name'] |
... | ... | |
368 | 367 |
# buildInProgress (409), |
369 | 368 |
# overLimit (413) |
370 | 369 |
|
371 |
log.debug('delete_server %s', server_id)
|
|
370 |
log.info('delete_server %s', server_id)
|
|
372 | 371 |
vm = util.get_vm(server_id, request.user_uniq) |
373 | 372 |
delete_instance(vm) |
374 | 373 |
return HttpResponse(status=204) |
... | ... | |
377 | 376 |
@util.api_method('POST') |
378 | 377 |
def server_action(request, server_id): |
379 | 378 |
req = util.get_request_dict(request) |
380 |
log.debug('server_action %s %s', server_id, req)
|
|
379 |
log.info('server_action %s %s', server_id, req)
|
|
381 | 380 |
vm = util.get_vm(server_id, request.user_uniq) |
382 | 381 |
if len(req) != 1: |
383 | 382 |
raise faults.BadRequest("Malformed request") |
... | ... | |
403 | 402 |
# badRequest (400), |
404 | 403 |
# overLimit (413) |
405 | 404 |
|
406 |
log.debug('list_addresses %s', server_id)
|
|
405 |
log.info('list_addresses %s', server_id)
|
|
407 | 406 |
vm = util.get_vm(server_id, request.user_uniq) |
408 | 407 |
addresses = [nic_to_dict(nic) for nic in vm.nics.all()] |
409 | 408 |
|
... | ... | |
425 | 424 |
# itemNotFound (404), |
426 | 425 |
# overLimit (413) |
427 | 426 |
|
428 |
log.debug('list_addresses_by_network %s %s', server_id, network_id)
|
|
427 |
log.info('list_addresses_by_network %s %s', server_id, network_id)
|
|
429 | 428 |
machine = util.get_vm(server_id, request.user_uniq) |
430 | 429 |
network = util.get_network(network_id, request.user_uniq) |
431 | 430 |
nic = util.get_nic(machine, network) |
... | ... | |
448 | 447 |
# badRequest (400), |
449 | 448 |
# overLimit (413) |
450 | 449 |
|
451 |
log.debug('list_server_metadata %s', server_id)
|
|
450 |
log.info('list_server_metadata %s', server_id)
|
|
452 | 451 |
vm = util.get_vm(server_id, request.user_uniq) |
453 | 452 |
metadata = dict((m.meta_key, m.meta_value) for m in vm.metadata.all()) |
454 | 453 |
return util.render_metadata(request, metadata, use_values=True, status=200) |
... | ... | |
466 | 465 |
# overLimit (413) |
467 | 466 |
|
468 | 467 |
req = util.get_request_dict(request) |
469 |
log.debug('update_server_metadata %s %s', server_id, req)
|
|
468 |
log.info('update_server_metadata %s %s', server_id, req)
|
|
470 | 469 |
vm = util.get_vm(server_id, request.user_uniq) |
471 | 470 |
try: |
472 | 471 |
metadata = req['metadata'] |
... | ... | |
494 | 493 |
# badRequest (400), |
495 | 494 |
# overLimit (413) |
496 | 495 |
|
497 |
log.debug('get_server_metadata_item %s %s', server_id, key)
|
|
496 |
log.info('get_server_metadata_item %s %s', server_id, key)
|
|
498 | 497 |
vm = util.get_vm(server_id, request.user_uniq) |
499 | 498 |
meta = util.get_vm_meta(vm, key) |
500 | 499 |
d = {meta.meta_key: meta.meta_value} |
... | ... | |
515 | 514 |
# overLimit (413) |
516 | 515 |
|
517 | 516 |
req = util.get_request_dict(request) |
518 |
log.debug('create_server_metadata_item %s %s %s', server_id, key, req)
|
|
517 |
log.info('create_server_metadata_item %s %s %s', server_id, key, req)
|
|
519 | 518 |
vm = util.get_vm(server_id, request.user_uniq) |
520 | 519 |
try: |
521 | 520 |
metadict = req['meta'] |
... | ... | |
549 | 548 |
# badMediaType(415), |
550 | 549 |
# overLimit (413), |
551 | 550 |
|
552 |
log.debug('delete_server_metadata_item %s %s', server_id, key)
|
|
551 |
log.info('delete_server_metadata_item %s %s', server_id, key)
|
|
553 | 552 |
vm = util.get_vm(server_id, request.user_uniq) |
554 | 553 |
meta = util.get_vm_meta(vm, key) |
555 | 554 |
meta.delete() |
... | ... | |
567 | 566 |
# itemNotFound (404), |
568 | 567 |
# overLimit (413) |
569 | 568 |
|
570 |
log.debug('server_stats %s', server_id)
|
|
569 |
log.info('server_stats %s', server_id)
|
|
571 | 570 |
vm = util.get_vm(server_id, request.user_uniq) |
572 | 571 |
#secret = util.encrypt(vm.backend_vm_id) |
573 | 572 |
secret = vm.backend_vm_id # XXX disable backend id encryption |
b/snf-cyclades-app/synnefo/db/models.py | ||
---|---|---|
106 | 106 |
ordering = ["clustername"] |
107 | 107 |
|
108 | 108 |
def __unicode__(self): |
109 |
return self.clustername |
|
109 |
return self.clustername + "(id=" + str(self.id) + ")"
|
|
110 | 110 |
|
111 | 111 |
@property |
112 | 112 |
def backend_id(self): |
... | ... | |
358 | 358 |
get_latest_by = 'created' |
359 | 359 |
|
360 | 360 |
def __unicode__(self): |
361 |
return self.name |
|
361 |
return self.name + "(id=" + str(self.id) + ")"
|
|
362 | 362 |
|
363 | 363 |
|
364 | 364 |
class VirtualMachineMetadata(models.Model): |
... | ... | |
467 | 467 |
return getattr(snf_settings, self.type + '_TAGS') |
468 | 468 |
|
469 | 469 |
def __unicode__(self): |
470 |
return self.name |
|
470 |
return self.name + "(id=" + str(self.id) + ")"
|
|
471 | 471 |
|
472 | 472 |
@transaction.commit_on_success |
473 | 473 |
def update_state(self): |
b/snf-cyclades-app/synnefo/logic/backend.py | ||
---|---|---|
217 | 217 |
|
218 | 218 |
def start_action(vm, action): |
219 | 219 |
"""Update the state of a VM when a new action is initiated.""" |
220 |
log.debug("Applying action %s to VM %s", action, vm) |
|
221 |
|
|
220 | 222 |
if not action in [x[0] for x in VirtualMachine.ACTIONS]: |
221 | 223 |
raise VirtualMachine.InvalidActionError(action) |
222 | 224 |
|
... | ... | |
326 | 328 |
|
327 | 329 |
# Defined in settings.GANETI_CREATEINSTANCE_KWARGS |
328 | 330 |
# kw['hvparams'] = dict(serial_console=False) |
331 |
log.debug("Creating instance %s", kw) |
|
329 | 332 |
with pooled_rapi_client(vm) as client: |
330 | 333 |
return client.CreateInstance(**kw) |
331 | 334 |
|
... | ... | |
339 | 342 |
def reboot_instance(vm, reboot_type): |
340 | 343 |
assert reboot_type in ('soft', 'hard') |
341 | 344 |
with pooled_rapi_client(vm) as client: |
342 |
return client.RebootInstance(vm.backend_vm_id, reboot_type, dry_run=settings.TEST) |
|
345 |
return client.RebootInstance(vm.backend_vm_id, reboot_type, |
|
346 |
dry_run=settings.TEST) |
|
343 | 347 |
|
344 | 348 |
|
345 | 349 |
def startup_instance(vm): |
... | ... | |
366 | 370 |
# the instance's primary node, and is probably |
367 | 371 |
# hypervisor-specific. |
368 | 372 |
# |
373 |
log.debug("Getting console for vm %s", vm) |
|
374 |
|
|
369 | 375 |
console = {} |
370 | 376 |
console['kind'] = 'vnc' |
371 | 377 |
|
... | ... | |
390 | 396 |
if not backends: |
391 | 397 |
backends = Backend.objects.exclude(offline=True) |
392 | 398 |
|
399 |
log.debug("Creating network %s in backends %s", network, backends) |
|
400 |
|
|
393 | 401 |
for backend in backends: |
394 | 402 |
create_jobID = _create_network(network, backend) |
395 | 403 |
if connect: |
... | ... | |
424 | 432 |
|
425 | 433 |
def connect_network(network, backend, depend_job=None, group=None): |
426 | 434 |
"""Connect a network to nodegroups.""" |
435 |
log.debug("Connecting network %s to backend %s", network, backend) |
|
436 |
|
|
427 | 437 |
mode = "routed" if "ROUTED" in network.type else "bridged" |
428 | 438 |
|
429 | 439 |
with pooled_rapi_client(backend) as client: |
... | ... | |
440 | 450 |
if not backends: |
441 | 451 |
backends = Backend.objects.exclude(offline=True) |
442 | 452 |
|
453 |
log.debug("Deleting network %s from backends %s", network, backends) |
|
454 |
|
|
443 | 455 |
for backend in backends: |
444 | 456 |
disconnect_jobIDs = [] |
445 | 457 |
if disconnect: |
... | ... | |
453 | 465 |
|
454 | 466 |
|
455 | 467 |
def disconnect_network(network, backend, group=None): |
468 |
log.debug("Disconnecting network %s to backend %s", network, backend) |
|
469 |
|
|
456 | 470 |
with pooled_rapi_client(backend) as client: |
457 | 471 |
if group: |
458 | 472 |
return [client.DisconnectNetwork(network.backend_id, group)] |
... | ... | |
467 | 481 |
def connect_to_network(vm, network, address): |
468 | 482 |
nic = {'ip': address, 'network': network.backend_id} |
469 | 483 |
|
484 |
log.debug("Connecting vm %s to network %s(%s)", vm, network, address) |
|
485 |
|
|
470 | 486 |
with pooled_rapi_client(vm) as client: |
471 | 487 |
return client.ModifyInstance(vm.backend_vm_id, nics=[('add', nic)], |
472 | 488 |
hotplug=settings.GANETI_USE_HOTPLUG, |
... | ... | |
475 | 491 |
|
476 | 492 |
def disconnect_from_network(vm, nic): |
477 | 493 |
op = [('remove', nic.index, {})] |
494 |
|
|
495 |
log.debug("Removing nic of VM %s, with index %s", vm, str(nic.index)) |
|
496 |
|
|
478 | 497 |
with pooled_rapi_client(vm) as client: |
479 | 498 |
return client.ModifyInstance(vm.backend_vm_id, nics=op, |
480 | 499 |
hotplug=settings.GANETI_USE_HOTPLUG, |
... | ... | |
487 | 506 |
except KeyError: |
488 | 507 |
raise ValueError("Unsopported Firewall Profile: %s" % profile) |
489 | 508 |
|
509 |
log.debug("Setting tag of VM %s to %s", vm, profile) |
|
510 |
|
|
490 | 511 |
with pooled_rapi_client(vm) as client: |
491 | 512 |
# Delete all firewall tags |
492 | 513 |
for t in _firewall_tags.values(): |
Also available in: Unified diff