Integration of Ceilometer in Watcher
In current implementation is not easy to use ceilometer. Watcher must query metrics from the Telemetry v2 API to allow an easiest integration with OpenStack components (especially devstack). blueprint telemetry-integration Change-Id: Ide515472f1d160925d9f4aabf48c96dea4f6bc05
This commit is contained in:
@@ -1,25 +0,0 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
# Copyright (c) 2015 b<>com
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
# implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
from watcher.decision_engine.api.messaging.decision_engine_command import \
|
||||
DecisionEngineCommand
|
||||
from watcher.tests import base
|
||||
|
||||
|
||||
class TestDecisionEngineCommand(base.TestCase):
|
||||
def test_execute(self):
|
||||
DEC = DecisionEngineCommand()
|
||||
self.assertRaises(NotImplementedError, DEC.execute)
|
||||
@@ -1,30 +0,0 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
# Copyright (c) 2015 b<>com
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
# implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
from watcher.decision_engine.api.messaging.event_consumer import EventConsumer
|
||||
from watcher.tests import base
|
||||
|
||||
|
||||
class TestEventConsumer(base.TestCase):
|
||||
def test_set_messaging(self):
|
||||
messaging = "test message"
|
||||
EC = EventConsumer()
|
||||
EC.set_messaging(messaging)
|
||||
self.assertEqual(EC.messaging, messaging)
|
||||
|
||||
def test_execute(self):
|
||||
EC = EventConsumer()
|
||||
self.assertRaises(NotImplementedError, EC.execute, None, None, None)
|
||||
@@ -1,24 +0,0 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
# Copyright (c) 2015 b<>com
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
# implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
from watcher.decision_engine.api.planner.planner import Planner
|
||||
from watcher.tests import base
|
||||
|
||||
|
||||
class TestPlanner(base.TestCase):
|
||||
def test_schedule(self):
|
||||
pl = Planner()
|
||||
self.assertRaises(NotImplementedError, pl.schedule, None, None, None)
|
||||
@@ -1,26 +0,0 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
# Copyright (c) 2015 b<>com
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
# implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
'''from watcher.decision_engine.api.solution.solution import Solution
|
||||
from watcher.decision_engine.framework.model.model_root import ModelRoot
|
||||
from watcher.tests import base
|
||||
|
||||
class TestSolution(base.TestCase):
|
||||
def test_get_model(self):
|
||||
sol = Solution()
|
||||
current_model =
|
||||
sol.set_model(current_model)
|
||||
'''
|
||||
@@ -1,30 +0,0 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
# Copyright (c) 2015 b<>com
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
# implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
from watcher.decision_engine.api.solution.solution import Solution as sol
|
||||
from watcher.decision_engine.api.solution.solution_comparator import Solution
|
||||
from watcher.tests import base
|
||||
|
||||
|
||||
class test_Solution_Comparator(base.TestCase):
|
||||
def test_compare(self):
|
||||
sol1 = sol()
|
||||
sol2 = sol()
|
||||
solution_comparator = Solution()
|
||||
self.assertRaises(NotImplementedError,
|
||||
solution_comparator.compare,
|
||||
sol1,
|
||||
sol2)
|
||||
@@ -1,25 +0,0 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
# Copyright (c) 2015 b<>com
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
# implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
from watcher.decision_engine.api.solution.solution_evaluator import \
|
||||
SolutionEvaluator
|
||||
from watcher.tests import base
|
||||
|
||||
|
||||
class TestSolutionEvaluator(base.TestCase):
|
||||
def test_evaluate(self):
|
||||
SE = SolutionEvaluator()
|
||||
self.assertRaises(NotImplementedError, SE.evaluate, None)
|
||||
@@ -20,11 +20,11 @@ from watcher.tests import base
|
||||
|
||||
class TestMetaAction(base.TestCase):
|
||||
def test_get_priority(self):
|
||||
MA = MetaAction()
|
||||
MA.set_priority(3)
|
||||
self.assertEqual(MA.get_priority(), 3)
|
||||
ma = MetaAction()
|
||||
ma.priority = 3
|
||||
self.assertEqual(ma.priority, 3)
|
||||
|
||||
def test_get_level(self):
|
||||
MA = MetaAction()
|
||||
MA.set_level(5)
|
||||
self.assertEqual(MA.get_level(), 5)
|
||||
ma = MetaAction()
|
||||
ma.level = 5
|
||||
self.assertEqual(ma.level, 5)
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
# Copyright (c) 2015 b<>com
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
# implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
from watcher.decision_engine.api.strategy.selector import Selector
|
||||
from watcher.tests import base
|
||||
|
||||
|
||||
class TestSelector(base.TestCase):
|
||||
def test_define_from_goal(self):
|
||||
Sel = Selector()
|
||||
self.assertRaises(NotImplementedError, Sel.define_from_goal, None)
|
||||
@@ -1,25 +0,0 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
# Copyright (c) 2015 b<>com
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
# implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
from watcher.decision_engine.api.strategy.strategy_context import \
|
||||
StrategyContext
|
||||
from watcher.tests import base
|
||||
|
||||
|
||||
class TestStrategyContext(base.TestCase):
|
||||
def test_execute_strategy(self):
|
||||
SC = StrategyContext()
|
||||
self.assertRaises(NotImplementedError, SC.execute_strategy, None)
|
||||
@@ -24,15 +24,15 @@ from watcher.decision_engine.framework.model.model_root import ModelRoot
|
||||
from watcher.decision_engine.framework.model.resource import Resource
|
||||
from watcher.decision_engine.framework.model.resource import ResourceType
|
||||
from watcher.decision_engine.framework.model.vm import VM
|
||||
from watcher.metrics_engine.api.cluster_state_collector import \
|
||||
ClusterStateCollector
|
||||
from watcher.metrics_engine.cluster_model_collector.api import \
|
||||
BaseClusterModelCollector
|
||||
|
||||
|
||||
class FakerStateCollector(ClusterStateCollector):
|
||||
class FakerModelCollector(BaseClusterModelCollector):
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
def get_latest_state_cluster(self):
|
||||
def get_latest_cluster_data_model(self):
|
||||
return self.generate_scenario_1()
|
||||
|
||||
def generate_random(self, count_nodes, number_of_vm_per_node):
|
||||
@@ -57,7 +57,7 @@ class FakerStateCollector(ClusterStateCollector):
|
||||
current_state_cluster.create_resource(disk)
|
||||
|
||||
for i in range(0, count_node):
|
||||
node_uuid = "Node_" + str(i)
|
||||
node_uuid = "Node_{0}".format(i)
|
||||
hypervisor = Hypervisor()
|
||||
hypervisor.uuid = node_uuid
|
||||
mem.set_capacity(hypervisor, 132)
|
||||
@@ -67,7 +67,7 @@ class FakerStateCollector(ClusterStateCollector):
|
||||
current_state_cluster.add_hypervisor(hypervisor)
|
||||
|
||||
for i in range(0, count_vm):
|
||||
vm_uuid = "VM_" + str(i)
|
||||
vm_uuid = "VM_{0}".format(i)
|
||||
vm = VM()
|
||||
vm.uuid = vm_uuid
|
||||
# print("create "+str(vm))
|
||||
@@ -108,7 +108,7 @@ class FakerStateCollector(ClusterStateCollector):
|
||||
current_state_cluster.create_resource(disk)
|
||||
|
||||
for i in range(0, count_node):
|
||||
node_uuid = "Node_" + str(i)
|
||||
node_uuid = "Node_{0}".format(i)
|
||||
node = Hypervisor()
|
||||
node.uuid = node_uuid
|
||||
|
||||
@@ -119,7 +119,7 @@ class FakerStateCollector(ClusterStateCollector):
|
||||
current_state_cluster.add_hypervisor(node)
|
||||
|
||||
for i in range(0, count_vm):
|
||||
vm_uuid = "VM_" + str(i)
|
||||
vm_uuid = "VM_{0}".format(i)
|
||||
vm = VM()
|
||||
vm.uuid = vm_uuid
|
||||
# print("create "+str(vm))
|
||||
@@ -179,7 +179,7 @@ class FakerStateCollector(ClusterStateCollector):
|
||||
current_state_cluster.create_resource(disk)
|
||||
|
||||
for i in range(0, count_node):
|
||||
node_uuid = "Node_" + str(i)
|
||||
node_uuid = "Node_{0}".format(i)
|
||||
node = Hypervisor()
|
||||
node.uuid = node_uuid
|
||||
mem.set_capacity(node, 132)
|
||||
@@ -216,7 +216,7 @@ class FakerStateCollector(ClusterStateCollector):
|
||||
current_state_cluster.create_resource(disk)
|
||||
|
||||
for i in range(0, count_node):
|
||||
node_uuid = "Node_" + str(i)
|
||||
node_uuid = "Node_{0}".format(i)
|
||||
node = Hypervisor()
|
||||
node.uuid = node_uuid
|
||||
mem.set_capacity(node, 132)
|
||||
@@ -226,7 +226,7 @@ class FakerStateCollector(ClusterStateCollector):
|
||||
current_state_cluster.add_hypervisor(node)
|
||||
|
||||
for i in range(0, count_vm):
|
||||
vm_uuid = "VM_" + str(i)
|
||||
vm_uuid = "VM_{0}".format(i)
|
||||
vm = VM()
|
||||
vm.uuid = vm_uuid
|
||||
# print("create "+str(vm))
|
||||
@@ -237,21 +237,21 @@ class FakerStateCollector(ClusterStateCollector):
|
||||
current_state_cluster.add_vm(vm)
|
||||
indice = 0
|
||||
for j in range(0, 2):
|
||||
node_uuid = "Node_" + str(j)
|
||||
node_uuid = "Node_{0}".format(j)
|
||||
for i in range(indice, 3):
|
||||
vm_uuid = "VM_" + str(i)
|
||||
vm_uuid = "VM_{0}".format(i)
|
||||
self.map(current_state_cluster, node_uuid, vm_uuid)
|
||||
|
||||
for j in range(2, 5):
|
||||
node_uuid = "Node_" + str(j)
|
||||
node_uuid = "Node_{0}".format(j)
|
||||
for i in range(indice, 4):
|
||||
vm_uuid = "VM_" + str(i)
|
||||
vm_uuid = "VM_{0}".format(i)
|
||||
self.map(current_state_cluster, node_uuid, vm_uuid)
|
||||
|
||||
for j in range(5, 10):
|
||||
node_uuid = "Node_" + str(j)
|
||||
node_uuid = "Node_{0}".format(j)
|
||||
for i in range(indice, 4):
|
||||
vm_uuid = "VM_" + str(i)
|
||||
vm_uuid = "VM_{0}".format(i)
|
||||
self.map(current_state_cluster, node_uuid, vm_uuid)
|
||||
|
||||
return current_state_cluster
|
||||
@@ -278,7 +278,7 @@ class FakerStateCollector(ClusterStateCollector):
|
||||
current_state_cluster.create_resource(disk)
|
||||
|
||||
for i in range(0, count_node):
|
||||
node_uuid = "Node_" + str(i)
|
||||
node_uuid = "Node_{0}".format(i)
|
||||
node = Hypervisor()
|
||||
node.uuid = node_uuid
|
||||
|
||||
@@ -289,7 +289,7 @@ class FakerStateCollector(ClusterStateCollector):
|
||||
current_state_cluster.add_hypervisor(node)
|
||||
|
||||
for i in range(0, count_vm):
|
||||
vm_uuid = "VM_" + str(i)
|
||||
vm_uuid = "VM_{0}".format(i)
|
||||
vm = VM()
|
||||
vm.uuid = vm_uuid
|
||||
# print("create "+str(vm))
|
||||
@@ -325,7 +325,7 @@ class FakerStateCollector(ClusterStateCollector):
|
||||
current_state_cluster.create_resource(disk)
|
||||
|
||||
for i in range(0, count_node):
|
||||
node_uuid = "Node_" + str(i)
|
||||
node_uuid = "Node_{0}".format(i)
|
||||
node = Hypervisor()
|
||||
node.uuid = node_uuid
|
||||
|
||||
|
||||
@@ -19,93 +19,22 @@
|
||||
|
||||
import random
|
||||
|
||||
from watcher.metrics_engine.api.metrics_resource_collector import Measure
|
||||
from watcher.metrics_engine.api.metrics_resource_collector import \
|
||||
MetricsResourceCollector
|
||||
|
||||
|
||||
class FakerMetricsCollector(MetricsResourceCollector):
|
||||
class FakerMetricsCollector(object):
|
||||
def __init__(self):
|
||||
self.emptytype = ""
|
||||
|
||||
def empty_one_metric(self, emptytype):
|
||||
self.emptytype = emptytype
|
||||
|
||||
def get_measurement(self,
|
||||
metric,
|
||||
callback=None,
|
||||
start_time=None,
|
||||
end_time=None,
|
||||
filters=None,
|
||||
aggregation_function=None,
|
||||
intervals=None):
|
||||
|
||||
results = []
|
||||
if metric == "compute_cpu_user_percent_gauge":
|
||||
if self.emptytype == "CPU_COMPUTE":
|
||||
pass
|
||||
else:
|
||||
results.append(Measure(0, 5))
|
||||
elif metric == "instance_cpu_percent_gauge":
|
||||
results.append(
|
||||
self.get_average_usage_vm_cpu(filters[0].split('=')[1]))
|
||||
elif metric == "instance_memory_resident_used_bytes_gauge":
|
||||
results.append(
|
||||
self.get_average_usage_vm_memory(filters[0].split('=')[1]))
|
||||
elif metric == "instance_disk_used_bytes_gauge":
|
||||
if self.emptytype == "DISK_COMPUTE":
|
||||
pass
|
||||
else:
|
||||
results.append(
|
||||
self.get_average_usage_vm_disk(filters[0].split('=')[1]))
|
||||
elif metric == "compute_memory_used_bytes_gauge":
|
||||
if self.emptytype == "MEM_COMPUTE":
|
||||
pass
|
||||
else:
|
||||
results.append(self.get_usage_node_cpu(
|
||||
filters[0].split('=')[1]))
|
||||
elif metric == "compute_disk_size_used_bytes_gauge":
|
||||
if self.emptytype == "DISK_COMPUTE":
|
||||
pass
|
||||
else:
|
||||
results.append(self.get_usage_node_disk(
|
||||
filters[0].split('=')[1]))
|
||||
else:
|
||||
results.append(Measure(0, 0))
|
||||
return results
|
||||
|
||||
def get_usage_node_disk(self, uuid):
|
||||
"""The last VM CPU usage values to average
|
||||
|
||||
:param uuid:00
|
||||
:return:
|
||||
"""
|
||||
# query influxdb stream
|
||||
|
||||
# compute in stream
|
||||
|
||||
# Normalize
|
||||
mock = {}
|
||||
# node 0
|
||||
mock['Node_0'] = Measure(0, 7)
|
||||
mock['Node_1'] = Measure(0, 100)
|
||||
# node 1
|
||||
mock['Node_2'] = Measure(0, 10)
|
||||
# node 2
|
||||
mock['Node_3'] = Measure(0, 5)
|
||||
mock['Node_4'] = Measure(0, 5)
|
||||
mock['Node_5'] = Measure(0, 10)
|
||||
|
||||
# node 3
|
||||
mock['Node_6'] = Measure(0, 8)
|
||||
|
||||
# node 4
|
||||
mock['VM_7'] = Measure(0, 4)
|
||||
if uuid not in mock.keys():
|
||||
# mock[uuid] = random.randint(1, 4)
|
||||
mock[uuid] = Measure(0, 8)
|
||||
|
||||
return mock[str(uuid)]
|
||||
def mock_get_statistics(self, resource_id, meter_name, period,
|
||||
aggregate='avg'):
|
||||
result = 0
|
||||
if meter_name == "compute.node.cpu.percent":
|
||||
result = self.get_usage_node_cpu(resource_id)
|
||||
elif meter_name == "cpu_util":
|
||||
result = self.get_average_usage_vm_cpu(resource_id)
|
||||
return result
|
||||
|
||||
def get_usage_node_cpu(self, uuid):
|
||||
"""The last VM CPU usage values to average
|
||||
@@ -120,25 +49,26 @@ class FakerMetricsCollector(MetricsResourceCollector):
|
||||
# Normalize
|
||||
mock = {}
|
||||
# node 0
|
||||
mock['Node_0'] = Measure(0, 7)
|
||||
mock['Node_1'] = Measure(0, 7)
|
||||
mock['Node_0'] = 7
|
||||
mock['Node_1'] = 7
|
||||
# node 1
|
||||
mock['Node_2'] = Measure(0, 80)
|
||||
mock['Node_2'] = 80
|
||||
# node 2
|
||||
mock['Node_3'] = Measure(0, 5)
|
||||
mock['Node_4'] = Measure(0, 5)
|
||||
mock['Node_5'] = Measure(0, 10)
|
||||
mock['Node_3'] = 5
|
||||
mock['Node_4'] = 5
|
||||
mock['Node_5'] = 10
|
||||
|
||||
# node 3
|
||||
mock['Node_6'] = Measure(0, 8)
|
||||
|
||||
mock['Node_6'] = 8
|
||||
mock['Node_19'] = 10
|
||||
# node 4
|
||||
mock['VM_7'] = Measure(0, 4)
|
||||
mock['VM_7'] = 4
|
||||
|
||||
if uuid not in mock.keys():
|
||||
# mock[uuid] = random.randint(1, 4)
|
||||
mock[uuid] = Measure(0, 8)
|
||||
mock[uuid] = 8
|
||||
|
||||
return mock[str(uuid)]
|
||||
return float(mock[str(uuid)])
|
||||
|
||||
def get_average_usage_vm_cpu(self, uuid):
|
||||
"""The last VM CPU usage values to average
|
||||
@@ -153,70 +83,70 @@ class FakerMetricsCollector(MetricsResourceCollector):
|
||||
# Normalize
|
||||
mock = {}
|
||||
# node 0
|
||||
mock['VM_0'] = Measure(0, 7)
|
||||
mock['VM_1'] = Measure(0, 7)
|
||||
mock['VM_0'] = 7
|
||||
mock['VM_1'] = 7
|
||||
# node 1
|
||||
mock['VM_2'] = Measure(0, 10)
|
||||
mock['VM_2'] = 10
|
||||
# node 2
|
||||
mock['VM_3'] = Measure(0, 5)
|
||||
mock['VM_4'] = Measure(0, 5)
|
||||
mock['VM_5'] = Measure(0, 10)
|
||||
mock['VM_3'] = 5
|
||||
mock['VM_4'] = 5
|
||||
mock['VM_5'] = 10
|
||||
|
||||
# node 3
|
||||
mock['VM_6'] = Measure(0, 8)
|
||||
mock['VM_6'] = 8
|
||||
|
||||
# node 4
|
||||
mock['VM_7'] = Measure(0, 4)
|
||||
mock['VM_7'] = 4
|
||||
if uuid not in mock.keys():
|
||||
# mock[uuid] = random.randint(1, 4)
|
||||
mock[uuid] = Measure(0, 8)
|
||||
mock[uuid] = 8
|
||||
|
||||
return mock[str(uuid)]
|
||||
|
||||
def get_average_usage_vm_memory(self, uuid):
|
||||
mock = {}
|
||||
# node 0
|
||||
mock['VM_0'] = Measure(0, 2)
|
||||
mock['VM_1'] = Measure(0, 5)
|
||||
mock['VM_0'] = 2
|
||||
mock['VM_1'] = 5
|
||||
# node 1
|
||||
mock['VM_2'] = Measure(0, 5)
|
||||
mock['VM_2'] = 5
|
||||
# node 2
|
||||
mock['VM_3'] = Measure(0, 8)
|
||||
mock['VM_4'] = Measure(0, 5)
|
||||
mock['VM_5'] = Measure(0, 16)
|
||||
mock['VM_3'] = 8
|
||||
mock['VM_4'] = 5
|
||||
mock['VM_5'] = 16
|
||||
|
||||
# node 3
|
||||
mock['VM_6'] = Measure(0, 8)
|
||||
mock['VM_6'] = 8
|
||||
|
||||
# node 4
|
||||
mock['VM_7'] = Measure(0, 4)
|
||||
mock['VM_7'] = 4
|
||||
if uuid not in mock.keys():
|
||||
# mock[uuid] = random.randint(1, 4)
|
||||
mock[uuid] = Measure(0, 10)
|
||||
mock[uuid] = 10
|
||||
|
||||
return mock[str(uuid)]
|
||||
|
||||
def get_average_usage_vm_disk(self, uuid):
|
||||
mock = {}
|
||||
# node 0
|
||||
mock['VM_0'] = Measure(0, 2)
|
||||
mock['VM_1'] = Measure(0, 2)
|
||||
mock['VM_0'] = 2
|
||||
mock['VM_1'] = 2
|
||||
# node 1
|
||||
mock['VM_2'] = Measure(0, 2)
|
||||
mock['VM_2'] = 2
|
||||
# node 2
|
||||
mock['VM_3'] = Measure(0, 10)
|
||||
mock['VM_4'] = Measure(0, 15)
|
||||
mock['VM_5'] = Measure(0, 20)
|
||||
mock['VM_3'] = 10
|
||||
mock['VM_4'] = 15
|
||||
mock['VM_5'] = 20
|
||||
|
||||
# node 3
|
||||
mock['VM_6'] = Measure(0, 8)
|
||||
mock['VM_6'] = 8
|
||||
|
||||
# node 4
|
||||
mock['VM_7'] = Measure(0, 4)
|
||||
mock['VM_7'] = 4
|
||||
|
||||
if uuid not in mock.keys():
|
||||
# mock[uuid] = random.randint(1, 4)
|
||||
mock[uuid] = Measure(0, 4)
|
||||
mock[uuid] = 4
|
||||
|
||||
return mock[str(uuid)]
|
||||
|
||||
|
||||
@@ -23,14 +23,11 @@ from watcher.objects.audit import Audit
|
||||
from watcher.objects.audit import AuditStatus
|
||||
from watcher.tests.db.base import DbTestCase
|
||||
from watcher.tests.decision_engine.faker_cluster_state import \
|
||||
FakerStateCollector
|
||||
from watcher.tests.decision_engine.faker_metrics_collector import \
|
||||
FakerMetricsCollector
|
||||
FakerModelCollector
|
||||
from watcher.tests.objects import utils as obj_utils
|
||||
|
||||
|
||||
class TestTriggerAuditCommand(DbTestCase):
|
||||
|
||||
def setUp(self):
|
||||
super(TestTriggerAuditCommand, self).setUp()
|
||||
self.audit_template = obj_utils.create_test_audit_template(
|
||||
@@ -41,33 +38,26 @@ class TestTriggerAuditCommand(DbTestCase):
|
||||
|
||||
def test_trigger_audit_without_errors(self):
|
||||
try:
|
||||
statedb = FakerStateCollector()
|
||||
ressourcedb = FakerMetricsCollector()
|
||||
command = TriggerAuditCommand(MagicMock(), statedb, ressourcedb)
|
||||
model_collector = FakerModelCollector()
|
||||
command = TriggerAuditCommand(MagicMock(), model_collector)
|
||||
command.execute(self.audit.uuid, self.context)
|
||||
except Exception:
|
||||
self.fail("The audit should be trigged without error")
|
||||
|
||||
def test_trigger_audit_with_errors(self):
|
||||
try:
|
||||
command = TriggerAuditCommand(MagicMock(), 0, 0)
|
||||
command.execute(self.audit.uuid, self.context)
|
||||
except Exception:
|
||||
self.fail("The audit should be trigged with error")
|
||||
|
||||
def test_trigger_audit_state_succes(self):
|
||||
statedb = FakerStateCollector()
|
||||
ressourcedb = FakerMetricsCollector()
|
||||
command = TriggerAuditCommand(MagicMock(), statedb, ressourcedb)
|
||||
def test_trigger_audit_state_success(self):
|
||||
model_collector = FakerModelCollector()
|
||||
command = TriggerAuditCommand(MagicMock(), model_collector)
|
||||
command.strategy_context.execute_strategy = MagicMock()
|
||||
command.execute(self.audit.uuid, self.context)
|
||||
audit = Audit.get_by_uuid(self.context, self.audit.uuid)
|
||||
self.assertEqual(AuditStatus.SUCCESS, audit.state)
|
||||
|
||||
def test_trigger_audit_send_notification(self):
|
||||
messaging = MagicMock()
|
||||
statedb = FakerStateCollector()
|
||||
ressourcedb = FakerMetricsCollector()
|
||||
command = TriggerAuditCommand(messaging, statedb, ressourcedb)
|
||||
model_collector = FakerModelCollector()
|
||||
command = TriggerAuditCommand(messaging, model_collector)
|
||||
command.strategy_context.execute_strategy = MagicMock()
|
||||
|
||||
command.execute(self.audit.uuid, self.context)
|
||||
|
||||
call_on_going = call(Events.TRIGGER_AUDIT.name, {
|
||||
|
||||
@@ -15,17 +15,17 @@
|
||||
# limitations under the License.
|
||||
import mock
|
||||
from mock import MagicMock
|
||||
|
||||
from watcher.common import utils
|
||||
from watcher.decision_engine.framework.command.trigger_audit_command import \
|
||||
TriggerAuditCommand
|
||||
from watcher.decision_engine.framework.messaging.audit_endpoint import \
|
||||
AuditEndpoint
|
||||
from watcher.metrics_engine.framework.collector_manager import CollectorManager
|
||||
from watcher.metrics_engine.cluster_model_collector.manager import \
|
||||
CollectorManager
|
||||
from watcher.tests import base
|
||||
from watcher.tests.decision_engine.faker_cluster_state import \
|
||||
FakerStateCollector
|
||||
from watcher.tests.decision_engine.faker_metrics_collector import \
|
||||
FakerMetricsCollector
|
||||
FakerModelCollector
|
||||
|
||||
|
||||
class TriggerAuditCommandWithExecutor(TriggerAuditCommand):
|
||||
@@ -43,12 +43,11 @@ class TestAuditEndpoint(base.TestCase):
|
||||
|
||||
def test_do_trigger_audit(self):
|
||||
audit_uuid = utils.generate_uuid()
|
||||
statedb = FakerStateCollector()
|
||||
ressourcedb = FakerMetricsCollector()
|
||||
command = TriggerAuditCommand(MagicMock(), statedb, ressourcedb)
|
||||
model_collector = FakerModelCollector()
|
||||
command = TriggerAuditCommand(MagicMock(), model_collector)
|
||||
endpoint = AuditEndpoint(command)
|
||||
|
||||
with mock.patch.object(CollectorManager, 'get_statedb_collector') \
|
||||
with mock.patch.object(CollectorManager, 'get_cluster_model_collector') \
|
||||
as mock_call2:
|
||||
mock_call2.return_value = 0
|
||||
|
||||
@@ -61,10 +60,9 @@ class TestAuditEndpoint(base.TestCase):
|
||||
|
||||
def test_trigger_audit(self):
|
||||
audit_uuid = utils.generate_uuid()
|
||||
statedb = FakerStateCollector()
|
||||
ressourcedb = FakerMetricsCollector()
|
||||
model_collector = FakerModelCollector()
|
||||
command = TriggerAuditCommandWithExecutor(MagicMock(),
|
||||
statedb, ressourcedb)
|
||||
model_collector)
|
||||
endpoint = AuditEndpoint(command)
|
||||
|
||||
with mock.patch.object(TriggerAuditCommandWithExecutor, 'executor') \
|
||||
|
||||
@@ -21,12 +21,12 @@ from watcher.decision_engine.framework.model.hypervisor import Hypervisor
|
||||
from watcher.decision_engine.framework.model.vm_state import VMState
|
||||
from watcher.tests import base
|
||||
from watcher.tests.decision_engine.faker_cluster_state import \
|
||||
FakerStateCollector
|
||||
FakerModelCollector
|
||||
|
||||
|
||||
class TestMapping(base.BaseTestCase):
|
||||
def test_get_node_from_vm(self):
|
||||
fake_cluster = FakerStateCollector()
|
||||
fake_cluster = FakerModelCollector()
|
||||
model = fake_cluster.generate_scenario_4_with_2_hypervisors()
|
||||
|
||||
vms = model.get_all_vms()
|
||||
@@ -38,14 +38,14 @@ class TestMapping(base.BaseTestCase):
|
||||
self.assertEqual(node.uuid, 'Node_0')
|
||||
|
||||
def test_get_node_from_vm_id(self):
|
||||
fake_cluster = FakerStateCollector()
|
||||
fake_cluster = FakerModelCollector()
|
||||
model = fake_cluster.generate_scenario_4_with_2_hypervisors()
|
||||
|
||||
hyps = model.mapping.get_node_vms_from_id("BLABLABLA")
|
||||
self.assertEqual(hyps.__len__(), 0)
|
||||
|
||||
def test_get_all_vms(self):
|
||||
fake_cluster = FakerStateCollector()
|
||||
fake_cluster = FakerModelCollector()
|
||||
model = fake_cluster.generate_scenario_4_with_2_hypervisors()
|
||||
|
||||
vms = model.get_all_vms()
|
||||
@@ -56,7 +56,7 @@ class TestMapping(base.BaseTestCase):
|
||||
self.assertEqual(vms['VM_1'].uuid, 'VM_1')
|
||||
|
||||
def test_get_mapping(self):
|
||||
fake_cluster = FakerStateCollector()
|
||||
fake_cluster = FakerModelCollector()
|
||||
model = fake_cluster.generate_scenario_4_with_2_hypervisors()
|
||||
|
||||
mapping_vm = model.mapping.get_mapping_vm()
|
||||
@@ -65,7 +65,7 @@ class TestMapping(base.BaseTestCase):
|
||||
self.assertEqual(mapping_vm['VM_1'], 'Node_1')
|
||||
|
||||
def test_migrate_vm(self):
|
||||
fake_cluster = FakerStateCollector()
|
||||
fake_cluster = FakerModelCollector()
|
||||
model = fake_cluster.generate_scenario_4_with_2_hypervisors()
|
||||
vms = model.get_all_vms()
|
||||
keys = vms.keys()
|
||||
@@ -80,12 +80,12 @@ class TestMapping(base.BaseTestCase):
|
||||
self.assertEqual(model.mapping.migrate_vm(vm1, hyp0, hyp1), True)
|
||||
|
||||
def test_unmap_from_id_log_warning(self):
|
||||
fake_cluster = FakerStateCollector()
|
||||
fake_cluster = FakerModelCollector()
|
||||
model = fake_cluster.generate_scenario_4_with_2_hypervisors()
|
||||
vms = model.get_all_vms()
|
||||
keys = vms.keys()
|
||||
vm0 = vms[keys[0]]
|
||||
id = str(uuid.uuid4())
|
||||
id = "{0}".format(uuid.uuid4())
|
||||
hypervisor = Hypervisor()
|
||||
hypervisor.uuid = id
|
||||
|
||||
@@ -94,7 +94,7 @@ class TestMapping(base.BaseTestCase):
|
||||
# hypervisor.uuid)), 1)
|
||||
|
||||
def test_unmap_from_id(self):
|
||||
fake_cluster = FakerStateCollector()
|
||||
fake_cluster = FakerModelCollector()
|
||||
model = fake_cluster.generate_scenario_4_with_2_hypervisors()
|
||||
vms = model.get_all_vms()
|
||||
keys = vms.keys()
|
||||
|
||||
@@ -24,14 +24,14 @@ from watcher.decision_engine.framework.model.hypervisor_state import \
|
||||
HypervisorState
|
||||
from watcher.decision_engine.framework.model.model_root import ModelRoot
|
||||
from watcher.tests.decision_engine.faker_cluster_state import \
|
||||
FakerStateCollector
|
||||
FakerModelCollector
|
||||
|
||||
from watcher.tests import base
|
||||
|
||||
|
||||
class TestModel(base.BaseTestCase):
|
||||
def test_model(self):
|
||||
fake_cluster = FakerStateCollector()
|
||||
fake_cluster = FakerModelCollector()
|
||||
model = fake_cluster.generate_scenario_1()
|
||||
|
||||
self.assertEqual(len(model._hypervisors), 5)
|
||||
@@ -40,7 +40,7 @@ class TestModel(base.BaseTestCase):
|
||||
|
||||
def test_add_hypervisor(self):
|
||||
model = ModelRoot()
|
||||
id = str(uuid.uuid4())
|
||||
id = "{0}".format(uuid.uuid4())
|
||||
hypervisor = Hypervisor()
|
||||
hypervisor.uuid = id
|
||||
model.add_hypervisor(hypervisor)
|
||||
@@ -48,7 +48,7 @@ class TestModel(base.BaseTestCase):
|
||||
|
||||
def test_delete_hypervisor(self):
|
||||
model = ModelRoot()
|
||||
id = str(uuid.uuid4())
|
||||
id = "{0}".format(uuid.uuid4())
|
||||
hypervisor = Hypervisor()
|
||||
hypervisor.uuid = id
|
||||
model.add_hypervisor(hypervisor)
|
||||
@@ -60,7 +60,7 @@ class TestModel(base.BaseTestCase):
|
||||
def test_get_all_hypervisors(self):
|
||||
model = ModelRoot()
|
||||
for i in range(10):
|
||||
id = str(uuid.uuid4())
|
||||
id = "{0}".format(uuid.uuid4())
|
||||
hypervisor = Hypervisor()
|
||||
hypervisor.uuid = id
|
||||
model.add_hypervisor(hypervisor)
|
||||
@@ -71,7 +71,7 @@ class TestModel(base.BaseTestCase):
|
||||
|
||||
def test_set_get_state_hypervisors(self):
|
||||
model = ModelRoot()
|
||||
id = str(uuid.uuid4())
|
||||
id = "{0}".format(uuid.uuid4())
|
||||
hypervisor = Hypervisor()
|
||||
hypervisor.uuid = id
|
||||
model.add_hypervisor(hypervisor)
|
||||
@@ -95,23 +95,23 @@ class TestModel(base.BaseTestCase):
|
||||
# self.assert(len(model._vms))
|
||||
def test_hypervisor_from_id_raise(self):
|
||||
model = ModelRoot()
|
||||
id = str(uuid.uuid4())
|
||||
id = "{0}".format(uuid.uuid4())
|
||||
hypervisor = Hypervisor()
|
||||
hypervisor.uuid = id
|
||||
model.add_hypervisor(hypervisor)
|
||||
|
||||
id2 = str(uuid.uuid4())
|
||||
id2 = "{0}".format(uuid.uuid4())
|
||||
self.assertRaises(exception.HypervisorNotFound,
|
||||
model.get_hypervisor_from_id, id2)
|
||||
|
||||
def test_remove_hypervisor_raise(self):
|
||||
model = ModelRoot()
|
||||
id = str(uuid.uuid4())
|
||||
id = "{0}".format(uuid.uuid4())
|
||||
hypervisor = Hypervisor()
|
||||
hypervisor.uuid = id
|
||||
model.add_hypervisor(hypervisor)
|
||||
|
||||
id2 = str(uuid.uuid4())
|
||||
id2 = "{0}".format(uuid.uuid4())
|
||||
hypervisor2 = Hypervisor()
|
||||
hypervisor2.uuid = id2
|
||||
|
||||
@@ -120,7 +120,7 @@ class TestModel(base.BaseTestCase):
|
||||
|
||||
def test_assert_hypervisor_raise(self):
|
||||
model = ModelRoot()
|
||||
id = str(uuid.uuid4())
|
||||
id = "{0}".format(uuid.uuid4())
|
||||
hypervisor = Hypervisor()
|
||||
hypervisor.uuid = id
|
||||
model.add_hypervisor(hypervisor)
|
||||
@@ -128,7 +128,7 @@ class TestModel(base.BaseTestCase):
|
||||
model.assert_hypervisor, "objet_qcq")
|
||||
|
||||
def test_vm_from_id_raise(self):
|
||||
fake_cluster = FakerStateCollector()
|
||||
fake_cluster = FakerModelCollector()
|
||||
model = fake_cluster.generate_scenario_1()
|
||||
self.assertRaises(exception.VMNotFound,
|
||||
model.get_vm_from_id, "valeur_qcq")
|
||||
|
||||
@@ -31,7 +31,7 @@ class TestStrategySelector(base.BaseTestCase):
|
||||
exptected_strategy = 'basic'
|
||||
selected_strategy = self.strategy_loader.load(exptected_strategy)
|
||||
self.assertEqual(
|
||||
selected_strategy.get_name(),
|
||||
selected_strategy.name,
|
||||
exptected_strategy,
|
||||
'The default strategy should be basic')
|
||||
|
||||
|
||||
@@ -14,8 +14,8 @@
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
from watcher.decision_engine.framework.strategy.StrategyManagerImpl import \
|
||||
StrategyContextImpl
|
||||
from watcher.decision_engine.framework.strategy.strategy_context import \
|
||||
StrategyContext
|
||||
from watcher.tests import base
|
||||
|
||||
|
||||
@@ -27,6 +27,6 @@ class FakeStrategy(object):
|
||||
class TestStrategyContextImpl(base.BaseTestCase):
|
||||
def test_add_remove_strategy(self):
|
||||
strategy = FakeStrategy()
|
||||
strategy_context = StrategyContextImpl()
|
||||
strategy_context = StrategyContext()
|
||||
strategy_context.add_strategy(strategy)
|
||||
strategy_context.remove_strategy(strategy)
|
||||
|
||||
@@ -15,16 +15,18 @@
|
||||
# limitations under the License.
|
||||
|
||||
import mock
|
||||
from mock import MagicMock
|
||||
from watcher.common.exception import MetaActionNotFound
|
||||
from watcher.common import utils
|
||||
from watcher.db import api as db_api
|
||||
from watcher.decision_engine.framework.default_planner import DefaultPlanner
|
||||
from watcher.decision_engine.strategies.basic_consolidation import \
|
||||
BasicConsolidation
|
||||
|
||||
from watcher.tests.db import base
|
||||
from watcher.tests.db import utils as db_utils
|
||||
from watcher.tests.decision_engine.faker_cluster_state import \
|
||||
FakerStateCollector
|
||||
FakerModelCollector
|
||||
from watcher.tests.decision_engine.faker_metrics_collector import \
|
||||
FakerMetricsCollector
|
||||
from watcher.tests.objects import utils as obj_utils
|
||||
@@ -34,9 +36,10 @@ class SolutionFaker(object):
|
||||
@staticmethod
|
||||
def build():
|
||||
metrics = FakerMetricsCollector()
|
||||
current_state_cluster = FakerStateCollector()
|
||||
current_state_cluster = FakerModelCollector()
|
||||
sercon = BasicConsolidation("basic", "Basic offline consolidation")
|
||||
sercon.set_metrics_resource_collector(metrics)
|
||||
sercon.ceilometer = MagicMock(
|
||||
get_statistics=metrics.mock_get_statistics)
|
||||
return sercon.execute(current_state_cluster.generate_scenario_1())
|
||||
|
||||
|
||||
@@ -44,9 +47,11 @@ class SolutionFakerSingleHyp(object):
|
||||
@staticmethod
|
||||
def build():
|
||||
metrics = FakerMetricsCollector()
|
||||
current_state_cluster = FakerStateCollector()
|
||||
current_state_cluster = FakerModelCollector()
|
||||
sercon = BasicConsolidation("basic", "Basic offline consolidation")
|
||||
sercon.set_metrics_resource_collector(metrics)
|
||||
sercon.ceilometer = MagicMock(
|
||||
get_statistics=metrics.mock_get_statistics)
|
||||
|
||||
return sercon.execute(
|
||||
current_state_cluster.generate_scenario_4_with_2_hypervisors())
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ from watcher.decision_engine.framework.events.event_consumer_factory import \
|
||||
EventConsumerFactory
|
||||
|
||||
from watcher.common.messaging.events.event import Event
|
||||
from watcher.decision_engine.framework.manager_decision_engine import \
|
||||
from watcher.decision_engine.framework.manager import \
|
||||
DecisionEngineManager
|
||||
|
||||
from watcher.decision_engine.framework.messaging.events import Events
|
||||
|
||||
@@ -16,7 +16,11 @@
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
from collections import Counter
|
||||
|
||||
import mock
|
||||
from mock import MagicMock
|
||||
|
||||
from watcher.common import exception
|
||||
|
||||
from watcher.decision_engine.framework.meta_actions.hypervisor_state import \
|
||||
@@ -30,11 +34,9 @@ from watcher.decision_engine.strategies.basic_consolidation import \
|
||||
BasicConsolidation
|
||||
from watcher.tests import base
|
||||
from watcher.tests.decision_engine.faker_cluster_state import \
|
||||
FakerStateCollector
|
||||
FakerModelCollector
|
||||
from watcher.tests.decision_engine.faker_metrics_collector import \
|
||||
FakerMetricsCollector
|
||||
# from watcher.tests.decision_engine.faker_metrics_collector import \
|
||||
# FakerMetricsCollectorEmptyType
|
||||
|
||||
|
||||
class TestBasicConsolidation(base.BaseTestCase):
|
||||
@@ -42,7 +44,7 @@ class TestBasicConsolidation(base.BaseTestCase):
|
||||
fake_metrics = FakerMetricsCollector()
|
||||
|
||||
# fake cluster
|
||||
fake_cluster = FakerStateCollector()
|
||||
fake_cluster = FakerModelCollector()
|
||||
|
||||
def test_cluster_size(self):
|
||||
size_cluster = len(
|
||||
@@ -53,18 +55,20 @@ class TestBasicConsolidation(base.BaseTestCase):
|
||||
def test_basic_consolidation_score_hypervisor(self):
|
||||
cluster = self.fake_cluster.generate_scenario_1()
|
||||
sercon = BasicConsolidation()
|
||||
sercon.set_metrics_resource_collector(self.fake_metrics)
|
||||
node_1_score = 0.01666666666666668
|
||||
sercon.ceilometer = MagicMock(
|
||||
statistic_aggregation=self.fake_metrics.mock_get_statistics)
|
||||
|
||||
node_1_score = 0.023333333333333317
|
||||
self.assertEqual(
|
||||
sercon.calculate_score_node(
|
||||
cluster.get_hypervisor_from_id("Node_1"),
|
||||
cluster), node_1_score)
|
||||
node_2_score = 0.01666666666666668
|
||||
node_2_score = 0.26666666666666666
|
||||
self.assertEqual(
|
||||
sercon.calculate_score_node(
|
||||
cluster.get_hypervisor_from_id("Node_2"),
|
||||
cluster), node_2_score)
|
||||
node_0_score = 0.01666666666666668
|
||||
node_0_score = 0.023333333333333317
|
||||
self.assertEqual(
|
||||
sercon.calculate_score_node(
|
||||
cluster.get_hypervisor_from_id("Node_0"),
|
||||
@@ -73,7 +77,8 @@ class TestBasicConsolidation(base.BaseTestCase):
|
||||
def test_basic_consolidation_score_vm(self):
|
||||
cluster = self.fake_cluster.generate_scenario_1()
|
||||
sercon = BasicConsolidation()
|
||||
sercon.set_metrics_resource_collector(self.fake_metrics)
|
||||
sercon.ceilometer = MagicMock(
|
||||
statistic_aggregation=self.fake_metrics.mock_get_statistics)
|
||||
vm_0 = cluster.get_vm_from_id("VM_0")
|
||||
vm_0_score = 0.0
|
||||
self.assertEqual(sercon.calculate_score_vm(vm_0, cluster), vm_0_score)
|
||||
@@ -95,7 +100,8 @@ class TestBasicConsolidation(base.BaseTestCase):
|
||||
def test_basic_consolidation_score_vm_disk(self):
|
||||
cluster = self.fake_cluster.generate_scenario_5_with_vm_disk_0()
|
||||
sercon = BasicConsolidation()
|
||||
sercon.set_metrics_resource_collector(self.fake_metrics)
|
||||
sercon.ceilometer = MagicMock(
|
||||
statistic_aggregation=self.fake_metrics.mock_get_statistics)
|
||||
vm_0 = cluster.get_vm_from_id("VM_0")
|
||||
vm_0_score = 0.0
|
||||
self.assertEqual(sercon.calculate_score_vm(vm_0, cluster), vm_0_score)
|
||||
@@ -103,7 +109,8 @@ class TestBasicConsolidation(base.BaseTestCase):
|
||||
def test_basic_consolidation_weight(self):
|
||||
cluster = self.fake_cluster.generate_scenario_1()
|
||||
sercon = BasicConsolidation()
|
||||
sercon.set_metrics_resource_collector(self.fake_metrics)
|
||||
sercon.ceilometer = MagicMock(
|
||||
statistic_aggregation=self.fake_metrics.mock_get_statistics)
|
||||
vm_0 = cluster.get_vm_from_id("VM_0")
|
||||
cores = 16
|
||||
# 80 Go
|
||||
@@ -130,16 +137,13 @@ class TestBasicConsolidation(base.BaseTestCase):
|
||||
self.assertRaises(exception.ClusterEmpty, sercon.execute,
|
||||
model)
|
||||
|
||||
def test_calculate_score_vm_raise_metric_collector(self):
|
||||
sercon = BasicConsolidation()
|
||||
self.assertRaises(exception.MetricCollectorNotDefined,
|
||||
sercon.calculate_score_vm, "VM_1", None)
|
||||
|
||||
def test_calculate_score_vm_raise_cluster_state_not_found(self):
|
||||
metrics = FakerMetricsCollector()
|
||||
metrics.empty_one_metric("CPU_COMPUTE")
|
||||
sercon = BasicConsolidation()
|
||||
sercon.set_metrics_resource_collector(metrics)
|
||||
sercon.ceilometer = MagicMock(
|
||||
statistic_aggregation=self.fake_metrics.mock_get_statistics)
|
||||
|
||||
self.assertRaises(exception.ClusteStateNotDefined,
|
||||
sercon.calculate_score_vm, "VM_1", None)
|
||||
|
||||
@@ -168,7 +172,7 @@ class TestBasicConsolidation(base.BaseTestCase):
|
||||
|
||||
def test_check_migration(self):
|
||||
sercon = BasicConsolidation()
|
||||
fake_cluster = FakerStateCollector()
|
||||
fake_cluster = FakerModelCollector()
|
||||
model = fake_cluster.generate_scenario_4_with_2_hypervisors()
|
||||
|
||||
all_vms = model.get_all_vms()
|
||||
@@ -180,7 +184,7 @@ class TestBasicConsolidation(base.BaseTestCase):
|
||||
|
||||
def test_threshold(self):
|
||||
sercon = BasicConsolidation()
|
||||
fake_cluster = FakerStateCollector()
|
||||
fake_cluster = FakerModelCollector()
|
||||
model = fake_cluster.generate_scenario_4_with_2_hypervisors()
|
||||
|
||||
all_hyps = model.get_all_hypervisors()
|
||||
@@ -197,122 +201,48 @@ class TestBasicConsolidation(base.BaseTestCase):
|
||||
sercon.get_number_of_released_nodes()
|
||||
sercon.get_number_of_migrations()
|
||||
|
||||
def test_calculate_score_node_raise_1(self):
|
||||
sercon = BasicConsolidation()
|
||||
metrics = FakerStateCollector()
|
||||
|
||||
model = metrics.generate_scenario_4_with_2_hypervisors()
|
||||
all_hyps = model.get_all_hypervisors()
|
||||
hyp0 = all_hyps[all_hyps.keys()[0]]
|
||||
|
||||
self.assertRaises(exception.MetricCollectorNotDefined,
|
||||
sercon.calculate_score_node, hyp0, model)
|
||||
|
||||
def test_calculate_score_node_raise_cpu_compute(self):
|
||||
metrics = FakerMetricsCollector()
|
||||
metrics.empty_one_metric("CPU_COMPUTE")
|
||||
sercon = BasicConsolidation()
|
||||
sercon.set_metrics_resource_collector(metrics)
|
||||
current_state_cluster = FakerStateCollector()
|
||||
model = current_state_cluster.generate_scenario_4_with_2_hypervisors()
|
||||
|
||||
all_hyps = model.get_all_hypervisors()
|
||||
hyp0 = all_hyps[all_hyps.keys()[0]]
|
||||
|
||||
self.assertRaises(exception.NoDataFound,
|
||||
sercon.calculate_score_node, hyp0, model)
|
||||
|
||||
"""
|
||||
def test_calculate_score_node_raise_memory_compute(self):
|
||||
metrics = FakerMetricsCollector()
|
||||
metrics.empty_one_metric("MEM_COMPUTE")
|
||||
sercon = BasicConsolidation()
|
||||
sercon.set_metrics_resource_collector(metrics)
|
||||
current_state_cluster = FakerStateCollector()
|
||||
model = current_state_cluster.generate_scenario_4_with_2_hypervisors()
|
||||
|
||||
all_hyps = model.get_all_hypervisors()
|
||||
hyp0 = all_hyps[all_hyps.keys()[0]]
|
||||
self.assertRaises(exception.NoDataFound,
|
||||
sercon.calculate_score_node, hyp0, model)
|
||||
|
||||
def test_calculate_score_node_raise_disk_compute(self):
|
||||
metrics = FakerMetricsCollector()
|
||||
metrics.empty_one_metric("DISK_COMPUTE")
|
||||
sercon = BasicConsolidation()
|
||||
sercon.set_metrics_resource_collector(metrics)
|
||||
current_state_cluster = FakerStateCollector()
|
||||
model = current_state_cluster.generate_scenario_4_with_2_hypervisors()
|
||||
|
||||
all_hyps = model.get_all_hypervisors()
|
||||
hyp0 = all_hyps[all_hyps.keys()[0]]
|
||||
|
||||
self.assertRaises(exception.NoDataFound,
|
||||
sercon.calculate_score_node, hyp0, model)
|
||||
"""
|
||||
|
||||
def test_basic_consolidation_migration(self):
|
||||
sercon = BasicConsolidation()
|
||||
sercon.set_metrics_resource_collector(FakerMetricsCollector())
|
||||
solution = None
|
||||
solution = sercon.execute(FakerStateCollector().generate_scenario_1())
|
||||
sercon.ceilometer = MagicMock(
|
||||
statistic_aggregation=self.fake_metrics.mock_get_statistics)
|
||||
|
||||
count_migration = 0
|
||||
change_hypervisor_state = 0
|
||||
change_power_state = 0
|
||||
migrate = []
|
||||
for action in solution.meta_actions:
|
||||
if isinstance(action, Migrate):
|
||||
count_migration += 1
|
||||
migrate.append(action)
|
||||
if isinstance(action, ChangeHypervisorState):
|
||||
change_hypervisor_state += 1
|
||||
if isinstance(action, ChangePowerState):
|
||||
change_power_state += 1
|
||||
solution = sercon.execute(
|
||||
self.fake_cluster.generate_scenario_3())
|
||||
|
||||
# self.assertEqual(change_hypervisor_state, 1)
|
||||
# self.assertEqual(count_migration, 2)
|
||||
actions_counter = Counter(
|
||||
[type(action) for action in solution.meta_actions])
|
||||
|
||||
expected_num_migrations = 0
|
||||
expected_power_state = 0
|
||||
expected_change_hypervisor_state = 0
|
||||
|
||||
num_migrations = actions_counter.get(Migrate, 0)
|
||||
num_hypervisor_state_change = actions_counter.get(
|
||||
ChangeHypervisorState, 0)
|
||||
num_power_state_change = actions_counter.get(
|
||||
ChangePowerState, 0)
|
||||
|
||||
self.assertEqual(num_migrations, expected_num_migrations)
|
||||
self.assertEqual(num_hypervisor_state_change, expected_power_state)
|
||||
self.assertEqual(num_power_state_change,
|
||||
expected_change_hypervisor_state)
|
||||
|
||||
def test_execute_cluster_empty(self):
|
||||
metrics = FakerMetricsCollector()
|
||||
current_state_cluster = FakerStateCollector()
|
||||
|
||||
current_state_cluster = FakerModelCollector()
|
||||
sercon = BasicConsolidation("sercon", "Basic offline consolidation")
|
||||
sercon.set_metrics_resource_collector(metrics)
|
||||
sercon.ceilometer = MagicMock(
|
||||
statistic_aggregation=self.fake_metrics.mock_get_statistics)
|
||||
model = current_state_cluster.generate_random(0, 0)
|
||||
self.assertRaises(exception.ClusterEmpty, sercon.execute, model)
|
||||
|
||||
def test_basic_consolidation_random(self):
|
||||
metrics = FakerMetricsCollector()
|
||||
current_state_cluster = FakerStateCollector()
|
||||
|
||||
sercon = BasicConsolidation("sercon", "Basic offline consolidation")
|
||||
sercon.set_metrics_resource_collector(metrics)
|
||||
|
||||
solution = sercon.execute(
|
||||
current_state_cluster.generate_random(25, 2))
|
||||
solution.__str__()
|
||||
|
||||
count_migration = 0
|
||||
change_hypervisor_state = 0
|
||||
change_power_state = 0
|
||||
migrate = []
|
||||
for action in solution.meta_actions:
|
||||
if isinstance(action, Migrate):
|
||||
count_migration += 1
|
||||
migrate.append(action)
|
||||
if isinstance(action, ChangeHypervisorState):
|
||||
change_hypervisor_state += 1
|
||||
if isinstance(action, ChangePowerState):
|
||||
change_power_state += 1
|
||||
|
||||
# calculate_weight
|
||||
def test_execute_no_workload(self):
|
||||
metrics = FakerMetricsCollector()
|
||||
sercon = BasicConsolidation()
|
||||
sercon.set_metrics_resource_collector(metrics)
|
||||
current_state_cluster = FakerStateCollector()
|
||||
model = current_state_cluster.\
|
||||
sercon.ceilometer = MagicMock(
|
||||
statistic_aggregation=self.fake_metrics.mock_get_statistics)
|
||||
|
||||
current_state_cluster = FakerModelCollector()
|
||||
model = current_state_cluster. \
|
||||
generate_scenario_5_with_1_hypervisor_no_vm()
|
||||
|
||||
with mock.patch.object(BasicConsolidation, 'calculate_weight') \
|
||||
|
||||
@@ -16,12 +16,12 @@
|
||||
from watcher.decision_engine.strategies.dummy_strategy import DummyStrategy
|
||||
from watcher.tests import base
|
||||
from watcher.tests.decision_engine.faker_cluster_state import \
|
||||
FakerStateCollector
|
||||
FakerModelCollector
|
||||
|
||||
|
||||
class TestDummyStrategy(base.TestCase):
|
||||
def test_dummy_strategy(self):
|
||||
tactique = DummyStrategy("basic", "Basic offline consolidation")
|
||||
fake_cluster = FakerStateCollector()
|
||||
fake_cluster = FakerModelCollector()
|
||||
model = fake_cluster.generate_scenario_4_with_2_hypervisors()
|
||||
tactique.execute(model)
|
||||
|
||||
@@ -1,25 +0,0 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
# Copyright (c) 2015 b<>com
|
||||
#
|
||||
# Authors: Jean-Emile DARTOIS <jean-emile.dartois@b-com.com>
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
# implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
from watcher.tests import base
|
||||
|
||||
|
||||
class TestLoader(base.BaseTestCase):
|
||||
|
||||
def test_loader(self):
|
||||
pass
|
||||
@@ -1,24 +0,0 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
# Copyright (c) 2015 b<>com
|
||||
#
|
||||
# Authors: Jean-Emile DARTOIS <jean-emile.dartois@b-com.com>
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
# implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
from watcher.tests import base
|
||||
|
||||
|
||||
class TestPlanner(base.BaseTestCase):
|
||||
def test_planner(self):
|
||||
pass
|
||||
Reference in New Issue
Block a user