JupyterHub’s API¶
JupyterHub has a REST API:
In [1]:
import requests
hub_api = 'http://127.0.0.1:8081/hub/api/'
token = "result of token=$(jupyterhub token yourname)"
In [2]:
import json
from requests import HTTPError
def api_request(path, method='get', data=None):
if data:
data = json.dumps(data)
r = requests.request(method, hub_api + path,
headers={'Authorization': 'token %s' % token},
data=data,
)
try:
r.raise_for_status()
except Exception as e:
try:
info = r.json()
except Exception:
raise e
if 'message' in info:
# raise nice json error if there was one
raise HTTPError("%s: %s" % (r.status_code, info['message'])) from None
else:
# raise original
raise e
if r.text:
return r.json()
else:
return None
We can list users and their status:
In [3]:
api_request('users')
Out[3]:
[{'admin': True,
'last_activity': '2016-05-06T11:53:51.627000',
'name': 'minrk',
'pending': None,
'server': '/user/minrk'},
{'admin': False,
'last_activity': '2016-05-06T11:57:13.329254',
'name': 'takluyver',
'pending': None,
'server': None}]
We can also start user servers:
In [4]:
api_request('users/takluyver/server', method='post')
api_request('users')
Out[4]:
[{'admin': True,
'last_activity': '2016-05-06T11:53:51.627000',
'name': 'minrk',
'pending': None,
'server': '/user/minrk'},
{'admin': False,
'last_activity': '2016-05-06T11:57:29.285044',
'name': 'takluyver',
'pending': None,
'server': '/user/takluyver'}]
And stop them:
In [5]:
api_request('users/takluyver/server', method='delete')
api_request('users')
Out[5]:
[{'admin': True,
'last_activity': '2016-05-06T11:53:51.627000',
'name': 'minrk',
'pending': None,
'server': '/user/minrk'},
{'admin': False,
'last_activity': '2016-05-06T11:57:30.145986',
'name': 'takluyver',
'pending': None,
'server': None}]
We can also see the proxy routing table:
In [6]:
api_request('proxy')
Out[6]:
{'/': {'last_activity': '2016-05-06T11:56:29.543Z',
'target': 'http://127.0.0.1:8081'},
'/user/minrk': {'last_activity': '2016-05-06T11:57:29.159Z',
'target': 'http://127.0.0.1:45683',
'user': 'minrk'}}