From ef0d133ba83005a69b31055ab4e6e11716a9f8fe Mon Sep 17 00:00:00 2001 From: Alexander Chadin Date: Mon, 17 Oct 2016 17:34:17 +0300 Subject: [PATCH] Transform KB into MB and normalize CPU This patch set normalizes CPU for hardware.cpu.util meter and transform KB into MB fetched from hardware.memory.used meter. Change-Id: I6dd1d053e81f06c3adb6fb256ac77bbf55a07f3e --- .../strategies/workload_stabilization.py | 7 ++++++ .../model/faker_metrics_collector.py | 23 +++++++++++-------- .../strategies/test_workload_stabilization.py | 20 ++++++++-------- 3 files changed, 30 insertions(+), 20 deletions(-) diff --git a/watcher/decision_engine/strategy/strategies/workload_stabilization.py b/watcher/decision_engine/strategy/strategies/workload_stabilization.py index 0d40cafc8..26bf264c4 100644 --- a/watcher/decision_engine/strategy/strategies/workload_stabilization.py +++ b/watcher/decision_engine/strategy/strategies/workload_stabilization.py @@ -25,6 +25,7 @@ import random import oslo_cache from oslo_config import cfg from oslo_log import log +import oslo_utils from watcher._i18n import _LI, _ from watcher.common import exception @@ -201,6 +202,8 @@ class WorkloadStabilization(base.WorkloadStabilizationBaseStrategy): if avg_meter is None: raise exception.NoMetricValuesForInstance( resource_id=instance_uuid, metric_name=meter) + if meter == 'cpu_util': + avg_meter /= float(100) instance_load[meter] = avg_meter return instance_load @@ -236,6 +239,10 @@ class WorkloadStabilization(base.WorkloadStabilizationBaseStrategy): raise exception.NoSuchMetricForHost( metric=self.instance_metrics[metric], host=node_id) + if self.instance_metrics[metric] == 'hardware.memory.used': + avg_meter /= oslo_utils.units.Ki + if self.instance_metrics[metric] == 'hardware.cpu.util': + avg_meter /= 100 hosts_load[node_id][metric] = avg_meter return hosts_load diff --git a/watcher/tests/decision_engine/model/faker_metrics_collector.py b/watcher/tests/decision_engine/model/faker_metrics_collector.py index 3fd93fec5..e2f0931a2 100644 --- a/watcher/tests/decision_engine/model/faker_metrics_collector.py +++ b/watcher/tests/decision_engine/model/faker_metrics_collector.py @@ -18,6 +18,8 @@ import random +import oslo_utils + class FakerMetricsCollector(object): def __init__(self): @@ -68,11 +70,12 @@ class FakerMetricsCollector(object): def get_usage_node_ram(self, uuid): mock = {} - mock['Node_0'] = 7 - mock['Node_1'] = 5 - mock['Node_2'] = 29 - mock['Node_3'] = 8 - mock['Node_4'] = 4 + # Ceilometer returns hardware.memory.used samples in KB. + mock['Node_0'] = 7*oslo_utils.units.Ki + mock['Node_1'] = 5*oslo_utils.units.Ki + mock['Node_2'] = 29*oslo_utils.units.Ki + mock['Node_3'] = 8*oslo_utils.units.Ki + mock['Node_4'] = 4*oslo_utils.units.Ki if uuid not in mock.keys(): # mock[uuid] = random.randint(1, 4) @@ -136,11 +139,11 @@ class FakerMetricsCollector(object): # node 4 mock['INSTANCE_7_hostname_7'] = 4 - mock['Node_0'] = 0.07 - mock['Node_1'] = 0.05 - mock['Node_2'] = 0.1 - mock['Node_3'] = 0.04 - mock['Node_4'] = 0.02 + mock['Node_0'] = 7 + mock['Node_1'] = 5 + mock['Node_2'] = 10 + mock['Node_3'] = 4 + mock['Node_4'] = 2 if uuid not in mock.keys(): # mock[uuid] = random.randint(1, 4) 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 16e4f79f2..d22ce2392 100644 --- a/watcher/tests/decision_engine/strategy/strategies/test_workload_stabilization.py +++ b/watcher/tests/decision_engine/strategy/strategies/test_workload_stabilization.py @@ -86,7 +86,7 @@ class TestWorkloadStabilization(base.TestCase): self.m_model.return_value = self.fake_cluster.generate_scenario_1() instance_0_dict = { 'uuid': 'INSTANCE_0', 'vcpus': 10, - 'cpu_util': 7, 'memory.resident': 2} + 'cpu_util': 0.07, 'memory.resident': 2} self.assertEqual( instance_0_dict, self.strategy.get_instance_load("INSTANCE_0")) @@ -106,9 +106,8 @@ class TestWorkloadStabilization(base.TestCase): def test_get_hosts_load(self): self.m_model.return_value = self.fake_cluster.generate_scenario_1() - self.assertEqual( - self.strategy.get_hosts_load(), - self.hosts_load_assert) + self.assertEqual(self.strategy.get_hosts_load(), + self.hosts_load_assert) def test_get_sd(self): test_cpu_sd = 0.027 @@ -128,11 +127,12 @@ class TestWorkloadStabilization(base.TestCase): def test_calculate_migration_case(self): self.m_model.return_value = self.fake_cluster.generate_scenario_1() - self.assertEqual( - self.strategy.calculate_migration_case( - self.hosts_load_assert, "INSTANCE_5", - "Node_2", "Node_1")[-1]["Node_1"], - {'cpu_util': 2.55, 'memory.resident': 21, 'vcpus': 40}) + result = self.strategy.calculate_migration_case( + 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, + 'vcpus': 40}) def test_simulate_migrations(self): model = self.fake_cluster.generate_scenario_1() @@ -174,7 +174,7 @@ class TestWorkloadStabilization(base.TestCase): ) with mock.patch.object(self.strategy, 'migrate') as mock_migrate: self.strategy.do_execute() - self.assertEqual(mock_migrate.call_count, 1) + self.assertEqual(mock_migrate.call_count, 2) def test_execute_nothing_to_migrate(self): self.m_model.return_value = self.fake_cluster.generate_scenario_1()