Set status_reason when container creation fails

If Container creation fails, this patch updates the
status_reason field so that operator can know the reason
of container creation failure.

Closes-Bug: #1614398
Change-Id: I5571517c909b3fe4f45947fc89676de5352584de
This commit is contained in:
Pradeep Kumar Singh 2016-11-02 06:30:06 +00:00
parent 0aa3b3496b
commit 694ea48d0d
2 changed files with 15 additions and 11 deletions

View File

@ -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()

View File

@ -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')