Closed nmaludy closed 5 years ago
For me it sounds like a typical/expected issue, when variable is not yet published/created and you're trying to use it too early:
publish:
master_server_arr: "{{ task('get_master_server').result.result.dnsServers.dnsServer }}"
master_server_obj: "{{ _master_server_arr[0] }}"
But I'll leave it for @m4dcoder to clarify & answer if there is a room for improvement in Mistral itself.
@armab @m4dcoder it doesn't seem to be jinja specific, the following YAQL does not work either:
version: '2.0'
menandmice.wf_test:
description: >
A sample workflow that demonstrates how to create a master DNS zone
and several slave zones on slave servers.
type: direct
input:
- session
- server
- zone_name
- master_server
- slave_servers
output:
master_server_ref: <% $.master_server_ref %>
master_server_ip: <% $.master_server_ip %>
tasks:
get_master_server:
action: menandmice.get_dns_servers
input:
session: <% $.session %>
server: <% $.server %>
filter: "name: <% $.master_server %>"
publish:
master_server_arr: <% task(get_master_server).result.result.dnsServers.dnsServer %>
master_server_obj: <% $.master_server_arr[0] %>
master_server_ref: <% $.master_server_obj.ref %>
master_server_ip: <% $.master_server_obj.address %>
I'm guessing/leaning towards this being a mistral issue not updating the context when each variable is published but only when the task is completed.
I tested this out by trying to print the published variables within the publish
stanza.
version: '2.0'
menandmice.wf_test:
description: >
A sample workflow that demonstrates how to create a master DNS zone
and several slave zones on slave servers.
type: direct
input:
- session
- server
- zone_name
- master_server
- slave_servers
output:
master_server_arr: <% $.master_server_arr %>
master_published: <% $.master_published %>
tasks:
get_master_server:
action: menandmice.get_dns_servers
input:
session: <% $.session %>
server: <% $.server %>
filter: "name: <% $.master_server %>"
publish:
master_server_arr: <% task(get_master_server).result.result.dnsServers.dnsServer %>
master_published: <% task(get_master_server).published %>
It looks like that is empty at the time of execution:
| status | succeeded (7s elapsed) |
| start_timestamp | Fri, 07 Jul 2017 13:34:15 UTC |
| end_timestamp | Fri, 07 Jul 2017 13:34:22 UTC |
| result | { |
| | "master_published": {},
Did a little digging on my own. If i'm looking at the code right the publish starts here:
https://github.com/StackStorm/mistral/blob/master/mistral/engine/tasks.py#L163
Which then runs the publish function here:
https://github.com/StackStorm/mistral/blob/master/mistral/workflow/data_flow.py#L187-L211
Then each publish expression is then evaluated here:
https://github.com/StackStorm/mistral/blob/master/mistral/expressions/__init__.py#L88-L103
In the expression evaluation it appears that the context is not updated at all during those calls, instead the data is written to a new dict that this returned from the evaluation. This new dict is then written to the task executions 'published` variable (which i assume is then merged into the workflows context at some point.. didn't get that far).
Since this is a mistral issue are there any thoughts? Do you think this is a worthwhile feature to request? Should i go a head and close this case?
Digging through mistral bug reports, looks like it's a known bug/feature request: https://bugs.launchpad.net/mistral/+bug/1680109
Thanks for contributing to this issue. As it has been 90 days since the last activity, we are automatically marking is as stale. If this issue is not relevant or applicable anymore (problem has been fixed in a new version or similar), please close the issue or let us know so we can close it. On the contrary, if the issue is still relevant, there is nothing you need to do, but if you have any additional details or context which would help us when working on this issue, please include it as a comment to this issue.
Closing in favor of Orquesta.
I have a mistral workflow that returns a fairly complex data structure. In order to decompose the parsing steps i tried parsing incrementally and assigning to different
publish:
variables: Unfortunately it seems that thepublish
ed variables are not made available immediately to the context.Version with error:
Error
Version that works:
I'll see if i can get a more simple example sometime tomorrow and also will test with YAQL.
Not sure if this is a mistral problem, a stackstorm problem, or expected behavior?