Tidy up - Watcher Decision Engine package
Some Python class and packages need to be renamed for a better compliance with the shared terminology which provides a better understanding of Watcher objects and components by every contributor. This patchset is there to change the code structure by adding the folder "strategies" and "loading". Partially implements: blueprint glossary-related-refactoring Change-Id: I56fb24ee6762b3186eccde5983233e17bb227cc1
This commit is contained in:
@@ -13,7 +13,6 @@
|
||||
# implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
from mock import call
|
||||
from mock import MagicMock
|
||||
from watcher.decision_engine.command.audit import TriggerAuditCommand
|
||||
@@ -21,8 +20,8 @@ from watcher.decision_engine.messaging.events import Events
|
||||
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 \
|
||||
FakerModelCollector
|
||||
from watcher.tests.decision_engine.strategy.strategies.faker_cluster_state \
|
||||
import FakerModelCollector
|
||||
from watcher.tests.objects import utils as obj_utils
|
||||
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ from watcher.decision_engine.messaging.audit_endpoint import AuditEndpoint
|
||||
from watcher.metrics_engine.cluster_model_collector.manager import \
|
||||
CollectorManager
|
||||
from watcher.tests import base
|
||||
from watcher.tests.decision_engine.faker_cluster_state import \
|
||||
from watcher.tests.decision_engine.strategy.strategies.faker_cluster_state import \
|
||||
FakerModelCollector
|
||||
|
||||
|
||||
|
||||
@@ -17,17 +17,18 @@
|
||||
# limitations under the License.
|
||||
#
|
||||
import uuid
|
||||
|
||||
from watcher.decision_engine.model.hypervisor import Hypervisor
|
||||
from watcher.decision_engine.model.vm_state import VMState
|
||||
from watcher.tests import base
|
||||
from watcher.tests.decision_engine.faker_cluster_state import \
|
||||
from watcher.tests.decision_engine.strategy.strategies.faker_cluster_state import \
|
||||
FakerModelCollector
|
||||
|
||||
|
||||
class TestMapping(base.BaseTestCase):
|
||||
def test_get_node_from_vm(self):
|
||||
fake_cluster = FakerModelCollector()
|
||||
model = fake_cluster.generate_scenario_4_with_2_hypervisors()
|
||||
model = fake_cluster.generate_scenario_3_with_2_hypervisors()
|
||||
|
||||
vms = model.get_all_vms()
|
||||
keys = list(vms.keys())
|
||||
@@ -39,14 +40,14 @@ class TestMapping(base.BaseTestCase):
|
||||
|
||||
def test_get_node_from_vm_id(self):
|
||||
fake_cluster = FakerModelCollector()
|
||||
model = fake_cluster.generate_scenario_4_with_2_hypervisors()
|
||||
model = fake_cluster.generate_scenario_3_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 = FakerModelCollector()
|
||||
model = fake_cluster.generate_scenario_4_with_2_hypervisors()
|
||||
model = fake_cluster.generate_scenario_3_with_2_hypervisors()
|
||||
|
||||
vms = model.get_all_vms()
|
||||
self.assertEqual(vms.__len__(), 2)
|
||||
@@ -57,7 +58,7 @@ class TestMapping(base.BaseTestCase):
|
||||
|
||||
def test_get_mapping(self):
|
||||
fake_cluster = FakerModelCollector()
|
||||
model = fake_cluster.generate_scenario_4_with_2_hypervisors()
|
||||
model = fake_cluster.generate_scenario_3_with_2_hypervisors()
|
||||
|
||||
mapping_vm = model.mapping.get_mapping_vm()
|
||||
self.assertEqual(mapping_vm.__len__(), 2)
|
||||
@@ -66,7 +67,7 @@ class TestMapping(base.BaseTestCase):
|
||||
|
||||
def test_migrate_vm(self):
|
||||
fake_cluster = FakerModelCollector()
|
||||
model = fake_cluster.generate_scenario_4_with_2_hypervisors()
|
||||
model = fake_cluster.generate_scenario_3_with_2_hypervisors()
|
||||
vms = model.get_all_vms()
|
||||
keys = list(vms.keys())
|
||||
vm0 = vms[keys[0]]
|
||||
@@ -81,7 +82,7 @@ class TestMapping(base.BaseTestCase):
|
||||
|
||||
def test_unmap_from_id_log_warning(self):
|
||||
fake_cluster = FakerModelCollector()
|
||||
model = fake_cluster.generate_scenario_4_with_2_hypervisors()
|
||||
model = fake_cluster.generate_scenario_3_with_2_hypervisors()
|
||||
vms = model.get_all_vms()
|
||||
keys = list(vms.keys())
|
||||
vm0 = vms[keys[0]]
|
||||
@@ -95,7 +96,7 @@ class TestMapping(base.BaseTestCase):
|
||||
|
||||
def test_unmap_from_id(self):
|
||||
fake_cluster = FakerModelCollector()
|
||||
model = fake_cluster.generate_scenario_4_with_2_hypervisors()
|
||||
model = fake_cluster.generate_scenario_3_with_2_hypervisors()
|
||||
vms = model.get_all_vms()
|
||||
keys = list(vms.keys())
|
||||
vm0 = vms[keys[0]]
|
||||
|
||||
@@ -17,15 +17,15 @@
|
||||
# limitations under the License.
|
||||
#
|
||||
import uuid
|
||||
|
||||
from watcher.common import exception
|
||||
from watcher.common.exception import IllegalArgumentException
|
||||
from watcher.decision_engine.model.hypervisor import Hypervisor
|
||||
from watcher.decision_engine.model.hypervisor_state import HypervisorState
|
||||
from watcher.decision_engine.model.model_root import ModelRoot
|
||||
from watcher.tests.decision_engine.faker_cluster_state import \
|
||||
FakerModelCollector
|
||||
|
||||
from watcher.tests import base
|
||||
from watcher.tests.decision_engine.strategy.strategies.faker_cluster_state import \
|
||||
FakerModelCollector
|
||||
|
||||
|
||||
class TestModel(base.BaseTestCase):
|
||||
|
||||
@@ -13,20 +13,40 @@
|
||||
# implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from mock import patch
|
||||
from stevedore.extension import Extension
|
||||
from stevedore.extension import ExtensionManager
|
||||
from watcher.decision_engine.strategy.dummy_strategy import DummyStrategy
|
||||
from watcher.decision_engine.strategy.loader import StrategyLoader
|
||||
|
||||
from watcher.decision_engine.strategy.loading.default import \
|
||||
DefaultStrategyLoader
|
||||
from watcher.decision_engine.strategy.strategies.base import BaseStrategy
|
||||
from watcher.decision_engine.strategy.strategies.dummy_strategy import \
|
||||
DummyStrategy
|
||||
from watcher.tests.base import TestCase
|
||||
|
||||
|
||||
class TestStrategyLoader(TestCase):
|
||||
class TestDefaultStrategyLoader(TestCase):
|
||||
|
||||
@patch("watcher.decision_engine.strategy.loader.ExtensionManager")
|
||||
strategy_loader = DefaultStrategyLoader()
|
||||
|
||||
def test_load_strategy_with_empty_model(self):
|
||||
selected_strategy = self.strategy_loader.load(None)
|
||||
self.assertIsNotNone(selected_strategy,
|
||||
'The default strategy not be must none')
|
||||
self.assertIsInstance(selected_strategy, BaseStrategy)
|
||||
|
||||
def test_load_strategy_is_basic(self):
|
||||
exptected_strategy = 'basic'
|
||||
selected_strategy = self.strategy_loader.load(exptected_strategy)
|
||||
self.assertEqual(
|
||||
selected_strategy.name,
|
||||
exptected_strategy,
|
||||
'The default strategy should be basic')
|
||||
|
||||
@patch(
|
||||
"watcher.decision_engine.strategy.loading.default.ExtensionManager")
|
||||
def test_strategy_loader(self, m_extension_manager):
|
||||
dummy_strategy_name = "dummy"
|
||||
# Set up the fake Stevedore extensions
|
||||
@@ -40,15 +60,13 @@ class TestStrategyLoader(TestCase):
|
||||
)],
|
||||
namespace="watcher_strategies",
|
||||
)
|
||||
strategy_loader = StrategyLoader()
|
||||
strategy_loader = DefaultStrategyLoader()
|
||||
loaded_strategy = strategy_loader.load("dummy")
|
||||
|
||||
self.assertEqual("dummy", loaded_strategy.name)
|
||||
self.assertEqual("Dummy Strategy", loaded_strategy.description)
|
||||
|
||||
def test_load_dummy_strategy(self):
|
||||
strategy_loader = StrategyLoader()
|
||||
strategy_loader = DefaultStrategyLoader()
|
||||
loaded_strategy = strategy_loader.load("dummy")
|
||||
|
||||
self.assertEqual("dummy", loaded_strategy.name)
|
||||
self.assertEqual("Dummy Strategy", loaded_strategy.description)
|
||||
self.assertIsInstance(loaded_strategy, DummyStrategy)
|
||||
@@ -15,10 +15,13 @@
|
||||
# limitations under the License.
|
||||
from mock import patch
|
||||
from oslo_config import cfg
|
||||
|
||||
from watcher.common.exception import WatcherException
|
||||
from watcher.decision_engine.strategy.loader import StrategyLoader
|
||||
from watcher.decision_engine.strategy.selector.default import StrategySelector
|
||||
from watcher.decision_engine.strategy.loading.default import \
|
||||
DefaultStrategyLoader
|
||||
from watcher.decision_engine.strategy.selection.default import StrategySelector
|
||||
from watcher.tests.base import TestCase
|
||||
|
||||
CONF = cfg.CONF
|
||||
|
||||
|
||||
@@ -26,7 +29,7 @@ class TestStrategySelector(TestCase):
|
||||
|
||||
strategy_selector = StrategySelector()
|
||||
|
||||
@patch.object(StrategyLoader, 'load')
|
||||
@patch.object(DefaultStrategyLoader, 'load')
|
||||
def test_define_from_goal(self, mock_call):
|
||||
cfg.CONF.set_override(
|
||||
'goals', {"DUMMY": "fake"}, group='watcher_goals'
|
||||
@@ -36,7 +39,7 @@ class TestStrategySelector(TestCase):
|
||||
self.strategy_selector.define_from_goal(expected_goal)
|
||||
mock_call.assert_called_once_with(expected_strategy)
|
||||
|
||||
@patch.object(StrategyLoader, 'load')
|
||||
@patch.object(DefaultStrategyLoader, 'load')
|
||||
def test_define_from_goal_with_incorrect_mapping(self, mock_call):
|
||||
cfg.CONF.set_override(
|
||||
'goals', {}, group='watcher_goals'
|
||||
|
||||
@@ -167,39 +167,12 @@ class FakerModelCollector(BaseClusterModelCollector):
|
||||
|
||||
return current_state_cluster
|
||||
|
||||
def generate_scenario_2(self):
|
||||
current_state_cluster = ModelRoot()
|
||||
# number of nodes
|
||||
count_node = 5
|
||||
|
||||
# define ressouce ( CPU, MEM disk, ... )
|
||||
mem = Resource(ResourceType.memory)
|
||||
# 2199.954 Mhz
|
||||
num_cores = Resource(ResourceType.cpu_cores)
|
||||
disk = Resource(ResourceType.disk)
|
||||
|
||||
current_state_cluster.create_resource(mem)
|
||||
current_state_cluster.create_resource(num_cores)
|
||||
current_state_cluster.create_resource(disk)
|
||||
|
||||
for i in range(0, count_node):
|
||||
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)
|
||||
# print("create "+str(node))
|
||||
current_state_cluster.add_hypervisor(node)
|
||||
return current_state_cluster
|
||||
|
||||
def map(self, model, h_id, vm_id):
|
||||
model.get_mapping().map(
|
||||
model.get_hypervisor_from_id(h_id),
|
||||
model.get_vm_from_id(vm_id))
|
||||
|
||||
def generate_scenario_3(self):
|
||||
def generate_scenario_2(self):
|
||||
vms = []
|
||||
|
||||
current_state_cluster = ModelRoot()
|
||||
@@ -263,7 +236,7 @@ class FakerModelCollector(BaseClusterModelCollector):
|
||||
|
||||
return current_state_cluster
|
||||
|
||||
def generate_scenario_4_with_2_hypervisors(self):
|
||||
def generate_scenario_3_with_2_hypervisors(self):
|
||||
vms = []
|
||||
|
||||
current_state_cluster = ModelRoot()
|
||||
@@ -317,7 +290,7 @@ class FakerModelCollector(BaseClusterModelCollector):
|
||||
|
||||
return current_state_cluster
|
||||
|
||||
def generate_scenario_5_with_1_hypervisor_no_vm(self):
|
||||
def generate_scenario_4_with_1_hypervisor_no_vm(self):
|
||||
current_state_cluster = ModelRoot()
|
||||
# number of nodes
|
||||
count_node = 1
|
||||
@@ -22,20 +22,18 @@ import mock
|
||||
from mock import MagicMock
|
||||
|
||||
from watcher.common import exception
|
||||
|
||||
from watcher.decision_engine.actions.hypervisor_state import \
|
||||
ChangeHypervisorState
|
||||
from watcher.decision_engine.actions.power_state import ChangePowerState
|
||||
|
||||
from watcher.decision_engine.actions.migration import Migrate
|
||||
from watcher.decision_engine.actions.power_state import ChangePowerState
|
||||
from watcher.decision_engine.model.model_root import ModelRoot
|
||||
from watcher.decision_engine.strategy.basic_consolidation import \
|
||||
from watcher.decision_engine.strategy.strategies.basic_consolidation import \
|
||||
BasicConsolidation
|
||||
from watcher.tests import base
|
||||
from watcher.tests.decision_engine.faker_cluster_state import \
|
||||
FakerModelCollector
|
||||
from watcher.tests.decision_engine.faker_metrics_collector import \
|
||||
FakerMetricsCollector
|
||||
from watcher.tests.decision_engine.strategy.strategies.faker_cluster_state \
|
||||
import FakerModelCollector
|
||||
from watcher.tests.decision_engine.strategy.strategies.faker_metrics_collector\
|
||||
import FakerMetricsCollector
|
||||
|
||||
|
||||
class TestBasicConsolidation(base.BaseTestCase):
|
||||
@@ -154,7 +152,7 @@ class TestBasicConsolidation(base.BaseTestCase):
|
||||
def test_check_migration(self):
|
||||
sercon = BasicConsolidation()
|
||||
fake_cluster = FakerModelCollector()
|
||||
model = fake_cluster.generate_scenario_4_with_2_hypervisors()
|
||||
model = fake_cluster.generate_scenario_3_with_2_hypervisors()
|
||||
|
||||
all_vms = model.get_all_vms()
|
||||
all_hyps = model.get_all_hypervisors()
|
||||
@@ -166,7 +164,7 @@ class TestBasicConsolidation(base.BaseTestCase):
|
||||
def test_threshold(self):
|
||||
sercon = BasicConsolidation()
|
||||
fake_cluster = FakerModelCollector()
|
||||
model = fake_cluster.generate_scenario_4_with_2_hypervisors()
|
||||
model = fake_cluster.generate_scenario_3_with_2_hypervisors()
|
||||
|
||||
all_hyps = model.get_all_hypervisors()
|
||||
hyp0 = all_hyps[list(all_hyps.keys())[0]]
|
||||
@@ -188,7 +186,7 @@ class TestBasicConsolidation(base.BaseTestCase):
|
||||
statistic_aggregation=self.fake_metrics.mock_get_statistics)
|
||||
|
||||
solution = sercon.execute(
|
||||
self.fake_cluster.generate_scenario_3())
|
||||
self.fake_cluster.generate_scenario_2())
|
||||
|
||||
actions_counter = Counter(
|
||||
[type(action) for action in solution.actions])
|
||||
@@ -224,7 +222,7 @@ class TestBasicConsolidation(base.BaseTestCase):
|
||||
|
||||
current_state_cluster = FakerModelCollector()
|
||||
model = current_state_cluster. \
|
||||
generate_scenario_5_with_1_hypervisor_no_vm()
|
||||
generate_scenario_4_with_1_hypervisor_no_vm()
|
||||
|
||||
with mock.patch.object(BasicConsolidation, 'calculate_weight') \
|
||||
as mock_score_call:
|
||||
@@ -13,15 +13,16 @@
|
||||
# implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
from watcher.decision_engine.strategy.dummy_strategy import DummyStrategy
|
||||
from watcher.decision_engine.strategy.strategies.dummy_strategy import \
|
||||
DummyStrategy
|
||||
from watcher.tests import base
|
||||
from watcher.tests.decision_engine.faker_cluster_state import \
|
||||
FakerModelCollector
|
||||
from watcher.tests.decision_engine.strategy.strategies.faker_cluster_state\
|
||||
import FakerModelCollector
|
||||
|
||||
|
||||
class TestDummyStrategy(base.TestCase):
|
||||
def test_dummy_strategy(self):
|
||||
tactique = DummyStrategy("basic", "Basic offline consolidation")
|
||||
fake_cluster = FakerModelCollector()
|
||||
model = fake_cluster.generate_scenario_4_with_2_hypervisors()
|
||||
model = fake_cluster.generate_scenario_3_with_2_hypervisors()
|
||||
tactique.execute(model)
|
||||
@@ -1,37 +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.strategy.base import BaseStrategy
|
||||
from watcher.decision_engine.strategy.loader import StrategyLoader
|
||||
from watcher.tests import base
|
||||
|
||||
|
||||
class TestStrategySelector(base.BaseTestCase):
|
||||
|
||||
strategy_loader = StrategyLoader()
|
||||
|
||||
def test_load_strategy_with_empty_model(self):
|
||||
selected_strategy = self.strategy_loader.load(None)
|
||||
self.assertIsNotNone(selected_strategy,
|
||||
'The default strategy be must not none')
|
||||
self.assertIsInstance(selected_strategy, BaseStrategy)
|
||||
|
||||
def test_load_strategy_is_basic(self):
|
||||
exptected_strategy = 'basic'
|
||||
selected_strategy = self.strategy_loader.load(exptected_strategy)
|
||||
self.assertEqual(
|
||||
selected_strategy.name,
|
||||
exptected_strategy,
|
||||
'The default strategy should be basic')
|
||||
@@ -16,20 +16,22 @@
|
||||
|
||||
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.actions.base import BaseAction
|
||||
from watcher.decision_engine.planner.default import DefaultPlanner
|
||||
from watcher.decision_engine.solution.default import DefaultSolution
|
||||
from watcher.decision_engine.strategy.basic_consolidation import \
|
||||
from watcher.decision_engine.strategy.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 \
|
||||
FakerModelCollector
|
||||
from watcher.tests.decision_engine.faker_metrics_collector import \
|
||||
FakerMetricsCollector
|
||||
from watcher.tests.decision_engine.strategy.strategies.faker_cluster_state\
|
||||
import FakerModelCollector
|
||||
from watcher.tests.decision_engine.strategy.strategies.faker_metrics_collector\
|
||||
import FakerMetricsCollector
|
||||
from watcher.tests.objects import utils as obj_utils
|
||||
|
||||
|
||||
@@ -54,7 +56,7 @@ class SolutionFakerSingleHyp(object):
|
||||
get_statistics=metrics.mock_get_statistics)
|
||||
|
||||
return sercon.execute(
|
||||
current_state_cluster.generate_scenario_4_with_2_hypervisors())
|
||||
current_state_cluster.generate_scenario_3_with_2_hypervisors())
|
||||
|
||||
|
||||
class TestActionScheduling(base.DbTestCase):
|
||||
|
||||
Reference in New Issue
Block a user