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