Argument Binding References#

An argument binding reference sets the state definition argument value to the result of another state execution. In this way, argument binding references determine the order of state execution in the structured layer state (SLS) file structure.

An argument binding reference uses the following format:

“${<cloud>:<state>:<property_path>}”

Where <cloud> is the state cloud path reference (excluding function reference), <state> is the state declaration ID, and <property_path> is a colon (:) delimited path to the property value.

In the following example, State_B will be executed before State_A because the State_A argument “state_B_id” requires the “ID” value from State_B output.

State_A:
   cloud.instance.present:
     - name: "Instance A"
     - state_B_id: "${cloud:State_B:ID}"
 State_B:
   cloud.instance.present:
     - name: "Instance B"

Indexes#

An argument binding reference can contain an index to point to a specific element of a collection property, as shown in the following example.

State_A:
  cloud.instance.present:
    - name: "Instance A"
    - state_B_address: "${cloud:State_B:nics[0]:address}"
State_B:
  cloud.instance.present:
    - name: "Instance B"
    - nics:
        - network_name: "Network_1"
          # address is populated after state is executed
          address:
        - network_name: "Network_2"
          # address is populated after state is executed
          address:

An argument binding reference can contain a wildcard (*) index to collect all elements in a collection property. In the following example, State_A “state_B_addresses” argument will be set to a list of 2 addresses, one address for each nic of State_B.

State_A:
  cloud.instance.present:
    - name: "Instance A"
    - state_B_addresses: "${cloud:State_B:nics[*]:address}"
State_B:
  cloud.instance.present:
    - name: "Instance B"
    - nics:
        - network_name: "Network_1"
          # address is populated after state is executed
          address:
        - network_name: "Network_2"
          # address is populated after state is executed
          address:

“Resource” Contract#

To support argument binding, a cloud plugin must implement a “resource” contract, where every state execution function must return a “new_state” property as part of the return dictionary. The “new_state” is used to resolve argument binding requisites.

Arg_bind Requisites#

Behind-the-scenes argument binding references are implemented using the Idem requisite system, where argument binding references are parsed during the SLS compilation phase and added to high data as arg_bind requisites. During arg_bind requisite execution, the “new_state” property returned after function execution is used to resolve the value of the referenced parameter.

The following example demonstrates SLS high data after the compilation phase, where “${cloud:State_B:ID}” is resolved as the arg_bind requisite.

State_A:
   cloud.instance.present:
     - name: "Instance A"
     - state_B_id: "${cloud:State_B:ID}"
     - arg_bind:
       - cloud:
          - State_B
             - ID: state_B_id
 State_B:
   cloud.instance.present:
     - name: "Instance B"