diff --git a/gns3server/controller/compute.py b/gns3server/controller/compute.py index ff565a13..fe981241 100644 --- a/gns3server/controller/compute.py +++ b/gns3server/controller/compute.py @@ -138,6 +138,14 @@ class Compute: self._password = None self._auth = aiohttp.BasicAuth(self._user, "") + def set_last_error(self, msg): + """ + Set the last error message for this compute. + + :param msg: message + """ + self._last_error = msg + @asyncio.coroutine def interfaces(self): """ diff --git a/gns3server/controller/gns3vm/__init__.py b/gns3server/controller/gns3vm/__init__.py index cf38a0f3..a5fcee4b 100644 --- a/gns3server/controller/gns3vm/__init__.py +++ b/gns3server/controller/gns3vm/__init__.py @@ -246,13 +246,15 @@ class GNS3VM: except GNS3VMError as e: # User will receive the error later when they will try to use the node try: - yield from self._controller.add_compute(compute_id="vm", - name="GNS3 VM ({})".format(self.current_engine().vmname), - host=None, - force=True) + compute = yield from self._controller.add_compute(compute_id="vm", + name="GNS3 VM ({})".format(self.current_engine().vmname), + host=None, + force=True) + compute.set_last_error(str(e)) + except aiohttp.web.HTTPConflict: pass - log.error("Can't start the GNS3 VM: %s", str(e)) + log.error("Cannot start the GNS3 VM: {}".format(e)) @asyncio.coroutine def exit_vm(self): @@ -290,8 +292,9 @@ class GNS3VM: yield from engine.start() except Exception as e: yield from self._controller.delete_compute("vm") - log.error("Can't start the GNS3 VM: {}".format(str(e))) + log.error("Cannot start the GNS3 VM: {}".format(str(e))) yield from compute.update(name="GNS3 VM ({})".format(engine.vmname)) + compute.set_last_error(str(e)) raise e yield from compute.connect() # we can connect now that the VM has started yield from compute.update(name="GNS3 VM ({})".format(engine.vmname), diff --git a/gns3server/web/web_server.py b/gns3server/web/web_server.py index aad691d4..25427af4 100644 --- a/gns3server/web/web_server.py +++ b/gns3server/web/web_server.py @@ -137,7 +137,10 @@ class WebServer: def signal_handler(signame, *args): log.warning("Server has got signal {}, exiting...".format(signame)) - asyncio_ensure_future(self.shutdown_server()) + try: + asyncio_ensure_future(self.shutdown_server()) + except asyncio.CancelledError: + pass signals = ["SIGTERM", "SIGINT"] if sys.platform.startswith("win"): @@ -295,4 +298,7 @@ class WebServer: log.warning("TypeError exception in the loop {}".format(e)) finally: if self._loop.is_running(): - self._loop.run_until_complete(self.shutdown_server()) + try: + self._loop.run_until_complete(self.shutdown_server()) + except asyncio.CancelledError: + pass