mirror of
https://github.com/jupyterhub/jupyterhub.git
synced 2025-10-10 03:23:04 +00:00
Always have .servers
model on users
rather than only when named_servers is enabled. Put new-in-0.9 state there, rather than continuing to add server fields to top-level user model.
This commit is contained in:
@@ -3,7 +3,7 @@ swagger: '2.0'
|
|||||||
info:
|
info:
|
||||||
title: JupyterHub
|
title: JupyterHub
|
||||||
description: The REST API for JupyterHub
|
description: The REST API for JupyterHub
|
||||||
version: 0.8.0dev
|
version: 0.9.0dev
|
||||||
license:
|
license:
|
||||||
name: BSD-3-Clause
|
name: BSD-3-Clause
|
||||||
schemes:
|
schemes:
|
||||||
@@ -606,12 +606,52 @@ definitions:
|
|||||||
description: The user's notebook server's base URL, if running; null if not.
|
description: The user's notebook server's base URL, if running; null if not.
|
||||||
pending:
|
pending:
|
||||||
type: string
|
type: string
|
||||||
enum: ["spawn", "stop"]
|
enum: ["spawn", "stop", null]
|
||||||
description: The currently pending action, if any
|
description: The currently pending action, if any
|
||||||
last_activity:
|
last_activity:
|
||||||
type: string
|
type: string
|
||||||
format: date-time
|
format: date-time
|
||||||
description: Timestamp of last-seen activity from the user
|
description: Timestamp of last-seen activity from the user
|
||||||
|
servers:
|
||||||
|
type: object
|
||||||
|
description: The active servers for this user.
|
||||||
|
items:
|
||||||
|
schema:
|
||||||
|
$ref: '#/definitions/Server'
|
||||||
|
Server:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
name:
|
||||||
|
type: string
|
||||||
|
description: The server's name. The user's default server has an empty name ('')
|
||||||
|
ready:
|
||||||
|
type: boolean
|
||||||
|
description: |
|
||||||
|
Whether the server is ready for traffic.
|
||||||
|
Will always be false when any transition is pending.
|
||||||
|
pending:
|
||||||
|
type: string
|
||||||
|
enum: ["spawn", "stop", null]
|
||||||
|
description: |
|
||||||
|
The currently pending action, if any.
|
||||||
|
A server is not ready if an action is pending.
|
||||||
|
url:
|
||||||
|
type: string
|
||||||
|
description: |
|
||||||
|
The URL where the server can be accessed
|
||||||
|
(typically /user/:name/:server.name/).
|
||||||
|
progress_url:
|
||||||
|
type: string
|
||||||
|
description: |
|
||||||
|
The URL for an event-stream to retrieve events during a spawn.
|
||||||
|
started:
|
||||||
|
type: string
|
||||||
|
format: date-time
|
||||||
|
description: UTC timestamp when the server was last started.
|
||||||
|
last_activity:
|
||||||
|
type: string
|
||||||
|
format: date-time
|
||||||
|
description: UTC timestamp last-seen activity on this server.
|
||||||
Group:
|
Group:
|
||||||
type: object
|
type: object
|
||||||
properties:
|
properties:
|
||||||
|
@@ -97,6 +97,7 @@ class APIHandler(BaseHandler):
|
|||||||
'last_activity': isoformat(spawner.orm_spawner.last_activity),
|
'last_activity': isoformat(spawner.orm_spawner.last_activity),
|
||||||
'started': isoformat(spawner.orm_spawner.started),
|
'started': isoformat(spawner.orm_spawner.started),
|
||||||
'pending': spawner.pending or None,
|
'pending': spawner.pending or None,
|
||||||
|
'ready': spawner.ready,
|
||||||
'url': url_path_join(spawner.user.url, spawner.name, '/'),
|
'url': url_path_join(spawner.user.url, spawner.name, '/'),
|
||||||
'progress_url': spawner._progress_url,
|
'progress_url': spawner._progress_url,
|
||||||
}
|
}
|
||||||
@@ -147,23 +148,19 @@ class APIHandler(BaseHandler):
|
|||||||
'admin': user.admin,
|
'admin': user.admin,
|
||||||
'groups': [ g.name for g in user.groups ],
|
'groups': [ g.name for g in user.groups ],
|
||||||
'server': user.url if user.running else None,
|
'server': user.url if user.running else None,
|
||||||
'progress_url': user.progress_url(''),
|
|
||||||
'pending': None,
|
'pending': None,
|
||||||
'created': isoformat(user.created),
|
'created': isoformat(user.created),
|
||||||
'started': None,
|
|
||||||
'last_activity': isoformat(user.last_activity),
|
'last_activity': isoformat(user.last_activity),
|
||||||
}
|
}
|
||||||
if '' in user.spawners:
|
if '' in user.spawners:
|
||||||
server_model = self.server_model(user.spawners[''])
|
model['pending'] = user.spawners[''].pending
|
||||||
# copy some values from the default server to the user model
|
|
||||||
for key in ('started', 'pending'):
|
|
||||||
model[key] = server_model[key]
|
|
||||||
|
|
||||||
if self.allow_named_servers:
|
servers = model['servers'] = {}
|
||||||
servers = model['servers'] = {}
|
for name, spawner in user.spawners.items():
|
||||||
for name, spawner in user.spawners.items():
|
# include 'active' servers, not just ready
|
||||||
if spawner.ready:
|
# (this includes pending events)
|
||||||
servers[name] = self.server_model(spawner)
|
if spawner.active:
|
||||||
|
servers[name] = self.server_model(spawner)
|
||||||
return model
|
return model
|
||||||
|
|
||||||
def group_model(self, group):
|
def group_model(self, group):
|
||||||
|
@@ -200,14 +200,8 @@ def normalize_user(user):
|
|||||||
smooths out user model with things like timestamps
|
smooths out user model with things like timestamps
|
||||||
for easier comparison
|
for easier comparison
|
||||||
"""
|
"""
|
||||||
for key in ('created', 'last_activity', 'started'):
|
for key in ('created', 'last_activity'):
|
||||||
user[key] = normalize_timestamp(user[key])
|
user[key] = normalize_timestamp(user[key])
|
||||||
if user['progress_url']:
|
|
||||||
user['progress_url'] = re.sub(
|
|
||||||
r'.*/hub/api',
|
|
||||||
'PREFIX/hub/api',
|
|
||||||
user['progress_url'],
|
|
||||||
)
|
|
||||||
if 'servers' in user:
|
if 'servers' in user:
|
||||||
for server in user['servers'].values():
|
for server in user['servers'].values():
|
||||||
for key in ('started', 'last_activity'):
|
for key in ('started', 'last_activity'):
|
||||||
@@ -228,8 +222,7 @@ def fill_user(model):
|
|||||||
model.setdefault('pending', None)
|
model.setdefault('pending', None)
|
||||||
model.setdefault('created', TIMESTAMP)
|
model.setdefault('created', TIMESTAMP)
|
||||||
model.setdefault('last_activity', TIMESTAMP)
|
model.setdefault('last_activity', TIMESTAMP)
|
||||||
model.setdefault('started', None)
|
model.setdefault('servers', {})
|
||||||
model.setdefault('progress_url', 'PREFIX/hub/api/users/{name}/server/progress'.format(**model))
|
|
||||||
return model
|
return model
|
||||||
|
|
||||||
|
|
||||||
|
@@ -34,7 +34,6 @@ def test_default_server(app, named_servers):
|
|||||||
'name': username,
|
'name': username,
|
||||||
'auth_state': None,
|
'auth_state': None,
|
||||||
'server': user.url,
|
'server': user.url,
|
||||||
'started': TIMESTAMP,
|
|
||||||
'servers': {
|
'servers': {
|
||||||
'': {
|
'': {
|
||||||
'name': '',
|
'name': '',
|
||||||
@@ -42,6 +41,7 @@ def test_default_server(app, named_servers):
|
|||||||
'last_activity': TIMESTAMP,
|
'last_activity': TIMESTAMP,
|
||||||
'url': user.url,
|
'url': user.url,
|
||||||
'pending': None,
|
'pending': None,
|
||||||
|
'ready': True,
|
||||||
'progress_url': 'PREFIX/hub/api/users/{}/server/progress'.format(username),
|
'progress_url': 'PREFIX/hub/api/users/{}/server/progress'.format(username),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -99,6 +99,7 @@ def test_create_named_server(app, named_servers):
|
|||||||
'last_activity': TIMESTAMP,
|
'last_activity': TIMESTAMP,
|
||||||
'url': url_path_join(user.url, name, '/'),
|
'url': url_path_join(user.url, name, '/'),
|
||||||
'pending': None,
|
'pending': None,
|
||||||
|
'ready': True,
|
||||||
'progress_url': 'PREFIX/hub/api/users/{}/servers/{}/progress'.format(
|
'progress_url': 'PREFIX/hub/api/users/{}/servers/{}/progress'.format(
|
||||||
username, servername),
|
username, servername),
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user