diff --git a/zun/api/controllers/v1/containers.py b/zun/api/controllers/v1/containers.py index 5eca510f6..c6a32b65e 100644 --- a/zun/api/controllers/v1/containers.py +++ b/zun/api/controllers/v1/containers.py @@ -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, diff --git a/zun/tests/unit/api/controllers/v1/test_containers.py b/zun/tests/unit/api/controllers/v1/test_containers.py index 523d4bc43..2eddb4202 100644 --- a/zun/tests/unit/api/controllers/v1/test_containers.py +++ b/zun/tests/unit/api/controllers/v1/test_containers.py @@ -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()