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()