diff --git a/watcher/decision_engine/model/collector/nova.py b/watcher/decision_engine/model/collector/nova.py index e9d965c23..e1b2c4a07 100644 --- a/watcher/decision_engine/model/collector/nova.py +++ b/watcher/decision_engine/model/collector/nova.py @@ -263,6 +263,10 @@ class ModelBuilder(object): detailed=True) if cnode: node_info = cnode[0] + # filter out baremetal node + if node_info.hypervisor_type == 'ironic': + LOG.debug("filtering out baremetal node: %s", node_name) + continue self.add_compute_node(node_info) # node.servers is a list of server objects # New in nova version 2.53 diff --git a/watcher/tests/decision_engine/cluster/test_model_builder.py b/watcher/tests/decision_engine/cluster/test_model_builder.py index c266ba10c..bb18d2b8e 100644 --- a/watcher/tests/decision_engine/cluster/test_model_builder.py +++ b/watcher/tests/decision_engine/cluster/test_model_builder.py @@ -173,3 +173,61 @@ class TestModelBuilder(base.BaseTestCase): 'hosttwo', servers=True, detailed=True) self.assertEqual( m_nova.return_value.get_compute_node_by_name.call_count, 2) + + @mock.patch.object(nova_helper, 'NovaHelper') + def test_add_physical_layer_with_baremetal_node(self, m_nova): + """""" + + m_nova.return_value.get_aggregate_list.return_value = \ + [mock.Mock(id=1, name='example'), + mock.Mock(id=5, name='example', hosts=['hostone', 'hosttwo'])] + + m_nova.return_value.get_service_list.return_value = \ + [mock.Mock(zone='av_b', host='hostthree'), + mock.Mock(zone='av_a', host='hostone')] + + compute_node = mock.Mock( + id='796fee99-65dd-4262-aa-fd2a1143faa6', + hypervisor_hostname='hostone', + hypervisor_type='QEMU', + state='TEST_STATE', + status='TEST_STATUS', + memory_mb=333, + free_disk_gb=222, + local_gb=111, + vcpus=4, + servers=[ + {'name': 'fake_instance', + 'uuid': 'ef500f7e-dac8-470f-960c-169486fce71b'} + ], + service={'id': 123, 'host': 'hostone', + 'disabled_reason': ''}, + ) + + baremetal_node = mock.Mock( + id='5f2d1b3d-4099-4623-b9-05148aefd6cb', + hypervisor_hostname='hosttwo', + hypervisor_type='ironic', + state='TEST_STATE', + status='TEST_STATUS', + ) + + m_nova.return_value.get_compute_node_by_name.side_effect = [ + [compute_node], [baremetal_node]] + + m_scope = [{"compute": [ + {"host_aggregates": [{"id": 5}]}, + {"availability_zones": [{"name": "av_a"}]} + ]}] + + t_nova_cluster = nova.ModelBuilder(mock.Mock()) + model = t_nova_cluster.execute(m_scope) + + compute_nodes = model.get_all_compute_nodes() + self.assertEqual(1, len(compute_nodes)) + m_nova.return_value.get_compute_node_by_name.assert_any_call( + 'hostone', servers=True, detailed=True) + m_nova.return_value.get_compute_node_by_name.assert_any_call( + 'hosttwo', servers=True, detailed=True) + self.assertEqual( + m_nova.return_value.get_compute_node_by_name.call_count, 2)