diff --git a/nova/tests/unit/virt/ironic/test_driver.py b/nova/tests/unit/virt/ironic/test_driver.py index e18ecad2286e..8605bddfacca 100644 --- a/nova/tests/unit/virt/ironic/test_driver.py +++ b/nova/tests/unit/virt/ironic/test_driver.py @@ -3488,17 +3488,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 = [] @@ -3553,6 +3564,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 e6558547130c..16dc86c61abc 100644 --- a/nova/virt/ironic/driver.py +++ b/nova/virt/ironic/driver.py @@ -694,14 +694,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 @@ -723,7 +724,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