diff --git a/zun/compute/manager.py b/zun/compute/manager.py index fb34eed0f..919a05765 100755 --- a/zun/compute/manager.py +++ b/zun/compute/manager.py @@ -284,10 +284,12 @@ class Manager(object): with excutils.save_and_reraise_exception(reraise=reraise): LOG.error("Error occurred while calling Docker pause API: %s", six.text_type(e)) + self._fail_container(context, container, six.text_type(e)) except Exception as e: with excutils.save_and_reraise_exception(reraise=reraise): LOG.exception("Unexpected exception: %s,", six.text_type(e)) + self._fail_container(context, container, six.text_type(e)) def container_pause(self, context, container): utils.spawn_n(self._do_container_pause, context, container) @@ -303,10 +305,12 @@ class Manager(object): LOG.error( "Error occurred while calling Docker unpause API: %s", six.text_type(e)) + self._fail_container(context, container, six.text_type(e)) except Exception as e: with excutils.save_and_reraise_exception(reraise=reraise): LOG.exception("Unexpected exception: %s", six.text_type(e)) + self._fail_container(context, container, six.text_type(e)) def container_unpause(self, context, container): utils.spawn_n(self._do_container_unpause, context, container) @@ -369,6 +373,7 @@ class Manager(object): with excutils.save_and_reraise_exception(reraise=reraise): LOG.error("Error occurred while calling Docker kill API: %s", six.text_type(e)) + self._fail_container(context, container, six.text_type(e)) def container_kill(self, context, container, signal): utils.spawn_n(self._do_container_kill, context, container, signal) diff --git a/zun/container/docker/driver.py b/zun/container/docker/driver.py index 6db88ed35..66387b674 100644 --- a/zun/container/docker/driver.py +++ b/zun/container/docker/driver.py @@ -97,6 +97,7 @@ class DockerDriver(driver.ContainerDriver): response = docker.create_container(image, **kwargs) container.container_id = response['Id'] container.status = consts.CREATED + container.status_reason = None container.save(context) return container @@ -127,6 +128,7 @@ class DockerDriver(driver.ContainerDriver): except errors.APIError as api_error: if '404' in str(api_error): container.status = consts.ERROR + container.status_reason = six.text_type(api_error) return container raise @@ -225,6 +227,7 @@ class DockerDriver(driver.ContainerDriver): else: docker.restart(container.container_id) container.status = consts.RUNNING + container.status_reason = None return container @check_container_id @@ -236,6 +239,7 @@ class DockerDriver(driver.ContainerDriver): else: docker.stop(container.container_id) container.status = consts.STOPPED + container.status_reason = None return container @check_container_id @@ -243,6 +247,7 @@ class DockerDriver(driver.ContainerDriver): with docker_utils.docker_client() as docker: docker.start(container.container_id) container.status = consts.RUNNING + container.status_reason = None return container @check_container_id @@ -250,6 +255,7 @@ class DockerDriver(driver.ContainerDriver): with docker_utils.docker_client() as docker: docker.pause(container.container_id) container.status = consts.PAUSED + container.status_reason = None return container @check_container_id @@ -257,6 +263,7 @@ class DockerDriver(driver.ContainerDriver): with docker_utils.docker_client() as docker: docker.unpause(container.container_id) container.status = consts.RUNNING + container.status_reason = None return container @check_container_id @@ -326,6 +333,7 @@ class DockerDriver(driver.ContainerDriver): except errors.APIError as api_error: if '404' in str(api_error): container.status = consts.ERROR + container.status_reason = six.text_type(api_error) return container raise diff --git a/zun/tests/unit/compute/test_compute_manager.py b/zun/tests/unit/compute/test_compute_manager.py index 24fcc1792..0057e1977 100755 --- a/zun/tests/unit/compute/test_compute_manager.py +++ b/zun/tests/unit/compute/test_compute_manager.py @@ -349,13 +349,17 @@ class TestManager(base.TestCase): self.compute_manager._do_container_pause(self.context, container) mock_pause.assert_called_once_with(container) + @mock.patch.object(manager.Manager, '_fail_container') @mock.patch.object(fake_driver, 'pause') - def test_container_pause_failed(self, mock_pause): + def test_container_pause_failed(self, mock_pause, mock_fail): container = Container(self.context, **utils.get_test_container()) - mock_pause.side_effect = exception.DockerError + mock_pause.side_effect = exception.DockerError( + message="Docker Error occurred") self.assertRaises(exception.DockerError, self.compute_manager._do_container_pause, self.context, container, reraise=True) + mock_fail.assert_called_with(self.context, + container, 'Docker Error occurred') @mock.patch.object(fake_driver, 'unpause') def test_container_unpause(self, mock_unpause): @@ -363,13 +367,17 @@ class TestManager(base.TestCase): self.compute_manager._do_container_unpause(self.context, container) mock_unpause.assert_called_once_with(container) + @mock.patch.object(manager.Manager, '_fail_container') @mock.patch.object(fake_driver, 'unpause') - def test_container_unpause_failed(self, mock_unpause): + def test_container_unpause_failed(self, mock_unpause, mock_fail): container = Container(self.context, **utils.get_test_container()) - mock_unpause.side_effect = exception.DockerError + mock_unpause.side_effect = exception.DockerError( + message="Docker Error occurred") self.assertRaises(exception.DockerError, self.compute_manager._do_container_unpause, self.context, container, reraise=True) + mock_fail.assert_called_with(self.context, + container, 'Docker Error occurred') @mock.patch.object(fake_driver, 'show_logs') def test_container_logs(self, mock_logs): @@ -415,13 +423,17 @@ class TestManager(base.TestCase): self.compute_manager._do_container_kill(self.context, container, None) mock_kill.assert_called_once_with(container, None) + @mock.patch.object(manager.Manager, '_fail_container') @mock.patch.object(fake_driver, 'kill') - def test_container_kill_failed(self, mock_kill): + def test_container_kill_failed(self, mock_kill, mock_fail): container = Container(self.context, **utils.get_test_container()) - mock_kill.side_effect = exception.DockerError + mock_kill.side_effect = exception.DockerError( + message="Docker Error occurred") self.assertRaises(exception.DockerError, self.compute_manager._do_container_kill, self.context, container, None, reraise=True) + mock_fail.assert_called_with(self.context, + container, 'Docker Error occurred') @mock.patch.object(Container, 'save') @mock.patch.object(fake_driver, 'update') diff --git a/zun/tests/unit/container/docker/test_docker_driver.py b/zun/tests/unit/container/docker/test_docker_driver.py index 5da90932e..a45ce4a7e 100644 --- a/zun/tests/unit/container/docker/test_docker_driver.py +++ b/zun/tests/unit/container/docker/test_docker_driver.py @@ -170,7 +170,7 @@ class TestDockerDriver(base.DriverTestCase): mock_container.container_id) self.assertEqual(result_container.status, consts.ERROR) - self.assertEqual(1, mock_init.call_count) + self.assertEqual(2, mock_init.call_count) def test_show_fail_api_error(self): with mock.patch.object(errors.APIError, '__str__', @@ -291,7 +291,7 @@ class TestDockerDriver(base.DriverTestCase): mock_container.container_id) self.assertEqual(result_container.status, consts.ERROR) - self.assertEqual(1, mock_init.call_count) + self.assertEqual(2, mock_init.call_count) def test_kill_fail_api_error(self): with mock.patch.object(errors.APIError, '__str__',