diff --git a/shade/_tasks.py b/shade/_tasks.py index e291658bb..d87967321 100644 --- a/shade/_tasks.py +++ b/shade/_tasks.py @@ -126,6 +126,11 @@ class ServerRebuild(task_manager.Task): return client.nova_client.servers.rebuild(**self.args) +class HypervisorList(task_manager.Task): + def main(self, client): + return client.nova_client.hypervisors.list(**self.args) + + class KeypairList(task_manager.Task): def main(self, client): return client.nova_client.keypairs.list() diff --git a/shade/operatorcloud.py b/shade/operatorcloud.py index 65b51af31..45cf06291 100644 --- a/shade/operatorcloud.py +++ b/shade/operatorcloud.py @@ -1486,3 +1486,17 @@ class OperatorCloud(openstackcloud.OpenStackCloud): ) return True + + def list_hypervisors(self): + """List all hypervisors + + :returns: A list of hypervisor dicts. + """ + + try: + return self.manager.submitTask(_tasks.HypervisorList()) + except OpenStackCloudException: + raise + except Exception as e: + raise OpenStackCloudException( + "Error fetching hypervisor list: %s" % str(e)) diff --git a/shade/tests/unit/test_shade_operator.py b/shade/tests/unit/test_shade_operator.py index 78a4b8acf..beae25aae 100644 --- a/shade/tests/unit/test_shade_operator.py +++ b/shade/tests/unit/test_shade_operator.py @@ -19,6 +19,7 @@ import testtools import os_client_config.cloud_config import shade +import munch from shade import exc from shade import meta from shade.tests import fakes @@ -1038,3 +1039,18 @@ class TestShadeOperator(base.TestCase): def test_has_service_yes(self, session_mock): session_mock.get_endpoint.return_value = 'http://fake.url' self.assertTrue(self.cloud.has_service("image")) + + @mock.patch.object(shade._tasks.HypervisorList, 'main') + def test_list_hypervisors(self, mock_hypervisorlist): + '''This test verifies that calling list_hypervisors results in a call + to the HypervisorList task.''' + mock_hypervisorlist.return_value = [ + munch.Munch({'hypervisor_hostname': 'testserver1', + 'id': '1'}), + munch.Munch({'hypervisor_hostname': 'testserver2', + 'id': '2'}) + ] + + r = self.cloud.list_hypervisors() + self.assertEquals(2, len(r)) + self.assertEquals('testserver1', r[0]['hypervisor_hostname'])