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