diff --git a/jupyterhub/app.py b/jupyterhub/app.py index d3d8347c..ccbd9e1e 100644 --- a/jupyterhub/app.py +++ b/jupyterhub/app.py @@ -1112,7 +1112,7 @@ class JupyterHub(Application): if self.proxy.public_server.is_up() or self.proxy.api_server.is_up(): # check for *authenticated* access to the proxy (auth token can change) try: - yield self.proxy.get_routes() + routes = yield self.proxy.get_routes() except (HTTPError, OSError, socket.error) as e: if isinstance(e, HTTPError) and e.code == 403: msg = "Did CONFIGPROXY_AUTH_TOKEN change?" @@ -1124,6 +1124,7 @@ class JupyterHub(Application): return else: self.log.info("Proxy already running at: %s", self.proxy.public_server.bind_url) + yield self.proxy.check_routes(self.users, self._service_map, routes) self.proxy_process = None return diff --git a/jupyterhub/orm.py b/jupyterhub/orm.py index 5e581e19..f9827aad 100644 --- a/jupyterhub/orm.py +++ b/jupyterhub/orm.py @@ -257,19 +257,17 @@ class Proxy(Base): user_routes = { r['user'] for r in routes.values() if 'user' in r } futures = [] db = inspect(self).session - for orm_user in db.query(User).filter(User.server != None): + for orm_user in db.query(User): user = user_dict[orm_user] - if not user.running: - # Don't add users to the proxy that haven't finished starting - continue - if user.server is None: - # This should never be True, but seems to be on rare occasion. - # catch filter bug, either in sqlalchemy or my understanding of its behavior - self.log.error("User %s has no server, but wasn't filtered out.", user) - continue - if user.name not in user_routes: - self.log.warning("Adding missing route for %s (%s)", user.name, user.server) - futures.append(self.add_user(user)) + if user.running: + if user.name not in user_routes: + self.log.warning("Adding missing route for %s (%s)", user.name, user.server) + futures.append(self.add_user(user)) + else: + # User not running, make sure it's not in the table + if user.name in user_routes: + self.log.warning("Removing route for not running %s", user.name) + futures.append(self.delete_user(user)) # check service routes service_routes = { r['service'] for r in routes.values() if 'service' in r } diff --git a/jupyterhub/user.py b/jupyterhub/user.py index 20f3aa8d..44869745 100644 --- a/jupyterhub/user.py +++ b/jupyterhub/user.py @@ -161,9 +161,9 @@ class User(HasTraits): @property def proxy_path(self): if self.settings.get('subdomain_host'): - return url_path_join('/' + self.domain, self.server.base_url) + return url_path_join('/' + self.domain, self.base_url) else: - return self.server.base_url + return self.base_url @property def domain(self):