From 972cbd05944feacab972535a55d3b838616f8de4 Mon Sep 17 00:00:00 2001 From: Julien Duponchelle Date: Tue, 7 Jun 2016 16:06:37 +0200 Subject: [PATCH] Cleanly forward exception from compute to controller --- gns3server/controller/compute.py | 14 +++++++++++--- gns3server/web/route.py | 6 +++--- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/gns3server/controller/compute.py b/gns3server/controller/compute.py index ad7d2c5ba..69f445918 100644 --- a/gns3server/controller/compute.py +++ b/gns3server/controller/compute.py @@ -305,16 +305,24 @@ class Compute: body = body.decode() if response.status >= 300: + # Try to decode the GNS3 error + try: + msg = json.loads(body)["message"] + except (KeyError, json.decoder.JSONDecodeError): + msg = body + if response.status == 400: raise aiohttp.web.HTTPBadRequest(text="Bad request {} {}".format(url, body)) elif response.status == 401: raise aiohttp.web.HTTPUnauthorized(text="Invalid authentication for compute {}".format(self.id)) elif response.status == 403: - raise aiohttp.web.HTTPForbidden(text="Forbidden {} {}".format(url, body)) + raise aiohttp.web.HTTPForbidden(text=msg) elif response.status == 404: - raise aiohttp.web.HTTPNotFound(text="{} not found on compute".format(url)) + raise aiohttp.web.HTTPNotFound(text=msg) elif response.status == 409: - raise aiohttp.web.HTTPConflict(text="Conflict {} {}".format(url, body)) + raise aiohttp.web.HTTPConflict(text=msg) + elif response.status == 500: + raise aiohttp.web.HTTPInternalServerError(text="Internal server error {}".format(url)) elif response.status == 503: raise aiohttp.web.HTTPServiceUnavailable(text="Service unavailable {} {}".format(url, body)) else: diff --git a/gns3server/web/route.py b/gns3server/web/route.py index 3819cc5ea..8cba4e7e0 100644 --- a/gns3server/web/route.py +++ b/gns3server/web/route.py @@ -25,7 +25,7 @@ import traceback log = logging.getLogger(__name__) -from ..compute.error import NodeError +from ..compute.error import NodeError, ImageMissingError from ..controller.controller_error import ControllerError from ..ubridge.ubridge_error import UbridgeError from .response import Response @@ -198,10 +198,10 @@ class Route(object): response.set_status(409) response.json({"message": str(e), "status": 409}) except (NodeError, UbridgeError, ImageMissingError) as e: - log.error("Node error detected: {type}".format(type=type(e)), exc_info=1) + log.error("Node error detected: {type}".format(type=e.__class__.__name__), exc_info=1) response = Response(request=request, route=route) response.set_status(409) - response.json({"message": str(e), "status": 409, "exception": str(e.__class__)}) + response.json({"message": str(e), "status": 409, "exception": e.__class__.__name__}) except asyncio.futures.CancelledError as e: log.error("Request canceled") response = Response(request=request, route=route)