From b14806c6af2e48e876d6b070803aa64ec98f4983 Mon Sep 17 00:00:00 2001 From: Stefano Borini Date: Fri, 5 May 2017 20:25:26 +0100 Subject: [PATCH 1/4] Included extensions to web api for new Vue based admin interface. --- remoteappmanager/webapi/admin/application.py | 13 +++++++++++ remoteappmanager/webapi/admin/container.py | 23 ++++++++++++++++++- .../webapi/admin/tests/test_application.py | 7 ++++++ .../webapi/admin/tests/test_container.py | 6 +++++ .../webapi/admin/tests/test_user.py | 5 ++++ remoteappmanager/webapi/admin/user.py | 9 ++++++++ requirements.txt | 2 +- 7 files changed, 63 insertions(+), 2 deletions(-) diff --git a/remoteappmanager/webapi/admin/application.py b/remoteappmanager/webapi/admin/application.py index 024bdfcc9..8a2417297 100644 --- a/remoteappmanager/webapi/admin/application.py +++ b/remoteappmanager/webapi/admin/application.py @@ -46,3 +46,16 @@ def create(self, resource, **kwargs): raise exceptions.Unable() resource.identifier = str(id) + + @gen.coroutine + @authenticated + def items(self, items_response, **kwargs): + db = self.application.db + apps = db.list_applications() + + items = [] + for app in apps: + item = Application(identifier=str(app.id), image_name=app.image) + items.append(item) + + items_response.set(items) diff --git a/remoteappmanager/webapi/admin/container.py b/remoteappmanager/webapi/admin/container.py index d1045dcf3..67280b442 100644 --- a/remoteappmanager/webapi/admin/container.py +++ b/remoteappmanager/webapi/admin/container.py @@ -3,12 +3,19 @@ from tornadowebapi import exceptions from tornadowebapi.resource import Resource from tornadowebapi.resource_handler import ResourceHandler +from tornadowebapi.traitlets import Unicode from remoteappmanager.webapi.decorators import authenticated class Container(Resource): - pass + docker_id = Unicode() + name = Unicode() + image_name = Unicode() + image_id = Unicode() + mapping_id = Unicode() + user = Unicode() + realm = Unicode() class ContainerHandler(ResourceHandler): @@ -43,3 +50,17 @@ def delete(self, resource, **kwargs): self.log.exception( "Could not stop and remove container for id {}".format( identifier)) + + @gen.coroutine + @authenticated + def items(self, items_response, **kwargs): + manager = self.application.container_manager + containers = (yield manager.find_containers()) + + items = [] + for c in containers: + item = Container(identifier=c.url_id) + item.fill(c) + items.append(item) + + items_response.set(items) diff --git a/remoteappmanager/webapi/admin/tests/test_application.py b/remoteappmanager/webapi/admin/tests/test_application.py index 3704382e4..f4be9b11a 100644 --- a/remoteappmanager/webapi/admin/tests/test_application.py +++ b/remoteappmanager/webapi/admin/tests/test_application.py @@ -68,5 +68,12 @@ def test_delete_failed_auth(self): self.delete("/user/johndoe/api/v1/applications/0/", httpstatus.NOT_FOUND) + def test_items(self): + response, data = self.get("/user/johndoe/api/v1/applications/", + httpstatus.OK) + + self.assertEqual(data["items"]["0"]["image_name"], + "simphonyproject/simphony-mayavi:0.6.0") + def cookie_auth_token(self): return "jupyter-hub-token-johndoe=johndoe" diff --git a/remoteappmanager/webapi/admin/tests/test_container.py b/remoteappmanager/webapi/admin/tests/test_container.py index b79ae1991..eff382be5 100644 --- a/remoteappmanager/webapi/admin/tests/test_container.py +++ b/remoteappmanager/webapi/admin/tests/test_container.py @@ -51,6 +51,12 @@ def test_delete_failure_stop_container(self): self.delete("/user/johndoe/api/v1/containers/found/", httpstatus.NO_CONTENT) + def test_items(self): + response, data = self.get("/user/johndoe/api/v1/containers/", + httpstatus.OK) + + self.assertEqual(len(data["identifiers"]), 1) + def cookie_auth_token(self): return "jupyter-hub-token-johndoe=johndoe" diff --git a/remoteappmanager/webapi/admin/tests/test_user.py b/remoteappmanager/webapi/admin/tests/test_user.py index a29df780f..731b9848e 100644 --- a/remoteappmanager/webapi/admin/tests/test_user.py +++ b/remoteappmanager/webapi/admin/tests/test_user.py @@ -67,5 +67,10 @@ def test_delete_failed_auth(self): self.delete("/user/johndoe/api/v1/users/0/", httpstatus.NOT_FOUND) + def test_items(self): + response, data = self.get("/user/johndoe/api/v1/users/", httpstatus.OK) + + self.assertEqual(data["items"]["0"]["name"], "johndoe") + def cookie_auth_token(self): return "jupyter-hub-token-johndoe=johndoe" diff --git a/remoteappmanager/webapi/admin/user.py b/remoteappmanager/webapi/admin/user.py index 70b35f6e5..2ddc573fb 100644 --- a/remoteappmanager/webapi/admin/user.py +++ b/remoteappmanager/webapi/admin/user.py @@ -45,3 +45,12 @@ def create(self, resource, **kwargs): raise exceptions.Exists() except db_exceptions.UnsupportedOperation: raise exceptions.Unable() + + @gen.coroutine + @authenticated + def items(self, items_response, **kwargs): + users = self.application.db.list_users() + + items_response.set([ + User(identifier=str(u.id), name=u.name) + for u in users]) diff --git a/requirements.txt b/requirements.txt index 98e630513..db94425f3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -11,5 +11,5 @@ git+git://github.com/jupyterhub/jupyterhub.git@2d1a45f0190059ef436c2f97dc8d6e391 jupyter_client==4.3.0 click==6.6 tabulate==0.7.5 -git+git://github.com/simphony/tornado-webapi.git@master#egg=tornadowebapi +git+git://github.com/simphony/tornado-webapi.git@13d044331a1e86a03b18f6c1424cc9adf424ddac#egg=tornadowebapi oauthenticator==0.5.1 From c62abb0e37a2654e9bdd3ba56edac0ba67c1059b Mon Sep 17 00:00:00 2001 From: Stefano Borini Date: Fri, 5 May 2017 20:43:24 +0100 Subject: [PATCH 2/4] Added qualifiers to Container traitlets --- remoteappmanager/webapi/admin/container.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/remoteappmanager/webapi/admin/container.py b/remoteappmanager/webapi/admin/container.py index 67280b442..960aaf296 100644 --- a/remoteappmanager/webapi/admin/container.py +++ b/remoteappmanager/webapi/admin/container.py @@ -9,13 +9,13 @@ class Container(Resource): - docker_id = Unicode() - name = Unicode() - image_name = Unicode() - image_id = Unicode() - mapping_id = Unicode() - user = Unicode() - realm = Unicode() + docker_id = Unicode(allow_empty=False, strip=True, scope="output") + name = Unicode(allow_empty=False, strip=True, scope="output") + image_name = Unicode(allow_empty=False, strip=True, scope="output") + image_id = Unicode(allow_empty=False, strip=True, scope="output") + mapping_id = Unicode(allow_empty=False, strip=True, scope="output") + user = Unicode(allow_empty=False, strip=True, scope="output") + realm = Unicode(allow_empty=False, strip=True, scope="output") class ContainerHandler(ResourceHandler): From 535108f3f323866c31f8f7a657ebad3967d27620 Mon Sep 17 00:00:00 2001 From: Stefano Borini Date: Fri, 5 May 2017 21:20:22 +0100 Subject: [PATCH 3/4] Added some comments to restart build --- remoteappmanager/webapi/admin/container.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/remoteappmanager/webapi/admin/container.py b/remoteappmanager/webapi/admin/container.py index 960aaf296..d9575d5ae 100644 --- a/remoteappmanager/webapi/admin/container.py +++ b/remoteappmanager/webapi/admin/container.py @@ -9,6 +9,9 @@ class Container(Resource): + """Represents a container as seen from the administrator. + It can only be stopped. + """ docker_id = Unicode(allow_empty=False, strip=True, scope="output") name = Unicode(allow_empty=False, strip=True, scope="output") image_name = Unicode(allow_empty=False, strip=True, scope="output") @@ -54,6 +57,7 @@ def delete(self, resource, **kwargs): @gen.coroutine @authenticated def items(self, items_response, **kwargs): + """Get all the currently running containers.""" manager = self.application.container_manager containers = (yield manager.find_containers()) From a64240fd2fd087fe125e26402490985bd06bc9bd Mon Sep 17 00:00:00 2001 From: Stefano Borini Date: Mon, 8 May 2017 13:22:36 +0100 Subject: [PATCH 4/4] docstrings --- remoteappmanager/webapi/admin/application.py | 7 +++++++ remoteappmanager/webapi/admin/user.py | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/remoteappmanager/webapi/admin/application.py b/remoteappmanager/webapi/admin/application.py index 8a2417297..c1ffe8fd9 100644 --- a/remoteappmanager/webapi/admin/application.py +++ b/remoteappmanager/webapi/admin/application.py @@ -50,6 +50,13 @@ def create(self, resource, **kwargs): @gen.coroutine @authenticated def items(self, items_response, **kwargs): + """Produces a list of Application items in the items_response object. + + Parameters + ---------- + items_response: ItemsResponse + an object to be filled with the appropriate information + """ db = self.application.db apps = db.list_applications() diff --git a/remoteappmanager/webapi/admin/user.py b/remoteappmanager/webapi/admin/user.py index 2ddc573fb..8445952d8 100644 --- a/remoteappmanager/webapi/admin/user.py +++ b/remoteappmanager/webapi/admin/user.py @@ -49,6 +49,13 @@ def create(self, resource, **kwargs): @gen.coroutine @authenticated def items(self, items_response, **kwargs): + """Produces a list of User items in the items_response object. + + Parameters + ---------- + items_response: ItemsResponse + an object to be filled with the appropriate information + """ users = self.application.db.list_users() items_response.set([