return additional detail about servers

Introduce a new parameter `detailed` to `list_servers`,
`search_servers`, and `get_server`.  When True, `list_servers` will call
`meta.get_hostvars_from_server` for each server.

This does not modify the default behavior (`detailed=False`) of these
methods.

Change-Id: I919fd2ec20515c2b13eee02a75623c6ce6d7d273
This commit is contained in:
Lars Kellogg-Stedman 2015-10-23 22:11:31 -04:00
parent 631a8e53e9
commit e941434e4f
2 changed files with 54 additions and 10 deletions

View File

@ -1049,8 +1049,8 @@ class OpenStackCloud(object):
groups = self.list_security_groups()
return _utils._filter_list(groups, name_or_id, filters)
def search_servers(self, name_or_id=None, filters=None):
servers = self.list_servers()
def search_servers(self, name_or_id=None, filters=None, detailed=False):
servers = self.list_servers(detailed=detailed)
return _utils._filter_list(servers, name_or_id, filters)
def search_images(self, name_or_id=None, filters=None):
@ -1256,7 +1256,7 @@ class OpenStackCloud(object):
"Unavailable feature: security groups"
)
def list_servers(self):
def list_servers(self, detailed=False):
"""List all available servers.
:returns: A list of server dicts.
@ -1273,17 +1273,24 @@ class OpenStackCloud(object):
# blocking.
if self._servers_lock.acquire(len(self._servers) == 0):
try:
self._servers = self._list_servers()
self._servers = self._list_servers(detailed=detailed)
self._servers_time = time.time()
finally:
self._servers_lock.release()
return self._servers
def _list_servers(self):
def _list_servers(self, detailed=False):
try:
return meta.obj_list_to_dict(
self.manager.submitTask(_tasks.ServerList())
)
servers = meta.obj_list_to_dict(
self.manager.submitTask(_tasks.ServerList()))
if detailed:
return [
meta.get_hostvars_from_server(self, server)
for server in servers
]
else:
return servers
except Exception as e:
raise OpenStackCloudException(
"Error fetching server list: %s" % e)
@ -1651,7 +1658,7 @@ class OpenStackCloud(object):
return _utils._get_entity(
self.search_security_groups, name_or_id, filters)
def get_server(self, name_or_id=None, filters=None):
def get_server(self, name_or_id=None, filters=None, detailed=False):
"""Get a server by name or ID.
:param name_or_id: Name or ID of the server.
@ -1670,7 +1677,9 @@ class OpenStackCloud(object):
found.
"""
return _utils._get_entity(self.search_servers, name_or_id, filters)
searchfunc = functools.partial(self.search_servers,
detailed=detailed)
return _utils._get_entity(searchfunc, name_or_id, filters)
def get_server_by_id(self, id):
return meta.obj_to_dict(

View File

@ -13,6 +13,7 @@
# under the License.
import mock
import munch
import glanceclient
from heatclient import client as heat_client
@ -398,3 +399,37 @@ class TestShade(base.TestCase):
r = self.cloud._get_record('mickey.domain', 'mickey')
self.assertIsNotNone(r)
self.assertDictEqual(record1, r)
@mock.patch.object(shade._tasks.ServerList, 'main')
def test_list_servers(self, mock_serverlist):
'''This test verifies that calling list_servers results in a call
to the ServerList task.'''
mock_serverlist.return_value = [
munch.Munch({'name': 'testserver',
'id': '1'})
]
r = self.cloud.list_servers()
self.assertEquals(1, len(r))
self.assertEquals('testserver', r[0]['name'])
@mock.patch.object(shade._tasks.ServerList, 'main')
@mock.patch('shade.meta.get_hostvars_from_server')
def test_list_servers_detailed(self,
mock_get_hostvars_from_server,
mock_serverlist):
'''This test verifies that when list_servers is called with
`detailed=True` that it calls `get_hostvars_from_server` for each
server in the list.'''
mock_serverlist.return_value = ['server1', 'server2']
mock_get_hostvars_from_server.side_effect = [
{'name': 'server1', 'id': '1'},
{'name': 'server2', 'id': '2'},
]
r = self.cloud.list_servers(detailed=True)
self.assertEquals(2, len(r))
self.assertEquals(len(r), mock_get_hostvars_from_server.call_count)
self.assertEquals('server1', r[0]['name'])
self.assertEquals('server2', r[1]['name'])