Using a delay between states to resolve Jinja template argument binding#

Idem SLS files support a dependency delay between states, where a state isn’t rendered until a preceding state has been rendered:

State_A:
  test.nop
#!require: State_A
State_B:
  test.nop

You can use a delay to parse and process an argument binding reference in a Jinja template. A Jinja template argument binding reference follows this pattern:

{% for key,value in hub.idem.arg_bind.resolve('${<cloud>:<state>}').items() %}
    {{ value }}
{% endfor %}

In the following example, State_B includes a Jinja template argument binding reference that needs a value from State_A. The #!require:State_A delay forces the rendering of State_B to first wait for State_A to be rendered, which makes its Name tag value available to State_B.

State_A:
  cloud.subnetwork.search:
    - tags: {Name: {% params.get("pvt_subnetwork_name") %}}

#!require:State_A

State_B:
  cloud.private_cloud_attachment.present:
    - name: "Private cloud B"
    - subnetwork_ids: {% subnetwork_ids=[] %} {% for k,v in  hub.idem.arg_bind.resolve('${cloud.subnetwork:State_A}').items() %} {{ subnetwork_ids.append(v["resource_id"]) }} {% endfor %}

Fetching argument binding reference values#

For a Jinja template containing an argument binding reference to be rendered, the argument binding must be passed to custom function hub.idem.arg_bind.resolve() as a string. The function parses the argument binding template and resolves the value.

The new_state of the prerequisite block executed states should be available in hub.idem.RUNS[name][“running”] using the argument binding references in Jinja that were resolved in the rend subsystem.

For List, data resolution happens as below - The target ‘foo:bar:[0]’ or ‘foo:bar[0]’ will return data[‘foo’][‘bar’][0] if data like {‘foo’:{‘bar’:[‘baz’]}}

For Dict, data resolution happens as below - The target ‘foo:bar:0’ will return data[‘foo’][‘bar’][0] if data like {‘foo’:{‘bar’:{‘0’:’baz’}}}