Merge "Add and identify excluded instances in compute CDM"
This commit is contained in:
@@ -42,6 +42,9 @@ class InstanceState(enum.Enum):
|
|||||||
class Instance(compute_resource.ComputeResource):
|
class Instance(compute_resource.ComputeResource):
|
||||||
|
|
||||||
fields = {
|
fields = {
|
||||||
|
# If the resource is excluded by the scope,
|
||||||
|
# 'watcher_exclude' property will be set True.
|
||||||
|
"watcher_exclude": wfields.BooleanField(default=False),
|
||||||
"state": wfields.StringField(default=InstanceState.ACTIVE.value),
|
"state": wfields.StringField(default=InstanceState.ACTIVE.value),
|
||||||
|
|
||||||
"memory": wfields.NonNegativeIntegerField(),
|
"memory": wfields.NonNegativeIntegerField(),
|
||||||
|
|||||||
@@ -36,6 +36,12 @@ class ComputeScope(base.BaseScope):
|
|||||||
node = cluster_model.get_node_by_uuid(node_name)
|
node = cluster_model.get_node_by_uuid(node_name)
|
||||||
cluster_model.delete_instance(instance, node)
|
cluster_model.delete_instance(instance, node)
|
||||||
|
|
||||||
|
def update_exclude_instance(self, cluster_model, instance, node_name):
|
||||||
|
node = cluster_model.get_node_by_uuid(node_name)
|
||||||
|
cluster_model.unmap_instance(instance, node)
|
||||||
|
instance.update({"watcher_exclude": True})
|
||||||
|
cluster_model.map_instance(instance, node)
|
||||||
|
|
||||||
def _check_wildcard(self, aggregate_list):
|
def _check_wildcard(self, aggregate_list):
|
||||||
if '*' in aggregate_list:
|
if '*' in aggregate_list:
|
||||||
if len(aggregate_list) == 1:
|
if len(aggregate_list) == 1:
|
||||||
@@ -108,8 +114,9 @@ class ComputeScope(base.BaseScope):
|
|||||||
self.remove_instance(cluster_model, instance, node_uuid)
|
self.remove_instance(cluster_model, instance, node_uuid)
|
||||||
cluster_model.remove_node(node)
|
cluster_model.remove_node(node)
|
||||||
|
|
||||||
def remove_instances_from_model(self, instances_to_remove, cluster_model):
|
def update_exclude_instance_in_model(
|
||||||
for instance_uuid in instances_to_remove:
|
self, instances_to_exclude, cluster_model):
|
||||||
|
for instance_uuid in instances_to_exclude:
|
||||||
try:
|
try:
|
||||||
node_name = cluster_model.get_node_by_instance_uuid(
|
node_name = cluster_model.get_node_by_instance_uuid(
|
||||||
instance_uuid).uuid
|
instance_uuid).uuid
|
||||||
@@ -119,7 +126,7 @@ class ComputeScope(base.BaseScope):
|
|||||||
" instance was hosted on.",
|
" instance was hosted on.",
|
||||||
instance_uuid)
|
instance_uuid)
|
||||||
continue
|
continue
|
||||||
self.remove_instance(
|
self.update_exclude_instance(
|
||||||
cluster_model,
|
cluster_model,
|
||||||
cluster_model.get_instance_by_uuid(instance_uuid),
|
cluster_model.get_instance_by_uuid(instance_uuid),
|
||||||
node_name)
|
node_name)
|
||||||
@@ -165,7 +172,7 @@ class ComputeScope(base.BaseScope):
|
|||||||
nodes=nodes_to_exclude,
|
nodes=nodes_to_exclude,
|
||||||
instance_metadata=instance_metadata)
|
instance_metadata=instance_metadata)
|
||||||
|
|
||||||
instances_to_remove = set(instances_to_exclude)
|
instances_to_exclude = set(instances_to_exclude)
|
||||||
if allowed_nodes:
|
if allowed_nodes:
|
||||||
nodes_to_remove = set(model_hosts) - set(allowed_nodes)
|
nodes_to_remove = set(model_hosts) - set(allowed_nodes)
|
||||||
nodes_to_remove.update(nodes_to_exclude)
|
nodes_to_remove.update(nodes_to_exclude)
|
||||||
@@ -174,8 +181,9 @@ class ComputeScope(base.BaseScope):
|
|||||||
|
|
||||||
if instance_metadata and self.config.check_optimize_metadata:
|
if instance_metadata and self.config.check_optimize_metadata:
|
||||||
self.exclude_instances_with_given_metadata(
|
self.exclude_instances_with_given_metadata(
|
||||||
instance_metadata, cluster_model, instances_to_remove)
|
instance_metadata, cluster_model, instances_to_exclude)
|
||||||
|
|
||||||
self.remove_instances_from_model(instances_to_remove, cluster_model)
|
self.update_exclude_instance_in_model(instances_to_exclude,
|
||||||
|
cluster_model)
|
||||||
|
|
||||||
return cluster_model
|
return cluster_model
|
||||||
|
|||||||
@@ -242,16 +242,22 @@ class TestComputeScope(base.TestCase):
|
|||||||
('INSTANCE_7', 'Node_4')]
|
('INSTANCE_7', 'Node_4')]
|
||||||
self.assertEqual(sorted(expected_edges), sorted(model.edges()))
|
self.assertEqual(sorted(expected_edges), sorted(model.edges()))
|
||||||
|
|
||||||
def test_remove_instances_from_model(self):
|
def test_update_exclude_instances_in_model(self):
|
||||||
model = self.fake_cluster.generate_scenario_1()
|
model = self.fake_cluster.generate_scenario_1()
|
||||||
compute.ComputeScope([], mock.Mock(),
|
compute.ComputeScope([], mock.Mock(),
|
||||||
osc=mock.Mock()).remove_instances_from_model(
|
osc=mock.Mock()).update_exclude_instance_in_model(
|
||||||
['INSTANCE_1', 'INSTANCE_2'], model)
|
['INSTANCE_1', 'INSTANCE_2'], model)
|
||||||
expected_edges = [
|
expected_edges = [
|
||||||
('INSTANCE_0', 'Node_0'),
|
('INSTANCE_0', 'Node_0'),
|
||||||
|
('INSTANCE_1', 'Node_0'),
|
||||||
|
('INSTANCE_2', 'Node_1'),
|
||||||
('INSTANCE_3', 'Node_2'),
|
('INSTANCE_3', 'Node_2'),
|
||||||
('INSTANCE_4', 'Node_2'),
|
('INSTANCE_4', 'Node_2'),
|
||||||
('INSTANCE_5', 'Node_2'),
|
('INSTANCE_5', 'Node_2'),
|
||||||
('INSTANCE_6', 'Node_3'),
|
('INSTANCE_6', 'Node_3'),
|
||||||
('INSTANCE_7', 'Node_4')]
|
('INSTANCE_7', 'Node_4')]
|
||||||
self.assertEqual(sorted(expected_edges), sorted(model.edges()))
|
self.assertEqual(sorted(expected_edges), sorted(model.edges()))
|
||||||
|
self.assertFalse(
|
||||||
|
model.get_instance_by_uuid('INSTANCE_0').watcher_exclude)
|
||||||
|
self.assertTrue(
|
||||||
|
model.get_instance_by_uuid('INSTANCE_1').watcher_exclude)
|
||||||
|
|||||||
Reference in New Issue
Block a user