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