{%- from "ironic/map.jinja" import client with context %}
{%- if client.enabled %}

ironic_client_pkg:
  pkg.installed:
    - names: {{ client.pkgs }}
    - install_recommends: False

{%- for identity_name, nodes in client.nodes.iteritems() %}
  {%- for node in nodes %}

node_{{ node.name }}_present:
  ironicv1.node_present:
    - name: {{ node.name }}
    - driver: {{ node.driver }}
    - driver_info: {{ node.driver_info|default({}) }}
    - cloud_name: {{ client.cloud_name }}
    - properties: {{ node.properties|default({}) }}
    {%- if node.network_interface is defined %}
    - network_interface: {{ node.network_interface }}
    {%- endif %}
    {%- if node.storage_interface is defined %}
    - storage_interface: {{ node.storage_interface }}
    {%- endif %}
    {%- if node.microversion is defined %}
    - microversion: "{{ node.microversion }}"
    {%- endif %}

  {%- if node.ports is defined %}
  {%- for port in node.ports %}

{{ node.name }}_port{{ loop.index }}_present:
  ironicv1.port_present:
    - address: {{ port.address }}
    - node: {{ node.name }}
    - cloud_name: {{ client.cloud_name }}
    {%- if port.local_link_connection is defined %}
    - local_link_connection: {{ port.local_link_connection }}
    {%- endif %}
    {%- if port.microversion is defined %}
    - microversion: "{{ port.microversion }}"
    {%- endif %}

  {%- endfor %} # end for ports
  {%- endif %} # end if node.ports defined

    {%- for vc_name, vc in node.get('volume_connectors', {}).iteritems() %}
{{ node.name }}_volume_connector{{ vc_name }}_present:
  ironicv1.volume_connector_present:
    - name: {{ vc.get('name', vc_name) }}
    - node: {{ node.name }}
    - volume_type: {{ vc.volume_type }}
    - cloud_name: {{ client.cloud_name }}

    {%- endfor %} # end for volume_connectors
  {%- endfor %} # end for nodes
{%- endfor %} # end client.nodes.iteritems

  {%- if client.get('node_state_transition', {}).get('enabled') %}
    {%- if client.node_state_transition.enroll_to_available is defined %}
    {# Ensure nodes are moved to available state, might take some time when automated cleaning is enabled #}
ironic_nodes_in_available_state:
  ironicv1.ensure_target_state:
    - name: 'available'
    {%- if client.node_state_transition.enroll_to_available.node_names is defined %}
    - node_names: {{ client.node_state_transition.enroll_to_available.node_names }}
    {%- endif %}
    {%- if client.node_state_transition.enroll_to_available.provision_state is defined %}
    - provision_state: {{ client.node_state_transition.enroll_to_available.provision_state }}
    {%- endif %}
    - cloud_name: {{ client.cloud_name }}
    {%- if client.node_state_transition.enroll_to_available.pool_size is defined %}
    - pool_size: {{ client.node_state_transition.enroll_to_available.pool_size }}
    {%- endif %}
    {%- if client.node_state_transition.enroll_to_available.sleep_time is defined %}
    - sleep_time: {{ client.node_state_transition.enroll_to_available.sleep_time }}
    {%- endif %}
    {%- if client.node_state_transition.enroll_to_available.timeout is defined %}
    - timeout: {{ client.node_state_transition.enroll_to_available.timeout }}
    {%- endif %}
    {%- endif %} # enroll_to_available
  {%- endif %} #  node_state_transition.enabled

{%- endif %} # end if client.enabled
