Achieved goal should be returned by each strategy
Today, there is no way to know what goal is achieved by a given strategy. The mapping between goal and strategies is done in the Watcher configuration. Beyond that, there is no way to know that several strategies achieve the same optimization goal. There should be a way to return the list of available goals depending on which strategies have been deployed on the node where the Watcher Decision Engine is running. Change-Id: I29e6b5cb8c9314b66a5b740ee2cd2f9097468a08 Implements: blueprint get-goal-from-strategy
This commit is contained in:
parent
bf2de9d42e
commit
a0a9b2ce13
@ -0,0 +1,35 @@
|
||||
@startuml
|
||||
class "Base Strategy" {
|
||||
String goal_id
|
||||
String goal_display_name
|
||||
String strategy_id
|
||||
String strategy_display_name
|
||||
Solution execute()
|
||||
}
|
||||
class "Energy Base Strategy" {
|
||||
String goal_id="REDUCE_ENERGY"
|
||||
String goal_display_name="Reduce Energy"
|
||||
}
|
||||
class "IO Base Strategy" {
|
||||
String goal_id="REDUCE_DISK_IO"
|
||||
String goal_display_name="Reduce Disk IO"
|
||||
}
|
||||
class "Network Bandwidth Base Strategy" {
|
||||
String goal_id="REDUCE_NETWORK_BANDWIDTH"
|
||||
String goal_display_name="Reduce Network Bandwidth"
|
||||
}
|
||||
class "Energy Strategy A" {
|
||||
String strategy_id="ENERGY_STRATEGY_A"
|
||||
String strategy_display_name="Energy Strategy A"
|
||||
}
|
||||
class "Energy Strategy B" {
|
||||
String strategy_id="ENERGY_STRATEGY_B"
|
||||
String strategy_display_name="Energy Strategy B"
|
||||
}
|
||||
"Base Strategy" <|-- "IO Base Strategy"
|
||||
"Base Strategy" <|-- "Energy Base Strategy"
|
||||
"Base Strategy" <|-- "Network Bandwidth Base Strategy"
|
||||
"Energy Base Strategy" <|-- "Energy Strategy A"
|
||||
"Energy Base Strategy" <|-- "Energy Strategy B"
|
||||
"Base Strategy" ..> Solution : generates
|
||||
@enduml
|
BIN
doc/source/images/class_diagram_goal_from_strategy.png
Normal file
BIN
doc/source/images/class_diagram_goal_from_strategy.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 31 KiB |
288
specs/mitaka/approved/get-goal-from-strategy.rst
Normal file
288
specs/mitaka/approved/get-goal-from-strategy.rst
Normal file
@ -0,0 +1,288 @@
|
||||
..
|
||||
This work is licensed under a Creative Commons Attribution 3.0 Unported
|
||||
License.
|
||||
|
||||
http://creativecommons.org/licenses/by/3.0/legalcode
|
||||
|
||||
=====================================================
|
||||
The achieved goal should be returned by each strategy
|
||||
=====================================================
|
||||
|
||||
https://blueprints.launchpad.net/watcher/+spec/get-goal-from-strategy
|
||||
|
||||
|
||||
Problem description
|
||||
===================
|
||||
|
||||
Today, there is no way to know what `Goal`_ is achieved by a given
|
||||
`Strategy`_. The mapping between goal and strategies is done in the Watcher
|
||||
configuration.
|
||||
|
||||
Beyond that, there is no way to know that several strategies achieve the same
|
||||
optimization goal.
|
||||
|
||||
There should be a way to return the list of available goals depending on which
|
||||
strategies have been deployed on the node where the `Watcher Decision Engine`_
|
||||
is running.
|
||||
|
||||
Use Cases
|
||||
----------
|
||||
|
||||
As an `Administrator`_
|
||||
I want to be able to get the list of available optimization goals
|
||||
So that I can select one `Goal`_ and use it in my `Audit Template`_
|
||||
|
||||
As an `Administrator`_
|
||||
I want to be able to install new strategies and get an updated list of
|
||||
available goals
|
||||
So that I am sure that the returned list of goals is aligned with the deployed
|
||||
strategies
|
||||
|
||||
As an `Administrator`_
|
||||
I want to be notified when the `Goal`_ of an `Audit Template`_ is not any more
|
||||
available
|
||||
So that I know that I have to update or delete this `Audit Template`_
|
||||
|
||||
As an `Administrator`_
|
||||
I want to be able to get the translated name of each `Goal`_
|
||||
So that I can understand what kind of optimization(s) it provides
|
||||
|
||||
As an `Administrator`_
|
||||
I want to be able to get the list of available strategies for a given `Goal`_
|
||||
So that I can select a specific strategy for my `Audit Template`_
|
||||
|
||||
Project Priority
|
||||
-----------------
|
||||
|
||||
Not relevant because Watcher is not in the big tent so far.
|
||||
|
||||
|
||||
Proposed change
|
||||
===============
|
||||
|
||||
Each `Strategy`_ should be able to return the `Goal`_ it achieves.
|
||||
|
||||
All strategies related to the same `Goal`_ should derive from the same parent
|
||||
class and return the same `Goal`_ properties.
|
||||
|
||||
Below you will find a class diagram showing a hierarchy of Strategies for
|
||||
several goals:
|
||||
|
||||
.. image:: ../../../doc/source/images/class_diagram_goal_from_strategy.png
|
||||
:width: 140%
|
||||
|
||||
In the future, it will also enable Watcher strategies to provide other common
|
||||
attributes and methods for a given goal (input parameters, efficacy indicators,
|
||||
...).
|
||||
|
||||
Alternatives
|
||||
------------
|
||||
|
||||
Keep the current system which reads the mapping between goals and strategies
|
||||
from the Watcher configuration file.
|
||||
|
||||
Data model impact
|
||||
-----------------
|
||||
|
||||
The list of available goals should be stored in the `Watcher database`_.
|
||||
Therefore a new table should be created in the database for this.
|
||||
|
||||
For each goal, the list of available strategies should also be stored in the
|
||||
`Watcher database`_. A new table should be created in the database for this.
|
||||
|
||||
REST API impact
|
||||
---------------
|
||||
|
||||
There will be an impact on every REST resource URLs that starts with
|
||||
**/v1/goals/** and that uses the type **Goal**:
|
||||
|
||||
* GET /v1/goals
|
||||
* GET /v1/goals/(goal_uuid)
|
||||
* GET /v1/goals/detail
|
||||
|
||||
The type **Goal** will contain two attributes:
|
||||
|
||||
* The unique goal id.
|
||||
* The display name of the goal: i.e. the translated name of the `Goal`_ in the
|
||||
language of the `Administrator`_.
|
||||
|
||||
Here is a sample of the new JSON payload for a list of 2 goals, the first goal
|
||||
having only one strategy and the second goal having 2 available strategies:
|
||||
|
||||
::
|
||||
|
||||
{
|
||||
"goals": [
|
||||
{
|
||||
"goal_id": "REDUCE_ENERGY",
|
||||
"goal_display_name": "Reduce Energy Consumption",
|
||||
"strategies": [
|
||||
{
|
||||
"strategy_id": "POWERING_DOWN",
|
||||
"strategy_display_name": "Powering down unused compute
|
||||
nodes",
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"goal_id": "SERVERS_CONSOLIDATION",
|
||||
"goal_display_name": "Reduce the number of compute nodes needed
|
||||
to support current projects workloads"
|
||||
"strategies": [
|
||||
{
|
||||
"strategy_id": "FFD",
|
||||
"strategy_display_name": "First-Fit Decreasing",
|
||||
},
|
||||
{
|
||||
"strategy_id": "BFD",
|
||||
"strategy_display_name": "Best-Fit Decreasing",
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
Security impact
|
||||
---------------
|
||||
|
||||
None
|
||||
|
||||
Notifications impact
|
||||
--------------------
|
||||
|
||||
None
|
||||
|
||||
Other end user impact
|
||||
---------------------
|
||||
|
||||
**python-watcherclient** should be able to return all goal attributes when
|
||||
requesting the list of goals and to return the list of available strategies
|
||||
when requesting the detail of a given goal.
|
||||
|
||||
It should also be possible to browse the list of available goals in **Horizon**
|
||||
when the admin is creating a new `Audit Template`_. When the admin has selected
|
||||
a given goal, he/she should be able to see the list of available strategies for
|
||||
this goal and select the preferred `Strategy`_.
|
||||
|
||||
Performance Impact
|
||||
------------------
|
||||
|
||||
None
|
||||
|
||||
Other deployer impact
|
||||
---------------------
|
||||
|
||||
Now the association between a `Goal`_ and a `Strategy`_ should no more be
|
||||
configured in the main Watcher configuration file.
|
||||
|
||||
Developer impact
|
||||
----------------
|
||||
|
||||
None
|
||||
|
||||
|
||||
Implementation
|
||||
==============
|
||||
|
||||
Assignee(s)
|
||||
-----------
|
||||
|
||||
Primary assignee:
|
||||
vincent-francoise
|
||||
|
||||
Work Items
|
||||
----------
|
||||
|
||||
Here is the list of foreseen work items:
|
||||
|
||||
* Remove the previous `Goal`_ listing and mapping mechanism which was read from
|
||||
the Watcher configuration file. The following Python files should be
|
||||
impacted:
|
||||
|
||||
- ``/devstack/local.conf.controller``
|
||||
- ``/watcher/decision_engine/strategy/selection/default.py``
|
||||
- | ``/watcher/tests/decision_engine/strategy/selector/``
|
||||
| ``test_strategy_selector.py``
|
||||
- ``/watcher/tests/api/v1/test_goals.py``
|
||||
- ``/watcher/tests/api/v1/test_audit_templates.py``
|
||||
- ``/watcher/api/controllers/v1/goal.py``
|
||||
- ``/watcher/api/controllers/v1/audit_template.py``
|
||||
- ``/watcher/opts.py``
|
||||
- ``/etc/watcher/watcher.conf.sample``
|
||||
* In the ``BaseStrategy`` class, the following attributes should be added:
|
||||
|
||||
- The unique goal id.
|
||||
- The display name containing the name of the goal translated in the language
|
||||
of the `Administrator`_.
|
||||
- The unique strategy id.
|
||||
- The display name containing the name of the `Strategy`_ translated in the
|
||||
language of the `Administrator`_.
|
||||
* For each **XYZ** `Goal`_, there should be a base `Strategy`_ class, named
|
||||
**XYZBaseStrategy**, containing the goal attribute values indicating what
|
||||
goal id and display name all child strategies achieve.
|
||||
* Update all existing strategies with this new way of handling goals. Create a
|
||||
base strategy class for each common optimization `Goal`_.
|
||||
* add a new **Goal** object in **/watcher/db/sqlalchemy/models.py** for the
|
||||
storage of goals in the `Watcher database`_.
|
||||
* add a new **goal.py** class in the **/watcher/objects/** package to handle
|
||||
CRUD operations on goal objects in the database.
|
||||
* when the `Watcher Decision Engine`_ service is started, Watcher should browse
|
||||
the list of available strategies, get their `Goal`_ attributes and create a
|
||||
new entry in the `Watcher database`_ for each new goal id. After that, the
|
||||
`Watcher Decision Engine`_ should be able to check whether all audit
|
||||
templates in the `Watcher database`_ contain an existing goal. If not, an
|
||||
error should be traced in the logs. During this phase, the
|
||||
`Watcher Decision Engine`_ should also create a record in the database for
|
||||
each new `Strategy`_ id and associate this record to the `Goal`_ object it
|
||||
achieves. Note that this very same model would then be used by other
|
||||
blueprints such as `blueprint optimization-threshold`_ to expose the input
|
||||
parameters of each `Strategy`_.
|
||||
* update the Watcher devstack plugin setup to adapt it (remove the auto
|
||||
**[watcher_goals]** config setup).
|
||||
|
||||
Dependencies
|
||||
============
|
||||
|
||||
None
|
||||
|
||||
Testing
|
||||
=======
|
||||
|
||||
* Update unit tests in the `Watcher Decision Engine`_
|
||||
* Update Tempest test to run a strategy
|
||||
* Add some Tempest tests to get the list of available goals and for each
|
||||
`Goal`_ the list of available strategies
|
||||
|
||||
Documentation Impact
|
||||
====================
|
||||
|
||||
* Update the page named "*Build a new optimization strategy*" explaining that
|
||||
when a new goal is added, a new base strategy class should be created.
|
||||
* Update the page named "*Configuring Watcher*", removing the "*Goals mapping
|
||||
configuration*" section.
|
||||
* Update the page named "*Watcher User Guide*", providing CLI examples showing
|
||||
how to get the list of goals and how to get the list of available strategies
|
||||
for a given `Goal`_.
|
||||
|
||||
References
|
||||
==========
|
||||
|
||||
IRC discussions:
|
||||
|
||||
* http://eavesdrop.openstack.org/meetings/watcher/2016/watcher.2016-01-20-14.00.log.html
|
||||
* http://eavesdrop.openstack.org/meetings/watcher/2016/watcher.2016-02-17-14.00.log.html
|
||||
* http://eavesdrop.openstack.org/meetings/watcher/2016/watcher.2016-03-16-14.00.log.html
|
||||
|
||||
History
|
||||
=======
|
||||
|
||||
None
|
||||
|
||||
|
||||
.. _Administrator: https://factory.b-com.com/www/watcher/doc/watcher/glossary.html#administrator
|
||||
.. _Goal: https://factory.b-com.com/www/watcher/doc/watcher/glossary.html#goal
|
||||
.. _Audit Template: http://factory.b-com.com/www/watcher/doc/watcher/glossary.html#audit-template
|
||||
.. _Strategy: https://factory.b-com.com/www/watcher/doc/watcher/glossary.html#strategy
|
||||
.. _Watcher Decision Engine: https://factory.b-com.com/www/watcher/doc/watcher/architecture.html#watcher-decision-engine
|
||||
.. _Watcher database: https://factory.b-com.com/www/watcher/doc/watcher/architecture.html#watcher-database
|
||||
.. _blueprint optimization-threshold: https://blueprints.launchpad.net/watcher/+spec/optimization-threshold
|
Loading…
x
Reference in New Issue
Block a user