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