From: Steve Baker Date: Thu, 22 Aug 2013 01:18:57 +0000 (+1200) Subject: Do not assume nova provides a fault on ERROR X-Git-Tag: 2014.1~162^2 X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=2911321e9d08a4905c98f183ad86d6d4f5831d4a;p=openstack-build%2Fheat-build.git Do not assume nova provides a fault on ERROR A nova server object in an ERROR state does not always provide a fault attribute to get the error reason from. Fixes bug: #1213285 Change-Id: I861951207cf8fd526a65f768154c76afd0be9081 --- diff --git a/heat/engine/resources/instance.py b/heat/engine/resources/instance.py index dd12eb98..e00bc36a 100644 --- a/heat/engine/resources/instance.py +++ b/heat/engine/resources/instance.py @@ -308,7 +308,7 @@ class Instance(resource.Resource): volume_attach.start() return volume_attach.done() elif server.status == 'ERROR': - fault = server.fault or {} + fault = getattr(server, 'fault', {}) message = fault.get('message', 'Unknown') code = fault.get('code', 500) delete = scheduler.TaskRunner( diff --git a/heat/tests/test_instance.py b/heat/tests/test_instance.py index 8a07c346..431cd6cf 100644 --- a/heat/tests/test_instance.py +++ b/heat/tests/test_instance.py @@ -242,6 +242,30 @@ class InstancesTest(HeatTestCase): self.m.VerifyAll() + def test_instance_create_error_no_fault(self): + return_server = self.fc.servers.list()[1] + instance = self._create_test_instance(return_server, + 'test_instance_create') + return_server.status = 'ERROR' + + self.m.StubOutWithMock(return_server, 'get') + return_server.get() + return_server.get().AndRaise( + clients.novaclient.exceptions.NotFound('test')) + self.m.ReplayAll() + + try: + instance.check_create_complete( + (return_server, self.FakeVolumeAttach())) + except exception.Error as e: + self.assertEqual( + 'Build of server sample-server2 failed: Unknown (500)', + str(e)) + else: + self.fail('Error not raised') + + self.m.VerifyAll() + def test_instance_validate(self): stack_name = 'test_instance_validate_stack' (t, stack) = self._setup_test_stack(stack_name)