summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRandall Burt <randall.burt@rackspace.com>2014-11-19 16:24:17 -0600
committerCédric Ollivier <ollivier.cedric@gmail.com>2015-03-08 11:01:36 +0000
commite0e0165d893355b327a381d8f81941bf89b267cb (patch)
treeb02f77dc94edc73f9064515bb78a1fe3e9c01ec9
parent61d4bf0e98191b2ddd81119d1c3325b18a37b532 (diff)
downloadheat-e0e0165d893355b327a381d8f81941bf89b267cb.tar.gz
Detect container failure when checking create complete
Change-Id: I77f56ec544a82e13cd5a00a3adcfde6c0dda822e (cherry picked from commit 0f368be6b9069d829a7f6b57b39d37d2d5830b44)
-rw-r--r--contrib/heat_docker/heat_docker/resources/docker_container.py5
-rw-r--r--contrib/heat_docker/heat_docker/tests/test_docker_container.py22
2 files changed, 27 insertions, 0 deletions
diff --git a/contrib/heat_docker/heat_docker/resources/docker_container.py b/contrib/heat_docker/heat_docker/resources/docker_container.py
index 6f52b1264..1ccb137b4 100644
--- a/contrib/heat_docker/heat_docker/resources/docker_container.py
+++ b/contrib/heat_docker/heat_docker/resources/docker_container.py
@@ -289,6 +289,11 @@ class DockerContainer(resource.Resource):
def check_create_complete(self, container_id):
status = self._get_container_status(container_id)
+ exit_status = status.get('ExitCode')
+ if exit_status is not None and exit_status != 0:
+ logs = self.get_client().logs(self.resource_id)
+ raise resource.ResourceInError(resource_status=self.FAILED,
+ status_reason=logs)
return status['Running']
def handle_delete(self):
diff --git a/contrib/heat_docker/heat_docker/tests/test_docker_container.py b/contrib/heat_docker/heat_docker/tests/test_docker_container.py
index b2793b6c2..1df80634b 100644
--- a/contrib/heat_docker/heat_docker/tests/test_docker_container.py
+++ b/contrib/heat_docker/heat_docker/tests/test_docker_container.py
@@ -16,10 +16,12 @@
import mock
from oslo.utils import importutils
+import six
from heat.common import exception
from heat.common import template_format
from heat.engine import resource
+from heat.engine import rsrc_defn
from heat.engine import scheduler
from heat.tests.common import HeatTestCase
from heat.tests import utils
@@ -106,6 +108,26 @@ class DockerContainerTest(HeatTestCase):
self.assertEqual(['samalba/wordpress'], client.pulled_images)
self.assertEqual('super-blog', client.container_create[0]['name'])
+ @mock.patch.object(docker_container.DockerContainer, 'get_client')
+ def test_create_failed(self, test_client):
+ mock_client = mock.Mock()
+ mock_client.inspect_container.return_value = {
+ "State": {
+ "ExitCode": -1
+ }
+ }
+ mock_client.logs.return_value = "Container startup failed"
+ test_client.return_value = mock_client
+ mock_stack = mock.Mock()
+ mock_stack.db_resource_get.return_value = None
+ res_def = mock.Mock(spec=rsrc_defn.ResourceDefinition)
+ docker_res = docker_container.DockerContainer("test", res_def,
+ mock_stack)
+ exc = self.assertRaises(resource.ResourceInError,
+ docker_res.check_create_complete,
+ 'foo')
+ self.assertIn("Container startup failed", six.text_type(exc))
+
def test_start_with_bindings_and_links(self):
t = template_format.parse(template)
stack = utils.parse_stack(t)