From 571a428375704ed92024e3cbf09e9127c1062f72 Mon Sep 17 00:00:00 2001 From: Katherine Xiao Date: Mon, 6 Jul 2020 12:48:41 -0700 Subject: [PATCH 1/4] fix deletion of default server when stopping named server and added corresponding test --- jupyterhub/tests/test_named_servers.py | 36 ++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/jupyterhub/tests/test_named_servers.py b/jupyterhub/tests/test_named_servers.py index d4593083..b20d53cf 100644 --- a/jupyterhub/tests/test_named_servers.py +++ b/jupyterhub/tests/test_named_servers.py @@ -368,3 +368,39 @@ async def test_user_redirect_hook_default_server_name( assert redirected_url.path == url_path_join( app.base_url, 'user', username, 'terminals/1' ) + + +async def test_named_server_stop_server(app, username, named_servers): + server_name = "myserver" + base_url = public_url(app) + cookies = await app.login_user(username) + user = app.users[username] + with mock.patch.dict(app.users.settings, {'spawner_class': FormSpawner}): + with mock.patch.object( + app.proxy, 'add_user', side_effect=Exception('mock exception') + ): + await user.spawn() # spawn default server + + r = await get_page( + 'spawn/%s/%s' % (username, server_name), app, cookies=cookies + ) + r.raise_for_status() + assert r.url.endswith('/spawn/%s/%s' % (username, server_name)) + assert FormSpawner.options_form in r.text + + # submit the form, should throw Exceotion when add_user is called + next_url = url_path_join( + app.base_url, 'hub/spawn-pending', username, server_name + ) + r = await async_requests.post( + url_concat( + url_path_join(base_url, 'hub/spawn', username, server_name), + {'next': next_url}, + ), + cookies=cookies, + data={'bounds': ['-10', '10'], 'energy': '938MeV'}, + ) + r.raise_for_status() + assert user.spawners[server_name].server is None + assert user.running + assert user.spawners[''].server From 608cad6404fa10cf63ed1d3d7dff853381db1a52 Mon Sep 17 00:00:00 2001 From: Katherine Xiao Date: Mon, 6 Jul 2020 12:53:50 -0700 Subject: [PATCH 2/4] fix in base.py --- jupyterhub/handlers/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jupyterhub/handlers/base.py b/jupyterhub/handlers/base.py index 91bf4a4e..12c48be2 100644 --- a/jupyterhub/handlers/base.py +++ b/jupyterhub/handlers/base.py @@ -912,7 +912,7 @@ class BaseHandler(RequestHandler): self.log.error( "Stopping %s to avoid inconsistent state", user_server_name ) - await user.stop() + await user.stop(server_name) PROXY_ADD_DURATION_SECONDS.labels(status='failure').observe( time.perf_counter() - proxy_add_start_time ) From acc8d15fec5f68ab829d1bfcbca7a71721f761fc Mon Sep 17 00:00:00 2001 From: Katherine Xiao Date: Mon, 6 Jul 2020 17:23:42 -0700 Subject: [PATCH 3/4] fixed test --- jupyterhub/tests/test_named_servers.py | 46 ++++++++++---------------- 1 file changed, 17 insertions(+), 29 deletions(-) diff --git a/jupyterhub/tests/test_named_servers.py b/jupyterhub/tests/test_named_servers.py index b20d53cf..c85e86d1 100644 --- a/jupyterhub/tests/test_named_servers.py +++ b/jupyterhub/tests/test_named_servers.py @@ -372,35 +372,23 @@ async def test_user_redirect_hook_default_server_name( async def test_named_server_stop_server(app, username, named_servers): server_name = "myserver" - base_url = public_url(app) - cookies = await app.login_user(username) + await app.login_user(username) user = app.users[username] - with mock.patch.dict(app.users.settings, {'spawner_class': FormSpawner}): - with mock.patch.object( - app.proxy, 'add_user', side_effect=Exception('mock exception') - ): - await user.spawn() # spawn default server - r = await get_page( - 'spawn/%s/%s' % (username, server_name), app, cookies=cookies - ) - r.raise_for_status() - assert r.url.endswith('/spawn/%s/%s' % (username, server_name)) - assert FormSpawner.options_form in r.text + r = await api_request(app, 'users', username, 'server', method='post') + assert r.status_code == 201 + assert r.text == '' + assert user.spawners[''].server - # submit the form, should throw Exceotion when add_user is called - next_url = url_path_join( - app.base_url, 'hub/spawn-pending', username, server_name - ) - r = await async_requests.post( - url_concat( - url_path_join(base_url, 'hub/spawn', username, server_name), - {'next': next_url}, - ), - cookies=cookies, - data={'bounds': ['-10', '10'], 'energy': '938MeV'}, - ) - r.raise_for_status() - assert user.spawners[server_name].server is None - assert user.running - assert user.spawners[''].server + with mock.patch.object( + app.proxy, 'add_user', side_effect=Exception('mock exception') + ): + r = await api_request( + app, 'users', username, 'servers', server_name, method='post' + ) + r.raise_for_status() + assert r.status_code == 201 + assert r.text == '' + assert user.spawners[server_name].server is None + assert user.spawners[''].server + assert user.running From 409835303e088e30de9395a5f81c5f9d5b62393a Mon Sep 17 00:00:00 2001 From: Katherine Xiao Date: Mon, 6 Jul 2020 17:45:08 -0700 Subject: [PATCH 4/4] formatting --- jupyterhub/tests/test_named_servers.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/jupyterhub/tests/test_named_servers.py b/jupyterhub/tests/test_named_servers.py index c85e86d1..20e515a2 100644 --- a/jupyterhub/tests/test_named_servers.py +++ b/jupyterhub/tests/test_named_servers.py @@ -389,6 +389,7 @@ async def test_named_server_stop_server(app, username, named_servers): r.raise_for_status() assert r.status_code == 201 assert r.text == '' - assert user.spawners[server_name].server is None - assert user.spawners[''].server - assert user.running + + assert user.spawners[server_name].server is None + assert user.spawners[''].server + assert user.running