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