Gate Fix: remove nova hosts deprecated table

This commit removes the deprecated nova hosts table from the
nova driver. It uses superseded hypervisor list instead.

Ref: I85a287ff2666c2dcdcbbc8fd6c2e285176f7a67a

Closes-Bug: #1755156
Change-Id: I6cfdc72332fa7a03a65793beffd246d07c3a1f07
This commit is contained in:
Anusha Ramineni 2018-03-12 11:36:56 +05:30 committed by Eric K
parent 6a3369b683
commit 250fa0c3e8
4 changed files with 96 additions and 48 deletions

View File

@ -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)

View File

@ -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]

View File

@ -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()

View File

@ -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.