Revision 5c8076b6

b/snf-cyclades-app/synnefo/logic/backend.py
96 96
        # Commission for this change has not been issued, or the issued
97 97
        # commission was unaware of the current change. Reject all previous
98 98
        # commissions and create a new one in forced mode!
99
        previous_serial = vm.serial
100
        if previous_serial and not previous_serial.resolved:
101
            quotas.resolve_vm_commission(previous_serial)
102 99
        commission_name = ("client: dispatcher, resource: %s, ganeti_job: %s"
103 100
                           % (vm, job_id))
104
        serial = quotas.issue_commission(user=vm.userid,
105
                                         source=quotas.DEFAULT_SOURCE,
106
                                         provisions=commission_info,
107
                                         name=commission_name,
108
                                         force=True,
109
                                         auto_accept=True)
110
        # Clear VM's serial. Expected job may arrive later. However correlated
111
        # serial must not be accepted, since it reflects a previous VM state
112
        vm.serial = None
101
        quotas.handle_resource_commission(vm, action,
102
                                          commission_info=commission_info,
103
                                          commission_name=commission_name,
104
                                          force=True,
105
                                          auto_accept=True)
106
        log.debug("Issued new commission: %s", vm.serial)
113 107

  
114 108
    return vm
115 109

  
b/snf-cyclades-app/synnefo/logic/servers.py
81 81
            validate_server_action(vm, action)
82 82
            vm.action = action
83 83

  
84
            # Resolve(reject) previous serial if it is still pending!!
85
            previous_serial = vm.serial
86
            if previous_serial and not previous_serial.resolved:
87
                quotas.resolve_vm_commission(serial=previous_serial)
88

  
89
            # Check if action is quotable and issue the corresponding
90
            # commission
91
            serial = None
92
            commission_info = quotas.get_commission_info(vm, action=action)
93
            if commission_info is not None:
94
                # Issue new commission, associate it with the VM
95
                commission_name = "client: api, resource %s" % vm
96
                serial = quotas.issue_commission(user=user_id,
97
                                                 source=quotas.DEFAULT_SOURCE,
98
                                                 provisions=commission_info,
99
                                                 name=commission_name,
100
                                                 force=False,
101
                                                 auto_accept=False)
102
            vm.serial = serial
84
            commission_name = "client: api, resource: %s" % vm
85
            quotas.handle_resource_commission(vm, action=action,
86
                                              commission_name=commission_name)
87
            vm.save()
103 88

  
104 89
            # XXX: Special case for server creation!
105 90
            if action == "BUILD":
b/snf-cyclades-app/synnefo/quotas/__init__.py
349 349
    return dict((r, -s) for r, s in resources.items())
350 350

  
351 351

  
352
def resolve_vm_commission(serial):
352
def handle_resource_commission(resource, action, commission_name,
353
                               commission_info=None, force=False,
354
                               auto_accept=False):
355
    """Handle a issuing of a commission for a resource.
356

  
357
    Create a new commission for a resource based on the action that
358
    is performed. If the resource has a previous pending commission,
359
    resolved it before issuing the new one.
360

  
361
    """
362
    # Try to resolve previous serial
363
    resolve_commission(resource.serial)
364

  
365
    # Check if action is quotable and issue the corresponding commission
366
    serial = None
367
    if commission_info is None:
368
        commission_info = get_commission_info(resource, action=action)
369
    if commission_info is not None:
370
        # Issue new commission, associate it with the resource
371
        if commission_name is None:
372
            commission_name = "client: api, resource %s" % resource
373
        serial = issue_commission(user=resource.userid,
374
                                  source=DEFAULT_SOURCE,
375
                                  provisions=commission_info,
376
                                  name=commission_name,
377
                                  force=False,
378
                                  auto_accept=False)
379
    resource.serial = serial
380

  
381

  
382
def resolve_commission(serial):
383
    if serial is None or serial.resolved:
384
        return
353 385
    log.warning("Resolving pending commission: %s", serial)
354 386
    if not serial.pending and serial.accept:
355 387
        accept_serial(serial)

Also available in: Unified diff