watcher-specs/specs/stein/implemented/enhance-watcher-applier-engine.rst
licanwei a895f7bcac move specs from apporved to implemented
Change-Id: I2a36581930ff42d8f61ffd001b974d5580595017
2019-03-22 09:49:45 +08:00

157 lines
3.5 KiB
ReStructuredText

..
This work is licensed under a Creative Commons Attribution 3.0 Unported
License.
http://creativecommons.org/licenses/by/3.0/legalcode
===============================
Enhance Watcher Applier Engine
===============================
https://blueprints.launchpad.net/watcher/+spec/enhance-watcher-applier-engine
`Taskflow`_ is the default workflow engine for Watcher Applier.
In Watcher the flow pattern for linked actions is Graph flow.
For parent action A and child action B, this means B depends on A
and that the execution of B must wait until A finished.
Taskflow has a callback function to decide at runtime whether B
should be allowed to execute. The callback function returns
a boolean True to allow B execution or False to not.
Currently the callback function always returns True in Watcher Applier.
Problem description
===================
For example, we want to live migrate a VM, if there are two potential
target nodes that meet the requirements. However, we don't know which
one will definitely be able to migrate successfully. The existing
strategy will select one to create a Migrate action and the action may
fail if there are no enough resource in the destination node.
A solution is that we can make two linked actions for the two
potential targets. If first action succeeded, then the second action
will be ignored. Otherwise continue to execute the second one.
For this purpose, We need the callback function returns True or False
depending on the result of previous action A execution.
Action B should be executed unless action A failed. If action A
executes success, the execution of action B should be ignored.
Use Cases
----------
As a Watcher user, I want to decide an action whether to be executed
depending on the result of a previous action.
Proposed change
===============
Now the callback function, named decider, always returns True. We propose
to add a new config option 'action_execution_rule' which is a dict type.
Its key field is strategy name and the value is 'ALWAYS' or 'ANY'.
'ALWAYS' means the callback function returns True as usual.
'ANY' means the return depends on the result of previous action execution.
The callback returns True if previous action gets failed, and the engine
continues to run the next action. If previous action executes success,
the callback returns False then the next action will be ignored.
For strategies that aren't in 'action_execution_rule', the callback always
returns True.
If exception is throwing out during the action execution, reverting will
be triggered by taskflow. To continue executing the next action,
we return False instead of throwing an exception.
Alternatives
------------
None
Data model impact
-----------------
None
REST API impact
---------------
None
Security impact
---------------
None
Notifications impact
--------------------
None
Other end user impact
---------------------
None
Performance Impact
------------------
None
Other deployer impact
---------------------
The default value of 'action_execution_rule' doesn't change
the behavior of Applier.
Developer impact
----------------
None
Implementation
==============
Assignee(s)
-----------
Primary assignee:
licanwei
Work Items
----------
* Add a new config option 'action_execution_rule'
* Implement the callback function
Dependencies
============
None
Testing
=======
Unittest for all changes
Documentation Impact
====================
None
References
==========
None
History
=======
None
.. _Taskflow: https://docs.openstack.org/taskflow/latest/