diff options
author | cl349@freefall.cl.cam.ac.uk <cl349@freefall.cl.cam.ac.uk> | 2004-11-03 23:01:54 +0000 |
---|---|---|
committer | cl349@freefall.cl.cam.ac.uk <cl349@freefall.cl.cam.ac.uk> | 2004-11-03 23:01:54 +0000 |
commit | 5693a9fd4be82285e3cfc66840534f92b41f2c24 (patch) | |
tree | e27f8e7e1702cf2d34ebc9cf2ab9a976d957e4d9 | |
parent | 983ac8ad4155fedd88b42f5786ae839ab5844c37 (diff) | |
download | xen-5693a9fd4be82285e3cfc66840534f92b41f2c24.tar.gz xen-5693a9fd4be82285e3cfc66840534f92b41f2c24.tar.bz2 xen-5693a9fd4be82285e3cfc66840534f92b41f2c24.zip |
bitkeeper revision 1.1159.155.7 (41896362-2P6ibesMBXM0pV5gks0Bw)
Apply changes from Mike Wray:
- Get domain creation errors returned to the caller.
- Add logging for domain create failures.
-rw-r--r-- | tools/python/xen/xend/server/SrvBase.py | 24 | ||||
-rw-r--r-- | tools/python/xen/xend/server/SrvDomainDir.py | 27 |
2 files changed, 17 insertions, 34 deletions
diff --git a/tools/python/xen/xend/server/SrvBase.py b/tools/python/xen/xend/server/SrvBase.py index 6bc32b42bc..b32d102273 100644 --- a/tools/python/xen/xend/server/SrvBase.py +++ b/tools/python/xen/xend/server/SrvBase.py @@ -8,17 +8,18 @@ import types import StringIO from twisted.internet import defer -#defer.Deferred.debug = 1 from twisted.internet import reactor from twisted.protocols import http from twisted.web import error from twisted.web import resource from twisted.web import server +from twisted.python.failure import Failure from xen.xend import sxp from xen.xend import PrettyPrint from xen.xend.Args import ArgError from xen.xend.XendError import XendError +from xen.xend.XendLogging import log def uri_pathlist(p): """Split a path into a list. @@ -105,17 +106,17 @@ class SrvBase(resource.Resource): try: val = op_method(op, req) except Exception, err: - return self._perform_err(err, req) + return self._perform_err(err, op, req) if isinstance(val, defer.Deferred): - val.addCallback(self._perform_cb, req, dfr=1) - val.addErrback(self._perform_err, req, dfr=1) + val.addCallback(self._perform_cb, op, req, dfr=1) + val.addErrback(self._perform_err, op, req, dfr=1) return server.NOT_DONE_YET else: - self._perform_cb(val, req, 0) + self._perform_cb(val, op, req, dfr=0) return '' - def _perform_cb(self, val, req, dfr): + def _perform_cb(self, val, op, req, dfr=0): """Callback to complete the request. May be called from a Deferred. @@ -141,7 +142,7 @@ class SrvBase(resource.Resource): if dfr: req.finish() - def _perform_err(self, err, req, dfr=0): + def _perform_err(self, err, op, req, dfr=0): """Error callback to complete a request. May be called from a Deferred. @@ -149,13 +150,16 @@ class SrvBase(resource.Resource): @param req: request causing the error @param dfr: deferred flag """ - if not (isinstance(err, ArgError) or - isinstance(err, sxp.ParseError) or - isinstance(err, XendError)): + if isinstance(err, Failure): + err = err.getErrorMessage() + elif not (isinstance(err, ArgError) or + isinstance(err, sxp.ParseError) or + isinstance(err, XendError)): if dfr: return err else: raise + log.exception("op=%s: %s", op, str(err)) if self.use_sxp(req): req.setHeader("Content-Type", sxp.mime_type) sxp.show(['xend.err', str(err)], out=req) diff --git a/tools/python/xen/xend/server/SrvDomainDir.py b/tools/python/xen/xend/server/SrvDomainDir.py index 08eed6da38..2fc8ee4877 100644 --- a/tools/python/xen/xend/server/SrvDomainDir.py +++ b/tools/python/xen/xend/server/SrvDomainDir.py @@ -11,6 +11,7 @@ from xen.xend import sxp from xen.xend import XendDomain from xen.xend.Args import FormFn from xen.xend.XendError import XendError +from xen.xend.XendLogging import log from SrvDir import SrvDir from SrvDomain import SrvDomain @@ -59,18 +60,15 @@ class SrvDomainDir(SrvDir): except sxp.ParseError, ex: errmsg = 'Invalid configuration ' + str(ex) if not ok: - req.setResponseCode(http.BAD_REQUEST, errmsg) - return errmsg + raise XendError(errmsg) try: deferred = self.xd.domain_create(config) deferred.addCallback(self._op_create_cb, configstring, req) - deferred.addErrback(self._op_create_err, req) return deferred except Exception, ex: print 'op_create> Exception creating domain:' traceback.print_exc() - req.setResponseCode(http.BAD_REQUEST, "Error creating domain: " + str(ex)) - return str(ex) + raise XendError("Error creating domain: " + str(ex)) def _op_create_cb(self, dominfo, configstring, req): """Callback to handle deferred domain creation. @@ -92,27 +90,15 @@ class SrvDomainDir(SrvDir): out.close() return val - 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 - traceback.print_exc() - req.setResponseCode(http.BAD_REQUEST, "Error creating domain: " + str(err)) - return str(err) - def op_restore(self, op, req): """Restore a domain from file. @return: deferred """ - #todo: return is deferred. May need ok and err callbacks. fn = FormFn(self.xd.domain_restore, [['file', 'str']]) deferred = fn(req.args) deferred.addCallback(self._op_restore_cb, req) - #deferred.addErrback(self._op_restore_err, req) return deferred def _op_restore_cb(self, dominfo, req): @@ -130,13 +116,6 @@ class SrvDomainDir(SrvDir): out.close() 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) - def render_POST(self, req): return self.perform(req) |