mirror of
https://github.com/jupyterhub/jupyterhub.git
synced 2025-10-13 04:53:01 +00:00
get the tests running
This commit is contained in:
@@ -111,9 +111,10 @@ class APIHandler(BaseHandler):
|
|||||||
for name, spawner in user.spawners.items():
|
for name, spawner in user.spawners.items():
|
||||||
if spawner.ready:
|
if spawner.ready:
|
||||||
servers[name] = s = {'name': name}
|
servers[name] = s = {'name': name}
|
||||||
s['pending'] = spawner.pending or None
|
if spawner.pending:
|
||||||
|
s['pending'] = spawner.pending
|
||||||
if spawner.server:
|
if spawner.server:
|
||||||
s['url'] = user.url + name
|
s['url'] = user.url + name + '/'
|
||||||
return model
|
return model
|
||||||
|
|
||||||
def group_model(self, group):
|
def group_model(self, group):
|
||||||
|
@@ -185,6 +185,8 @@ class UserServerAPIHandler(APIHandler):
|
|||||||
user = self.find_user(name)
|
user = self.find_user(name)
|
||||||
if server_name and not self.allow_named_servers:
|
if server_name and not self.allow_named_servers:
|
||||||
raise web.HTTPError(400, "Named servers are not enabled.")
|
raise web.HTTPError(400, "Named servers are not enabled.")
|
||||||
|
if self.allow_named_servers and not server_name:
|
||||||
|
server_name = user.default_server_name()
|
||||||
spawner = user.spawners[server_name]
|
spawner = user.spawners[server_name]
|
||||||
pending = spawner.pending
|
pending = spawner.pending
|
||||||
if pending == 'spawn':
|
if pending == 'spawn':
|
||||||
@@ -194,8 +196,6 @@ class UserServerAPIHandler(APIHandler):
|
|||||||
elif pending:
|
elif pending:
|
||||||
raise web.HTTPError(400, "%s is pending %s" % (spawner._log_name, pending))
|
raise web.HTTPError(400, "%s is pending %s" % (spawner._log_name, pending))
|
||||||
|
|
||||||
self._check_pending(spawner, accepted='spawn')
|
|
||||||
|
|
||||||
if spawner.ready:
|
if spawner.ready:
|
||||||
# include notify, so that a server that died is noticed immediately
|
# include notify, so that a server that died is noticed immediately
|
||||||
# set _spawn_pending flag to prevent races while we wait
|
# set _spawn_pending flag to prevent races while we wait
|
||||||
|
@@ -20,7 +20,7 @@ from .. import __version__
|
|||||||
from .. import orm
|
from .. import orm
|
||||||
from ..objects import Server
|
from ..objects import Server
|
||||||
from ..spawner import LocalProcessSpawner
|
from ..spawner import LocalProcessSpawner
|
||||||
from ..utils import url_path_join, exponential_backoff
|
from ..utils import default_server_name, url_path_join, exponential_backoff
|
||||||
|
|
||||||
# pattern for the authentication token header
|
# pattern for the authentication token header
|
||||||
auth_header_pat = re.compile(r'^(?:token|bearer)\s+([^\s]+)$', flags=re.IGNORECASE)
|
auth_header_pat = re.compile(r'^(?:token|bearer)\s+([^\s]+)$', flags=re.IGNORECASE)
|
||||||
@@ -377,6 +377,9 @@ class BaseHandler(RequestHandler):
|
|||||||
@gen.coroutine
|
@gen.coroutine
|
||||||
def spawn_single_user(self, user, server_name='', options=None):
|
def spawn_single_user(self, user, server_name='', options=None):
|
||||||
user_server_name = user.name
|
user_server_name = user.name
|
||||||
|
if self.allow_named_servers and not server_name:
|
||||||
|
server_name = default_server_name(user)
|
||||||
|
|
||||||
if server_name:
|
if server_name:
|
||||||
user_server_name = '%s:%s' % (user.name, server_name)
|
user_server_name = '%s:%s' % (user.name, server_name)
|
||||||
|
|
||||||
@@ -517,20 +520,24 @@ class BaseHandler(RequestHandler):
|
|||||||
spawner._stop_pending = True
|
spawner._stop_pending = True
|
||||||
|
|
||||||
@gen.coroutine
|
@gen.coroutine
|
||||||
def stop(f=None):
|
def stop():
|
||||||
"""Stop the server
|
"""Stop the server
|
||||||
|
|
||||||
1. remove it from the proxy
|
1. remove it from the proxy
|
||||||
2. stop the server
|
2. stop the server
|
||||||
3. notice that it stopped
|
3. notice that it stopped
|
||||||
"""
|
"""
|
||||||
yield self.proxy.delete_user(user, name)
|
tic = IOLoop.current().time()
|
||||||
yield user.stop(name)
|
try:
|
||||||
|
yield self.proxy.delete_user(user, name)
|
||||||
|
yield user.stop(name)
|
||||||
|
finally:
|
||||||
|
spawner._stop_pending = False
|
||||||
toc = IOLoop.current().time()
|
toc = IOLoop.current().time()
|
||||||
self.log.info("User %s server took %.3f seconds to stop", user.name, toc - tic)
|
self.log.info("User %s server took %.3f seconds to stop", user.name, toc - tic)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
yield gen.with_timeout(timedelta(seconds=self.slow_stop_timeout), stop)
|
yield gen.with_timeout(timedelta(seconds=self.slow_stop_timeout), stop())
|
||||||
except gen.TimeoutError:
|
except gen.TimeoutError:
|
||||||
if spawner._stop_pending:
|
if spawner._stop_pending:
|
||||||
# hit timeout, but stop is still pending
|
# hit timeout, but stop is still pending
|
||||||
|
@@ -231,9 +231,9 @@ class Proxy(LoggingConfigurable):
|
|||||||
user.name, spawner.proxy_spec, spawner.server.host,
|
user.name, spawner.proxy_spec, spawner.server.host,
|
||||||
)
|
)
|
||||||
|
|
||||||
if spawner.pending:
|
if spawner.pending and spawner.pending != 'spawn':
|
||||||
raise RuntimeError(
|
raise RuntimeError(
|
||||||
"%s is pending %s, shouldn't be added to the proxy yet!" % (spawner._log_name)
|
"%s is pending %s, shouldn't be added to the proxy yet!" % (spawner._log_name, spawner.pending)
|
||||||
)
|
)
|
||||||
|
|
||||||
yield self.add_route(
|
yield self.add_route(
|
||||||
|
@@ -38,6 +38,27 @@ def test_create_named_server(app, named_servers):
|
|||||||
assert prefix == user.spawners[servername].server.base_url
|
assert prefix == user.spawners[servername].server.base_url
|
||||||
assert prefix.endswith('/user/%s/%s/' % (username, servername))
|
assert prefix.endswith('/user/%s/%s/' % (username, servername))
|
||||||
|
|
||||||
|
r = yield api_request(app, 'users', username)
|
||||||
|
r.raise_for_status()
|
||||||
|
|
||||||
|
user_model = r.json()
|
||||||
|
user_model.pop('last_activity')
|
||||||
|
assert user_model == {
|
||||||
|
'name': username,
|
||||||
|
'groups': [],
|
||||||
|
'kind': 'user',
|
||||||
|
'admin': False,
|
||||||
|
'pending': None,
|
||||||
|
'server': None,
|
||||||
|
'servers': {
|
||||||
|
name: {
|
||||||
|
'name': name,
|
||||||
|
'url': url_path_join(user.url, name, '/'),
|
||||||
|
}
|
||||||
|
for name in ['1', servername]
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.gen_test
|
@pytest.mark.gen_test
|
||||||
def test_delete_named_server(app, named_servers):
|
def test_delete_named_server(app, named_servers):
|
||||||
@@ -69,9 +90,9 @@ def test_delete_named_server(app, named_servers):
|
|||||||
'servers': {
|
'servers': {
|
||||||
name: {
|
name: {
|
||||||
'name': name,
|
'name': name,
|
||||||
'url': url_path_join(user.url, name),
|
'url': url_path_join(user.url, name, '/'),
|
||||||
}
|
}
|
||||||
for name in ['1', servername]
|
for name in ['1']
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -317,8 +317,6 @@ class User(HasTraits):
|
|||||||
url of the server will be /user/:name/:server_name
|
url of the server will be /user/:name/:server_name
|
||||||
"""
|
"""
|
||||||
db = self.db
|
db = self.db
|
||||||
if self.allow_named_servers and not server_name:
|
|
||||||
server_name = default_server_name(self)
|
|
||||||
|
|
||||||
base_url = url_path_join(self.base_url, server_name) + '/'
|
base_url = url_path_join(self.base_url, server_name) + '/'
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user