Fix Can't connect to compute local on some computers

Chicken and egg problem we try to connect to compute
before http was available. I rewrote the code to prevent
erase of settings and rollback the beta4 code for init.

Fix #946
This commit is contained in:
Julien Duponchelle 2017-03-21 18:06:45 +01:00
parent 1566d7f12a
commit 8712866489
No known key found for this signature in database
GPG Key ID: CE8B29639E07F5E8
3 changed files with 20 additions and 3 deletions

View File

@ -248,7 +248,6 @@ class Controller:
"""
Store settings shared by the different GUI will be replace by dedicated API later. Dictionnary
"""
assert self._settings is not None
return self._settings
@settings.setter

View File

@ -103,7 +103,15 @@ class ServerHandler:
description="Retrieve gui settings from the server. Temporary will we removed in later release")
def read_settings(request, response):
response.json(Controller.instance().settings)
settings = None
while True:
# The init of the server could take some times
# we ensure settings are loaded before returning them
settings = Controller.instance().settings
if settings is not None:
break
yield from asyncio.sleep(0.5)
response.json(settings)
@Route.post(
r"/settings",
@ -113,6 +121,8 @@ class ServerHandler:
})
def write_settings(request, response):
controller = Controller.instance()
if controller.settings is None: # Server is not loaded ignore settings update to prevent buggy client sync issue
return
controller.settings = request.json
try:
controller.save()

View File

@ -186,6 +186,13 @@ class WebServer:
atexit.register(close_asyncio_loop)
@asyncio.coroutine
def _on_startup(self, *args):
"""
Called when the HTTP server start
"""
yield from Controller.instance().start()
def run(self):
"""
Starts the server.
@ -225,8 +232,9 @@ class WebServer:
for key, val in os.environ.items():
log.debug("ENV %s=%s", key, val)
self._loop.run_until_complete(Controller.instance().start())
self._app = aiohttp.web.Application()
# Background task started with the server
self._app.on_startup.append(self._on_startup)
# Allow CORS for this domains
cors = aiohttp_cors.setup(self._app, defaults={