Merge "Prevent the migration of VM with 'optimize' False in VM metadata"
This commit is contained in:
@@ -48,7 +48,7 @@ class Instance(compute_resource.ComputeResource):
|
||||
"disk": wfields.IntegerField(),
|
||||
"disk_capacity": wfields.NonNegativeIntegerField(),
|
||||
"vcpus": wfields.NonNegativeIntegerField(),
|
||||
"metadata": wfields.DictField(),
|
||||
"metadata": wfields.JsonField(),
|
||||
}
|
||||
|
||||
def accept(self, visitor):
|
||||
|
||||
@@ -235,3 +235,10 @@ class ModelRoot(nx.DiGraph, base.Model):
|
||||
model.add_instance(instance)
|
||||
|
||||
return model
|
||||
|
||||
@classmethod
|
||||
def is_isomorphic(cls, G1, G2):
|
||||
def node_match(node1, node2):
|
||||
return node1.as_dict() == node2.as_dict()
|
||||
return nx.algorithms.isomorphism.isomorph.is_isomorphic(
|
||||
G1, G2, node_match=node_match)
|
||||
|
||||
@@ -39,6 +39,8 @@ which are dynamically loaded by Watcher at launch time.
|
||||
import abc
|
||||
import six
|
||||
|
||||
from oslo_utils import strutils
|
||||
|
||||
from watcher.common import clients
|
||||
from watcher.common import context
|
||||
from watcher.common import exception
|
||||
@@ -264,6 +266,22 @@ class BaseStrategy(loadable.Loadable):
|
||||
def state_collector(self, s):
|
||||
self._cluster_state_collector = s
|
||||
|
||||
def filter_instances_by_audit_tag(self, instances):
|
||||
if not self.config.check_optimize_metadata:
|
||||
return instances
|
||||
instances_to_migrate = []
|
||||
for instance in instances:
|
||||
optimize = True
|
||||
if instance.metadata:
|
||||
try:
|
||||
optimize = strutils.bool_from_string(
|
||||
instance.metadata.get('optimize'))
|
||||
except ValueError:
|
||||
optimize = False
|
||||
if optimize:
|
||||
instances_to_migrate.append(instance)
|
||||
return instances_to_migrate
|
||||
|
||||
|
||||
@six.add_metaclass(abc.ABCMeta)
|
||||
class DummyBaseStrategy(BaseStrategy):
|
||||
|
||||
@@ -159,7 +159,12 @@ class BasicConsolidation(base.ServerConsolidationBaseStrategy):
|
||||
"datasource",
|
||||
help="Data source to use in order to query the needed metrics",
|
||||
default="ceilometer",
|
||||
choices=["ceilometer", "monasca", "gnocchi"])
|
||||
choices=["ceilometer", "monasca", "gnocchi"]),
|
||||
cfg.BoolOpt(
|
||||
"check_optimize_metadata",
|
||||
help="Check optimize metadata field in instance before "
|
||||
"migration",
|
||||
default=False),
|
||||
]
|
||||
|
||||
@property
|
||||
@@ -437,9 +442,10 @@ class BasicConsolidation(base.ServerConsolidationBaseStrategy):
|
||||
def node_and_instance_score(self, sorted_scores):
|
||||
"""Get List of VMs from node"""
|
||||
node_to_release = sorted_scores[len(sorted_scores) - 1][0]
|
||||
instances_to_migrate = self.compute_model.get_node_instances(
|
||||
instances = self.compute_model.get_node_instances(
|
||||
self.compute_model.get_node_by_uuid(node_to_release))
|
||||
|
||||
instances_to_migrate = self.filter_instances_by_audit_tag(instances)
|
||||
instance_score = []
|
||||
for instance in instances_to_migrate:
|
||||
if instance.state == element.InstanceState.ACTIVE.value:
|
||||
|
||||
Reference in New Issue
Block a user