summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZuul <zuul@review.opendev.org>2021-04-10 07:02:35 +0000
committerGerrit Code Review <review@openstack.org>2021-04-10 07:02:35 +0000
commit2ed1664b12cf67cecb1d858b10d901b674a8149f (patch)
treeeb71b24fc9ba9cd334e914a5eca44fc40a992551
parent2bb0893d6a3cb16578b46aa687afdc29e827b9b8 (diff)
parent8fd01fad3e3f0a56f1971df1291529df3ef19a3f (diff)
downloadnova-stable/pike.tar.gz
Merge "Lowercase ironic driver hash ring and ignore case in cache" into stable/pikepike-eolstable/pike
-rw-r--r--nova/tests/unit/virt/ironic/test_driver.py33
-rw-r--r--nova/virt/ironic/driver.py7
2 files changed, 36 insertions, 4 deletions
diff --git a/nova/tests/unit/virt/ironic/test_driver.py b/nova/tests/unit/virt/ironic/test_driver.py
index 7ee03dfebf..12b2cc02fc 100644
--- a/nova/tests/unit/virt/ironic/test_driver.py
+++ b/nova/tests/unit/virt/ironic/test_driver.py
@@ -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 = []
diff --git a/nova/virt/ironic/driver.py b/nova/virt/ironic/driver.py
index b10951ee68..79786bd957 100644
--- a/nova/virt/ironic/driver.py
+++ b/nova/virt/ironic/driver.py
@@ -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