Merge pull request #776 from minrk/cleanup-on-start

remove stopped users from proxy on startup
This commit is contained in:
Carol Willing
2016-09-27 09:51:01 -07:00
committed by GitHub
3 changed files with 14 additions and 15 deletions

View File

@@ -1112,7 +1112,7 @@ class JupyterHub(Application):
if self.proxy.public_server.is_up() or self.proxy.api_server.is_up(): 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) # check for *authenticated* access to the proxy (auth token can change)
try: try:
yield self.proxy.get_routes() routes = yield self.proxy.get_routes()
except (HTTPError, OSError, socket.error) as e: except (HTTPError, OSError, socket.error) as e:
if isinstance(e, HTTPError) and e.code == 403: if isinstance(e, HTTPError) and e.code == 403:
msg = "Did CONFIGPROXY_AUTH_TOKEN change?" msg = "Did CONFIGPROXY_AUTH_TOKEN change?"
@@ -1124,6 +1124,7 @@ class JupyterHub(Application):
return return
else: else:
self.log.info("Proxy already running at: %s", self.proxy.public_server.bind_url) 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 self.proxy_process = None
return return

View File

@@ -257,19 +257,17 @@ class Proxy(Base):
user_routes = { r['user'] for r in routes.values() if 'user' in r } user_routes = { r['user'] for r in routes.values() if 'user' in r }
futures = [] futures = []
db = inspect(self).session 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] user = user_dict[orm_user]
if not user.running: if user.running:
# Don't add users to the proxy that haven't finished starting if user.name not in user_routes:
continue self.log.warning("Adding missing route for %s (%s)", user.name, user.server)
if user.server is None: futures.append(self.add_user(user))
# This should never be True, but seems to be on rare occasion. else:
# catch filter bug, either in sqlalchemy or my understanding of its behavior # User not running, make sure it's not in the table
self.log.error("User %s has no server, but wasn't filtered out.", user) if user.name in user_routes:
continue self.log.warning("Removing route for not running %s", user.name)
if user.name not in user_routes: futures.append(self.delete_user(user))
self.log.warning("Adding missing route for %s (%s)", user.name, user.server)
futures.append(self.add_user(user))
# check service routes # check service routes
service_routes = { r['service'] for r in routes.values() if 'service' in r } service_routes = { r['service'] for r in routes.values() if 'service' in r }

View File

@@ -161,9 +161,9 @@ class User(HasTraits):
@property @property
def proxy_path(self): def proxy_path(self):
if self.settings.get('subdomain_host'): 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: else:
return self.server.base_url return self.base_url
@property @property
def domain(self): def domain(self):