From c91f6479f09b39ef6bbf0d18be79b1195d89521c Mon Sep 17 00:00:00 2001 From: licanwei Date: Thu, 26 Oct 2017 19:41:37 -0700 Subject: [PATCH] Server with PAUSE status can also live-migrate Closes-Bug: #1728477 Change-Id: I39a2672df842b62177fd0c4dbec7b92b398cfb96 --- .../strategies/vm_workload_consolidation.py | 3 ++- .../test_vm_workload_consolidation.py | 25 ++++++++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/watcher/decision_engine/strategy/strategies/vm_workload_consolidation.py b/watcher/decision_engine/strategy/strategies/vm_workload_consolidation.py index 6465a14b3..f03c47337 100644 --- a/watcher/decision_engine/strategy/strategies/vm_workload_consolidation.py +++ b/watcher/decision_engine/strategy/strategies/vm_workload_consolidation.py @@ -245,7 +245,8 @@ class VMWorkloadConsolidation(base.ServerConsolidationBaseStrategy): :return: None """ instance_state_str = self.get_instance_state_str(instance) - if instance_state_str != element.InstanceState.ACTIVE.value: + if instance_state_str not in (element.InstanceState.ACTIVE.value, + element.InstanceState.PAUSED.value): # Watcher currently only supports live VM migration and block live # VM migration which both requires migrated VM to be active. # When supported, the cold migration may be used as a fallback diff --git a/watcher/tests/decision_engine/strategy/strategies/test_vm_workload_consolidation.py b/watcher/tests/decision_engine/strategy/strategies/test_vm_workload_consolidation.py index e09fdd86a..331e5a90a 100644 --- a/watcher/tests/decision_engine/strategy/strategies/test_vm_workload_consolidation.py +++ b/watcher/tests/decision_engine/strategy/strategies/test_vm_workload_consolidation.py @@ -22,6 +22,7 @@ import datetime 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 @@ -131,7 +132,7 @@ class TestVMWorkloadConsolidation(base.TestCase): expected_cru = {'cpu': 0.05, 'disk': 0.05, 'ram': 0.0234375} self.assertEqual(expected_cru, cru) - def test_add_migration(self): + def test_add_migration_with_active_state(self): model = self.fake_cluster.generate_scenario_1() self.m_model.return_value = model self.fake_metrics.model = model @@ -148,6 +149,28 @@ class TestVMWorkloadConsolidation(base.TestCase): 'resource_id': instance_uuid}} self.assertEqual(expected, self.strategy.solution.actions[0]) + def test_add_migration_with_paused_state(self): + model = self.fake_cluster.generate_scenario_1() + self.m_model.return_value = model + self.fake_metrics.model = model + n1 = model.get_node_by_uuid('Node_0') + n2 = model.get_node_by_uuid('Node_1') + instance_uuid = 'INSTANCE_0' + instance = model.get_instance_by_uuid(instance_uuid) + setattr(instance, 'state', element.InstanceState.ERROR.value) + self.strategy.add_migration(instance, n1, n2) + self.assertEqual(0, len(self.strategy.solution.actions)) + + setattr(instance, 'state', element.InstanceState.PAUSED.value) + self.strategy.add_migration(instance, n1, n2) + self.assertEqual(1, len(self.strategy.solution.actions)) + expected = {'action_type': 'migrate', + 'input_parameters': {'destination_node': n2.uuid, + 'source_node': n1.uuid, + 'migration_type': 'live', + 'resource_id': instance_uuid}} + self.assertEqual(expected, self.strategy.solution.actions[0]) + def test_is_overloaded(self): model = self.fake_cluster.generate_scenario_1() self.m_model.return_value = model