diff --git a/watcher/tests/decision_engine/model/data/scenario_1_with_all_nodes_disable.xml b/watcher/tests/decision_engine/model/data/scenario_1_with_all_nodes_disable.xml new file mode 100644 index 000000000..9db3d1019 --- /dev/null +++ b/watcher/tests/decision_engine/model/data/scenario_1_with_all_nodes_disable.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/watcher/tests/decision_engine/model/faker_cluster_state.py b/watcher/tests/decision_engine/model/faker_cluster_state.py index 66f2a4147..ee272ce45 100644 --- a/watcher/tests/decision_engine/model/faker_cluster_state.py +++ b/watcher/tests/decision_engine/model/faker_cluster_state.py @@ -136,6 +136,9 @@ class FakerModelCollector(base.BaseClusterDataModelCollector): def generate_scenario_1_with_1_node_unavailable(self): return self.load_model('scenario_1_with_1_node_unavailable.xml') + def generate_scenario_1_with_all_nodes_disable(self): + return self.load_model('scenario_1_with_all_nodes_disable.xml') + def generate_scenario_1_with_all_instances_exclude(self): return self.load_model('scenario_1_with_all_instances_exclude.xml') diff --git a/watcher/tests/decision_engine/strategy/strategies/test_host_maintenance.py b/watcher/tests/decision_engine/strategy/strategies/test_host_maintenance.py index a1a962942..5171097d1 100755 --- a/watcher/tests/decision_engine/strategy/strategies/test_host_maintenance.py +++ b/watcher/tests/decision_engine/strategy/strategies/test_host_maintenance.py @@ -20,6 +20,7 @@ import mock from watcher.common import exception +from watcher.decision_engine.model import element from watcher.decision_engine.model import model_root from watcher.decision_engine.strategy import strategies from watcher.tests import base @@ -60,6 +61,36 @@ class TestHostMaintenance(base.TestCase): exception.ClusterStateNotDefined, self.strategy.execute) + def test_get_instance_state_str(self): + mock_instance = mock.MagicMock(state="active") + self.assertEqual("active", + self.strategy.get_instance_state_str(mock_instance)) + + mock_instance.state = element.InstanceState("active") + self.assertEqual("active", + self.strategy.get_instance_state_str(mock_instance)) + + mock_instance.state = None + self.assertRaises( + exception.WatcherException, + self.strategy.get_instance_state_str, + mock_instance) + + def test_get_node_status_str(self): + mock_node = mock.MagicMock(status="enabled") + self.assertEqual("enabled", + self.strategy.get_node_status_str(mock_node)) + + mock_node.status = element.ServiceState("enabled") + self.assertEqual("enabled", + self.strategy.get_node_status_str(mock_node)) + + mock_node.status = None + self.assertRaises( + exception.WatcherException, + self.strategy.get_node_status_str, + mock_node) + def test_get_node_capacity(self): model = self.fake_cluster.generate_scenario_1() self.m_model.return_value = model @@ -172,6 +203,11 @@ class TestHostMaintenance(base.TestCase): self.assertFalse(self.strategy.safe_maintain(node_0)) self.assertFalse(self.strategy.safe_maintain(node_1)) + model = self.fake_cluster.generate_scenario_1_with_all_nodes_disable() + self.m_model.return_value = model + node_0 = model.get_node_by_uuid('Node_0') + self.assertTrue(self.strategy.safe_maintain(node_0)) + def test_try_maintain(self): model = self.fake_cluster.generate_scenario_1() self.m_model.return_value = model @@ -186,8 +222,14 @@ class TestHostMaintenance(base.TestCase): node_2 = model.get_node_by_uuid('Node_2') node_3 = model.get_node_by_uuid('Node_3') instance_4 = model.get_instance_by_uuid("INSTANCE_4") - if not self.strategy.safe_maintain(node_2, node_3): - self.strategy.try_maintain(node_2) + + result = self.strategy.pre_execute() + self.assertIsNone(result) + + self.strategy.input_parameters = {"maintenance_node": 'Node_2', + "backup_node": 'Node_3'} + self.strategy.do_execute() + expected = [{'action_type': 'change_nova_service_state', 'input_parameters': { 'resource_id': 'Node_3', @@ -204,3 +246,6 @@ class TestHostMaintenance(base.TestCase): 'migration_type': 'live', 'resource_id': instance_4.uuid}}] self.assertEqual(expected, self.strategy.solution.actions) + + result = self.strategy.post_execute() + self.assertIsNone(result)