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
This commit is contained in:
Hongbin Lu
2018-06-15 04:19:40 +00:00
parent 7ea69a50cb
commit 3fa2acbf3a
4 changed files with 30 additions and 17 deletions

View File

@@ -68,9 +68,10 @@ class CapsuleCollection(collection.Collection):
@staticmethod @staticmethod
def convert_with_links(rpc_capsules, limit, url=None, def convert_with_links(rpc_capsules, limit, url=None,
expand=False, **kwargs): expand=False, **kwargs):
context = pecan.request.context
collection = CapsuleCollection() collection = CapsuleCollection()
collection.capsules = \ 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) collection.next = collection.get_next(limit, url=url, **kwargs)
return collection return collection
@@ -264,7 +265,8 @@ class CapsuleController(base.Controller):
new_capsule.uuid) new_capsule.uuid)
pecan.response.status = 202 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') @pecan.expose('json')
@exception.wrap_pecan_controller_exception @exception.wrap_pecan_controller_exception
@@ -273,9 +275,10 @@ class CapsuleController(base.Controller):
:param capsule_ident: UUID or name of a capsule. :param capsule_ident: UUID or name of a capsule.
""" """
context = pecan.request.context
capsule = _get_capsule(capsule_ident) capsule = _get_capsule(capsule_ident)
check_policy_on_capsule(capsule.as_dict(), "capsule:get") 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') @pecan.expose('json')
@exception.wrap_pecan_controller_exception @exception.wrap_pecan_controller_exception

View File

@@ -73,7 +73,8 @@ class ContainerCollection(collection.Collection):
context = pecan.request.context context = pecan.request.context
collection = ContainerCollection() collection = ContainerCollection()
collection.containers = \ 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) collection.next = collection.get_next(limit, url=url, **kwargs)
return collection return collection
@@ -264,7 +265,7 @@ class ContainersController(base.Controller):
raise exception.ServerNotUsable raise exception.ServerNotUsable
return view.format_container(context, pecan.request.host_url, return view.format_container(context, pecan.request.host_url,
container) container.as_dict())
def _generate_name_for_container(self): def _generate_name_for_container(self):
"""Generate a random name like: zeta-22-container.""" """Generate a random name like: zeta-22-container."""
@@ -396,7 +397,7 @@ class ContainersController(base.Controller):
new_container.uuid) new_container.uuid)
pecan.response.status = 202 pecan.response.status = 202
return view.format_container(context, pecan.request.host_url, return view.format_container(context, pecan.request.host_url,
new_container) new_container.as_dict())
def _set_default_resource_limit(self, container_dict): def _set_default_resource_limit(self, container_dict):
# NOTE(kiennt): Default disk size will be set later. # NOTE(kiennt): Default disk size will be set later.
@@ -600,7 +601,7 @@ class ContainersController(base.Controller):
compute_api = pecan.request.compute_api compute_api = pecan.request.compute_api
container = compute_api.container_update(context, container, patch) container = compute_api.container_update(context, container, patch)
return view.format_container(context, pecan.request.host_url, return view.format_container(context, pecan.request.host_url,
container) container.as_dict())
@base.Controller.api_version("1.1", "1.13") @base.Controller.api_version("1.1", "1.13")
@pecan.expose('json') @pecan.expose('json')
@@ -621,7 +622,7 @@ class ContainersController(base.Controller):
context = pecan.request.context context = pecan.request.context
container.save(context) container.save(context)
return view.format_container(context, pecan.request.host_url, return view.format_container(context, pecan.request.host_url,
container) container.as_dict())
@base.Controller.api_version("1.19") @base.Controller.api_version("1.19")
@pecan.expose('json') @pecan.expose('json')
@@ -646,7 +647,7 @@ class ContainersController(base.Controller):
compute_api.resize_container(context, container, kwargs) compute_api.resize_container(context, container, kwargs)
pecan.response.status = 202 pecan.response.status = 202
return view.format_container(context, pecan.request.host_url, return view.format_container(context, pecan.request.host_url,
container) container.as_dict())
@pecan.expose('json') @pecan.expose('json')
@exception.wrap_pecan_controller_exception @exception.wrap_pecan_controller_exception

View File

@@ -15,6 +15,7 @@
import itertools import itertools
from zun.api.controllers import link from zun.api.controllers import link
from zun.api.controllers.v1.views import containers_view
_basic_keys = ( _basic_keys = (
@@ -39,7 +40,7 @@ _basic_keys = (
) )
def format_capsule(url, capsule): def format_capsule(url, capsule, context):
def transform(key, value): def transform(key, value):
if key not in _basic_keys: if key not in _basic_keys:
return return
@@ -51,6 +52,13 @@ def format_capsule(url, capsule):
'bookmark', url, 'bookmark', url,
'capsules', value, 'capsules', value,
bookmark=True)]) 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: else:
yield (key, value) yield (key, value)

View File

@@ -60,14 +60,15 @@ def format_container(context, url, container):
return return
if key == 'uuid': if key == 'uuid':
yield ('uuid', value) yield ('uuid', value)
yield ('links', [link.make_link( if url:
'self', url, 'containers', value), yield ('links', [link.make_link(
link.make_link( 'self', url, 'containers', value),
'bookmark', url, link.make_link(
'containers', value, 'bookmark', url,
bookmark=True)]) 'containers', value,
bookmark=True)])
else: else:
yield (key, value) yield (key, value)
return dict(itertools.chain.from_iterable( 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()))