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

neutron_client_packages:
  pkg.installed:
  - names: {{ client.pkgs }}


{%- for identity_name, identity in client.server.iteritems() %}

{%- if identity.security_group is defined %}

{%- for security_group_name, security_group in identity.security_group.iteritems() %}
openstack_security_group_{{ security_group_name }}:
  neutronng.security_group_present:
    - name: {{ security_group_name }}
    {%- if security_group.description is defined %}
    - description: {{ security_group.description }}
    {%- endif %}
    - rules: {{ security_group.rules }}
    - profile: {{ identity_name }}
    - tenant: {{ security_group.tenant }}
    {%- if identity.endpoint_type is defined %}
    - endpoint_type: {{ identity.endpoint_type }}
    {%- endif %}
{%- endfor %}

{%- endif %}

{%- if identity.network is defined %}

{%- for network_name, network in identity.network.iteritems() %}

neutron_openstack_network_{{ network_name }}:
  neutronng.network_present:
    - name: {{ network_name }}
    - profile: {{ identity_name }}
    - tenant: {{ network.tenant }}
    {%- if identity.endpoint_type is defined %}
    - endpoint_type: {{ identity.endpoint_type }}
    {%- endif %}

    {%- if network.provider_network_type is defined %}
    - provider_network_type: {{ network.provider_network_type }}
    {%- endif %}
    {%- if network.provider_physical_network is defined %}
    - provider_physical_network: {{ network.provider_physical_network }}
    {%- endif %}
    {%- if network.router_external is defined %}
    - router_external: {{ network.router_external }}
    {%- endif %}
    {%- if network.admin_state_up is defined %}
    - admin_state_up: {{ network.admin_state_up }}
    {%- endif %}
    {%- if network.shared is defined %}
    - shared: {{ network.shared }}
    {%- endif %}
    {%- if network.provider_segmentation_id is defined %}
    - provider_segmentation_id: {{ network.provider_segmentation_id }}
    {%- endif %}
    {%- if network.dns_domain is defined %}
    - dns_domain: {{ network.dns_domain }}
    {%- endif %}
    {%- if network.is_default is defined %}
    - is_default: {{ network.is_default }}
    {%- endif %}

{%- if network.subnet is defined %}

{%- for subnet_name, subnet in network.subnet.iteritems() %}
neutron_openstack_subnet_{{ subnet_name }}:
  neutronng.subnet_present:
    - name: {{ subnet_name }}
    - network_name: {{ network_name }}
    - profile: {{ identity_name }}
    - tenant: {{ network.tenant }}
    {%- if identity.endpoint_type is defined %}
    - endpoint_type: {{ identity.endpoint_type }}
    {%- endif %}

    {%- if subnet.cidr is defined %}
    - cidr: {{ subnet.cidr  }}
    {%- endif %}
    {%- if subnet.ip_version is defined %}
    - ip_version: {{ subnet.ip_version }}
    {%- endif %}
    {%- if subnet.enable_dhcp is defined %}
    - enable_dhcp: {{ subnet.enable_dhcp }}
    {%- endif %}
    {%- if subnet.allocation_pools is defined %}
    - allocation_pools: {{ subnet.allocation_pools }}
    {%- endif %}
    {%- if subnet.gateway_ip is defined %}
    - gateway_ip: {{ subnet.gateway_ip }}
    {%- endif %}
    {%- if subnet.dns_nameservers is defined %}
    - dns_nameservers: {{ subnet.dns_nameservers }}
    {%- endif %}
    {%- if subnet.host_routes is defined %}
    - host_routes: {{ subnet.host_routes }}
    {%- endif %}
    - require:
      - neutronng: neutron_openstack_network_{{ network_name }}

{%- endfor %}

{%- endif %}

{%- if network.port is defined %}

{%- for port_name, port in network.port.iteritems() %}
neutron_openstack_port_{{ port_name }}:
  neutronng.port_present:
    - network_name: {{ network_name }}
    - name: {{ port_name }}
    - profile: {{ identity_name }}
    - tenant: {{ network.tenant }}
    {%- if identity.endpoint_type is defined %}
    - endpoint_type: {{ identity.endpoint_type }}
    {%- endif %}
    {%- if port.description is defined %}
    - description: {{ port.description  }}
    {%- endif %}
    {%- if port.fixed_ips is defined %}
    - fixed_ips: {{ port.fixed_ips }}
    {%- endif %}
    {%- if port.device_id is defined %}
    - device_id: {{ port.device_id }}
    {%- endif %}
    {%- if port.device_owner is defined %}
    - device_owner: {{ port.device_owner }}
    {%- endif %}
    {%- if port.binding_host_id is defined %}
    - binding_host_id: {{ port.binding_host_id }}
    {%- endif %}
    {%- if port.admin_state_up is defined %}
    - admin_state_up: {{ port.admin_state_up }}
    {%- endif %}
    {%- if port.mac_address is defined %}
    - mac_address: {{ port.mac_address }}
    {%- endif %}
    {%- if port.vnic_type is defined %}
    - vnic_type: {{ port.vnic_type }}
    {%- endif %}
    {%- if port.binding_profile is defined %}
    - binding_profile: {{ port.binding_profile }}
    {%- endif %}
    {%- if port.security_groups is defined %}
    - security_groups: {{ port.security_groups }}
    {%- endif %}
    {%- if port.extra_dhcp_opt is defined %}
    - extra_dhcp_opt: {{ port.extra_dhcp_opt }}
    {%- endif %}
    {%- if port.qos_policy is defined %}
    - qos_policy: {{ port.qos_policy }}
    {%- endif %}
    {%- if port.allowed_address_pair is defined %}
    - allowed_address_pair: {{ port.allowed_address_pair }}
    {%- endif %}
    {%- if port.dns_name is defined %}
    - dns_name: {{ port.dns_name }}
    {%- endif %}
    - require:
      - neutronng: neutron_openstack_network_{{ network_name }}
{%- endfor %}

{%- endif %}

{%- endfor %}

{%- endif %}

{%- if identity.router is defined %}

{%- for router_name, router in identity.router.iteritems() %}
neutron_openstack_router_{{ router_name }}:
  neutronng.router_present:
    - name: {{ router_name }}
    - interfaces: {{ router.interfaces }}
    - gateway_network: {{ router.gateway_network }}
    - profile: {{ identity_name }}
    - tenant: {{ router.tenant }}
    - admin_state_up: {{ router.admin_state_up }}
    {%- if identity.endpoint_type is defined %}
    - endpoint_type: {{ identity.endpoint_type }}
    {%- endif %}
{%- endfor %}

{%- endif %}

{%- if identity.floating_ip is defined %}

{%- for instance_name, instance in identity.floating_ip.iteritems() %}
neutron_floating_ip_for_{{ instance_name }}:
  neutronng.floatingip_present:
    - subnet: {{ instance.subnet }}
    - tenant_name: {{ instance.tenant }}
    - name: {{ instance.server }}
    - network:  {{ instance.network }}
    - profile: {{ identity_name }}
    {%- if identity.endpoint_type is defined %}
    - endpoint_type: {{ identity.endpoint_type }}
    {%- endif %}

{%- endfor %}

{%- endif %}

{%- endfor %}

{%- endif %}
