From 783627626c7a1d5156272cb3d61faa0a827e023c Mon Sep 17 00:00:00 2001 From: Hidekazu Nakamura Date: Tue, 1 Aug 2017 10:16:26 +0900 Subject: [PATCH] Fix compute CDM to include disabled compute node Currently compute CDM excludes disabled compute node. This patch set fixes compute CDM to include disabled compute node. Change-Id: I8236bb73e0d9bb242251c2abfb59ad5693087afa Closes-Bug: #1685787 --- watcher/common/nova_helper.py | 3 ++ watcher/decision_engine/scope/default.py | 8 ++--- .../decision_engine/scope/test_default.py | 32 +++++++++---------- 3 files changed, 23 insertions(+), 20 deletions(-) diff --git a/watcher/common/nova_helper.py b/watcher/common/nova_helper.py index 85252a86e..72dae4188 100644 --- a/watcher/common/nova_helper.py +++ b/watcher/common/nova_helper.py @@ -82,6 +82,9 @@ class NovaHelper(object): def get_availability_zone_list(self): return self.nova.availability_zones.list(detailed=True) + def get_service_list(self): + return self.nova.services.list(binary='nova-compute') + def find_instance(self, instance_id): return self.nova.servers.get(instance_id) diff --git a/watcher/decision_engine/scope/default.py b/watcher/decision_engine/scope/default.py index 4e74f6e2b..89ea48237 100644 --- a/watcher/decision_engine/scope/default.py +++ b/watcher/decision_engine/scope/default.py @@ -145,7 +145,7 @@ class DefaultScope(base.BaseScope): compute_nodes.extend(detailed_aggregate.hosts) def _collect_zones(self, availability_zones, allowed_nodes): - zone_list = self.wrapper.get_availability_zone_list() + service_list = self.wrapper.get_service_list() zone_names = [zone['name'] for zone in availability_zones] include_all_nodes = False @@ -155,9 +155,9 @@ class DefaultScope(base.BaseScope): else: raise exception.WildcardCharacterIsUsed( resource="availability zones") - for zone in zone_list: - if zone.zoneName in zone_names or include_all_nodes: - allowed_nodes.extend(zone.hosts.keys()) + for service in service_list: + if service.zone in zone_names or include_all_nodes: + allowed_nodes.extend(service.host) def exclude_resources(self, resources, **kwargs): instances_to_exclude = kwargs.get('instances') diff --git a/watcher/tests/decision_engine/scope/test_default.py b/watcher/tests/decision_engine/scope/test_default.py index 06e7572d5..04efe4451 100644 --- a/watcher/tests/decision_engine/scope/test_default.py +++ b/watcher/tests/decision_engine/scope/test_default.py @@ -32,20 +32,20 @@ class TestDefaultScope(base.TestCase): super(TestDefaultScope, self).setUp() self.fake_cluster = faker_cluster_state.FakerModelCollector() - @mock.patch.object(nova_helper.NovaHelper, 'get_availability_zone_list') + @mock.patch.object(nova_helper.NovaHelper, 'get_service_list') def test_get_scoped_model_with_zones_and_instances(self, mock_zone_list): cluster = self.fake_cluster.generate_scenario_1() audit_scope = fake_scopes.fake_scope_1 mock_zone_list.return_value = [ - mock.Mock(zoneName='AZ{0}'.format(i), - hosts={'Node_{0}'.format(i): {}}) + mock.Mock(zone='AZ{0}'.format(i), + host={'Node_{0}'.format(i): {}}) for i in range(2)] model = default.DefaultScope(audit_scope, mock.Mock(), osc=mock.Mock()).get_scoped_model(cluster) expected_edges = [('INSTANCE_2', 'Node_1')] self.assertEqual(sorted(expected_edges), sorted(model.edges())) - @mock.patch.object(nova_helper.NovaHelper, 'get_availability_zone_list') + @mock.patch.object(nova_helper.NovaHelper, 'get_service_list') def test_get_scoped_model_without_scope(self, mock_zone_list): model = self.fake_cluster.generate_scenario_1() default.DefaultScope([], mock.Mock(), @@ -125,26 +125,26 @@ class TestDefaultScope(base.TestCase): [{'name': 'HA_1'}, {'id': 0}], allowed_nodes) self.assertEqual(['Node_0', 'Node_1'], allowed_nodes) - @mock.patch.object(nova_helper.NovaHelper, 'get_availability_zone_list') + @mock.patch.object(nova_helper.NovaHelper, 'get_service_list') def test_collect_zones(self, mock_zone_list): allowed_nodes = [] mock_zone_list.return_value = [ - mock.Mock(zoneName="AZ{0}".format(i + 1), - hosts={'Node_{0}'.format(2 * i): 1, - 'Node_{0}'.format(2 * i + 1): 2}) + mock.Mock(zone="AZ{0}".format(i + 1), + host={'Node_{0}'.format(2 * i): 1, + 'Node_{0}'.format(2 * i + 1): 2}) for i in range(2)] default.DefaultScope([{'availability_zones': [{'name': "AZ1"}]}], mock.Mock(), osc=mock.Mock())._collect_zones( [{'name': "AZ1"}], allowed_nodes) self.assertEqual(['Node_0', 'Node_1'], sorted(allowed_nodes)) - @mock.patch.object(nova_helper.NovaHelper, 'get_availability_zone_list') + @mock.patch.object(nova_helper.NovaHelper, 'get_service_list') def test_zones_wildcard_is_used(self, mock_zone_list): allowed_nodes = [] mock_zone_list.return_value = [ - mock.Mock(zoneName="AZ{0}".format(i + 1), - hosts={'Node_{0}'.format(2 * i): 1, - 'Node_{0}'.format(2 * i + 1): 2}) + mock.Mock(zone="AZ{0}".format(i + 1), + host={'Node_{0}'.format(2 * i): 1, + 'Node_{0}'.format(2 * i + 1): 2}) for i in range(2)] default.DefaultScope([{'availability_zones': [{'name': "*"}]}], mock.Mock(), osc=mock.Mock())._collect_zones( @@ -152,13 +152,13 @@ class TestDefaultScope(base.TestCase): self.assertEqual(['Node_0', 'Node_1', 'Node_2', 'Node_3'], sorted(allowed_nodes)) - @mock.patch.object(nova_helper.NovaHelper, 'get_availability_zone_list') + @mock.patch.object(nova_helper.NovaHelper, 'get_service_list') def test_zones_wildcard_with_other_ids(self, mock_zone_list): allowed_nodes = [] mock_zone_list.return_value = [ - mock.Mock(zoneName="AZ{0}".format(i + 1), - hosts={'Node_{0}'.format(2 * i): 1, - 'Node_{0}'.format(2 * i + 1): 2}) + mock.Mock(zone="AZ{0}".format(i + 1), + host={'Node_{0}'.format(2 * i): 1, + 'Node_{0}'.format(2 * i + 1): 2}) for i in range(2)] scope_handler = default.DefaultScope( [{'availability_zones': [{'name': "*"}, {'name': 'AZ1'}]}],