mirror of
https://github.com/jupyterhub/jupyterhub.git
synced 2025-10-16 14:33:00 +00:00
support named servers in proxy
This commit is contained in:
@@ -18,12 +18,10 @@ Route Specification:
|
|||||||
# Copyright (c) IPython Development Team.
|
# Copyright (c) IPython Development Team.
|
||||||
# Distributed under the terms of the Modified BSD License.
|
# Distributed under the terms of the Modified BSD License.
|
||||||
|
|
||||||
from collections import namedtuple
|
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
from subprocess import Popen
|
from subprocess import Popen
|
||||||
import time
|
from urllib.parse import quote
|
||||||
from urllib.parse import quote, urlparse
|
|
||||||
|
|
||||||
from tornado import gen
|
from tornado import gen
|
||||||
from tornado.httpclient import AsyncHTTPClient, HTTPRequest
|
from tornado.httpclient import AsyncHTTPClient, HTTPRequest
|
||||||
@@ -226,27 +224,31 @@ class Proxy(LoggingConfigurable):
|
|||||||
yield self.delete_route(service.proxy_spec)
|
yield self.delete_route(service.proxy_spec)
|
||||||
|
|
||||||
@gen.coroutine
|
@gen.coroutine
|
||||||
def add_user(self, user, client=None):
|
def add_user(self, user, server_name='', client=None):
|
||||||
"""Add a user's server to the proxy table."""
|
"""Add a user's server to the proxy table."""
|
||||||
|
spawner = user.spawners[server_name]
|
||||||
self.log.info("Adding user %s to proxy %s => %s",
|
self.log.info("Adding user %s to proxy %s => %s",
|
||||||
user.name, user.proxy_spec, user.server.host,
|
user.name, user.proxy_spec(server_name), spawner.server.host,
|
||||||
)
|
)
|
||||||
|
|
||||||
if user.spawner._spawn_pending:
|
if spawner._spawn_pending:
|
||||||
raise RuntimeError(
|
raise RuntimeError(
|
||||||
"User %s's spawn is pending, shouldn't be added to the proxy yet!", user.name)
|
"User %s's spawn is pending, shouldn't be added to the proxy yet!", user.name)
|
||||||
|
|
||||||
yield self.add_route(
|
yield self.add_route(
|
||||||
user.proxy_spec,
|
user.proxy_spec(server_name),
|
||||||
user.server.host,
|
spawner.server.host,
|
||||||
{'user': user.name}
|
{
|
||||||
|
'user': user.name,
|
||||||
|
'server_name': server_name,
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
@gen.coroutine
|
@gen.coroutine
|
||||||
def delete_user(self, user):
|
def delete_user(self, user, server_name=''):
|
||||||
"""Remove a user's server from the proxy table."""
|
"""Remove a user's server from the proxy table."""
|
||||||
self.log.info("Removing user %s from proxy", user.name)
|
self.log.info("Removing user %s from proxy", user.name)
|
||||||
yield self.delete_route(user.proxy_spec)
|
yield self.delete_route(user.proxy_spec(server_name))
|
||||||
|
|
||||||
@gen.coroutine
|
@gen.coroutine
|
||||||
def add_all_services(self, service_dict):
|
def add_all_services(self, service_dict):
|
||||||
@@ -274,8 +276,9 @@ class Proxy(LoggingConfigurable):
|
|||||||
futures = []
|
futures = []
|
||||||
for orm_user in db.query(User):
|
for orm_user in db.query(User):
|
||||||
user = user_dict[orm_user]
|
user = user_dict[orm_user]
|
||||||
if user.running:
|
for name, spawner in user.spawners:
|
||||||
futures.append(self.add_user(user))
|
if user.running(name):
|
||||||
|
futures.append(self.add_user(user, name))
|
||||||
# wait after submitting them all
|
# wait after submitting them all
|
||||||
for f in futures:
|
for f in futures:
|
||||||
yield f
|
yield f
|
||||||
@@ -286,7 +289,7 @@ class Proxy(LoggingConfigurable):
|
|||||||
if not routes:
|
if not routes:
|
||||||
routes = yield self.get_all_routes()
|
routes = yield self.get_all_routes()
|
||||||
|
|
||||||
user_routes = {r['data']['user'] for r in routes.values() if 'user' in r['data']}
|
user_routes = {path for path, r in routes.items() if 'user' in r['data']}
|
||||||
futures = []
|
futures = []
|
||||||
db = self.db
|
db = self.db
|
||||||
|
|
||||||
@@ -298,12 +301,14 @@ class Proxy(LoggingConfigurable):
|
|||||||
|
|
||||||
for orm_user in db.query(User):
|
for orm_user in db.query(User):
|
||||||
user = user_dict[orm_user]
|
user = user_dict[orm_user]
|
||||||
if user.running:
|
for name, spawner in user.spawners.items():
|
||||||
good_routes.add(user.proxy_spec)
|
if user.running(name):
|
||||||
if user.name not in user_routes:
|
spec = user.proxy_spec(name)
|
||||||
self.log.warning(
|
good_routes.add(spec)
|
||||||
"Adding missing route for %s (%s)", user.name, user.server)
|
if spec not in user_routes:
|
||||||
futures.append(self.add_user(user))
|
self.log.warning(
|
||||||
|
"Adding missing route for %s (%s)", spec, spawner.server)
|
||||||
|
futures.append(self.add_user(user, name))
|
||||||
|
|
||||||
# check service routes
|
# check service routes
|
||||||
service_routes = {r['data']['service']
|
service_routes = {r['data']['service']
|
||||||
|
Reference in New Issue
Block a user