Workflows are written using XML markup language. This XML has no fixed structure but instead XML tags are translated into Python function calls. Thus such XML can be considered as a simplified programming language.
Consider the following XML fragment:
<func arg1="value1" arg2="value2" />
This is an equivalent to func(arg1='value1', arg2='value2') in Python. Tag name is mapped to a function name, one that Murano Conductor knows. Each attribute corresponds to function argument.
XML functions may also have a body. It is evaluated to "body" argument. Thus
<func arg1="value1" arg2="value2">some text</func>
is translated to func(arg1='value1', arg2='value2', body='some text')
In example above all function arguments were constant values. But they also can be evaluated:
<foo arg="value">
<bar/>
</foo>
turns to
body_value = bar()
foo(arg='value', body=body_value)
Tag body may consist of several function invocations. In such case all values would be concatenated. For example if
def foo(**kwargs):
return "foo"
def bar(**kwargs):
return "bar"
then <func><foo/> - <bar/></func> will result in func(body = 'foo - bar')
Function parameters can also be function calls using <parameter> tag
<foo arg="value"/>
can be rewritten as
<foo>
<parameter name="arg">value</parameter>
</foo>
while that later form is more verbose it allows having dynamically evaluated values as function arguments:
<foo>
<parameter name="arg"><bar/></parameter>
</foo>
Functions may also have other custom tags in their body that interpreted in a way different from plain function invocation.


