Fix server get_details when server is not found

When a nova server is not found (e.g. deleted), the get_details()
function should return some useful information instead of just throwing
an exception. It would be difficult for users to figure out what
happened.

Change-Id: I960edf4cf292ad3a640046dc4afafa2aa7915116
Closes-Bug: #1526177
This commit is contained in:
tengqm 2015-12-15 02:41:19 -05:00
parent f0df889c8b
commit 3761205177
2 changed files with 20 additions and 3 deletions

View File

@ -535,7 +535,16 @@ class ServerProfile(base.Profile):
if obj.physical_id is None or obj.physical_id == '':
return {}
server = self.nova(obj).server_get(obj.physical_id)
try:
server = self.nova(obj).server_get(obj.physical_id)
except exception.InternalError as ex:
return {
'Error': {
'code': ex.code,
'message': six.text_type(ex)
}
}
if server is None:
return {}
server_data = server.to_dict()

View File

@ -970,14 +970,22 @@ class TestNovaServerProfile(base.SenlinTestCase):
def test_do_get_details_server_not_found(self):
# Test path for server not created
nc = mock.Mock()
nc.server_get.return_value = None
err = exception.InternalError(code=404,
message='No Server found for ID')
nc.server_get.side_effect = err
profile = server.ServerProfile('t', self.spec)
profile._novaclient = nc
obj = mock.Mock()
obj.physical_id = 'FAKE_ID'
res = profile.do_get_details(obj)
self.assertEqual({}, res)
expected = {
'Error': {
'message': 'No Server found for ID',
'code': 404
}
}
self.assertEqual(expected, res)
nc.server_get.assert_called_once_with('FAKE_ID')
def test_do_join_successful(self):