diff --git a/congress/datasources/nova_driver.py b/congress/datasources/nova_driver.py index 0a18e79da..7ef3df899 100644 --- a/congress/datasources/nova_driver.py +++ b/congress/datasources/nova_driver.py @@ -13,15 +13,18 @@ # under the License. # -"""Schema version history +"""Schema change history + +date: 2018-03-15 +changes: + - (incompatible) Removed the `hosts` table for OS hosts information because + access to the information has been removed from the latest Nova API and + client. + - Added the `hypervisors` table for hypervisor information. -version: 2.1 date: 2017-10-01 changes: - - Added the tags table for server tags information. - -version: 2.0 -Initial schema version. + - Added the `tags` table for server tags information. """ from __future__ import print_function @@ -43,7 +46,7 @@ class NovaDriver(datasource_driver.PollingDataSourceDriver, datasource_driver.ExecutionDriver): SERVERS = "servers" FLAVORS = "flavors" - HOSTS = "hosts" + HYPERVISORS = "hypervisors" SERVICES = 'services' AVAILABILITY_ZONES = "availability_zones" TAGS = "tags" @@ -122,16 +125,18 @@ class NovaDriver(datasource_driver.PollingDataSourceDriver, {'fieldname': 'rxtx_factor', 'desc': 'RX/TX factor', 'translator': value_trans})} - hosts_translator = { + hypervisors_translator = { 'translation-type': 'HDICT', - 'table-name': HOSTS, + 'table-name': HYPERVISORS, 'selector-type': 'DOT_SELECTOR', 'field-translators': - ({'fieldname': 'host_name', 'desc': 'Name of host', + ({'fieldname': 'hypervisor_hostname', 'desc': 'Hypervisor host', 'translator': value_trans}, - {'fieldname': 'service', 'desc': 'Enabled service', + {'fieldname': 'id', 'desc': 'hypervisori id', 'translator': value_trans}, - {'fieldname': 'zone', 'desc': 'The availability zone of host', + {'fieldname': 'state', 'desc': 'State of the hypervisor', + 'translator': value_trans}, + {'fieldname': 'status', 'desc': 'Status of the hypervisor', 'translator': value_trans})} services_translator = { @@ -167,8 +172,8 @@ class NovaDriver(datasource_driver.PollingDataSourceDriver, 'desc': 'Availability zone state', 'translator': value_trans})} - TRANSLATORS = [servers_translator, flavors_translator, hosts_translator, - services_translator, availability_zones_translator] + TRANSLATORS = [servers_translator, flavors_translator, services_translator, + hypervisors_translator, availability_zones_translator] def __init__(self, name='', args=None): super(NovaDriver, self).__init__(name, args) @@ -215,9 +220,10 @@ class NovaDriver(datasource_driver.PollingDataSourceDriver, self.nova_client.flavors.list()) self.add_update_method(flavors_method, self.flavors_translator) - hosts_method = lambda: self._translate_hosts( - self.nova_client.hosts.list()) - self.add_update_method(hosts_method, self.hosts_translator) + hypervisors_method = lambda: self._translate_hypervisors( + self.nova_client.hypervisors.list()) + self.add_update_method(hypervisors_method, + self.hypervisors_translator) services_method = lambda: self._translate_services( self.nova_client.services.list()) @@ -237,9 +243,11 @@ class NovaDriver(datasource_driver.PollingDataSourceDriver, row_data = NovaDriver.convert_objs(obj, NovaDriver.flavors_translator) return row_data - @ds_utils.update_state_on_changed(HOSTS) - def _translate_hosts(self, obj): - row_data = NovaDriver.convert_objs(obj, NovaDriver.hosts_translator) + @ds_utils.update_state_on_changed(HYPERVISORS) + def _translate_hypervisors(self, obj): + row_data = NovaDriver.convert_objs( + obj, + NovaDriver.hypervisors_translator) return row_data @ds_utils.update_state_on_changed(SERVICES) diff --git a/congress/tests/datasources/fakes.py b/congress/tests/datasources/fakes.py index dd5fada21..51a145f2b 100644 --- a/congress/tests/datasources/fakes.py +++ b/congress/tests/datasources/fakes.py @@ -29,8 +29,10 @@ class NovaFakeClient(mock.MagicMock): self.flavors = mock.MagicMock() self.flavors.list.return_value = self.get_flavor_list() - self.hosts = mock.MagicMock() - self.hosts.list.return_value = self.get_host_list() + # self.hosts = mock.MagicMock() + # self.hosts.list.return_value = self.get_host_list() + self.hypervisors = mock.MagicMock() + self.hypervisors.list.return_value = self.get_hypervisor_list() self.services = mock.MagicMock() self.services.list.return_value = self.get_service_list() @@ -111,16 +113,30 @@ class NovaFakeClient(mock.MagicMock): return [flavor_one, flavor_two, flavor_three, flavor_four] - def get_host(self, host_name, service, zone): +# def get_host(self, host_name, service, zone): +# h = mock.MagicMock() +# h.host_name = host_name +# h.service = service +# h.zone = zone +# return h +# +# def get_host_list(self): +# h_one = self.get_host('host1', 'nova-compute', 'nova1') +# h_two = self.get_host('host2', 'nova-cert', 'nova1') +# +# return [h_one, h_two] + + def get_hypervisor(self, host_name, id_, state, status): h = mock.MagicMock() - h.host_name = host_name - h.service = service - h.zone = zone + h.hypervisor_hostname = host_name + h.id = id_ + h.state = state + h.status = status return h - def get_host_list(self): - h_one = self.get_host('host1', 'nova-compute', 'nova1') - h_two = self.get_host('host2', 'nova-cert', 'nova1') + def get_hypervisor_list(self): + h_one = self.get_hypervisor('host1', '2', 'up', 'enabled') + h_two = self.get_hypervisor('host2', '3', 'down', 'enabled') return [h_one, h_two] diff --git a/congress/tests/datasources/test_nova_driver.py b/congress/tests/datasources/test_nova_driver.py index 5ae160734..3fa4121b5 100644 --- a/congress/tests/datasources/test_nova_driver.py +++ b/congress/tests/datasources/test_nova_driver.py @@ -179,29 +179,42 @@ class TestNovaDriver(base.TestCase): self.assertEqual(2.0, rxtx_factor) self.assertEqual('1024 MB Server', name) - def test_hosts(self): - host_list = self.nova.hosts.list() - self.driver._translate_hosts(host_list) - host_tuples = self.driver.state[self.driver.HOSTS] - self.assertEqual(2, len(host_tuples)) - # {'hosts': - # [{'host_name': 'host1', - # 'service': 'nova-compute', - # 'zone': zone}, - # {'host_name': 'host2', - # 'service': 'nova-cert', - # 'zone': zone}]} - for host in host_tuples: +# def test_hosts(self): +# host_list = self.nova.hosts.list() +# self.driver._translate_hosts(host_list) +# host_tuples = self.driver.state[self.driver.HOSTS] +# self.assertEqual(2, len(host_tuples)) +# for host in host_tuples: +# host_name = host[0] +# service = host[1] +# zone = host[2] +# +# if host_name == 'host1': +# self.assertEqual('nova-compute', service) +# self.assertEqual('nova1', str(zone)) +# elif host_name == 'host2': +# self.assertEqual('nova-cert', service) +# self.assertEqual('nova1', str(zone)) + + def test_hypervisors(self): + hypervisors = self.nova.hypervisors.list() + self.driver._translate_hypervisors(hypervisors) + hypervisor_tuples = self.driver.state[self.driver.HYPERVISORS] + self.assertEqual(2, len(hypervisor_tuples)) + for host in hypervisor_tuples: host_name = host[0] - service = host[1] - zone = host[2] + id = host[1] + state = host[2] + status = host[3] if host_name == 'host1': - self.assertEqual('nova-compute', service) - self.assertEqual('nova1', str(zone)) + self.assertEqual('2', id) + self.assertEqual('up', state) + self.assertEqual('enabled', status) elif host_name == 'host2': - self.assertEqual('nova-cert', service) - self.assertEqual('nova1', str(zone)) + self.assertEqual('3', id) + self.assertEqual('down', state) + self.assertEqual('enabled', status) def test_services(self): service_list = self.nova.services.list() diff --git a/releasenotes/notes/nova-hosts-removal-0bec974eac28e0b1.yaml b/releasenotes/notes/nova-hosts-removal-0bec974eac28e0b1.yaml new file mode 100644 index 000000000..b02df9dbd --- /dev/null +++ b/releasenotes/notes/nova-hosts-removal-0bec974eac28e0b1.yaml @@ -0,0 +1,11 @@ +--- +prelude: > +features: + - The Nova data source driver now supports the + `hypervisors` table, replacing the old `hosts` table. +upgrade: + - Nova os-hosts API had been deprecated since Pike and + no longer available in the latest Nova client. As a + result, the `hosts` table is no longer available in + the Nova data source driver. In its place, please use + the new `hypervisors` table.