From cfcee7b6f305d1ec3fcd91db06c1dacc150159ad Mon Sep 17 00:00:00 2001 From: Jason Dunsmore Date: Fri, 7 Feb 2014 13:56:04 -0600 Subject: [PATCH] Move refresh_server() to nova_utils Move refresh_server() to nova_utils so Server, Instance, and CloudServer can use it. Change-Id: Ib97eead3930a6a7de66ffa6aa4453b2bab80b0c6 --- heat/engine/resources/nova_utils.py | 17 +++++++++ heat/engine/resources/server.py | 17 +-------- heat/tests/test_nova_utils.py | 35 +++++++++++++++++ heat/tests/test_server.py | 59 ----------------------------- 4 files changed, 54 insertions(+), 74 deletions(-) diff --git a/heat/engine/resources/nova_utils.py b/heat/engine/resources/nova_utils.py index 308f2d48c6..7b82df6670 100644 --- a/heat/engine/resources/nova_utils.py +++ b/heat/engine/resources/nova_utils.py @@ -48,6 +48,23 @@ deferred_server_statuses = ['BUILD', 'VERIFY_RESIZE'] +def refresh_server(server): + ''' + Refresh server's attributes and log warnings for non-critical API errors. + ''' + try: + server.get() + except clients.novaclient.exceptions.ClientException as exc: + if exc.code == 500: + msg = _('Server "%(name)s" (%(id)s) received the following ' + 'exception during server.get(): %(exception)s') + logger.warning(msg % {'name': server.name, + 'id': server.id, + 'exception': str(exc)}) + else: + raise + + def get_image_id(nova_client, image_identifier): ''' Return an id for the specified image name or identifier. diff --git a/heat/engine/resources/server.py b/heat/engine/resources/server.py index 4da1e7ed62..4de296f048 100644 --- a/heat/engine/resources/server.py +++ b/heat/engine/resources/server.py @@ -345,23 +345,10 @@ class Server(resource.Resource): def check_create_complete(self, server): return self._check_active(server) - def _refresh_server(self, server): - try: - server.get() - except clients.novaclient.exceptions.ClientException as exc: - if exc.code == 500: - msg = _("Stack %(name)s (%(id)s) received the following " - "exception during server.get(): %(exception)s") - logger.warning(msg % {'name': self.stack.name, - 'id': self.stack.id, - 'exception': str(exc)}) - else: - raise - def _check_active(self, server): if server.status != 'ACTIVE': - self._refresh_server(server) + nova_utils.refresh_server(server) # Some clouds append extra (STATUS) strings to the status short_server_status = server.status.split('(')[0] @@ -660,7 +647,7 @@ class Server(resource.Resource): if server.status == 'SUSPENDED': return True - self._refresh_server(server) + nova_utils.refresh_server(server) logger.debug(_('%(name)s check_suspend_complete status ' '= %(status)s') % { 'name': self.name, 'status': server.status}) diff --git a/heat/tests/test_nova_utils.py b/heat/tests/test_nova_utils.py index a9be7f4711..89d744b569 100644 --- a/heat/tests/test_nova_utils.py +++ b/heat/tests/test_nova_utils.py @@ -17,6 +17,7 @@ import uuid from heat.common import exception +from heat.engine import clients from heat.engine.resources import nova_utils from heat.tests.common import HeatTestCase @@ -107,6 +108,40 @@ class NovaUtilsTests(HeatTestCase): self.m.VerifyAll() +class NovaUtilsRefreshServerTests(HeatTestCase): + + def test_successful_refresh(self): + server = self.m.CreateMockAnything() + server.get().AndReturn(None) + self.m.ReplayAll() + + self.assertIsNone(nova_utils.refresh_server(server)) + self.m.VerifyAll() + + def test_500_error(self): + server = self.m.CreateMockAnything() + msg = ("ClientException: The server has either erred or is " + "incapable of performing the requested operation.") + server.get().AndRaise( + clients.novaclient.exceptions.ClientException(500, msg)) + self.m.ReplayAll() + + self.assertIsNone(nova_utils.refresh_server(server)) + self.m.VerifyAll() + + def test_unhandled_exception(self): + server = self.m.CreateMockAnything() + msg = ("ClientException: The server has either erred or is " + "incapable of performing the requested operation.") + server.get().AndRaise( + clients.novaclient.exceptions.ClientException(501, msg)) + self.m.ReplayAll() + + self.assertRaises(clients.novaclient.exceptions.ClientException, + nova_utils.refresh_server, server) + self.m.VerifyAll() + + class NovaUtilsUserdataTests(HeatTestCase): scenarios = [ diff --git a/heat/tests/test_server.py b/heat/tests/test_server.py index 3919c8cf46..31e799cdb2 100644 --- a/heat/tests/test_server.py +++ b/heat/tests/test_server.py @@ -164,65 +164,6 @@ class ServersTest(HeatTestCase): self.assertEqual('::babe:4317:0A83', server.FnGetAtt('accessIPv6')) self.m.VerifyAll() - def _test_server_error_during_create(self, exception): - return_server = self.fc.servers.list()[0] - server = self._setup_test_server(return_server, 'test_create_500') - server.resource_id = 1234 - - # Override the get_servers_1234 handler - d1 = {'server': self.fc.client.get_servers_detail()[1]['servers'][0]} - d2 = copy.deepcopy(d1) - d1['server']['status'] = 'BUILD' - d2['server']['status'] = 'ACTIVE' - self.m.StubOutWithMock(self.fc.client, 'get_servers_1234') - get = self.fc.client.get_servers_1234 - get().AndReturn((200, d1)) - get().AndReturn((200, d1)) - get().AndRaise(exception) - get().AndReturn((200, d2)) - self.m.ReplayAll() - - self.m.ReplayAll() - scheduler.TaskRunner(server.create)() - self.assertEqual('CREATE', server.action) - self.assertEqual('COMPLETE', server.status) - self.m.VerifyAll() - - def test_server_create_500_error(self): - msg = ("ClientException: The server has either erred or is " - "incapable of performing the requested operation.") - exc = clients.novaclient.exceptions.ClientException(500, msg) - self._test_server_error_during_create(exc) - - def _test_server_error_during_suspend(self, exception): - return_server = self.fc.servers.list()[1] - server = self._create_test_server(return_server, 'test_suspend_500') - server.resource_id = 1234 - - # Override the get_servers_1234 handler - d1 = {'server': self.fc.client.get_servers_detail()[1]['servers'][0]} - d2 = copy.deepcopy(d1) - d1['server']['status'] = 'ACTIVE' - d2['server']['status'] = 'SUSPENDED' - self.m.StubOutWithMock(self.fc.client, 'get_servers_1234') - get = self.fc.client.get_servers_1234 - get().AndReturn((200, d1)) - get().AndReturn((200, d1)) - get().AndRaise(exception) - get().AndReturn((200, d2)) - self.m.ReplayAll() - - scheduler.TaskRunner(server.suspend)() - self.assertEqual('SUSPEND', server.action) - self.assertEqual('COMPLETE', server.status) - self.m.VerifyAll() - - def test_server_suspend_500_error(self): - msg = ("ClientException: The server has either erred or is " - "incapable of performing the requested operation.") - exc = clients.novaclient.exceptions.ClientException(500, msg) - self._test_server_error_during_suspend(exc) - def test_server_create_metadata(self): return_server = self.fc.servers.list()[1] stack_name = 'create_metadata_test_stack'