From 2ec8bc10cd93f5fbcf8893857bfe872e8bea0d70 Mon Sep 17 00:00:00 2001 From: licanwei Date: Fri, 13 Jan 2017 11:17:36 +0800 Subject: [PATCH] resolve KeyError exception In the optimize solution stage when launching audit based vm_workload_consolidation strategy. The instance map in node should change when migration action was removed. Otherwise a KeyError exception will be thrown. Change-Id: I054b6b12922892a02d155b4ddc001b19890d32c5 Closes-Bug: #1656157 --- .../strategies/vm_workload_consolidation.py | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/watcher/decision_engine/strategy/strategies/vm_workload_consolidation.py b/watcher/decision_engine/strategy/strategies/vm_workload_consolidation.py index 82bb9f80a..bfe811f35 100644 --- a/watcher/decision_engine/strategy/strategies/vm_workload_consolidation.py +++ b/watcher/decision_engine/strategy/strategies/vm_workload_consolidation.py @@ -171,16 +171,14 @@ class VMWorkloadConsolidation(base.ServerConsolidationBaseStrategy): destination_node_state_str = self.get_state_str(destination_node.state) if destination_node_state_str == element.ServiceState.DISABLED.value: self.add_action_enable_compute_node(destination_node) - model.mapping.unmap(source_node, instance) - model.mapping.map(destination_node, instance) - - params = {'migration_type': migration_type, - 'source_node': source_node.uuid, - 'destination_node': destination_node.uuid} - self.solution.add_action(action_type='migrate', - resource_id=instance.uuid, - input_parameters=params) - self.number_of_migrations += 1 + if model.migrate_instance(instance, source_node, destination_node): + params = {'migration_type': migration_type, + 'source_node': source_node.uuid, + 'destination_node': destination_node.uuid} + self.solution.add_action(action_type='migrate', + resource_id=instance.uuid, + input_parameters=params) + self.number_of_migrations += 1 def disable_unused_nodes(self, model): """Generate actions for disablity of unused nodes. @@ -404,9 +402,9 @@ class VMWorkloadConsolidation(base.ServerConsolidationBaseStrategy): for a in actions: self.solution.actions.remove(a) self.number_of_migrations -= 1 - if src_uuid != dst_uuid: - src_node = model.get_node_by_uuid(src_uuid) - dst_node = model.get_node_by_uuid(dst_uuid) + src_node = model.get_node_by_uuid(src_uuid) + dst_node = model.get_node_by_uuid(dst_uuid) + if model.migrate_instance(instance_uuid, dst_node, src_node): self.add_migration( instance_uuid, src_node, dst_node, model)