From da4c9125f73057fb3aed48b2bd5019379aa71f67 Mon Sep 17 00:00:00 2001 From: Jean-Emile DARTOIS Date: Tue, 1 Dec 2015 12:21:47 +0100 Subject: [PATCH] Fixed missing attribute in the data model Querying compute.node.* with Ceilometer requires some additional information in the cluster data model in order to build the resource_id. This patchset add the attribute hostname and change the query. Change-Id: Ifcefcd70a6d0f5967ab4f638ce077e38ef214f64 Closes-Bug: #1521559 --- .../{named_element.py => compute_resource.py} | 11 ++++++++++- watcher/decision_engine/model/hypervisor.py | 6 ++++-- watcher/decision_engine/model/vm.py | 5 +++-- .../strategy/basic_consolidation.py | 6 ++++-- .../cluster_model_collector/nova.py | 1 + .../decision_engine/faker_cluster_state.py | 10 ++++++++++ .../decision_engine/faker_metrics_collector.py | 18 +++++++++--------- .../model/test_named_element.py | 6 +++--- 8 files changed, 44 insertions(+), 19 deletions(-) rename watcher/decision_engine/model/{named_element.py => compute_resource.py} (83%) diff --git a/watcher/decision_engine/model/named_element.py b/watcher/decision_engine/model/compute_resource.py similarity index 83% rename from watcher/decision_engine/model/named_element.py rename to watcher/decision_engine/model/compute_resource.py index bf027e56a..02f42adc8 100644 --- a/watcher/decision_engine/model/named_element.py +++ b/watcher/decision_engine/model/compute_resource.py @@ -15,11 +15,12 @@ # limitations under the License. -class NamedElement(object): +class ComputeResource(object): def __init__(self): self._uuid = "" self._human_id = "" + self._hostname = "" @property def uuid(self): @@ -29,6 +30,14 @@ class NamedElement(object): def uuid(self, u): self._uuid = u + @property + def hostname(self): + return self._hostname + + @hostname.setter + def hostname(self, h): + self._hostname = h + @property def human_id(self): return self._human_id diff --git a/watcher/decision_engine/model/hypervisor.py b/watcher/decision_engine/model/hypervisor.py index 988bc1966..17be5be9b 100644 --- a/watcher/decision_engine/model/hypervisor.py +++ b/watcher/decision_engine/model/hypervisor.py @@ -13,13 +13,15 @@ # implied. # See the License for the specific language governing permissions and # limitations under the License. + +from watcher.decision_engine.model.compute_resource import ComputeResource from watcher.decision_engine.model.hypervisor_state import HypervisorState -from watcher.decision_engine.model.named_element import NamedElement from watcher.decision_engine.model.power_state import PowerState -class Hypervisor(NamedElement): +class Hypervisor(ComputeResource): def __init__(self): + super(Hypervisor, self).__init__() self._state = HypervisorState.ONLINE self._status = HypervisorState.ENABLED self._power_state = PowerState.g0 diff --git a/watcher/decision_engine/model/vm.py b/watcher/decision_engine/model/vm.py index ea17d28aa..0a0500bdc 100644 --- a/watcher/decision_engine/model/vm.py +++ b/watcher/decision_engine/model/vm.py @@ -13,12 +13,13 @@ # implied. # See the License for the specific language governing permissions and # limitations under the License. -from watcher.decision_engine.model.named_element import NamedElement +from watcher.decision_engine.model.compute_resource import ComputeResource from watcher.decision_engine.model.vm_state import VMState -class VM(NamedElement): +class VM(ComputeResource): def __init__(self): + super(VM, self).__init__() self._state = VMState.ACTIVE.value @property diff --git a/watcher/decision_engine/strategy/basic_consolidation.py b/watcher/decision_engine/strategy/basic_consolidation.py index 6d37568f8..040dd8cb3 100644 --- a/watcher/decision_engine/strategy/basic_consolidation.py +++ b/watcher/decision_engine/strategy/basic_consolidation.py @@ -257,8 +257,10 @@ class BasicConsolidation(BaseStrategy): :param model: :return: """ + resource_id = "{0}_{1}".format(hypervisor.uuid, + hypervisor.hostname) cpu_avg_vm = self.ceilometer. \ - statistic_aggregation(resource_id=hypervisor.uuid, + statistic_aggregation(resource_id=resource_id, meter_name='compute.node.cpu.percent', period="7200", aggregate='avg' @@ -266,7 +268,7 @@ class BasicConsolidation(BaseStrategy): if cpu_avg_vm is None: LOG.error( "No values returned for {0} compute.node.cpu.percent".format( - hypervisor.uuid)) + resource_id)) cpu_avg_vm = 100 cpu_capacity = model.get_resource_from_id( diff --git a/watcher/metrics_engine/cluster_model_collector/nova.py b/watcher/metrics_engine/cluster_model_collector/nova.py index 154211e63..63c8a8e5c 100644 --- a/watcher/metrics_engine/cluster_model_collector/nova.py +++ b/watcher/metrics_engine/cluster_model_collector/nova.py @@ -54,6 +54,7 @@ class NovaClusterModelCollector(BaseClusterModelCollector): # create hypervisor in cluster_model_collector hypervisor = Hypervisor() hypervisor.uuid = service.host + hypervisor.hostname = h.hypervisor_hostname # set capacity mem.set_capacity(hypervisor, h.memory_mb) disk.set_capacity(hypervisor, h.free_disk_gb) diff --git a/watcher/tests/decision_engine/faker_cluster_state.py b/watcher/tests/decision_engine/faker_cluster_state.py index cce526a3d..666260d08 100644 --- a/watcher/tests/decision_engine/faker_cluster_state.py +++ b/watcher/tests/decision_engine/faker_cluster_state.py @@ -58,8 +58,11 @@ class FakerModelCollector(BaseClusterModelCollector): for i in range(0, count_node): node_uuid = "Node_{0}".format(i) + hypervisor = Hypervisor() hypervisor.uuid = node_uuid + hypervisor.hostname = "host_{0}".format(i) + mem.set_capacity(hypervisor, 132) disk.set_capacity(hypervisor, 250) num_cores.set_capacity(hypervisor, 40) @@ -111,6 +114,7 @@ class FakerModelCollector(BaseClusterModelCollector): node_uuid = "Node_{0}".format(i) node = Hypervisor() node.uuid = node_uuid + node.hostname = "hostname_{0}".format(i) mem.set_capacity(node, 132) disk.set_capacity(node, 250) @@ -182,6 +186,7 @@ class FakerModelCollector(BaseClusterModelCollector): node_uuid = "Node_{0}".format(i) node = Hypervisor() node.uuid = node_uuid + node.hostname = "hostname_{0}".format(i) mem.set_capacity(node, 132) disk.set_capacity(node, 250) num_cores.set_capacity(node, 40) @@ -219,6 +224,8 @@ class FakerModelCollector(BaseClusterModelCollector): node_uuid = "Node_{0}".format(i) node = Hypervisor() node.uuid = node_uuid + node.hostname = "hostname_{0}".format(i) + mem.set_capacity(node, 132) disk.set_capacity(node, 250) num_cores.set_capacity(node, 40) @@ -281,6 +288,7 @@ class FakerModelCollector(BaseClusterModelCollector): node_uuid = "Node_{0}".format(i) node = Hypervisor() node.uuid = node_uuid + node.hostname = "hostname_{0}".format(i) mem.set_capacity(node, 132) disk.set_capacity(node, 250) @@ -328,6 +336,7 @@ class FakerModelCollector(BaseClusterModelCollector): node_uuid = "Node_{0}".format(i) node = Hypervisor() node.uuid = node_uuid + node.hostname = "hostname_{0}".format(i) mem.set_capacity(node, 1) disk.set_capacity(node, 1) @@ -359,6 +368,7 @@ class FakerModelCollector(BaseClusterModelCollector): node_uuid = "Node_" + str(i) node = Hypervisor() node.uuid = node_uuid + node.hostname = "hostname_{0}".format(i) mem.set_capacity(node, 4) disk.set_capacity(node, 4) diff --git a/watcher/tests/decision_engine/faker_metrics_collector.py b/watcher/tests/decision_engine/faker_metrics_collector.py index 553d1f276..6323cbf41 100644 --- a/watcher/tests/decision_engine/faker_metrics_collector.py +++ b/watcher/tests/decision_engine/faker_metrics_collector.py @@ -49,20 +49,20 @@ class FakerMetricsCollector(object): # Normalize mock = {} # node 0 - mock['Node_0'] = 7 - mock['Node_1'] = 7 + mock['Node_0_hostname_0'] = 7 + mock['Node_1_hostname_1'] = 7 # node 1 - mock['Node_2'] = 80 + mock['Node_2_hostname_2'] = 80 # node 2 - mock['Node_3'] = 5 - mock['Node_4'] = 5 - mock['Node_5'] = 10 + mock['Node_3_hostname_3'] = 5 + mock['Node_4_hostname_4'] = 5 + mock['Node_5_hostname_5'] = 10 # node 3 - mock['Node_6'] = 8 - mock['Node_19'] = 10 + mock['Node_6_hostname_6'] = 8 + mock['Node_19_hostname_19'] = 10 # node 4 - mock['VM_7'] = 4 + mock['VM_7_hostname_7'] = 4 if uuid not in mock.keys(): # mock[uuid] = random.randint(1, 4) diff --git a/watcher/tests/decision_engine/model/test_named_element.py b/watcher/tests/decision_engine/model/test_named_element.py index 015e439e3..76181a0c0 100644 --- a/watcher/tests/decision_engine/model/test_named_element.py +++ b/watcher/tests/decision_engine/model/test_named_element.py @@ -16,17 +16,17 @@ # See the License for the specific language governing permissions and # limitations under the License. # -from watcher.decision_engine.model.named_element import NamedElement +from watcher.decision_engine.model.compute_resource import ComputeResource from watcher.tests import base class TestNamedElement(base.BaseTestCase): def test_namedelement(self): - id = NamedElement() + id = ComputeResource() id.uuid = "BLABLABLA" self.assertEqual(id.uuid, "BLABLABLA") def test_set_get_human_id(self): - id = NamedElement() + id = ComputeResource() id.human_id = "BLABLABLA" self.assertEqual(id.human_id, "BLABLABLA")