Move refresh_server() to nova_utils

Move refresh_server() to nova_utils so Server, Instance, and
CloudServer can use it.

Change-Id: Ib97eead3930a6a7de66ffa6aa4453b2bab80b0c6
This commit is contained in:
Jason Dunsmore 2014-02-07 13:56:04 -06:00
parent 0a88d86742
commit cfcee7b6f3
4 changed files with 54 additions and 74 deletions

View File

@ -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.

View File

@ -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})

View File

@ -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 = [

View File

@ -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'