]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
Do not assume nova provides a fault on ERROR
authorSteve Baker <sbaker@redhat.com>
Thu, 22 Aug 2013 01:18:57 +0000 (13:18 +1200)
committerSteve Baker <sbaker@redhat.com>
Thu, 22 Aug 2013 23:28:13 +0000 (11:28 +1200)
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

heat/engine/resources/instance.py
heat/tests/test_instance.py

index dd12eb98bfd81e63d5ff824304c9db8ab81d9721..e00bc36a6f14512a53495f6db3f187cc2f4d1eda 100644 (file)
@@ -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(
index 8a07c346e2b679ab1fac563255f09cc3256896f3..431cd6cf8421270c0f0b01dcae2d498f7fc59347 100644 (file)
@@ -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)