Revision e221ade2
b/snf-cyclades-app/synnefo/api/actions.py | ||
---|---|---|
286 | 286 |
|
287 | 287 |
|
288 | 288 |
@server_action('firewallProfile') |
289 |
@transaction.commit_on_success |
|
290 | 289 |
def set_firewall_profile(request, vm, args): |
291 | 290 |
# Normal Response Code: 200 |
292 | 291 |
# Error Response Codes: computeFault (400, 500), |
... | ... | |
318 | 317 |
# itemNotFound (404), |
319 | 318 |
# overLimit (413) |
320 | 319 |
|
320 |
if net.state != 'ACTIVE': |
|
321 |
raise ServiceUnavailable('Network not active yet') |
|
322 |
|
|
321 | 323 |
server_id = args.get('serverRef', None) |
322 | 324 |
if not server_id: |
323 | 325 |
raise BadRequest('Malformed Request.') |
324 |
vm = get_vm(server_id, request.user_uniq) |
|
325 |
|
|
326 |
log.info("Connect VM %s to Network %s", vm, net) |
|
327 | 326 |
|
328 |
net = Network.objects.get(id=net.id) |
|
329 |
|
|
330 |
if net.state != 'ACTIVE': |
|
331 |
raise ServiceUnavailable('Network not active yet') |
|
327 |
vm = get_vm(server_id, request.user_uniq, non_suspended=True) |
|
332 | 328 |
|
333 | 329 |
address = None |
334 | 330 |
if net.dhcp: |
... | ... | |
366 | 362 |
|
367 | 363 |
if not server_id or not nic_index: |
368 | 364 |
raise BadRequest('Malformed Request.') |
369 |
vm = get_vm(server_id, request.user_uniq) |
|
365 |
|
|
366 |
vm = get_vm(server_id, request.user_uniq, non_suspended=True) |
|
370 | 367 |
nic = get_nic_from_index(vm, nic_index) |
371 | 368 |
|
372 |
log.info("Disconnect VM %s NIC %s", vm, str(nic.index))
|
|
369 |
log.info("Removing NIC %s from VM %s", str(nic.index), vm)
|
|
373 | 370 |
|
374 | 371 |
if nic.dirty: |
375 | 372 |
raise BuildInProgress('Machine is busy.') |
b/snf-cyclades-app/synnefo/api/networks.py | ||
---|---|---|
304 | 304 |
if net.deleted: |
305 | 305 |
raise Network.DeletedError |
306 | 306 |
|
307 |
key = req.keys()[0] |
|
308 |
val = req[key] |
|
309 |
|
|
310 | 307 |
try: |
308 |
key = req.keys()[0] |
|
309 |
val = req[key] |
|
311 | 310 |
assert isinstance(val, dict) |
312 | 311 |
return network_actions[key](request, net, req[key]) |
313 | 312 |
except KeyError: |
b/snf-cyclades-app/synnefo/api/servers.py | ||
---|---|---|
131 | 131 |
d['created'] = util.isoformat(vm.created) |
132 | 132 |
d['flavorRef'] = vm.flavor.id |
133 | 133 |
d['imageRef'] = vm.imageid |
134 |
d['suspended'] = vm.suspended |
|
134 | 135 |
|
135 | 136 |
metadata = dict((m.meta_key, m.meta_value) for m in vm.metadata.all()) |
136 | 137 |
if metadata: |
... | ... | |
418 | 419 |
except (TypeError, KeyError): |
419 | 420 |
raise faults.BadRequest("Malformed request") |
420 | 421 |
|
421 |
vm = util.get_vm(server_id, request.user_uniq) |
|
422 |
vm = util.get_vm(server_id, request.user_uniq, non_suspended=True)
|
|
422 | 423 |
vm.name = name |
423 | 424 |
vm.save() |
424 | 425 |
|
... | ... | |
438 | 439 |
# overLimit (413) |
439 | 440 |
|
440 | 441 |
log.info('delete_server %s', server_id) |
441 |
vm = util.get_vm(server_id, request.user_uniq) |
|
442 |
vm = util.get_vm(server_id, request.user_uniq, non_suspended=True)
|
|
442 | 443 |
delete_instance(vm) |
443 | 444 |
return HttpResponse(status=204) |
444 | 445 |
|
... | ... | |
447 | 448 |
def server_action(request, server_id): |
448 | 449 |
req = util.get_request_dict(request) |
449 | 450 |
log.debug('server_action %s %s', server_id, req) |
450 |
vm = util.get_vm(server_id, request.user_uniq) |
|
451 |
|
|
451 | 452 |
if len(req) != 1: |
452 | 453 |
raise faults.BadRequest("Malformed request") |
453 | 454 |
|
454 |
key = req.keys()[0] |
|
455 |
val = req[key] |
|
455 |
# Do not allow any action on deleted or suspended VMs |
|
456 |
vm = util.get_vm(server_id, request.user_uniq, non_deleted=True, |
|
457 |
non_suspended=True) |
|
456 | 458 |
|
457 | 459 |
try: |
460 |
key = req.keys()[0] |
|
461 |
val = req[key] |
|
458 | 462 |
assert isinstance(val, dict) |
459 |
return server_actions[key](request, vm, req[key])
|
|
463 |
return server_actions[key](request, vm, val)
|
|
460 | 464 |
except KeyError: |
461 | 465 |
raise faults.BadRequest("Unknown action") |
462 | 466 |
except AssertionError: |
... | ... | |
536 | 540 |
|
537 | 541 |
req = util.get_request_dict(request) |
538 | 542 |
log.info('update_server_metadata %s %s', server_id, req) |
539 |
vm = util.get_vm(server_id, request.user_uniq) |
|
543 |
vm = util.get_vm(server_id, request.user_uniq, non_suspended=True)
|
|
540 | 544 |
try: |
541 | 545 |
metadata = req['metadata'] |
542 | 546 |
assert isinstance(metadata, dict) |
... | ... | |
585 | 589 |
|
586 | 590 |
req = util.get_request_dict(request) |
587 | 591 |
log.info('create_server_metadata_item %s %s %s', server_id, key, req) |
588 |
vm = util.get_vm(server_id, request.user_uniq) |
|
592 |
vm = util.get_vm(server_id, request.user_uniq, non_suspended=True)
|
|
589 | 593 |
try: |
590 | 594 |
metadict = req['meta'] |
591 | 595 |
assert isinstance(metadict, dict) |
... | ... | |
619 | 623 |
# overLimit (413), |
620 | 624 |
|
621 | 625 |
log.info('delete_server_metadata_item %s %s', server_id, key) |
622 |
vm = util.get_vm(server_id, request.user_uniq) |
|
626 |
vm = util.get_vm(server_id, request.user_uniq, non_suspended=True)
|
|
623 | 627 |
meta = util.get_vm_meta(vm, key) |
624 | 628 |
meta.delete() |
625 | 629 |
vm.save() |
b/snf-cyclades-app/synnefo/api/util.py | ||
---|---|---|
157 | 157 |
return b64encode(enc) |
158 | 158 |
|
159 | 159 |
|
160 |
def get_vm(server_id, user_id): |
|
161 |
"""Return a VirtualMachine instance or raise ItemNotFound."""
|
|
160 |
def get_vm(server_id, user_id, non_deleted=False, non_suspended=False):
|
|
161 |
"""Find a VirtualMachine instance based on ID and owner."""
|
|
162 | 162 |
|
163 | 163 |
try: |
164 | 164 |
server_id = int(server_id) |
165 |
return VirtualMachine.objects.get(id=server_id, userid=user_id) |
|
165 |
vm = VirtualMachine.objects.get(id=server_id, userid=user_id) |
|
166 |
if non_deleted and vm.deleted: |
|
167 |
raise VirtualMachine.DeletedError |
|
168 |
if non_suspended and vm.suspended: |
|
169 |
raise Unauthorized("Administratively Suspended VM") |
|
166 | 170 |
except ValueError: |
167 | 171 |
raise BadRequest('Invalid server ID.') |
168 | 172 |
except VirtualMachine.DoesNotExist: |
169 | 173 |
raise ItemNotFound('Server not found.') |
170 | 174 |
|
171 |
|
|
172 | 175 |
def get_vm_meta(vm, key): |
173 | 176 |
"""Return a VirtualMachineMetadata instance or raise ItemNotFound.""" |
174 | 177 |
|
b/snf-cyclades-app/synnefo/logic/backend.py | ||
---|---|---|
236 | 236 |
if not action in [x[0] for x in VirtualMachine.ACTIONS]: |
237 | 237 |
raise VirtualMachine.InvalidActionError(action) |
238 | 238 |
|
239 |
# No actions to deleted and no actions beside destroy to suspended VMs
|
|
239 |
# No actions to deleted VMs |
|
240 | 240 |
if vm.deleted: |
241 | 241 |
raise VirtualMachine.DeletedError |
242 | 242 |
|
... | ... | |
250 | 250 |
vm.backendjobstatus = None |
251 | 251 |
vm.backendlogmsg = None |
252 | 252 |
|
253 |
# Update the relevant flags if the VM is being suspended or destroyed. |
|
254 |
# Do not set the deleted flag here, see ticket #721. |
|
255 |
# |
|
256 |
# The deleted flag is set asynchronously, when an OP_INSTANCE_REMOVE |
|
257 |
# completes successfully. Hence, a server may be visible for some time |
|
258 |
# after a DELETE /servers/id returns HTTP 204. |
|
259 |
# |
|
260 |
if action == "DESTROY": |
|
261 |
# vm.deleted = True |
|
262 |
pass |
|
263 |
elif action == "SUSPEND": |
|
264 |
vm.suspended = True |
|
265 |
elif action == "START": |
|
266 |
vm.suspended = False |
|
267 |
|
|
268 | 253 |
vm.save() |
269 | 254 |
|
270 | 255 |
|
Also available in: Unified diff