From 42c1babfa48156ef846e1b79ed5df07c044ba835 Mon Sep 17 00:00:00 2001
From: licanwei
Date: Sun, 22 Sep 2019 21:26:31 -0700
Subject: [PATCH] skip deleted instance when creating datamodel
Change-Id: Ic2ae4cb758eba32f1b1529a24d12a57ca93a2a82
Closes-Bug: #1844949
---
.../decision_engine/model/collector/nova.py | 4 ++++
.../decision_engine/cluster/test_nova_cdmc.py | 19 +++++++++++++++++--
2 files changed, 21 insertions(+), 2 deletions(-)
diff --git a/watcher/decision_engine/model/collector/nova.py b/watcher/decision_engine/model/collector/nova.py
index f38f76a5d..6e6bc2771 100644
--- a/watcher/decision_engine/model/collector/nova.py
+++ b/watcher/decision_engine/model/collector/nova.py
@@ -382,6 +382,10 @@ class NovaModelBuilder(base.BaseModelBuilder):
instances = self.call_retry(f=self.nova_helper.get_instance_list,
filters=filters, limit=limit)
for inst in instances:
+ # skip deleted instance
+ if getattr(inst, "OS-EXT-STS:vm_state") == (
+ element.InstanceState.DELETED.value):
+ continue
# Add Node
instance = self._build_instance_node(inst)
self.model.add_instance(instance)
diff --git a/watcher/tests/decision_engine/cluster/test_nova_cdmc.py b/watcher/tests/decision_engine/cluster/test_nova_cdmc.py
index 97775ec6e..e6399e071 100644
--- a/watcher/tests/decision_engine/cluster/test_nova_cdmc.py
+++ b/watcher/tests/decision_engine/cluster/test_nova_cdmc.py
@@ -175,11 +175,26 @@ class TestNovaModelBuilder(base.TestCase):
model_builder.model = mock.MagicMock()
mock_node = mock.MagicMock()
mock_host = mock_node.service["host"]
- mock_instances = [mock.MagicMock()]
+ inst1 = mock.MagicMock(
+ id='ef500f7e-dac8-470f-960c-169486fce711',
+ tenant_id='ff560f7e-dbc8-771f-960c-164482fce21b')
+ setattr(inst1, 'OS-EXT-STS:vm_state', 'deleted')
+ setattr(inst1, 'name', 'instance1')
+ inst2 = mock.MagicMock(
+ id='ef500f7e-dac8-470f-960c-169486fce722',
+ tenant_id='ff560f7e-dbc8-771f-960c-164482fce21b')
+ setattr(inst2, 'OS-EXT-STS:vm_state', 'active')
+ setattr(inst2, 'name', 'instance2')
+ mock_instances = [inst1, inst2]
+ model_builder.nova_helper.get_instance_list.return_value = (
+ mock_instances)
model_builder.add_instance_node(mock_node, mock_instances)
# verify that when len(instances) <= 1000, limit == len(instance).
model_builder.nova_helper.get_instance_list.assert_called_once_with(
- filters={'host': mock_host}, limit=1)
+ filters={'host': mock_host}, limit=2)
+ fake_instance = model_builder._build_instance_node(inst2)
+ model_builder.model.add_instance.assert_called_once_with(
+ fake_instance)
# verify that when len(instances) > 1000, limit == -1.
mock_instance = mock.Mock()