From 5151b666fdd4b7f7b015976851235231bc45ded4 Mon Sep 17 00:00:00 2001 From: Hidekazu Nakamura Date: Wed, 16 Nov 2016 20:07:38 +0900 Subject: [PATCH] Change hardware.cpu_util in workload_stabilization In this change set, hardware.cpu_util is changed to compute.node.cpu.percent in workload_stabilization. By doing so, one can run this strategy on a simple devstack without having to setup the SNMP plugin. Change-Id: I8df8921337ea3f4e751c0c822d823e64e3ca7e1c --- .../strategies/workload_stabilization.py | 21 +++++++++++++------ .../strategies/test_workload_stabilization.py | 20 +++++++++--------- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/watcher/decision_engine/strategy/strategies/workload_stabilization.py b/watcher/decision_engine/strategy/strategies/workload_stabilization.py index 5e74ad0c5..c63bd3d55 100644 --- a/watcher/decision_engine/strategy/strategies/workload_stabilization.py +++ b/watcher/decision_engine/strategy/strategies/workload_stabilization.py @@ -31,6 +31,7 @@ import copy import itertools import math import random +import re import oslo_cache from oslo_config import cfg @@ -119,7 +120,7 @@ class WorkloadStabilization(base.WorkloadStabilizationBaseStrategy): "description": "Mapping to get hardware statistics using" " instance metrics", "type": "object", - "default": {"cpu_util": "hardware.cpu.util", + "default": {"cpu_util": "compute.node.cpu.percent", "memory.resident": "hardware.memory.used"} }, "host_choice": { @@ -224,7 +225,7 @@ class WorkloadStabilization(base.WorkloadStabilizationBaseStrategy): def get_hosts_load(self): """Get load of every available host by gathering instances load""" hosts_load = {} - for node_id in self.get_available_nodes(): + for node_id, node in self.get_available_nodes().items(): hosts_load[node_id] = {} host_vcpus = self.compute_model.get_resource_by_uuid( element.ResourceType.cpu_cores).get_capacity( @@ -232,19 +233,27 @@ class WorkloadStabilization(base.WorkloadStabilizationBaseStrategy): hosts_load[node_id]['vcpus'] = host_vcpus for metric in self.metrics: + + resource_id = '' + meter_name = self.instance_metrics[metric] + if re.match('^compute.node', meter_name) is not None: + resource_id = "%s_%s" % (node.uuid, node.hostname) + else: + resource_id = node_id + avg_meter = self.ceilometer.statistic_aggregation( - resource_id=node_id, + resource_id=resource_id, meter_name=self.instance_metrics[metric], period="60", aggregate='avg' ) if avg_meter is None: raise exception.NoSuchMetricForHost( - metric=self.instance_metrics[metric], + metric=meter_name, host=node_id) - if self.instance_metrics[metric] == 'hardware.memory.used': + if meter_name == 'hardware.memory.used': avg_meter /= oslo_utils.units.Ki - if self.instance_metrics[metric] == 'hardware.cpu.util': + if meter_name == 'compute.node.cpu.percent': avg_meter /= 100 hosts_load[node_id][metric] = avg_meter return hosts_load diff --git a/watcher/tests/decision_engine/strategy/strategies/test_workload_stabilization.py b/watcher/tests/decision_engine/strategy/strategies/test_workload_stabilization.py index 35c8fa194..14b0bb2d9 100644 --- a/watcher/tests/decision_engine/strategy/strategies/test_workload_stabilization.py +++ b/watcher/tests/decision_engine/strategy/strategies/test_workload_stabilization.py @@ -40,10 +40,10 @@ class TestWorkloadStabilization(base.TestCase): self.hosts_load_assert = { 'Node_0': {'cpu_util': 0.07, 'memory.resident': 7.0, 'vcpus': 40}, - 'Node_1': {'cpu_util': 0.05, 'memory.resident': 5, 'vcpus': 40}, - 'Node_2': {'cpu_util': 0.1, 'memory.resident': 29, 'vcpus': 40}, - 'Node_3': {'cpu_util': 0.04, 'memory.resident': 8, 'vcpus': 40}, - 'Node_4': {'cpu_util': 0.02, 'memory.resident': 4, 'vcpus': 40}} + 'Node_1': {'cpu_util': 0.07, 'memory.resident': 5, 'vcpus': 40}, + 'Node_2': {'cpu_util': 0.8, 'memory.resident': 29, 'vcpus': 40}, + 'Node_3': {'cpu_util': 0.05, 'memory.resident': 8, 'vcpus': 40}, + 'Node_4': {'cpu_util': 0.05, 'memory.resident': 4, 'vcpus': 40}} p_model = mock.patch.object( strategies.WorkloadStabilization, "compute_model", @@ -76,7 +76,7 @@ class TestWorkloadStabilization(base.TestCase): 'weights': {"cpu_util_weight": 1.0, "memory.resident_weight": 1.0}, 'instance_metrics': - {"cpu_util": "hardware.cpu.util", + {"cpu_util": "compute.node.cpu.percent", "memory.resident": "hardware.memory.used"}, 'host_choice': 'retry', 'retry_count': 1}) @@ -84,9 +84,9 @@ class TestWorkloadStabilization(base.TestCase): self.strategy.thresholds = {"cpu_util": 0.2, "memory.resident": 0.2} self.strategy.weights = {"cpu_util_weight": 1.0, "memory.resident_weight": 1.0} - self.strategy.instance_metrics = {"cpu_util": "hardware.cpu.util", - "memory.resident": - "hardware.memory.used"} + self.strategy.instance_metrics = { + "cpu_util": "compute.node.cpu.percent", + "memory.resident": "hardware.memory.used"} self.strategy.host_choice = 'retry' self.strategy.retry_count = 1 @@ -123,7 +123,7 @@ class TestWorkloadStabilization(base.TestCase): self.hosts_load_assert) def test_get_sd(self): - test_cpu_sd = 0.027 + test_cpu_sd = 0.296 test_ram_sd = 9.3 self.assertEqual( round(self.strategy.get_sd( @@ -144,7 +144,7 @@ class TestWorkloadStabilization(base.TestCase): self.hosts_load_assert, "INSTANCE_5", "Node_2", "Node_1")[-1][ "Node_1"] result['cpu_util'] = round(result['cpu_util'], 3) - self.assertEqual(result, {'cpu_util': 0.075, 'memory.resident': 21, + self.assertEqual(result, {'cpu_util': 0.095, 'memory.resident': 21.0, 'vcpus': 40}) def test_simulate_migrations(self):