From 256104a38a2f8d8f9445c86a5913fff7fabd9112 Mon Sep 17 00:00:00 2001
From: licanwei
Date: Wed, 10 Jul 2019 14:03:31 +0800
Subject: [PATCH] remove baremetal nodes when building CDM
aggregate list and availability_zone list may return ironic type
compute nodes. When building compute data model we should check
the hypervisor_type and remove ironic compute nodes.
Change-Id: Idf404c104c30368baf95ef7d05ad8fc3e7adca38
Related-Bug: #1835183
---
.../decision_engine/model/collector/nova.py | 4 ++
.../cluster/test_model_builder.py | 58 +++++++++++++++++++
2 files changed, 62 insertions(+)
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)