Merge "Add debug message to report calculated metric for workload_balance"
This commit is contained in:
@@ -192,15 +192,30 @@ class WorkloadBalance(base.WorkloadStabilizationBaseStrategy):
|
|||||||
if (free_res['vcpu'] >= required_cores and
|
if (free_res['vcpu'] >= required_cores and
|
||||||
free_res['memory'] >= required_mem and
|
free_res['memory'] >= required_mem and
|
||||||
free_res['disk'] >= required_disk):
|
free_res['disk'] >= required_disk):
|
||||||
if (self._meter == 'instance_cpu_usage' and
|
if self._meter == 'instance_cpu_usage':
|
||||||
((src_instance_workload + workload) <
|
usage = src_instance_workload + workload
|
||||||
self.threshold / 100 * host.vcpus)):
|
usage_percent = usage / host.vcpus * 100
|
||||||
destination_hosts.append(instance_data)
|
limit = self.threshold / 100 * host.vcpus
|
||||||
if (self._meter == 'instance_ram_usage' and
|
if usage < limit:
|
||||||
((src_instance_workload + workload) <
|
destination_hosts.append(instance_data)
|
||||||
self.threshold / 100 * host.memory)):
|
LOG.debug(f"Host {host.hostname} evaluated as destination "
|
||||||
destination_hosts.append(instance_data)
|
f"for {instance_to_migrate.uuid}. Host usage "
|
||||||
|
f"for cpu would be {usage_percent}."
|
||||||
|
f"The threshold is: {self.threshold}. "
|
||||||
|
f"selected: {usage < limit}"
|
||||||
|
)
|
||||||
|
if self._meter == 'instance_ram_usage':
|
||||||
|
usage = src_instance_workload + workload
|
||||||
|
usage_percent = usage / host.memory * 100
|
||||||
|
limit = self.threshold / 100 * host.memory
|
||||||
|
if usage < limit:
|
||||||
|
destination_hosts.append(instance_data)
|
||||||
|
LOG.debug(f"Host {host.hostname} evaluated as destination "
|
||||||
|
f"for {instance_to_migrate.uuid}. Host usage "
|
||||||
|
f"for ram would be {usage_percent}."
|
||||||
|
f"The threshold is: {self.threshold}. "
|
||||||
|
f"selected: {usage < limit}"
|
||||||
|
)
|
||||||
return destination_hosts
|
return destination_hosts
|
||||||
|
|
||||||
def group_hosts_by_cpu_or_ram_util(self):
|
def group_hosts_by_cpu_or_ram_util(self):
|
||||||
@@ -251,8 +266,10 @@ class WorkloadBalance(base.WorkloadStabilizationBaseStrategy):
|
|||||||
cluster_workload += node_workload
|
cluster_workload += node_workload
|
||||||
if self._meter == 'instance_cpu_usage':
|
if self._meter == 'instance_cpu_usage':
|
||||||
node_util = node_workload / node.vcpus * 100
|
node_util = node_workload / node.vcpus * 100
|
||||||
|
host_metric = 'host_cpu_usage_percent'
|
||||||
else:
|
else:
|
||||||
node_util = node_workload / node.memory * 100
|
node_util = node_workload / node.memory * 100
|
||||||
|
host_metric = 'host_ram_usage_percent'
|
||||||
|
|
||||||
instance_data = {
|
instance_data = {
|
||||||
'compute_node': node, self._meter: node_util,
|
'compute_node': node, self._meter: node_util,
|
||||||
@@ -262,6 +279,9 @@ class WorkloadBalance(base.WorkloadStabilizationBaseStrategy):
|
|||||||
overload_hosts.append(instance_data)
|
overload_hosts.append(instance_data)
|
||||||
else:
|
else:
|
||||||
nonoverload_hosts.append(instance_data)
|
nonoverload_hosts.append(instance_data)
|
||||||
|
LOG.debug(f"Host usage for {node_id}: {host_metric} is "
|
||||||
|
f"{node_util}. Higher than threshold {self.threshold}: "
|
||||||
|
f"{node_util >= self.threshold}")
|
||||||
|
|
||||||
avg_workload = 0
|
avg_workload = 0
|
||||||
if cluster_size != 0:
|
if cluster_size != 0:
|
||||||
|
|||||||
@@ -304,8 +304,8 @@ class FakeGnocchiMetrics(object):
|
|||||||
mock = {}
|
mock = {}
|
||||||
|
|
||||||
# node 0
|
# node 0
|
||||||
mock['INSTANCE_1'] = 30
|
mock['INSTANCE_1'] = 40
|
||||||
mock['73b09e16-35b7-4922-804e-e8f5d9b740fc'] = 12
|
mock['73b09e16-35b7-4922-804e-e8f5d9b740fc'] = 9
|
||||||
# node 1
|
# node 1
|
||||||
mock['INSTANCE_3'] = 12
|
mock['INSTANCE_3'] = 12
|
||||||
mock['INSTANCE_4'] = 12
|
mock['INSTANCE_4'] = 12
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ from unittest import mock
|
|||||||
from watcher.applier.loading import default
|
from watcher.applier.loading import default
|
||||||
from watcher.common import utils
|
from watcher.common import utils
|
||||||
from watcher.decision_engine.strategy import strategies
|
from watcher.decision_engine.strategy import strategies
|
||||||
|
from watcher.decision_engine.strategy.strategies import workload_balance
|
||||||
from watcher.tests.decision_engine.model import gnocchi_metrics
|
from watcher.tests.decision_engine.model import gnocchi_metrics
|
||||||
from watcher.tests.decision_engine.strategy.strategies.test_base \
|
from watcher.tests.decision_engine.strategy.strategies.test_base \
|
||||||
import TestBaseStrategy
|
import TestBaseStrategy
|
||||||
@@ -77,7 +78,7 @@ class TestWorkloadBalance(TestBaseStrategy):
|
|||||||
n1, n2, avg, w_map = self.strategy.group_hosts_by_cpu_or_ram_util()
|
n1, n2, avg, w_map = self.strategy.group_hosts_by_cpu_or_ram_util()
|
||||||
self.assertEqual(n1[0]['compute_node'].uuid, 'Node_0')
|
self.assertEqual(n1[0]['compute_node'].uuid, 'Node_0')
|
||||||
self.assertEqual(n2[0]['compute_node'].uuid, 'Node_1')
|
self.assertEqual(n2[0]['compute_node'].uuid, 'Node_1')
|
||||||
self.assertEqual(avg, 33.0)
|
self.assertEqual(avg, 36.5)
|
||||||
|
|
||||||
def test_choose_instance_to_migrate(self):
|
def test_choose_instance_to_migrate(self):
|
||||||
model = self.fake_c_cluster.generate_scenario_6_with_2_nodes()
|
model = self.fake_c_cluster.generate_scenario_6_with_2_nodes()
|
||||||
@@ -99,7 +100,8 @@ class TestWorkloadBalance(TestBaseStrategy):
|
|||||||
n1, avg, w_map)
|
n1, avg, w_map)
|
||||||
self.assertIsNone(instance_to_mig)
|
self.assertIsNone(instance_to_mig)
|
||||||
|
|
||||||
def test_filter_destination_hosts(self):
|
@mock.patch.object(workload_balance.LOG, 'debug', autospec=True)
|
||||||
|
def test_filter_destination_hosts_cpu(self, mock_debug):
|
||||||
model = self.fake_c_cluster.generate_scenario_6_with_2_nodes()
|
model = self.fake_c_cluster.generate_scenario_6_with_2_nodes()
|
||||||
self.m_c_model.return_value = model
|
self.m_c_model.return_value = model
|
||||||
self.strategy.datasource = mock.MagicMock(
|
self.strategy.datasource = mock.MagicMock(
|
||||||
@@ -111,6 +113,42 @@ class TestWorkloadBalance(TestBaseStrategy):
|
|||||||
n2, instance_to_mig[1], avg, w_map)
|
n2, instance_to_mig[1], avg, w_map)
|
||||||
self.assertEqual(len(dest_hosts), 1)
|
self.assertEqual(len(dest_hosts), 1)
|
||||||
self.assertEqual(dest_hosts[0]['compute_node'].uuid, 'Node_1')
|
self.assertEqual(dest_hosts[0]['compute_node'].uuid, 'Node_1')
|
||||||
|
expected_calls = [
|
||||||
|
mock.call('Host usage for Node_0: host_cpu_usage_percent is 32.5. '
|
||||||
|
'Higher than threshold 25.0: True'),
|
||||||
|
mock.call('Host usage for Node_1: host_cpu_usage_percent is 7.5. '
|
||||||
|
'Higher than threshold 25.0: False'),
|
||||||
|
mock.call('Host hostname_1 evaluated as destination for '
|
||||||
|
'73b09e16-35b7-4922-804e-e8f5d9b740fc. Host usage for '
|
||||||
|
'cpu would be 20.0.The threshold is: 25.0. selected: '
|
||||||
|
'True')]
|
||||||
|
mock_debug.assert_has_calls(expected_calls, any_order=True)
|
||||||
|
|
||||||
|
@mock.patch.object(workload_balance.LOG, 'debug', autospec=True)
|
||||||
|
def test_filter_destination_hosts_ram(self, mock_debug):
|
||||||
|
model = self.fake_c_cluster.generate_scenario_6_with_2_nodes()
|
||||||
|
self.m_c_model.return_value = model
|
||||||
|
self.strategy._meter = 'instance_ram_usage'
|
||||||
|
self.strategy.threshold = 30.0
|
||||||
|
self.strategy.datasource = mock.MagicMock(
|
||||||
|
statistic_aggregation=self.fake_metrics.mock_get_statistics_wb)
|
||||||
|
n1, n2, avg, w_map = self.strategy.group_hosts_by_cpu_or_ram_util()
|
||||||
|
instance_to_mig = self.strategy.choose_instance_to_migrate(
|
||||||
|
n1, avg, w_map)
|
||||||
|
dest_hosts = self.strategy.filter_destination_hosts(
|
||||||
|
n2, instance_to_mig[1], avg, w_map)
|
||||||
|
self.assertEqual(len(dest_hosts), 1)
|
||||||
|
self.assertEqual(dest_hosts[0]['compute_node'].uuid, 'Node_1')
|
||||||
|
expected_calls = [
|
||||||
|
mock.call('Host usage for Node_0: host_ram_usage_percent is '
|
||||||
|
'37.121212121212125. Higher than threshold 30.0: True'),
|
||||||
|
mock.call('Host usage for Node_1: host_ram_usage_percent is '
|
||||||
|
'18.181818181818183. Higher than threshold 30.0: False'),
|
||||||
|
mock.call('Host hostname_1 evaluated as destination for '
|
||||||
|
'73b09e16-35b7-4922-804e-e8f5d9b740fc. Host usage for '
|
||||||
|
'ram would be 25.0.The threshold is: 30.0. selected: '
|
||||||
|
'True')]
|
||||||
|
mock_debug.assert_has_calls(expected_calls, any_order=True)
|
||||||
|
|
||||||
def test_execute_no_workload(self):
|
def test_execute_no_workload(self):
|
||||||
model = self.fake_c_cluster.\
|
model = self.fake_c_cluster.\
|
||||||
|
|||||||
Reference in New Issue
Block a user