diff --git a/zun/compute/manager.py b/zun/compute/manager.py index 43cbc0c71..e792f27e6 100644 --- a/zun/compute/manager.py +++ b/zun/compute/manager.py @@ -46,8 +46,9 @@ class Manager(object): super(Manager, self).__init__() self.driver = driver.load_container_driver(container_driver) - def _fail_container(self, container): + def _fail_container(self, container, error): container.status = fields.ContainerStatus.ERROR + container.status_reason = error container.task_state = None container.save() @@ -72,11 +73,11 @@ class Manager(object): except exception.DockerError as e: LOG.error(_LE("Error occured while calling docker API: %s"), six.text_type(e)) - self._fail_container(container) + self._fail_container(container, six.text_type(e)) return except Exception as e: LOG.exception(_LE("Unexpected exception: %s"), six.text_type(e)) - self._fail_container(container) + self._fail_container(container, six.text_type(e)) return container.task_state = fields.TaskState.CONTAINER_CREATING @@ -86,10 +87,10 @@ class Manager(object): except exception.DockerError as e: LOG.error(_LE("Error occured while calling docker API: %s"), six.text_type(e)) - self._fail_container(container) + self._fail_container(container, six.text_type(e)) except Exception as e: LOG.exception(_LE("Unexpected exception: %s"), six.text_type(e)) - self._fail_container(container) + self._fail_container(container, six.text_type(e)) finally: container.task_state = None container.save() diff --git a/zun/tests/unit/compute/test_compute_manager.py b/zun/tests/unit/compute/test_compute_manager.py index 9d31be9ee..b78632a0b 100644 --- a/zun/tests/unit/compute/test_compute_manager.py +++ b/zun/tests/unit/compute/test_compute_manager.py @@ -37,8 +37,9 @@ class TestManager(base.TestCase): @mock.patch.object(Container, 'save') def test_fail_container(self, mock_save): container = Container(self.context, **utils.get_test_container()) - self.compute_manager._fail_container(container) + self.compute_manager._fail_container(container, "Creation Failed") self.assertEqual(fields.ContainerStatus.ERROR, container.status) + self.assertEqual("Creation Failed", container.status_reason) self.assertIsNone(container.task_state) def test_validate_container_state(self): @@ -75,19 +76,21 @@ class TestManager(base.TestCase): def test_container_create_pull_image_failed(self, mock_fail, mock_pull, mock_save): container = Container(self.context, **utils.get_test_container()) - mock_pull.side_effect = exception.DockerError + mock_pull.side_effect = exception.DockerError("Pull Failed") self.compute_manager._do_container_create(self.context, container) - mock_fail.assert_called_once_with(container) + mock_fail.assert_called_once_with(container, "Pull Failed") @mock.patch.object(Container, 'save') + @mock.patch('zun.image.driver.pull_image') @mock.patch.object(fake_driver, 'create') @mock.patch.object(manager.Manager, '_fail_container') def test_container_create_docker_create_failed(self, mock_fail, - mock_create, mock_save): + mock_create, mock_pull, + mock_save): container = Container(self.context, **utils.get_test_container()) - mock_create.side_effect = exception.DockerError + mock_create.side_effect = exception.DockerError("Creation Failed") self.compute_manager._do_container_create(self.context, container) - mock_fail.assert_called_once_with(container) + mock_fail.assert_called_once_with(container, "Creation Failed") @mock.patch.object(manager.Manager, '_validate_container_state') @mock.patch.object(fake_driver, 'delete')