diff --git a/nova/tests/unit/virt/ironic/test_driver.py b/nova/tests/unit/virt/ironic/test_driver.py index b5a4fc09afee..2b969916dd1f 100644 --- a/nova/tests/unit/virt/ironic/test_driver.py +++ b/nova/tests/unit/virt/ironic/test_driver.py @@ -3414,17 +3414,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 = [] @@ -3549,6 +3560,26 @@ class NodeCacheTestCase(test.NoDBTestCase): **kwargs) 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 75aca89e9bd7..21e62e62ffa3 100644 --- a/nova/virt/ironic/driver.py +++ b/nova/virt/ironic/driver.py @@ -784,14 +784,15 @@ class IronicDriver(virt_driver.ComputeDriver): if peer_list is None or svc.host in peer_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): ctxt = nova_context.get_admin_context() @@ -835,7 +836,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