Enable strategy parameters
Strategy provides parameters to customize algorithm behavior. End user could query then specify parameters for their requirements. Change-Id: Id097db5f6e79c94b57674c8e5d55b06098abf18c Implements-bp: optimization-threshold
This commit is contained in:
@@ -39,6 +39,21 @@ def post_get_test_audit(**kw):
|
||||
return audit
|
||||
|
||||
|
||||
def post_get_test_audit_with_predefined_strategy(**kw):
|
||||
spec = kw.pop('strategy_parameters_spec', {})
|
||||
strategy_id = 2
|
||||
strategy = db_utils.get_test_strategy(parameters_spec=spec, id=strategy_id)
|
||||
|
||||
audit_template = db_utils.get_test_audit_template(
|
||||
strategy_id=strategy['id'])
|
||||
|
||||
audit = api_utils.audit_post_data(**kw)
|
||||
del audit['audit_template_id']
|
||||
audit['audit_template_uuid'] = audit_template['uuid']
|
||||
|
||||
return audit
|
||||
|
||||
|
||||
class TestAuditObject(base.TestCase):
|
||||
|
||||
def test_audit_init(self):
|
||||
@@ -563,6 +578,43 @@ class TestPost(api_base.FunctionalTest):
|
||||
self.assertEqual(400, response.status_int)
|
||||
assert not mock_trigger_audit.called
|
||||
|
||||
@mock.patch.object(deapi.DecisionEngineAPI, 'trigger_audit')
|
||||
def test_create_audit_parameters_no_predefined_strategy(
|
||||
self, mock_trigger_audit):
|
||||
mock_trigger_audit.return_value = mock.ANY
|
||||
audit_dict = post_get_test_audit(parameters={'name': 'Tom'})
|
||||
del audit_dict['uuid']
|
||||
del audit_dict['state']
|
||||
|
||||
response = self.post_json('/audits', audit_dict, expect_errors=True)
|
||||
self.assertEqual('application/json', response.content_type)
|
||||
self.assertEqual(400, response.status_int)
|
||||
expected_error_msg = ('Specify parameters but no predefined '
|
||||
'strategy for audit template, or no '
|
||||
'parameter spec in predefined strategy')
|
||||
self.assertTrue(response.json['error_message'])
|
||||
self.assertTrue(expected_error_msg in response.json['error_message'])
|
||||
assert not mock_trigger_audit.called
|
||||
|
||||
@mock.patch.object(deapi.DecisionEngineAPI, 'trigger_audit')
|
||||
def test_create_audit_parameters_no_schema(
|
||||
self, mock_trigger_audit):
|
||||
mock_trigger_audit.return_value = mock.ANY
|
||||
audit_dict = post_get_test_audit_with_predefined_strategy(
|
||||
parameters={'name': 'Tom'})
|
||||
del audit_dict['uuid']
|
||||
del audit_dict['state']
|
||||
|
||||
response = self.post_json('/audits', audit_dict, expect_errors=True)
|
||||
self.assertEqual('application/json', response.content_type)
|
||||
self.assertEqual(400, response.status_int)
|
||||
expected_error_msg = ('Specify parameters but no predefined '
|
||||
'strategy for audit template, or no '
|
||||
'parameter spec in predefined strategy')
|
||||
self.assertTrue(response.json['error_message'])
|
||||
self.assertTrue(expected_error_msg in response.json['error_message'])
|
||||
assert not mock_trigger_audit.called
|
||||
|
||||
|
||||
# class TestDelete(api_base.FunctionalTest):
|
||||
|
||||
|
||||
@@ -61,6 +61,7 @@ def get_test_audit(**kwargs):
|
||||
'created_at': kwargs.get('created_at'),
|
||||
'updated_at': kwargs.get('updated_at'),
|
||||
'deleted_at': kwargs.get('deleted_at'),
|
||||
'parameters': kwargs.get('parameters', {}),
|
||||
}
|
||||
|
||||
|
||||
@@ -178,6 +179,7 @@ def get_test_strategy(**kwargs):
|
||||
'created_at': kwargs.get('created_at'),
|
||||
'updated_at': kwargs.get('updated_at'),
|
||||
'deleted_at': kwargs.get('deleted_at'),
|
||||
'parameters_spec': kwargs.get('parameters_spec', {})
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
import mock
|
||||
|
||||
from watcher.applier.loading import default
|
||||
from watcher.common import utils
|
||||
from watcher.decision_engine.model import model_root
|
||||
from watcher.decision_engine.strategy import strategies
|
||||
from watcher.tests import base
|
||||
@@ -45,12 +46,16 @@ class TestDummyStrategy(base.TestCase):
|
||||
|
||||
def test_dummy_strategy(self):
|
||||
dummy = strategies.DummyStrategy(config=mock.Mock())
|
||||
dummy.input_parameters = utils.Struct()
|
||||
dummy.input_parameters.update({'para1': 4.0, 'para2': 'Hi'})
|
||||
solution = dummy.execute()
|
||||
self.assertEqual(3, len(solution.actions))
|
||||
|
||||
def test_check_parameters(self):
|
||||
model = self.fake_cluster.generate_scenario_3_with_2_hypervisors()
|
||||
self.m_model.return_value = model
|
||||
self.strategy.input_parameters = utils.Struct()
|
||||
self.strategy.input_parameters.update({'para1': 4.0, 'para2': 'Hi'})
|
||||
solution = self.strategy.execute()
|
||||
loader = default.DefaultActionLoader()
|
||||
for action in solution.actions:
|
||||
|
||||
@@ -21,6 +21,7 @@ import mock
|
||||
|
||||
from watcher.applier.loading import default
|
||||
from watcher.common import exception
|
||||
from watcher.common import utils
|
||||
from watcher.decision_engine.model import model_root
|
||||
from watcher.decision_engine.model import resource
|
||||
from watcher.decision_engine.strategy import strategies
|
||||
@@ -57,6 +58,10 @@ class TestOutletTempControl(base.BaseTestCase):
|
||||
statistic_aggregation=self.fake_metrics.mock_get_statistics)
|
||||
self.strategy = strategies.OutletTempControl(config=mock.Mock())
|
||||
|
||||
self.strategy.input_parameters = utils.Struct()
|
||||
self.strategy.input_parameters.update({'threshold': 34.3})
|
||||
self.strategy.threshold = 34.3
|
||||
|
||||
def test_calc_used_res(self):
|
||||
model = self.fake_cluster.generate_scenario_3_with_2_hypervisors()
|
||||
self.m_model.return_value = model
|
||||
|
||||
@@ -154,7 +154,8 @@ class TestSyncer(base.DbTestCase):
|
||||
]
|
||||
m_s_list.return_value = [
|
||||
objects.Strategy(self.ctx, id=1, name="strategy_1",
|
||||
goal_id=1, display_name="Strategy 1")
|
||||
goal_id=1, display_name="Strategy 1",
|
||||
parameters_spec='{}')
|
||||
]
|
||||
self.syncer.sync()
|
||||
|
||||
@@ -218,7 +219,8 @@ class TestSyncer(base.DbTestCase):
|
||||
]
|
||||
m_s_list.return_value = [
|
||||
objects.Strategy(self.ctx, id=1, name="strategy_1",
|
||||
goal_id=1, display_name="original")
|
||||
goal_id=1, display_name="original",
|
||||
parameters_spec='{}')
|
||||
]
|
||||
self.syncer.sync()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user