summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2015-10-12 08:10:38 +0000
committerGerrit Code Review <review@openstack.org>2015-10-12 08:10:38 +0000
commit472a5017271f8f6121b60412248a7557928b4439 (patch)
tree5edb4bbbe30403519b54ecebae3d530a626ba788
parent37f00e1a261d01c474e0db5b764b20debd88b69d (diff)
parente0e0165d893355b327a381d8f81941bf89b267cb (diff)
downloadheat-472a5017271f8f6121b60412248a7557928b4439.tar.gz
Merge "Detect container failure when checking create complete" into stable/juno
-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)