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.