consolidate progress url

and include it in server models
This commit is contained in:
Min RK
2018-04-05 11:20:16 +02:00
parent ee1a86d192
commit 6f8a34127b
4 changed files with 37 additions and 25 deletions

View File

@@ -97,6 +97,22 @@ class APIHandler(BaseHandler):
'message': message or status_message,
}))
def server_model(self, spawner):
"""Get the JSON model for a Spawner"""
last_activity = spawner.orm_spawner.last_activity
# don't call isoformat if last_activity is None
if last_activity:
last_activity = isoformat(last_activity)
return {
'name': spawner.name,
'last_activity': last_activity,
'started': isoformat(spawner.orm_spawner.started),
'pending': spawner.pending,
'url': url_path_join(spawner.user.url, spawner.name, '/'),
'progress_url': spawner._progress_url,
}
def user_model(self, user):
"""Get the JSON model for a User object"""
if isinstance(user, orm.User):
@@ -114,33 +130,23 @@ class APIHandler(BaseHandler):
'admin': user.admin,
'groups': [ g.name for g in user.groups ],
'server': user.url if user.running else None,
'progress_url': user.spawner._progress_url if user.active else None,
'pending': None,
'created': isoformat(user.created),
'last_activity': last_activity,
'started': None,
}
if '' in user.spawners:
spawner = user.spawners['']
model['pending'] = spawner.pending or None
if spawner.active and spawner.orm_spawner.started:
model['started'] = isoformat(spawner.orm_spawner.started)
server_model = self.server_model(user.spawners[''])
# copy some values from the default server to the user model
for key in ('started', 'pending', 'progress_url'):
model[key] = server_model[key]
if self.allow_named_servers:
servers = model['servers'] = {}
for name, spawner in user.spawners.items():
if spawner.ready:
last_activity = spawner.orm_spawner.last_activity
if last_activity:
last_activity = isoformat(last_activity)
servers[name] = s = {
'name': name,
'last_activity': last_activity,
'started': isoformat(spawner.orm_spawner.started),
}
if spawner.pending:
s['pending'] = spawner.pending
if spawner.server:
s['url'] = url_path_join(user.url, name, '/')
servers[name] = self.server_model(spawner)
return model
def group_model(self, group):

View File

@@ -887,13 +887,6 @@ class UserSpawnHandler(BaseHandler):
pass
# we may have waited above, check pending again:
url_parts = [self.hub.base_url, 'api/users', user.escaped_name]
if spawner.name:
url_parts.extend(['servers', spawner.name, 'progress'])
else:
url_parts.extend(['server/progress'])
progress_url = url_path_join(*url_parts)
if spawner.pending:
self.log.info("%s is pending %s", spawner._log_name, spawner.pending)
# spawn has started, but not finished
@@ -902,7 +895,7 @@ class UserSpawnHandler(BaseHandler):
html = self.render_template(
"spawn_pending.html",
user=user,
progress_url=progress_url,
progress_url=spawner._progress_url,
)
self.finish(html)
return
@@ -934,7 +927,7 @@ class UserSpawnHandler(BaseHandler):
html = self.render_template(
"spawn_pending.html",
user=user,
progress_url=progress_url,
progress_url=spawner._progress_url,
)
self.finish(html)
return

View File

@@ -692,6 +692,10 @@ class Spawner(LoggingConfigurable):
if self.pre_spawn_hook:
return self.pre_spawn_hook(self)
@property
def _progress_url(self):
return self.user.progress_url(self.name)
@async_generator
async def _generate_progress(self):
"""Private wrapper of progress generator

View File

@@ -320,6 +320,15 @@ class User:
else:
return self.base_url
def progress_url(self, server_name=''):
"""API URL for progress endpoint for a server with a given name"""
url_parts = [self.settings['hub'].base_url, 'api/users', self.escaped_name]
if server_name:
url_parts.extend(['servers', server_name, 'progress'])
else:
url_parts.extend(['server/progress'])
return url_path_join(*url_parts)
async def spawn(self, server_name='', options=None):
"""Start the user's spawner