Merge "Validate filters when listing containers"

This commit is contained in:
Zuul 2018-04-27 01:54:12 +00:00 committed by Gerrit Code Review
commit 740c929305
2 changed files with 49 additions and 21 deletions

View File

@ -197,11 +197,12 @@ class ContainersController(base.Controller):
policy.enforce(context, "container:get_all_all_projects",
action="container:get_all_all_projects")
context.all_projects = True
limit = api_utils.validate_limit(kwargs.get('limit'))
sort_dir = api_utils.validate_sort_dir(kwargs.get('sort_dir', 'asc'))
sort_key = kwargs.get('sort_key', 'id')
resource_url = kwargs.get('resource_url')
expand = kwargs.get('expand')
kwargs.pop('all_projects', None)
limit = api_utils.validate_limit(kwargs.pop('limit', None))
sort_dir = api_utils.validate_sort_dir(kwargs.pop('sort_dir', 'asc'))
sort_key = kwargs.pop('sort_key', 'id')
resource_url = kwargs.pop('resource_url', None)
expand = kwargs.pop('expand', None)
container_allowed_filters = ['name', 'image', 'project_id', 'user_id',
'memory', 'host', 'task_state', 'status',
@ -209,13 +210,18 @@ class ContainersController(base.Controller):
filters = {}
for filter_key in container_allowed_filters:
if filter_key in kwargs:
filter_value = kwargs[filter_key]
filter_value = kwargs.pop(filter_key)
filters[filter_key] = filter_value
marker_obj = None
marker = kwargs.get('marker')
marker = kwargs.pop('marker', None)
if marker:
marker_obj = objects.Container.get_by_uuid(context,
marker)
if kwargs:
unknown_params = [str(k) for k in kwargs]
msg = _("Unknown parameters: %s") % ", ".join(unknown_params)
raise exception.InvalidValue(msg)
containers = objects.Container.list(context,
limit,
marker_obj,

View File

@ -683,14 +683,11 @@ class TestContainerController(api_base.FunctionalTest):
params=params, content_type='application/json')
self.assertTrue(mock_container_create.not_called)
@patch('zun.compute.api.API.container_show')
@patch('zun.objects.Container.list')
def test_get_all_containers(self, mock_container_list,
mock_container_show):
def test_get_all_containers(self, mock_container_list):
test_container = utils.get_test_container()
containers = [objects.Container(self.context, **test_container)]
mock_container_list.return_value = containers
mock_container_show.return_value = containers[0]
response = self.get('/v1/containers/')
@ -706,15 +703,13 @@ class TestContainerController(api_base.FunctionalTest):
actual_containers[0].get('uuid'))
@patch('zun.common.policy.enforce')
@patch('zun.compute.api.API.container_show')
@patch('zun.objects.Container.list')
def test_get_all_containers_all_projects(self, mock_container_list,
mock_container_show, mock_policy):
mock_policy):
mock_policy.return_value = True
test_container = utils.get_test_container()
containers = [objects.Container(self.context, **test_container)]
mock_container_list.return_value = containers
mock_container_show.return_value = containers[0]
response = self.get('/v1/containers/?all_projects=1')
@ -729,14 +724,12 @@ class TestContainerController(api_base.FunctionalTest):
self.assertEqual(test_container['uuid'],
actual_containers[0].get('uuid'))
@patch('zun.compute.api.API.container_show')
@patch('zun.objects.Container.list')
def test_get_all_has_status_reason_and_image_pull_policy(
self, mock_container_list, mock_container_show):
self, mock_container_list):
test_container = utils.get_test_container()
containers = [objects.Container(self.context, **test_container)]
mock_container_list.return_value = containers
mock_container_show.return_value = containers[0]
response = self.get('/v1/containers/')
self.assertEqual(200, response.status_int)
@ -747,11 +740,9 @@ class TestContainerController(api_base.FunctionalTest):
self.assertIn('status_reason', actual_containers[0].keys())
self.assertIn('image_pull_policy', actual_containers[0].keys())
@patch('zun.compute.api.API.container_show')
@patch('zun.objects.Container.list')
def test_get_all_containers_with_pagination_marker(self,
mock_container_list,
mock_container_show):
mock_container_list):
container_list = []
for id_ in range(4):
test_container = utils.create_test_container(
@ -760,7 +751,6 @@ class TestContainerController(api_base.FunctionalTest):
container_list.append(objects.Container(self.context,
**test_container))
mock_container_list.return_value = container_list[-1:]
mock_container_show.return_value = container_list[-1]
response = self.get('/v1/containers/?limit=3&marker=%s'
% container_list[2].uuid)
@ -770,6 +760,38 @@ class TestContainerController(api_base.FunctionalTest):
self.assertEqual(container_list[-1].uuid,
actual_containers[0].get('uuid'))
@patch('zun.objects.Container.list')
def test_get_all_containers_with_filter(self, mock_container_list):
test_container = utils.get_test_container()
containers = [objects.Container(self.context, **test_container)]
mock_container_list.return_value = containers
response = self.get('/v1/containers/?name=fake-name')
mock_container_list.assert_called_once_with(
mock.ANY, 1000, None, 'id', 'asc', filters={'name': 'fake-name'})
self.assertEqual(200, response.status_int)
actual_containers = response.json['containers']
self.assertEqual(1, len(actual_containers))
self.assertEqual(test_container['uuid'],
actual_containers[0].get('uuid'))
@patch('zun.objects.Container.list')
def test_get_all_containers_with_unknown_parameter(
self, mock_container_list):
test_container = utils.get_test_container()
containers = [objects.Container(self.context, **test_container)]
mock_container_list.return_value = containers
response = self.get('/v1/containers/?unknown=fake-name',
expect_errors=True)
mock_container_list.assert_not_called()
self.assertEqual(400, response.status_int)
self.assertEqual('application/json', response.content_type)
self.assertEqual("Unknown parameters: unknown",
response.json['errors'][0]['detail'])
@patch('zun.objects.Container.list')
def test_get_all_containers_with_exception(self, mock_container_list):
test_container = utils.get_test_container()