diff --git a/tools/python/xen/xend/XendDomainInfo.py b/tools/python/xen/xend/XendDomainInfo.py index 7f789a48f7..c81c2a0516 100644 --- a/tools/python/xen/xend/XendDomainInfo.py +++ b/tools/python/xen/xend/XendDomainInfo.py @@ -288,6 +288,18 @@ def append_deferred(dlist, v): if isinstance(v, defer.Deferred): dlist.append(v) +def dlist_err(val): + """Error callback suitable for a deferred list. + In a deferred list the error callback is called with with Failure((error, index)). + This callback extracts the error and returns it. + + @param val: Failure containing (error, index) + @type val: twisted.internet.failure.Failure + """ + + (error, index) = val.value + return error + class XendDomainInfo: """Virtual machine object.""" @@ -760,6 +772,7 @@ class XendDomainInfo: append_deferred(dlist, v) index[dev_name] = dev_index + 1 deferred = defer.DeferredList(dlist, fireOnOneErrback=1) + deferred.addErrback(dlist_err) return deferred def device_create(self, dev_config): @@ -991,6 +1004,7 @@ class XendDomainInfo: log.warning("Unknown config field %s", field_name) index[field_name] = field_index + 1 d = defer.DeferredList(dlist, fireOnOneErrback=1) + deferred.addErrback(dlist_err) return d diff --git a/tools/python/xen/xend/server/SrvDomainDir.py b/tools/python/xen/xend/server/SrvDomainDir.py index 6307b25089..4526b996f9 100644 --- a/tools/python/xen/xend/server/SrvDomainDir.py +++ b/tools/python/xen/xend/server/SrvDomainDir.py @@ -5,6 +5,7 @@ from StringIO import StringIO from twisted.protocols import http from twisted.web import error +from twisted.python.failure import Failure from xen.xend import sxp from xen.xend import XendDomain @@ -94,6 +95,8 @@ class SrvDomainDir(SrvDir): def _op_create_err(self, err, req): """Callback to handle errors in deferred domain creation. """ + if isinstance(err, Failure): + err = err.getErrorMessage() print 'op_create> Deferred Exception creating domain:', err req.setResponseCode(http.BAD_REQUEST, "Error creating domain: " + str(err)) return str(err) @@ -127,6 +130,8 @@ class SrvDomainDir(SrvDir): return val def _op_restore_err(self, err, req): + if isinstance(err, Failure): + err = err.getErrorMessage() print 'op_create> Deferred Exception restoring domain:', err req.setResponseCode(http.BAD_REQUEST, "Error restoring domain: "+ str(err)) return str(err)