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:
parent
0a88d86742
commit
cfcee7b6f3
|
@ -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.
|
||||
|
|
|
@ -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})
|
||||
|
|
|
@ -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 = [
|
||||
|
|
|
@ -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'
|
||||
|
|
Loading…
Reference in New Issue