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
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

View File

@ -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

View File

@ -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)

View File

@ -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()))