diff --git a/nova/scheduler/weights/metrics.py b/nova/scheduler/weights/metrics.py index c9cc4b4077d0..ca5355129614 100644 --- a/nova/scheduler/weights/metrics.py +++ b/nova/scheduler/weights/metrics.py @@ -86,7 +86,7 @@ class MetricsWeigher(weights.BaseHostWeigher): # NOTE(sbauza): Keying a dict of Metrics per metric name given that we # have a MonitorMetricList object - metrics_dict = {m.name: m for m in host_state.metrics} + metrics_dict = {m.name: m for m in host_state.metrics or []} for (name, ratio) in self.setting: try: value += metrics_dict[name].value * ratio diff --git a/nova/tests/unit/scheduler/weights/test_weights_metrics.py b/nova/tests/unit/scheduler/weights/test_weights_metrics.py index 526969f33cc1..23f404f22797 100644 --- a/nova/tests/unit/scheduler/weights/test_weights_metrics.py +++ b/nova/tests/unit/scheduler/weights/test_weights_metrics.py @@ -74,6 +74,15 @@ class MetricsWeigherTestCase(test.NoDBTestCase): self.assertEqual(expected_weight, weighed_host.weight) self.assertEqual(expected_host, weighed_host.obj.host) + def test_single_resource_no_metrics(self): + setting = [idle + '=1'] + hostinfo_list = [fakes.FakeHostState('host1', 'node1', + {'metrics': None}), + fakes.FakeHostState('host2', 'node2', + {'metrics': None})] + self.assertRaises(exception.ComputeHostMetricNotFound, + self._get_weighed_host, hostinfo_list, setting) + def test_single_resource(self): # host1: idle=512 # host2: idle=1024