[openstack-dev] [Mistral] Converging discussions on WF context and WF/task/action inputs
Anastasia Kuznetsova
akuznetsova at mirantis.com
Wed Dec 24 08:06:54 UTC 2014
Winson, Renat,
I have a few questions, because some of aspects aren't clear to me.
1) How does the end user will pass env variables to workflow?Will you add
one more optional parameter to execution-create command?
mistral execution-create wf wf_input wf_params wf_env
If yes than what is wf_env will be, json file?
2) Retuning to first example:
...
action: std.sql conn_str={$.env.conn_str} query={$.query}
...
$.env - is it a name of environment or it will be a registered syntax to
getting access to values from env ?
3) Can user has a few environments?
On Wed, Dec 24, 2014 at 8:20 AM, Renat Akhmerov <rakhmerov at mirantis.com>
wrote:
> Thanks Winson,
>
> Since we discussed all this already I just want to confirm that I fully
> support this model, it will significantly help us make much more concise,
> readable and maintainable workflows. I spent a lot of time thinking about
> it and don’t see any problems with it. Nice job!
>
> However, all additional comments and questions are more than welcomed!
>
>
> Renat Akhmerov
> @ Mirantis Inc.
>
>
>
> On 24 Dec 2014, at 04:32, W Chan <m4d.coder at gmail.com> wrote:
>
> After some online discussions with Renat, the following is a revision of
> the proposal to address the following related blueprints.
> *
> https://blueprints.launchpad.net/mistral/+spec/mistral-execution-environment
> * https://blueprints.launchpad.net/mistral/+spec/mistral-global-context
> *
> https://blueprints.launchpad.net/mistral/+spec/mistral-default-input-values
> * https://blueprints.launchpad.net/mistral/+spec/mistral-runtime-context
>
> Please refer to the following threads for backgrounds.
> *
> http://lists.openstack.org/pipermail/openstack-dev/2014-December/052643.html
> *
> http://lists.openstack.org/pipermail/openstack-dev/2014-December/052960.html
> *
> http://lists.openstack.org/pipermail/openstack-dev/2014-December/052824.html
>
>
> *Workflow Context Scope*
> 1. context to workflow is passed to all its subflows and subtasks/actions
> (aka children) only explicitly via inputs
> 2. context are passed by value (copy.deepcopy) to children
> 3. change to context is passed to parent only when it's explicitly
> published at the end of the child execution
> 4. change to context at the parent (after a publish from a child) is
> passed to subsequent children
>
> *Environment Variables*
> Solves the problem for quickly passing pre-defined inputs to a WF
> execution. In the WF spec, environment variables are referenced as
> $.env.var1, $.env.var2, etc. We should implement an API and DB model
> where users can pre-defined different environments with their own set of
> variables. An environment can be passed either by name from the DB or
> adhoc by dict in start_workflow. On workflow execution, a copy of the
> environment is saved with the execution object. Action inputs are still
> declared explicitly in the WF spec. This does not solve the problem where
> common inputs are specified over and over again. So if there are multiple
> SQL tasks in the WF, the WF author still needs to supply the conn_str
> explicitly for each task. In the example below, let's say we have a SQL
> Query Action that takes a connection string and a query statement as
> inputs. The WF author can specify that the conn_str input is supplied from
> the $.env.conn_str.
>
> *Example:*
>
> # Assume this SqlAction is registered as std.sql in Mistral's Action table.
> class SqlAction(object):
> def __init__(self, conn_str, query):
> ...
>
> ...
>
> version: "2.0"
> workflows:
> demo:
> type: direct
> input:
> - query
> output:
> - records
> tasks:
> query:
> action: std.sql conn_str={$.env.conn_str} query={$.query}
> publish:
> records: $
>
> ...
>
> my_adhoc_env = {
> "conn_str": "mysql://admin:secrete@localhost/test"
> }
>
> ...
>
> # adhoc by dict
> start_workflow(wf_name, wf_inputs, env=my_adhoc_env)
>
> OR
>
> # lookup by name from DB model
> start_workflow(wf_name, wf_inputs, env="my_lab_env")
>
>
> *Define Default Action Inputs as Environment Variables*
> Solves the problem where we're specifying the same inputs to subflows and
> subtasks/actions over and over again. On command execution, if action
> inputs are not explicitly supplied, then defaults will be lookup from the
> environment.
>
> *Example:*
> Using the same example from above, the WF author can still supply both
> conn_str and query inputs in the WF spec. However, the author also has the
> option to supply that as default action inputs. An example environment
> structure is below. "__actions" should be reserved and immutable. Users
> can specific one or more default inputs for the sql action as nested dict
> under "__actions". Recursive YAQL eval should be supported in the env
> variables.
>
> version: "2.0"
> workflows:
> demo:
> type: direct
> input:
> - query
> output:
> - records
> tasks:
> query:
> action: std.sql query={$.query}
> publish:
> records: $
>
> ...
>
> my_adhoc_env = {
> "sql_server": "localhost",
> "__actions": {
> "std.sql": {
> "conn_str": "mysql://admin:secrete@{$.env.sql_server}/test"
> }
> }
> }
>
>
> *Default Input Values Supplied Explicitly in WF Spec*
> Please refer to this blueprint
> <https://blueprints.launchpad.net/mistral/+spec/mistral-default-input-values>
> for background. This is a different use case. To support, we just need to
> set the correct order of precedence in applying values.
> 1. Input explicitly given to the sub flow/task in the WF spec
> 2. Default input supplied from env
> 3. Default input supplied at WF spec
>
> *Putting this together...*
> At runtime, the WF context would be similar to the following example.
> This will be use to recursively eval the inputs for subflow/tasks/actions.
>
> ctx = {
> "var1": …,
> "var2": …,
> "my_server_ip": "10.1.23.250",
> "env": {
> "sql_server": "localhost",
> "__actions": {
> "std.sql": {
> "conn": "mysql://admin:secrete@{$.env.sql_server}/test"
> },
> "my.action": {
> "endpoint": "http://{$.my_server_ip}/v1/foo"
> }
> }
> }
> }
>
> *Runtime Context*
> Please refer to this thread
> <http://lists.openstack.org/pipermail/openstack-dev/2014-December/052824.html> for
> the background and discussion. The only change here is that on run_action,
> we will pass the runtime data as kwargs to all action invocation. This
> means all Action classes should have at least **kwargs added to the
> __init__ method.
>
> runtime = {
> "execution_id": ...,
> "task_id": ...,
> ...
> }
>
> ...
>
> action = SomeAction(..., runtime=runtime)
>
>
>
> _______________________________________________
> OpenStack-dev mailing list
> OpenStack-dev at lists.openstack.org
> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev
>
>
>
> _______________________________________________
> OpenStack-dev mailing list
> OpenStack-dev at lists.openstack.org
> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openstack.org/pipermail/openstack-dev/attachments/20141224/6d7e336a/attachment.html>
More information about the OpenStack-dev
mailing list