1
0
mirror of https://github.com/GNS3/gns3-server synced 2024-11-28 11:18:11 +00:00

If the connection between the controller and compute is closed reopen it

This commit is contained in:
Julien Duponchelle 2016-07-20 12:43:23 +02:00
parent 73d5066392
commit 7c4c03cf17
No known key found for this signature in database
GPG Key ID: CE8B29639E07F5E8
2 changed files with 19 additions and 12 deletions

View File

@ -87,7 +87,7 @@ class Compute:
self._connected = False self._connected = False
self._controller = controller self._controller = controller
self._set_auth(user, password) self._set_auth(user, password)
self._session = aiohttp.ClientSession() self._http_session = None
self._version = None self._version = None
self._cpu_usage_percent = None self._cpu_usage_percent = None
self._memory_usage_percent = None self._memory_usage_percent = None
@ -99,8 +99,14 @@ class Compute:
if compute_id == "local" and Config.instance().get_section_config("Server")["local"] is False: if compute_id == "local" and Config.instance().get_section_config("Server")["local"] is False:
raise ComputeError("The local compute is started without --local") raise ComputeError("The local compute is started without --local")
def _session(self):
if self._http_session is None or self._http_session.closed is True:
self._http_session = aiohttp.ClientSession()
return self._http_session
def __del__(self): def __del__(self):
self._session.close() if self._http_session:
self._http_session.close()
def _set_auth(self, user, password): def _set_auth(self, user, password):
""" """
@ -123,8 +129,8 @@ class Compute:
def update(self, **kwargs): def update(self, **kwargs):
for kw in kwargs: for kw in kwargs:
setattr(self, kw, kwargs[kw]) setattr(self, kw, kwargs[kw])
if self._session: if self._http_session:
self._session.close() self._http_session.close()
self._connected = False self._connected = False
self._controller.notification.emit("compute.updated", self.__json__()) self._controller.notification.emit("compute.updated", self.__json__())
self._controller.save() self._controller.save()
@ -132,7 +138,8 @@ class Compute:
@asyncio.coroutine @asyncio.coroutine
def close(self): def close(self):
self._connected = False self._connected = False
self._session.close() if self._http_session:
self._http_session.close()
if self._ws: if self._ws:
yield from self._ws.close() yield from self._ws.close()
self._ws = None self._ws = None
@ -273,7 +280,7 @@ class Compute:
""" """
url = self._getUrl("/projects/{}/stream/{}".format(project.id, path)) url = self._getUrl("/projects/{}/stream/{}".format(project.id, path))
response = yield from self._session.request("GET", url, auth=self._auth) response = yield from self._session().request("GET", url, auth=self._auth)
if response.status == 404: if response.status == 404:
raise aiohttp.web.HTTPNotFound(text="{} not found on compute".format(path)) raise aiohttp.web.HTTPNotFound(text="{} not found on compute".format(path))
return response.content return response.content
@ -310,7 +317,7 @@ class Compute:
""" """
Connect to the notification stream Connect to the notification stream
""" """
self._ws = yield from self._session.ws_connect(self._getUrl("/notifications/ws")) self._ws = yield from self._session().ws_connect(self._getUrl("/notifications/ws"))
while True: while True:
response = yield from self._ws.receive() response = yield from self._ws.receive()
if response.tp == aiohttp.MsgType.closed or response.tp == aiohttp.MsgType.error: if response.tp == aiohttp.MsgType.closed or response.tp == aiohttp.MsgType.error:
@ -351,7 +358,7 @@ class Compute:
else: else:
data = json.dumps(data) data = json.dumps(data)
response = yield from self._session.request(method, url, headers=headers, data=data, auth=self._auth, chunked=chunked) response = yield from self._session().request(method, url, headers=headers, data=data, auth=self._auth, chunked=chunked)
body = yield from response.read() body = yield from response.read()
if body: if body:
body = body.decode() body = body.decode()

View File

@ -185,8 +185,8 @@ def test_connectNotification(compute, async_run):
return response return response
compute._controller._notification = MagicMock() compute._controller._notification = MagicMock()
compute._session = AsyncioMagicMock(return_value=ws_mock) compute._http_session = AsyncioMagicMock(return_value=ws_mock)
compute._session.ws_connect = AsyncioMagicMock(return_value=ws_mock) compute._http_session.ws_connect = AsyncioMagicMock(return_value=ws_mock)
ws_mock.receive = receive ws_mock.receive = receive
async_run(compute._connect_notification()) async_run(compute._connect_notification())
@ -218,8 +218,8 @@ def test_connectNotificationPing(compute, async_run):
return response return response
compute._controller._notification = MagicMock() compute._controller._notification = MagicMock()
compute._session = AsyncioMagicMock(return_value=ws_mock) compute._http_session = AsyncioMagicMock(return_value=ws_mock)
compute._session.ws_connect = AsyncioMagicMock(return_value=ws_mock) compute._http_session.ws_connect = AsyncioMagicMock(return_value=ws_mock)
ws_mock.receive = receive ws_mock.receive = receive
async_run(compute._connect_notification()) async_run(compute._connect_notification())