From 5b741b2a4d91d8e4eeed6f7b8c0b83f547753975 Mon Sep 17 00:00:00 2001
From: licanwei
Date: Sun, 6 Aug 2017 23:16:16 -0700
Subject: [PATCH] Fix exception.ComputeNodeNotFound
compute_model.get_node_by_uuid(node_uuid) will raise a exception
when the compute node isn't in the compute model.
Closes-Bug: #1709004
Change-Id: I667a9dbfcf67f9f895976aadd5300bbea2ffe6f0
---
.../strategy/strategies/saving_energy.py | 4 ++-
.../strategy/strategies/test_saving_energy.py | 27 +++++++++++++++++++
2 files changed, 30 insertions(+), 1 deletion(-)
diff --git a/watcher/decision_engine/strategy/strategies/saving_energy.py b/watcher/decision_engine/strategy/strategies/saving_energy.py
index f31b90182..c49744419 100644
--- a/watcher/decision_engine/strategy/strategies/saving_energy.py
+++ b/watcher/decision_engine/strategy/strategies/saving_energy.py
@@ -129,7 +129,9 @@ class SavingEnergy(base.SavingEnergyBaseStrategy):
hypervisor_node = hypervisor_node.to_dict()
compute_service = hypervisor_node.get('service', None)
host_uuid = compute_service.get('host')
- if not self.compute_model.get_node_by_uuid(host_uuid):
+ try:
+ self.compute_model.get_node_by_uuid(host_uuid)
+ except wexc.ComputeNodeNotFound:
continue
if not (hypervisor_node.get('state') == 'up'):
diff --git a/watcher/tests/decision_engine/strategy/strategies/test_saving_energy.py b/watcher/tests/decision_engine/strategy/strategies/test_saving_energy.py
index df74fbda3..300e56cac 100644
--- a/watcher/tests/decision_engine/strategy/strategies/test_saving_energy.py
+++ b/watcher/tests/decision_engine/strategy/strategies/test_saving_energy.py
@@ -164,6 +164,33 @@ class TestSavingEnergy(base.TestCase):
self.assertEqual(len(self.strategy.free_poweron_node_pool), 0)
self.assertEqual(len(self.strategy.free_poweroff_node_pool), 2)
+ def test_get_hosts_pool_with_node_out_model(self):
+ mock_node1 = mock.Mock()
+ mock_node2 = mock.Mock()
+ mock_node1.to_dict.return_value = {
+ 'extra': {'compute_node_id': 1},
+ 'power_state': 'power off'}
+ mock_node2.to_dict.return_value = {
+ 'extra': {'compute_node_id': 2},
+ 'power_state': 'power off'}
+ self.m_ironic.node.get.side_effect = [mock_node1, mock_node2]
+
+ mock_hyper1 = mock.Mock()
+ mock_hyper2 = mock.Mock()
+ mock_hyper1.to_dict.return_value = {
+ 'running_vms': 0, 'service': {'host': 'Node_0'}, 'state': 'up'}
+ mock_hyper2.to_dict.return_value = {
+ 'running_vms': 0, 'service': {'host': 'Node_10'}, 'state': 'up'}
+ self.m_nova.hypervisors.get.side_effect = [mock_hyper1, mock_hyper2]
+
+ model = self.fake_cluster.generate_scenario_1()
+ self.m_model.return_value = model
+ self.strategy.get_hosts_pool()
+
+ self.assertEqual(len(self.strategy.with_vms_node_pool), 0)
+ self.assertEqual(len(self.strategy.free_poweron_node_pool), 0)
+ self.assertEqual(len(self.strategy.free_poweroff_node_pool), 1)
+
def test_save_energy_poweron(self):
self.strategy.free_poweroff_node_pool = [
'922d4762-0bc5-4b30-9cb9-48ab644dd861',