From 3fa2acbf3a035ae85d86b53fcdc9279c010124a0 Mon Sep 17 00:00:00 2001 From: Hongbin Lu Date: Fri, 15 Jun 2018 04:19:40 +0000 Subject: [PATCH] Format each container inside capsule In before, we simply return the blob of each container inside capsule. However, some container's attributes (i.e. id, host) are not supposed to be exposed. This patch format each capsule's container before sending the response. Change-Id: I89e005c407e03016c575bb5c6c2cfd4009e7c116 --- zun/api/controllers/v1/capsules.py | 9 ++++++--- zun/api/controllers/v1/containers.py | 13 +++++++------ zun/api/controllers/v1/views/capsules_view.py | 10 +++++++++- zun/api/controllers/v1/views/containers_view.py | 15 ++++++++------- 4 files changed, 30 insertions(+), 17 deletions(-) diff --git a/zun/api/controllers/v1/capsules.py b/zun/api/controllers/v1/capsules.py index 6450364cb..91529ffd8 100644 --- a/zun/api/controllers/v1/capsules.py +++ b/zun/api/controllers/v1/capsules.py @@ -68,9 +68,10 @@ class CapsuleCollection(collection.Collection): @staticmethod def convert_with_links(rpc_capsules, limit, url=None, expand=False, **kwargs): + context = pecan.request.context collection = CapsuleCollection() collection.capsules = \ - [view.format_capsule(url, p) for p in rpc_capsules] + [view.format_capsule(url, p, context) for p in rpc_capsules] collection.next = collection.get_next(limit, url=url, **kwargs) return collection @@ -264,7 +265,8 @@ class CapsuleController(base.Controller): new_capsule.uuid) pecan.response.status = 202 - return view.format_capsule(pecan.request.host_url, new_capsule) + return view.format_capsule(pecan.request.host_url, new_capsule, + context) @pecan.expose('json') @exception.wrap_pecan_controller_exception @@ -273,9 +275,10 @@ class CapsuleController(base.Controller): :param capsule_ident: UUID or name of a capsule. """ + context = pecan.request.context capsule = _get_capsule(capsule_ident) check_policy_on_capsule(capsule.as_dict(), "capsule:get") - return view.format_capsule(pecan.request.host_url, capsule) + return view.format_capsule(pecan.request.host_url, capsule, context) @pecan.expose('json') @exception.wrap_pecan_controller_exception diff --git a/zun/api/controllers/v1/containers.py b/zun/api/controllers/v1/containers.py index e59a66c12..3302f3d2f 100644 --- a/zun/api/controllers/v1/containers.py +++ b/zun/api/controllers/v1/containers.py @@ -73,7 +73,8 @@ class ContainerCollection(collection.Collection): context = pecan.request.context collection = ContainerCollection() collection.containers = \ - [view.format_container(context, url, p) for p in rpc_containers] + [view.format_container(context, url, p.as_dict()) + for p in rpc_containers] collection.next = collection.get_next(limit, url=url, **kwargs) return collection @@ -264,7 +265,7 @@ class ContainersController(base.Controller): raise exception.ServerNotUsable return view.format_container(context, pecan.request.host_url, - container) + container.as_dict()) def _generate_name_for_container(self): """Generate a random name like: zeta-22-container.""" @@ -396,7 +397,7 @@ class ContainersController(base.Controller): new_container.uuid) pecan.response.status = 202 return view.format_container(context, pecan.request.host_url, - new_container) + new_container.as_dict()) def _set_default_resource_limit(self, container_dict): # NOTE(kiennt): Default disk size will be set later. @@ -600,7 +601,7 @@ class ContainersController(base.Controller): compute_api = pecan.request.compute_api container = compute_api.container_update(context, container, patch) return view.format_container(context, pecan.request.host_url, - container) + container.as_dict()) @base.Controller.api_version("1.1", "1.13") @pecan.expose('json') @@ -621,7 +622,7 @@ class ContainersController(base.Controller): context = pecan.request.context container.save(context) return view.format_container(context, pecan.request.host_url, - container) + container.as_dict()) @base.Controller.api_version("1.19") @pecan.expose('json') @@ -646,7 +647,7 @@ class ContainersController(base.Controller): compute_api.resize_container(context, container, kwargs) pecan.response.status = 202 return view.format_container(context, pecan.request.host_url, - container) + container.as_dict()) @pecan.expose('json') @exception.wrap_pecan_controller_exception diff --git a/zun/api/controllers/v1/views/capsules_view.py b/zun/api/controllers/v1/views/capsules_view.py index ccf53f90e..e7f78005e 100644 --- a/zun/api/controllers/v1/views/capsules_view.py +++ b/zun/api/controllers/v1/views/capsules_view.py @@ -15,6 +15,7 @@ import itertools from zun.api.controllers import link +from zun.api.controllers.v1.views import containers_view _basic_keys = ( @@ -39,7 +40,7 @@ _basic_keys = ( ) -def format_capsule(url, capsule): +def format_capsule(url, capsule, context): def transform(key, value): if key not in _basic_keys: return @@ -51,6 +52,13 @@ def format_capsule(url, capsule): 'bookmark', url, 'capsules', value, bookmark=True)]) + elif key == 'containers': + containers = [] + for c in value: + container = containers_view.format_container( + context, None, c) + containers.append(container) + yield ('containers', containers) else: yield (key, value) diff --git a/zun/api/controllers/v1/views/containers_view.py b/zun/api/controllers/v1/views/containers_view.py index 13a253ee9..a80a258ce 100644 --- a/zun/api/controllers/v1/views/containers_view.py +++ b/zun/api/controllers/v1/views/containers_view.py @@ -60,14 +60,15 @@ def format_container(context, url, container): return if key == 'uuid': yield ('uuid', value) - yield ('links', [link.make_link( - 'self', url, 'containers', value), - link.make_link( - 'bookmark', url, - 'containers', value, - bookmark=True)]) + if url: + yield ('links', [link.make_link( + 'self', url, 'containers', value), + link.make_link( + 'bookmark', url, + 'containers', value, + bookmark=True)]) else: yield (key, value) return dict(itertools.chain.from_iterable( - transform(k, v) for k, v in container.as_dict().items())) + transform(k, v) for k, v in container.items()))