From 666362220b9078458d29201a50aa51ff09277711 Mon Sep 17 00:00:00 2001 From: Kevin Zhao Date: Fri, 10 Feb 2017 17:16:16 +0800 Subject: [PATCH] Add test cases for attach and resize Partially-Implements: BP support-interactive-mode Change-Id: I24512123d56ad7eb40cec4b702859989638fc960 Signed-off-by: Kevin Zhao --- .../api/controllers/v1/test_containers.py | 116 ++++++++++++++++++ .../unit/compute/test_compute_manager.py | 31 +++++ .../container/docker/test_docker_driver.py | 7 ++ zun/tests/unit/container/fake_driver.py | 8 ++ 4 files changed, 162 insertions(+) diff --git a/zun/tests/unit/api/controllers/v1/test_containers.py b/zun/tests/unit/api/controllers/v1/test_containers.py index 1081c8fe7..55f100a1c 100644 --- a/zun/tests/unit/api/controllers/v1/test_containers.py +++ b/zun/tests/unit/api/controllers/v1/test_containers.py @@ -1154,6 +1154,122 @@ class TestContainerController(api_base.FunctionalTest): self.assertIn('image_driver', response.json.keys()) self.assertEqual('glance', response.json.get('image_driver')) + @patch('zun.compute.api.API.container_attach') + @patch('zun.objects.Container.get_by_name') + def test_attach_container_by_name(self, mock_get_by_name, + mock_container_attach): + mock_container_attach.return_value = "ws://test" + test_container = utils.get_test_container() + test_container_obj = objects.Container(self.context, + **test_container) + mock_get_by_name.return_value = test_container_obj + + container_name = test_container.get('name') + response = self.app.get('/v1/containers/%s/attach/' % container_name) + + self.assertEqual(200, response.status_int) + mock_container_attach.assert_called_once_with( + mock.ANY, test_container_obj) + + @patch('zun.compute.api.API.container_attach') + @patch('zun.objects.Container.get_by_uuid') + def test_attach_container_by_uuid(self, mock_get_by_uuid, + mock_container_attach): + mock_container_attach.return_value = "ws://test" + test_container = utils.get_test_container() + test_container_obj = objects.Container(self.context, + **test_container) + mock_get_by_uuid.return_value = test_container_obj + + container_uuid = test_container.get('uuid') + response = self.app.get('/v1/containers/%s/attach/' % container_uuid) + + self.assertEqual(200, response.status_int) + mock_container_attach.assert_called_once_with( + mock.ANY, test_container_obj) + + @patch('zun.common.utils.validate_container_state') + @patch('zun.compute.api.API.container_attach') + @patch('zun.objects.Container.get_by_uuid') + def test_attach_container_with_exception(self, + mock_get_by_uuid, + mock_container_attach, + mock_validate): + mock_container_attach.return_value = "" + test_container = utils.get_test_container() + test_container_obj = objects.Container(self.context, **test_container) + mock_get_by_uuid.return_value = test_container_obj + mock_container_attach.side_effect = Exception + + container_uuid = test_container.get('uuid') + self.assertRaises(AppError, self.app.get, + '/v1/containers/%s/attach/' % container_uuid) + self.assertTrue(mock_container_attach.called) + + @patch('zun.common.utils.validate_container_state') + @patch('zun.compute.api.API.container_resize') + @patch('zun.objects.Container.get_by_name') + def test_resize_container_by_name(self, + mock_get_by_name, + mock_container_resize, + mock_validate): + test_container_obj = objects.Container(self.context, + **utils.get_test_container()) + mock_container_resize.return_value = test_container_obj + test_container = utils.get_test_container() + test_container_obj = objects.Container(self.context, **test_container) + mock_get_by_name.return_value = test_container_obj + + container_name = test_container.get('name') + url = '/v1/containers/%s/%s/' % (container_name, 'resize') + cmd = {'h': '100', 'w': '100'} + response = self.app.post(url, cmd) + self.assertEqual(200, response.status_int) + mock_container_resize.assert_called_once_with( + mock.ANY, test_container_obj, cmd['h'], cmd['w']) + + @patch('zun.common.utils.validate_container_state') + @patch('zun.compute.api.API.container_resize') + @patch('zun.objects.Container.get_by_name') + def test_resize_container_by_uuid(self, + mock_get_by_uuid, + mock_container_resize, + mock_validate): + test_container_obj = objects.Container(self.context, + **utils.get_test_container()) + mock_container_resize.return_value = test_container_obj + test_container = utils.get_test_container() + test_container_obj = objects.Container(self.context, **test_container) + mock_get_by_uuid.return_value = test_container_obj + + container_name = test_container.get('name') + url = '/v1/containers/%s/%s/' % (container_name, 'resize') + cmd = {'h': '100', 'w': '100'} + response = self.app.post(url, cmd) + self.assertEqual(200, response.status_int) + mock_container_resize.assert_called_once_with( + mock.ANY, test_container_obj, cmd['h'], cmd['w']) + + @patch('zun.common.utils.validate_container_state') + @patch('zun.compute.api.API.container_resize') + @patch('zun.objects.Container.get_by_uuid') + def test_resize_container_with_exception(self, + mock_get_by_uuid, + mock_container_resize, + mock_validate): + mock_container_resize.return_value = "" + test_container = utils.get_test_container() + test_container_obj = objects.Container(self.context, **test_container) + mock_get_by_uuid.return_value = test_container_obj + mock_container_resize.side_effect = Exception + + container_uuid = test_container.get('uuid') + body = {'h': '100', 'w': '100'} + self.assertRaises(AppError, self.app.post, + '/v1/containers/%s/%s/' % + (container_uuid, 'resize'), body) + self.assertTrue(mock_container_resize.called) + class TestContainerEnforcement(api_base.FunctionalTest): diff --git a/zun/tests/unit/compute/test_compute_manager.py b/zun/tests/unit/compute/test_compute_manager.py index 14eac7164..bf16416d4 100644 --- a/zun/tests/unit/compute/test_compute_manager.py +++ b/zun/tests/unit/compute/test_compute_manager.py @@ -379,3 +379,34 @@ class TestManager(base.TestCase): self.assertRaises(exception.DockerError, self.compute_manager.container_update, self.context, container, {}) + + @mock.patch.object(fake_driver, 'attach') + @mock.patch('zun.container.driver.ContainerDriver.get_websocket_url') + def test_container_attach(self, mock_attach, mock_getwebsocket_url): + container = Container(self.context, **utils.get_test_container()) + mock_getwebsocket_url.return_value = "ws://test" + self.compute_manager.container_attach(self.context, container) + mock_attach.assert_called_once_with(container) + + @mock.patch.object(fake_driver, 'attach') + def test_container_attach_failed(self, mock_attach): + container = Container(self.context, **utils.get_test_container()) + mock_attach.side_effect = Exception + self.assertRaises(exception.ZunException, + self.compute_manager.container_attach, + self.context, container) + + @mock.patch.object(fake_driver, 'resize') + def test_container_resize(self, mock_resize): + container = Container(self.context, **utils.get_test_container()) + self.compute_manager.container_resize(self.context, + container, "100", "100") + mock_resize.assert_called_once_with(container, "100", "100") + + @mock.patch.object(fake_driver, 'resize') + def test_container_resize_failed(self, mock_resize): + container = Container(self.context, **utils.get_test_container()) + mock_resize.side_effect = exception.DockerError + self.assertRaises(exception.DockerError, + self.compute_manager.container_resize, + self.context, container, "100", "100") diff --git a/zun/tests/unit/container/docker/test_docker_driver.py b/zun/tests/unit/container/docker/test_docker_driver.py index 8c8b75081..e98f5b272 100644 --- a/zun/tests/unit/container/docker/test_docker_driver.py +++ b/zun/tests/unit/container/docker/test_docker_driver.py @@ -329,6 +329,13 @@ class TestDockerDriver(base.DriverTestCase): mock_container.container_id) self.assertEqual(1, mock_init.call_count) + def test_resize(self): + self.mock_docker.resize = mock.Mock() + mock_container = mock.MagicMock() + self.driver.resize(mock_container, "100", "100") + self.mock_docker.resize.assert_called_once_with( + mock_container.container_id, 100, 100) + @mock.patch('zun.container.docker.driver.DockerDriver.get_sandbox_name') def test_create_sandbox(self, mock_get_sandbox_name): sandbox_name = 'my_test_sandbox' diff --git a/zun/tests/unit/container/fake_driver.py b/zun/tests/unit/container/fake_driver.py index 3e9c8aaae..44221b7e8 100644 --- a/zun/tests/unit/container/fake_driver.py +++ b/zun/tests/unit/container/fake_driver.py @@ -69,6 +69,14 @@ class FakeDriver(driver.ContainerDriver): def kill(self, container, signal=None): pass + @check_container_id + def attach(self, container): + pass + + @check_container_id + def resize(self, container, height, weight): + pass + def create_sandbox(self, context, name, **kwargs): pass