Revision 727fb2f9 snf-cyclades-app/synnefo/logic/callbacks.py

b/snf-cyclades-app/synnefo/logic/callbacks.py
34 34
import json
35 35
from functools import wraps
36 36

  
37
from synnefo.db.models import Backend, VirtualMachine, Network, BackendNetwork
37
from synnefo.db.models import (Backend, VirtualMachine, Network,
38
                               BackendNetwork, pooled_rapi_client)
38 39
from synnefo.logic import utils, backend
39 40

  
40 41
from synnefo.lib.utils import merge_time
......
170 171
        log.error("Message is of unknown type %s.", msg['type'])
171 172
        return
172 173

  
174
    operation = msg["operation"]
175
    status = msg["status"]
176
    jobID = msg["jobId"]
177
    logmsg = msg["logmsg"]
173 178
    nics = msg.get("nics", None)
174
    backend.process_op_status(vm, event_time, msg['jobId'], msg['operation'],
175
                              msg['status'], msg['logmsg'], nics)
179
    job_fields = msg.get("job_fields", {})
180

  
181
    # Special case: OP_INSTANCE_CREATE with opportunistic locking may fail
182
    # if all Ganeti nodes are already locked. Retry the job without
183
    # opportunistic locking..
184
    if (operation == "OP_INSTANCE_CREATE" and status == "error" and
185
       job_fields.get("opportunistic_locking", False)):
186
        if vm.backendjobid != jobID:  # The job has already been retried!
187
            return
188
        # Remove extra fields
189
        [job_fields.pop(f) for f in ("OP_ID", "reason")]
190
        name = job_fields.pop("name", job_fields.pop("instance_name"))
191
        # Turn off opportunistic locking before retrying the job
192
        job_fields["opportunistic_locking"] = False
193
        with pooled_rapi_client(vm) as c:
194
            jobID = c.CreateInstance(name=name, **job_fields)
195
        # Update the VM fields
196
        vm.backendjobid = jobID
197
        vm.backendjobstatus = None
198
        vm.save()
199
        log.info("Retrying failed creation of instance '%s' without"
200
                 " opportunistic locking. New job ID: '%s'", name, jobID)
201
        return
202

  
203
    backend.process_op_status(vm, event_time, jobID, operation,
204
                              status, logmsg, nics)
176 205

  
177 206
    log.debug("Done processing ganeti-op-status msg for vm %s.",
178 207
              msg['instance'])

Also available in: Unified diff