Merge "Lowercase ironic driver hash ring and ignore case in cache" into stable/pike

This commit is contained in:
Zuul 2021-04-10 07:02:35 +00:00 committed by Gerrit Code Review
commit 2ed1664b12
2 changed files with 36 additions and 4 deletions

View File

@ -2752,17 +2752,28 @@ class HashRingTestCase(test.NoDBTestCase):
self.assertEqual(SENTINEL, self.driver.hash_ring)
self.mock_is_up.assert_has_calls(is_up_calls)
def test__refresh_hash_ring_same_host_different_case(self):
# Test that we treat Host1 and host1 as the same host
# CONF.host is set to 'host1' in __test_refresh_hash_ring
services = ['Host1']
expected_hosts = {'host1'}
self.mock_is_up.return_value = True
self._test__refresh_hash_ring(services, expected_hosts)
def test__refresh_hash_ring_one_compute(self):
services = ['host1']
expected_hosts = {'host1'}
self.mock_is_up.return_value = True
self._test__refresh_hash_ring(services, expected_hosts)
def test__refresh_hash_ring_many_computes(self):
@mock.patch('nova.virt.ironic.driver.LOG.debug')
def test__refresh_hash_ring_many_computes(self, mock_log_debug):
services = ['host1', 'host2', 'host3']
expected_hosts = {'host1', 'host2', 'host3'}
self.mock_is_up.return_value = True
self._test__refresh_hash_ring(services, expected_hosts)
expected_msg = 'Hash ring members are %s'
mock_log_debug.assert_called_once_with(expected_msg, set(services))
def test__refresh_hash_ring_one_compute_new_compute(self):
services = []
@ -2817,6 +2828,26 @@ class NodeCacheTestCase(test.NoDBTestCase):
limit=0)
self.assertIsNotNone(self.driver.node_cache_time)
def test__refresh_cache_same_host_different_case(self):
# Test that we treat Host1 and host1 as the same host
self.host = 'Host1'
self.flags(host=self.host)
instances = []
nodes = [
_get_cached_node(
uuid=uuidutils.generate_uuid(), instance_uuid=None),
_get_cached_node(
uuid=uuidutils.generate_uuid(), instance_uuid=None),
_get_cached_node(
uuid=uuidutils.generate_uuid(), instance_uuid=None),
]
hosts = ['host1', 'host1', 'host1']
self._test__refresh_cache(instances, nodes, hosts)
expected_cache = {n.uuid: n for n in nodes}
self.assertEqual(expected_cache, self.driver.node_cache)
def test__refresh_cache(self):
# normal operation, one compute service
instances = []

View File

@ -669,14 +669,15 @@ class IronicDriver(virt_driver.ComputeDriver):
for svc in service_list:
is_up = self.servicegroup_api.service_is_up(svc)
if is_up:
services.add(svc.host)
services.add(svc.host.lower())
# NOTE(jroll): always make sure this service is in the list, because
# only services that have something registered in the compute_nodes
# table will be here so far, and we might be brand new.
services.add(CONF.host)
services.add(CONF.host.lower())
self.hash_ring = hash_ring.HashRing(services,
partitions=_HASH_RING_PARTITIONS)
LOG.debug('Hash ring members are %s', services)
def _refresh_cache(self):
# NOTE(lucasagomes): limit == 0 is an indicator to continue
@ -698,7 +699,7 @@ class IronicDriver(virt_driver.ComputeDriver):
# nova while the service was down, and not yet reaped, will not be
# reported until the periodic task cleans it up.
elif (node.instance_uuid is None and
CONF.host in
CONF.host.lower() in
self.hash_ring.get_nodes(node.uuid.encode('utf-8'))):
node_cache[node.uuid] = node