From f9a1b9d3cec667292dc13ea7bc0fc5e9092869f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vincent=20Fran=C3=A7oise?= Date: Thu, 31 Mar 2016 14:11:31 +0200 Subject: [PATCH] Documentation update for get-goal-from-strategy In this changeset, I updated the Watcher documentation to reflect the changes that are introduced by this blueprint. Partially Implements: blueprint get-goal-from-strategy Change-Id: I40be39624097365220bf7d94cbe177bbf5bbe0ed --- doc/source/architecture.rst | 22 +- doc/source/deploy/configuration.rst | 2 - doc/source/deploy/user-guide.rst | 37 +++- doc/source/dev/plugin/strategy-plugin.rst | 192 ++++++++++++++---- doc/source/glossary.rst | 10 +- .../sequence_create_audit_template.txt | 18 +- .../plantuml/sequence_launch_action_plan.txt | 4 +- .../images/sequence_create_audit_template.png | Bin 22586 -> 28206 bytes .../images/sequence_launch_action_plan.png | Bin 26148 -> 26060 bytes watcher/api/controllers/v1/strategy.py | 13 ++ .../strategy/strategies/base.py | 23 +++ .../strategies/vm_workload_consolidation.py | 33 +-- 12 files changed, 262 insertions(+), 92 deletions(-) diff --git a/doc/source/architecture.rst b/doc/source/architecture.rst index df7cfa94e..a3300b242 100644 --- a/doc/source/architecture.rst +++ b/doc/source/architecture.rst @@ -155,6 +155,7 @@ by the :ref:`Watcher API ` or the - :ref:`Action plans ` - :ref:`Actions ` - :ref:`Goals ` +- :ref:`Strategies ` The Watcher domain being here "*optimization of some resources provided by an OpenStack system*". @@ -196,8 +197,6 @@ Audit, the :ref:`Strategy ` relies on two sets of data: which provides information about the past of the :ref:`Cluster ` -So far, only one :ref:`Strategy ` can be associated to a -given :ref:`Goal ` via the main Watcher configuration file. .. _data_model: @@ -230,13 +229,15 @@ following parameters: - A name - A goal to achieve +- An optional strategy .. image:: ./images/sequence_create_audit_template.png :width: 100% -The `Watcher API`_ just makes sure that the goal exists (i.e. it is declared -in the Watcher configuration file) and stores a new audit template in the -:ref:`Watcher Database `. +The `Watcher API`_ makes sure that both the specified goal (mandatory) and +its associated strategy (optional) are registered inside the :ref:`Watcher +Database ` before storing a new audit template in +the :ref:`Watcher Database `. .. _sequence_diagrams_create_and_launch_audit: @@ -260,12 +261,11 @@ the Audit in the The :ref:`Watcher Decision Engine ` reads the Audit parameters from the :ref:`Watcher Database `. It instantiates the -appropriate :ref:`Strategy ` (using entry points) -associated to the :ref:`Goal ` of the -:ref:`Audit ` (it uses the information of the Watcher -configuration file to find the mapping between the -:ref:`Goal ` and the :ref:`Strategy ` -python class). +appropriate :ref:`strategy ` (using entry points) +given both the :ref:`goal ` and the strategy associated to the +parent :ref:`audit template ` of the :ref:`Audit +`. If no strategy is associated to the audit template, the +strategy is dynamically selected by the Decision Engine. The :ref:`Watcher Decision Engine ` also builds the :ref:`Cluster Data Model `. This diff --git a/doc/source/deploy/configuration.rst b/doc/source/deploy/configuration.rst index 099814f8c..2adcc643f 100644 --- a/doc/source/deploy/configuration.rst +++ b/doc/source/deploy/configuration.rst @@ -182,8 +182,6 @@ The configuration file is organized into the following sections: * ``[watcher_clients_auth]`` - Keystone auth configuration for clients * ``[watcher_applier]`` - Watcher Applier module configuration * ``[watcher_decision_engine]`` - Watcher Decision Engine module configuration -* ``[watcher_goals]`` - Goals mapping configuration -* ``[watcher_strategies]`` - Strategy configuration * ``[oslo_messaging_rabbit]`` - Oslo Messaging RabbitMQ driver configuration * ``[ceilometer_client]`` - Ceilometer client configuration * ``[cinder_client]`` - Cinder client configuration diff --git a/doc/source/deploy/user-guide.rst b/doc/source/deploy/user-guide.rst index fcd2c6006..d74e16850 100644 --- a/doc/source/deploy/user-guide.rst +++ b/doc/source/deploy/user-guide.rst @@ -56,18 +56,39 @@ watcher binary without options. How do I run an audit of my cluster ? ------------------------------------- -First, you need to create an :ref:`audit template `. -An :ref:`audit template ` defines an optimization -:ref:`goal ` to achieve (i.e. the settings of your audit). -This goal should be declared in the Watcher service configuration file -**/etc/watcher/watcher.conf**. +First, you need to find the :ref:`goal ` you want to achieve: .. code:: bash - $ watcher audit-template-create my_first_audit DUMMY + $ watcher goal-list -If you get "*You must provide a username via either --os-username or via -env[OS_USERNAME]*" you may have to verify your credentials. +.. note:: + + If you get "*You must provide a username via either --os-username or via + env[OS_USERNAME]*" you may have to verify your credentials. + +Then, you can create an :ref:`audit template `. +An :ref:`audit template ` defines an optimization +:ref:`goal ` to achieve (i.e. the settings of your audit). + +.. code:: bash + + $ watcher audit-template-create my_first_audit_template + +Although optional, you may want to actually set a specific strategy for your +audit template. If so, you may can search of its UUID using the following +command: + +.. code:: bash + + $ watcher strategy-list --goal-uuid + +The command to create your audit template would then be: + +.. code:: bash + + $ watcher audit-template-create my_first_audit_template \ + --strategy-uuid Then, you can create an audit. An audit is a request for optimizing your cluster depending on the specified :ref:`goal `. diff --git a/doc/source/dev/plugin/strategy-plugin.rst b/doc/source/dev/plugin/strategy-plugin.rst index a83b5b78b..6598bab42 100644 --- a/doc/source/dev/plugin/strategy-plugin.rst +++ b/doc/source/dev/plugin/strategy-plugin.rst @@ -15,7 +15,9 @@ plugin interface which gives anyone the ability to integrate an external strategy in order to make use of placement algorithms. This section gives some guidelines on how to implement and integrate custom -strategies with Watcher. +strategies with Watcher. If you wish to create a third-party package for your +plugin, you can refer to our :ref:`documentation for third-party package +creation `. Pre-requisites @@ -26,64 +28,173 @@ configured so that it would provide you all the metrics you need to be able to use your strategy. -Creating a new plugin -===================== +Create a new plugin +=================== -First of all you have to: +In order to create a new strategy, you have to: -- Extend :py:class:`~.BaseStrategy` -- Implement its :py:meth:`~.BaseStrategy.execute` method +- Extend the :py:class:`~.UnclassifiedStrategy` class +- Implement its :py:meth:`~.BaseStrategy.get_name` class method to return the + **unique** ID of the new strategy you want to create. This unique ID should + be the same as the name of :ref:`the entry point we will declare later on + `. +- Implement its :py:meth:`~.BaseStrategy.get_display_name` class method to + return the translated display name of the strategy you want to create. + Note: Do not use a variable to return the translated string so it can be + automatically collected by the translation tool. +- Implement its :py:meth:`~.BaseStrategy.get_translatable_display_name` + class method to return the translation key (actually the english display + name) of your new strategy. The value return should be the same as the + string translated in :py:meth:`~.BaseStrategy.get_display_name`. +- Implement its :py:meth:`~.BaseStrategy.execute` method to return the + solution you computed within your strategy. -Here is an example showing how you can write a plugin called ``DummyStrategy``: +Here is an example showing how you can write a plugin called ``NewStrategy``: .. code-block:: python - import uuid + import abc - class DummyStrategy(BaseStrategy): + import six - DEFAULT_NAME = "dummy" - DEFAULT_DESCRIPTION = "Dummy Strategy" + from watcher._i18n import _ + from watcher.decision_engine.strategy.strategies import base - def __init__(self, name=DEFAULT_NAME, description=DEFAULT_DESCRIPTION): - super(DummyStrategy, self).__init__(name, description) - def execute(self, model): - migration_type = 'live' - src_hypervisor = 'compute-host-1' - dst_hypervisor = 'compute-host-2' - instance_id = uuid.uuid4() - parameters = {'migration_type': migration_type, - 'src_hypervisor': src_hypervisor, - 'dst_hypervisor': dst_hypervisor} - self.solution.add_action(action_type="migration", - resource_id=instance_id, + class NewStrategy(base.UnclassifiedStrategy): + + def __init__(self, osc=None): + super(NewStrategy, self).__init__(osc) + + def execute(self, original_model): + self.solution.add_action(action_type="nop", input_parameters=parameters) # Do some more stuff here ... return self.solution + @classmethod + def get_name(cls): + return "new_strategy" + + @classmethod + def get_display_name(cls): + return _("New strategy") + + @classmethod + def get_translatable_display_name(cls): + return "New strategy" + + As you can see in the above example, the :py:meth:`~.BaseStrategy.execute` method returns a :py:class:`~.BaseSolution` instance as required. This solution is what wraps the abstract set of actions the strategy recommends to you. This solution is then processed by a :ref:`planner ` to produce -an action plan which shall contain the sequenced flow of actions to be +an action plan which contains the sequenced flow of actions to be executed by the :ref:`Watcher Applier `. -Please note that your strategy class will be instantiated without any -parameter. Therefore, you should make sure not to make any of them required in -your ``__init__`` method. +Please note that your strategy class will expect to find the same constructor +signature as BaseStrategy to instantiate you strategy. Therefore, you should +ensure that your ``__init__`` signature is identical to the +:py:class:`~.BaseStrategy` one. + + +Create a new goal +================= + +As stated before, the ``NewStrategy`` class extends a class called +:py:class:`~.UnclassifiedStrategy`. This class actually implements a set of +abstract methods which are defined within the :py:class:`~.BaseStrategy` parent +class. + +Once you are confident in your strategy plugin, the next step is now to +classify your goal by assigning it a proper goal. To do so, you can either +reuse existing goals defined in Watcher. As of now, four goal-oriented abstract +classes are defined in Watcher: + +- :py:class:`~.UnclassifiedStrategy` which is the one I mentioned up until now. +- :py:class:`~.DummyBaseStrategy` which is used by :py:class:`~.DummyStrategy` + for testing purposes. +- :py:class:`~.ServerConsolidationBaseStrategy` +- :py:class:`~.ThermalOptimizationBaseStrategy` + +If none of the above actually correspond to the goal your new strategy +achieves, you can define a brand new one. To do so, you need to: + +- Extend the :py:class:`~.BaseStrategy` class to make your new goal-oriented + strategy abstract class : +- Implement its :py:meth:`~.BaseStrategy.get_goal_name` class method to + return the **unique** ID of the goal you want to achieve. +- Implement its :py:meth:`~.BaseStrategy.get_goal_display_name` class method + to return the translated display name of the goal you want to achieve. + Note: Do not use a variable to return the translated string so it can be + automatically collected by the translation tool. +- Implement its :py:meth:`~.BaseStrategy.get_translatable_goal_display_name` + class method to return the goal translation key (actually the english + display name). The value return should be the same as the string translated + in :py:meth:`~.BaseStrategy.get_goal_display_name`. + +Here is an example showing how you can define a new ``NEW_GOAL`` goal and +modify your ``NewStrategy`` plugin so it now achieves the latter: + +.. code-block:: python + + import abc + + import six + + from watcher._i18n import _ + from watcher.decision_engine.strategy.strategies import base + + @six.add_metaclass(abc.ABCMeta) + class NewGoalBaseStrategy(base.BaseStrategy): + + @classmethod + def get_goal_name(cls): + return "NEW_GOAL" + + @classmethod + def get_goal_display_name(cls): + return _("New goal") + + @classmethod + def get_translatable_goal_display_name(cls): + return "New goal" + + + class NewStrategy(NewGoalBaseStrategy): + + def __init__(self, osc=None): + super(NewStrategy, self).__init__(osc) + + def execute(self, original_model): + self.solution.add_action(action_type="nop", + input_parameters=parameters) + # Do some more stuff here ... + return self.solution + + @classmethod + def get_name(cls): + return "new_strategy" + + @classmethod + def get_display_name(cls): + return _("New strategy") + + @classmethod + def get_translatable_display_name(cls): + return "New strategy" Abstract Plugin Class ===================== -Here below is the abstract :py:class:`~.BaseStrategy` class that every single -strategy should implement: +Here below is the abstract :py:class:`~.BaseStrategy` class: .. autoclass:: watcher.decision_engine.strategy.strategies.base.BaseStrategy :members: :noindex: +.. _strategy_plugin_add_entrypoint: Add a new entry point ===================== @@ -93,7 +204,9 @@ strategy must be registered as a named entry point under the ``watcher_strategies`` entry point of your ``setup.py`` file. If you are using pbr_, this entry point should be placed in your ``setup.cfg`` file. -The name you give to your entry point has to be unique. +The name you give to your entry point has to be unique and should be the same +as the value returned by the :py:meth:`~.BaseStrategy.get_id` class method of +your strategy. Here below is how you would proceed to register ``DummyStrategy`` using pbr_: @@ -101,7 +214,7 @@ Here below is how you would proceed to register ``DummyStrategy`` using pbr_: [entry_points] watcher_strategies = - dummy = thirdparty.dummy:DummyStrategy + dummy_strategy = thirdparty.dummy:DummyStrategy To get a better understanding on how to implement a more advanced strategy, @@ -117,16 +230,10 @@ plugins when it is restarted. If a Python package containing a custom plugin is installed within the same environment as Watcher, Watcher will automatically make that plugin available for use. -At this point, Watcher will use your new strategy if you reference it in the -``goals`` under the ``[watcher_goals]`` section of your ``watcher.conf`` -configuration file. For example, if you want to use a ``dummy`` strategy you -just installed, you would have to associate it to a goal like this: - -.. code-block:: ini - - [watcher_goals] - goals = BALANCE_LOAD:basic,MINIMIZE_ENERGY_CONSUMPTION:dummy - +At this point, Watcher will scan and register inside the :ref:`Watcher Database +` all the strategies (alongside the goals they +should satisfy) you implemented upon restarting the :ref:`Watcher Decision +Engine `. You should take care when installing strategy plugins. By their very nature, there are no guarantees that utilizing them as is will be supported, as @@ -148,7 +255,6 @@ for various types of backends. A list of the available backends is located here_. The Ceilosca project is a good example of how to create your own pluggable backend. - Finally, if your strategy requires new metrics not covered by Ceilometer, you can add them through a Ceilometer `plugin`_. @@ -191,7 +297,7 @@ Read usage metrics using the Watcher Cluster History Helper Here below is the abstract ``BaseClusterHistory`` class of the Helper. -.. autoclass:: watcher.metrics_engine.cluster_history.api.BaseClusterHistory +.. autoclass:: watcher.metrics_engine.cluster_history.base.BaseClusterHistory :members: :noindex: diff --git a/doc/source/glossary.rst b/doc/source/glossary.rst index 84da166e0..d3ea28738 100644 --- a/doc/source/glossary.rst +++ b/doc/source/glossary.rst @@ -99,14 +99,14 @@ The :ref:`Cluster ` may be divided in one or several Cluster Data Model ================== -.. watcher-term:: watcher.metrics_engine.cluster_model_collector.api +.. watcher-term:: watcher.metrics_engine.cluster_model_collector.base .. _cluster_history_definition: Cluster History =============== -.. watcher-term:: watcher.metrics_engine.cluster_history.api +.. watcher-term:: watcher.metrics_engine.cluster_history.base .. _controller_node_definition: @@ -223,8 +223,8 @@ measure of how much of the :ref:`Goal ` has been achieved in respect with constraints and :ref:`SLAs ` defined by the :ref:`Customer `. -The way efficacy is evaluated will depend on the -:ref:`Goal ` to achieve. +The way efficacy is evaluated will depend on the :ref:`Goal ` +to achieve. Of course, the efficacy will be relevant only as long as the :ref:`Action Plan ` is relevant @@ -323,7 +323,7 @@ Solution Strategy ======== -.. watcher-term:: watcher.decision_engine.strategy.strategies.base +.. watcher-term:: watcher.api.controllers.v1.strategy .. _watcher_applier_definition: diff --git a/doc/source/image_src/plantuml/sequence_create_audit_template.txt b/doc/source/image_src/plantuml/sequence_create_audit_template.txt index 98f8dc8cd..455cb3a77 100644 --- a/doc/source/image_src/plantuml/sequence_create_audit_template.txt +++ b/doc/source/image_src/plantuml/sequence_create_audit_template.txt @@ -2,15 +2,21 @@ actor Administrator -Administrator -> "Watcher CLI" : watcher audit-template-create +Administrator -> "Watcher CLI" : watcher audit-template-create \ +[--strategy-uuid ] "Watcher CLI" -> "Watcher API" : POST audit_template(parameters) -"Watcher API" -> "Watcher API" : make sure goal exist in configuration -"Watcher API" -> "Watcher Database" : create new audit_template in database +"Watcher API" -> "Watcher Database" : Request if goal exists in database +"Watcher API" <-- "Watcher Database" : OK -"Watcher API" <-- "Watcher Database" : new audit template uuid -"Watcher CLI" <-- "Watcher API" : return new audit template URL in HTTP Location Header -Administrator <-- "Watcher CLI" : new audit template uuid +"Watcher API" -> "Watcher Database" : Request if strategy exists in database (if provided) +"Watcher API" <-- "Watcher Database" : OK + +"Watcher API" -> "Watcher Database" : Create new audit_template in database +"Watcher API" <-- "Watcher Database" : New audit template UUID + +"Watcher CLI" <-- "Watcher API" : Return new audit template URL in HTTP Location Header +Administrator <-- "Watcher CLI" : New audit template UUID @enduml diff --git a/doc/source/image_src/plantuml/sequence_launch_action_plan.txt b/doc/source/image_src/plantuml/sequence_launch_action_plan.txt index 92469e654..88785ced5 100644 --- a/doc/source/image_src/plantuml/sequence_launch_action_plan.txt +++ b/doc/source/image_src/plantuml/sequence_launch_action_plan.txt @@ -4,8 +4,8 @@ actor Administrator Administrator -> "Watcher CLI" : watcher action-plan-start -"Watcher CLI" -> "Watcher API" : PATCH action_plan(state=TRIGGERED) -"Watcher API" -> "Watcher Database" : action_plan.state=TRIGGERED +"Watcher CLI" -> "Watcher API" : PATCH action_plan(state=PENDING) +"Watcher API" -> "Watcher Database" : action_plan.state=PENDING "Watcher CLI" <-- "Watcher API" : HTTP 200 diff --git a/doc/source/images/sequence_create_audit_template.png b/doc/source/images/sequence_create_audit_template.png index 57c539aec0aac4010a1f3418aa70e46379071521..92b57bc54cc6bf6ffd2f75da1f0523dec3562adf 100644 GIT binary patch literal 28206 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 z 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 diff --git a/doc/source/images/sequence_launch_action_plan.png b/doc/source/images/sequence_launch_action_plan.png index 2c7ece74e660b583fe8f5309a343cc7a95c5bf3a..97465c568b9ccecf6f806d537a791d22e0415548 100644 GIT binary patch literal 26060 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 is an algorithm implementation which is +able to find a :ref:`Solution ` for a given +:ref:`Goal `. + +There may be several potential strategies which are able to achieve the same +:ref:`Goal `. This is why it is possible to configure which +specific :ref:`Strategy ` should be used for each goal. + +Some strategies may provide better optimization results but may take more time +to find an optimal :ref:`Solution `. +""" + from oslo_config import cfg import pecan diff --git a/watcher/decision_engine/strategy/strategies/base.py b/watcher/decision_engine/strategy/strategies/base.py index 8bcb99346..e35b92d18 100644 --- a/watcher/decision_engine/strategy/strategies/base.py +++ b/watcher/decision_engine/strategy/strategies/base.py @@ -169,6 +169,29 @@ class DummyBaseStrategy(BaseStrategy): return "Dummy goal" +@six.add_metaclass(abc.ABCMeta) +class UnclassifiedStrategy(BaseStrategy): + """This base class is used to ease the development of new strategies + + The goal defined within this strategy can be used to simplify the + documentation explaining how to implement a new strategy plugin by + ommitting the need for the strategy developer to define a goal straight + away. + """ + + @classmethod + def get_goal_name(cls): + return "UNCLASSIFIED" + + @classmethod + def get_goal_display_name(cls): + return _("Unclassified") + + @classmethod + def get_translatable_goal_display_name(cls): + return "Unclassified" + + @six.add_metaclass(abc.ABCMeta) class ServerConsolidationBaseStrategy(BaseStrategy): diff --git a/watcher/decision_engine/strategy/strategies/vm_workload_consolidation.py b/watcher/decision_engine/strategy/strategies/vm_workload_consolidation.py index 4c89dc2cc..c897e2322 100644 --- a/watcher/decision_engine/strategy/strategies/vm_workload_consolidation.py +++ b/watcher/decision_engine/strategy/strategies/vm_workload_consolidation.py @@ -46,10 +46,11 @@ class VMWorkloadConsolidation(base.ServerConsolidationBaseStrategy): This strategy produces a solution resulting in more efficient utilization of cluster resources using following four phases: - * Offload phase - handling over-utilized resources - * Consolidation phase - handling under-utilized resources - * Solution optimization - reducing number of migrations - * Deactivation of unused hypervisors + + * Offload phase - handling over-utilized resources + * Consolidation phase - handling under-utilized resources + * Solution optimization - reducing number of migrations + * Deactivation of unused hypervisors A capacity coefficients (cc) might be used to adjust optimization thresholds. Different resources may require different coefficient @@ -58,7 +59,7 @@ class VMWorkloadConsolidation(base.ServerConsolidationBaseStrategy): If the cc equals 1 the full resource capacity may be used, cc values lower than 1 will lead to resource under utilization and values higher than 1 will lead to resource overbooking. - e.g. If targeted utilization is 80% of hypervisor capacity, + e.g. If targeted utilization is 80 percent of hypervisor capacity, the coefficient in the consolidation phase will be 0.8, but may any lower value in the offloading phase. The lower it gets the cluster will appear more released (distributed) for the @@ -397,12 +398,13 @@ class VMWorkloadConsolidation(base.ServerConsolidationBaseStrategy): This is done by eliminating unnecessary or circular set of migrations which can be replaced by a more efficient solution. e.g.: - * A->B, B->C => replace migrations A->B, B->C with - a single migration A->C as both solution result in - VM running on hypervisor C which can be achieved with - one migration instead of two. - * A->B, B->A => remove A->B and B->A as they do not result - in a new VM placement. + + * A->B, B->C => replace migrations A->B, B->C with + a single migration A->C as both solution result in + VM running on hypervisor C which can be achieved with + one migration instead of two. + * A->B, B->A => remove A->B and B->A as they do not result + in a new VM placement. :param model: model_root object """ @@ -502,10 +504,11 @@ class VMWorkloadConsolidation(base.ServerConsolidationBaseStrategy): This strategy produces a solution resulting in more efficient utilization of cluster resources using following four phases: - * Offload phase - handling over-utilized resources - * Consolidation phase - handling under-utilized resources - * Solution optimization - reducing number of migrations - * Deactivation of unused hypervisors + + * Offload phase - handling over-utilized resources + * Consolidation phase - handling under-utilized resources + * Solution optimization - reducing number of migrations + * Deactivation of unused hypervisors :param original_model: root_model object """