Revision 01f5f8d9
b/snf-cyclades-app/synnefo/api/servers.py | ||
---|---|---|
51 | 51 |
from synnefo.db.models import (VirtualMachine, VirtualMachineMetadata, |
52 | 52 |
NetworkInterface) |
53 | 53 |
from synnefo.logic.backend import (create_instance, delete_instance, |
54 |
process_op_status) |
|
54 |
process_op_status, job_is_still_running, |
|
55 |
vm_exists_in_backend) |
|
55 | 56 |
from synnefo.logic.utils import get_rsapi_state |
56 | 57 |
from synnefo.logic.backend_allocator import BackendAllocator |
57 | 58 |
from synnefo import quotas |
... | ... | |
403 | 404 |
|
404 | 405 |
jobID = create_instance(vm, nic, flavor, image) |
405 | 406 |
# At this point the job is enqueued in the Ganeti backend |
407 |
vm.backendopcode = "OP_INSTANCE_CREATE" |
|
406 | 408 |
vm.backendjobid = jobID |
407 | 409 |
vm.save() |
408 | 410 |
transaction.commit() |
... | ... | |
482 | 484 |
log.info('delete_server %s', server_id) |
483 | 485 |
vm = util.get_vm(server_id, request.user_uniq, for_update=True, |
484 | 486 |
non_suspended=True) |
487 |
# XXX: Workaround for race where OP_INSTANCE_REMOVE starts executing on |
|
488 |
# Ganeti before OP_INSTANCE_CREATE. This will be fixed when |
|
489 |
# OP_INSTANCE_REMOVE supports the 'depends' request attribute. |
|
490 |
if (vm.backendopcode == "OP_INSTANCE_CREATE" and |
|
491 |
vm.backendjobstatus != "success"): |
|
492 |
if job_is_still_running(vm) and not vm_exists_in_backend(vm): |
|
493 |
raise faults.BuildInProgress("Server is being build") |
|
494 |
|
|
485 | 495 |
start_action(vm, 'DESTROY') |
486 | 496 |
delete_instance(vm) |
487 | 497 |
return HttpResponse(status=204) |
b/snf-cyclades-app/synnefo/logic/backend.py | ||
---|---|---|
41 | 41 |
from synnefo import quotas |
42 | 42 |
from synnefo.api.util import release_resource |
43 | 43 |
from synnefo.util.mac2eui64 import mac2eui64 |
44 |
from synnefo.logic.rapi import GanetiApiError |
|
44 |
from synnefo.logic.rapi import GanetiApiError, JOB_STATUS_FINALIZED
|
|
45 | 45 |
|
46 | 46 |
from logging import getLogger |
47 | 47 |
log = getLogger(__name__) |
... | ... | |
522 | 522 |
return False |
523 | 523 |
|
524 | 524 |
|
525 |
def job_is_still_running(vm): |
|
526 |
with pooled_rapi_client(vm) as c: |
|
527 |
try: |
|
528 |
job_info = c.GetJobStatus(vm.backendjobid) |
|
529 |
return not (job_info["status"] in JOB_STATUS_FINALIZED) |
|
530 |
except GanetiApiError: |
|
531 |
return False |
|
532 |
|
|
533 |
|
|
525 | 534 |
def create_network(network, backend, connect=True): |
526 | 535 |
"""Create a network in a Ganeti backend""" |
527 | 536 |
log.debug("Creating network %s in backend %s", network, backend) |
Also available in: Unified diff