{%- from "neutron/map.jinja" import fwaas, server with context %}
[DEFAULT]

#
# From neutron
#

# Where to store Neutron state files. This directory must be writable by the
# agent. (string value)
#state_path = /var/lib/neutron
state_path = /var/lib/neutron

# The host IP to bind to. (unknown value)
#bind_host = 0.0.0.0
bind_host = {{ server.bind.address }}

# The port to bind to (port value)
# Minimum value: 0
# Maximum value: 65535
#bind_port = 9696
bind_port = {{ server.bind.port }}

# The path for API extensions. Note that this can be a colon-separated list of
# paths. For example: api_extensions_path =
# extensions:/path/to/more/exts:/even/more/exts. The __path__ of
# neutron.extensions is appended to this, so if your extensions are in there
# you don't need to specify them here. (string value)
#api_extensions_path =

# The type of authentication to use (string value)
#auth_strategy = keystone
auth_strategy = keystone

{%- if server.core_plugin is defined %}
core_plugin = {{ server.core_plugin }}
{%- if server.service_plugins is defined %}
{%- set service_plugins = [] %}
{%- for sname,service in server.service_plugins.iteritems() %}
{%- if service.enabled%}
{%- do service_plugins.append(sname)%}
{%- endif %}
{%- endfor %}
service_plugins = {{ ','.join(service_plugins) }}
{%- endif %}
{%- else %}

{% if server.backend.engine == "contrail" %}

api_extensions_path = extensions:/usr/lib/python2.7/dist-packages/neutron_plugin_contrail/extensions:/usr/lib/python2.7/dist-packages/neutron_lbaas/extensions
# The core plugin Neutron will use (string value)
core_plugin = neutron_plugin_contrail.plugins.opencontrail.contrail_plugin.NeutronPluginContrailCoreV2

service_plugins = neutron_plugin_contrail.plugins.opencontrail.loadbalancer.v2.plugin.LoadBalancerPluginV2

{% elif server.backend.engine in ["ml2", "ovn"] %}

core_plugin = neutron.plugins.ml2.plugin.Ml2Plugin

{% if server.backend.engine == "ml2" %}
{% set l3_plugin = 'neutron.services.l3_router.l3_router_plugin.L3RouterPlugin' %}
{% elif server.backend.engine == "ovn" %}
{% set l3_plugin = 'networking_ovn.l3.l3_ovn.OVNL3RouterPlugin' %}
{% endif %}

service_plugins = {{ server.backend.get('router', l3_plugin)}},metering
{%- if server.get('bgp_vpn', {}).get('enabled', False) -%},bgpvpn{%- endif -%}
{%- if fwaas.get('enabled', False) -%},{{ fwaas[fwaas.api_version]['service_plugin'] }}{%- endif -%}
{%- if server.get('qos', 'True') -%},neutron.services.qos.qos_plugin.QoSPlugin{%- endif -%}
{%- if server.get('vlan_aware_vms', False) -%},trunk{%- endif -%}
{%- if server.l2gw is defined and server.l2gw.get('enabled', False) -%},networking_l2gw.services.l2gateway.plugin.L2GatewayPlugin{%- endif -%}
{%- if server.get('sfc', {}).get('enabled', False) -%},flow_classifier,sfc{%- endif -%}

{% endif %}
{%- endif %}

# The service plugins Neutron will use (list value)
#service_plugins =

# The base MAC address Neutron will use for VIFs. The first 3 octets will
# remain unchanged. If the 4th octet is not 00, it will also be used. The
# others will be randomly generated. (string value)
#base_mac = fa:16:3e:00:00:00
{%- if server.base_mac is defined %}
base_mac = {{ server.base_mac }}
{%- endif %}

# Allow the usage of the bulk API (boolean value)
#allow_bulk = true

# The maximum number of items returned in a single response, value was
# 'infinite' or negative integer means no limit (string value)
#pagination_max_limit = -1
pagination_max_limit = {{ server.pagination_max_limit|default('-1') }}

# Default value of availability zone hints. The availability zone aware
# schedulers use this when the resources availability_zone_hints is empty.
# Multiple availability zones can be specified by a comma separated string.
# This value can be empty. In this case, even if availability_zone_hints for a
# resource is empty, availability zone is considered for high availability
# while scheduling the resource. (list value)
#default_availability_zones =
{%- if server.default_availability_zones is defined %}
default_availability_zones = {{ server.default_availability_zones }}
{%- endif %}

# Maximum number of DNS nameservers per subnet (integer value)
#max_dns_nameservers = 5

# Maximum number of host routes per subnet (integer value)
#max_subnet_host_routes = 20

# Enables IPv6 Prefix Delegation for automatic subnet CIDR allocation. Set to
# True to enable IPv6 Prefix Delegation for subnet allocation in a PD-capable
# environment. Users making subnet creation requests for IPv6 subnets without
# providing a CIDR or subnetpool ID will be given a CIDR via the Prefix
# Delegation mechanism. Note that enabling PD will override the behavior of the
# default IPv6 subnetpool. (boolean value)
#ipv6_pd_enabled = false

# DHCP lease duration (in seconds). Use -1 to tell dnsmasq to use infinite
# lease times. (integer value)
#dhcp_lease_duration = 86400
dhcp_lease_duration = {{ server.dhcp_lease_duration|default('600') }}

# Domain to use for building the hostnames (string value)
#dns_domain = openstacklocal
dns_domain = {{ server.dns_domain }}

# Driver for external DNS integration. (string value)
#external_dns_driver = <None>
{%- if server.backend.get('extension', {}).get('dns', {}).get('enabled', False) %}
external_dns_driver={{ server.backend.get('extension', {}).get('dns', {}).get('engine', '') }}
{%- endif %}

# Allow sending resource operation notification to DHCP agent (boolean value)
#dhcp_agent_notification = true

# Allow overlapping IP support in Neutron. Attention: the following parameter
# MUST be set to False if Neutron is being used in conjunction with Nova
# security groups. (boolean value)
#allow_overlapping_ips = false
allow_overlapping_ips = True

# Hostname to be used by the Neutron server, agents and services running on
# this machine. All the agents and services running on this machine must use
# the same host value. (unknown value)
#host = example.domain
{%- if server.host is defined %}
host={{ server.host }}
{%- endif %}

# This string is prepended to the normal URL that is returned in links to the
# OpenStack Network API. If it is empty (the default), the URLs are returned
# unchanged. (string value)
#network_link_prefix = <None>

# Send notification to nova when port status changes (boolean value)
#notify_nova_on_port_status_changes = true
notify_nova_on_port_status_changes = true

# Send notification to nova when port data (fixed_ips/floatingip) changes so
# nova can update its cache. (boolean value)
#notify_nova_on_port_data_changes = true
notify_nova_on_port_data_changes = true

# Number of seconds between sending events to nova if there are any events to
# send. (integer value)
#send_events_interval = 2

# Neutron IPAM (IP address management) driver to use. By default, the reference
# implementation of the Neutron IPAM driver is used. (string value)
#ipam_driver = internal

# If True, then allow plugins that support it to create VLAN transparent
# networks. (boolean value)
#vlan_transparent = false

# MTU of the underlying physical network. Neutron uses this value to calculate
# MTU for all virtual network components. For flat and VLAN networks, neutron
# uses this value without modification. For overlay networks such as VXLAN,
# neutron automatically subtracts the overlay protocol overhead from this
# value. Defaults to 1500, the standard value for Ethernet. (integer value)
# Deprecated group/name - [ml2]/segment_mtu
#global_physnet_mtu = 1500
global_physnet_mtu = {{ server.get('global_physnet_mtu', '1500') }}

# Number of backlog requests to configure the socket with (integer value)
#backlog = 4096

# Number of seconds to keep retrying to listen (integer value)
#retry_until_window = 30

# Enable SSL on the API server (boolean value)
#use_ssl = false

# Seconds between running periodic tasks. (integer value)
#periodic_interval = 40

# Number of separate API worker processes for service. If not specified, the
# default is equal to the number of CPUs available for best performance.
# (integer value)
#api_workers = <None>
{%- if server.api_workers is defined %}
api_workers = {{ server.api_workers }}
{%- endif %}

# Number of RPC worker processes for service. (integer value)
#rpc_workers = 1
{%- if server.rpc_workers is defined %}
rpc_workers = {{ server.rpc_workers }}
{%- else %}
rpc_workers = {{ grains.num_cpus }}
{%- endif %}


# Number of RPC worker processes dedicated to state reports queue. (integer
# value)
#rpc_state_report_workers = 1
{%- if server.rpc_state_report_workers is defined %}
rpc_state_report_workers = {{ server.rpc_state_report_workers }}
{%- else %}
rpc_state_report_workers = 4
{%- endif %}

# Range of seconds to randomly delay when starting the periodic task scheduler
# to reduce stampeding. (Disable by setting to 0) (integer value)
#periodic_fuzzy_delay = 5

#
# From neutron.agent
#

# The driver used to manage the virtual interface. (string value)
#interface_driver = <None>

# Location for Metadata Proxy UNIX domain socket. (string value)
#metadata_proxy_socket = $state_path/metadata_proxy

# User (uid or name) running metadata proxy after its initialization (if empty:
# agent effective user). (string value)
#metadata_proxy_user =

# Group (gid or name) running metadata proxy after its initialization (if
# empty: agent effective group). (string value)
#metadata_proxy_group =

#
# From neutron.db
#

# Seconds to regard the agent is down; should be at least twice
# report_interval, to be sure the agent is down for good. (integer value)
#agent_down_time = 75
agent_down_time = {{ server.get('agent_down_time', 75) }}

# Representing the resource type whose load is being reported by the agent.
# This can be "networks", "subnets" or "ports". When specified (Default is
# networks), the server will extract particular load sent as part of its agent
# configuration object from the agent report state, which is the number of
# resources being consumed, at every report_interval.dhcp_load_type can be used
# in combination with network_scheduler_driver =
# neutron.scheduler.dhcp_agent_scheduler.WeightScheduler When the
# network_scheduler_driver is WeightScheduler, dhcp_load_type can be configured
# to represent the choice for the resource being balanced. Example:
# dhcp_load_type=networks (string value)
# Possible values:
# networks - <No description provided>
# subnets - <No description provided>
# ports - <No description provided>
#dhcp_load_type = networks
dhcp_load_type = {{ server.get('dhcp_load_type', 'networks') }}

# Agent starts with admin_state_up=False when enable_new_agents=False. In the
# case, user's resources will not be scheduled automatically to the agent until
# admin changes admin_state_up to True. (boolean value)
#enable_new_agents = true

# Maximum number of routes per router (integer value)
#max_routes = 30

# Define the default value of enable_snat if not provided in
# external_gateway_info. (boolean value)
#enable_snat_by_default = true

# Driver to use for scheduling network to DHCP agent (string value)
#network_scheduler_driver = neutron.scheduler.dhcp_agent_scheduler.WeightScheduler
network_scheduler_driver = {{ server.get('network_scheduler_driver', 'neutron.scheduler.dhcp_agent_scheduler.WeightScheduler') }}

# Allow auto scheduling networks to DHCP agent. (boolean value)
#network_auto_schedule = true

# Automatically remove networks from offline DHCP agents. (boolean value)
#allow_automatic_dhcp_failover = true
{%- if server.allow_automatic_dhcp_failover is defined %}
allow_automatic_dhcp_failover = {{ server.get('allow_automatic_dhcp_failover', True)|lower }}
{%- endif %}

# Number of DHCP agents scheduled to host a tenant network. If this number is
# greater than 1, the scheduler automatically assigns multiple DHCP agents for
# a given tenant network, providing high availability for DHCP service.
# (integer value)
#dhcp_agents_per_network = 1
dhcp_agents_per_network = {{ server.get('dhcp_agents_per_network', 2) }}

# Enable services on an agent with admin_state_up False. If this option is
# False, when admin_state_up of an agent is turned False, services on it will
# be disabled. Agents with admin_state_up False are not selected for automatic
# scheduling regardless of this option. But manual scheduling to such agents is
# available if this option is True. (boolean value)
#enable_services_on_agents_with_admin_state_down = false

# The base mac address used for unique DVR instances by Neutron. The first 3
# octets will remain unchanged. If the 4th octet is not 00, it will also be
# used. The others will be randomly generated. The 'dvr_base_mac' *must* be
# different from 'base_mac' to avoid mixing them up with MAC's allocated for
# tenant ports. A 4 octet example would be dvr_base_mac = fa:16:3f:4f:00:00.
# The default is 3 octet (string value)
#dvr_base_mac = fa:16:3f:00:00:00
{%- if server.dvr_base_mac is defined %}
  {%- if server.base_mac is defined %}
    {%- if server.base_mac != server.dvr_base_mac %}
dvr_base_mac = {{ server.dvr_base_mac }}
    {%- endif %}
  {%- else %}
dvr_base_mac = {{ server.dvr_base_mac }}
  {%- endif %}
{%- endif %}

# System-wide flag to determine the type of router that tenants can create.
# Only admin can override. (boolean value)
#router_distributed = false
router_distributed = {{ server.get('dvr', 'False') }}

# Determine if setup is configured for DVR. If False, DVR API extension will be
# disabled. (boolean value)
#enable_dvr = true
enable_dvr = {{ server.get('dvr', 'False') }}

# Driver to use for scheduling router to a default L3 agent (string value)
#router_scheduler_driver = neutron.scheduler.l3_agent_scheduler.LeastRoutersScheduler
router_scheduler_driver = {{ server.get('router_scheduler_driver', 'neutron.scheduler.l3_agent_scheduler.ChanceScheduler') }}

# Allow auto scheduling of routers to L3 agent. (boolean value)
#router_auto_schedule = true

# Automatically reschedule routers from offline L3 agents to online L3 agents.
# (boolean value)
#allow_automatic_l3agent_failover = false
allow_automatic_l3agent_failover = true

# Enable HA mode for virtual routers. (boolean value)
#l3_ha = false
l3_ha = {{ server.get('l3_ha', 'False') }}

# Maximum number of L3 agents which a HA router will be scheduled on. If it is
# set to 0 then the router will be scheduled on every agent. (integer value)
#max_l3_agents_per_router = 3
max_l3_agents_per_router = {{ server.get('max_l3_agents_per_router', '0') }}

# Subnet used for the l3 HA admin network. (string value)
#l3_ha_net_cidr = 169.254.192.0/18
l3_ha_net_cidr = {{ server.get('l3_ha_net_cidr', '169.254.192.0/18') }}

# The network type to use when creating the HA network for an HA router. By
# default or if empty, the first 'tenant_network_types' is used. This is
# helpful when the VRRP traffic should use a specific network which is not the
# default one. (string value)
#l3_ha_network_type =
{%- if server.l3_ha_network_type is defined %}
l3_ha_network_type = {{ server.l3_ha_network_type }}
{%- endif %}

# The physical network name with which the HA network can be created. (string
# value)
#l3_ha_network_physical_name =
{%- if server.l3_ha_network_physical_name is defined %}
l3_ha_network_physical_name = {{ server.l3_ha_network_physical_name }}
{%- endif %}

#
# From neutron.extensions
#

# Maximum number of allowed address pairs (integer value)
#max_allowed_address_pair = 10
{%- if server.max_allowed_address_pair is defined %}
max_allowed_address_pair = {{ server.max_allowed_address_pair }}
{%- endif %}

{%- if server.logging is defined %}
{%- set _data = server.logging %}
{%- include "oslo_templates/files/queens/oslo/_log.conf" %}
{%- endif %}


{%- set _data = server.message_queue %}
{%- include "oslo_templates/files/queens/oslo/messaging/_default.conf" %}

{%- set _data = {} %}
{%- include "oslo_templates/files/queens/oslo/service/_wsgi_default.conf" %}

nova_url = http://{{ server.compute.host }}:8774/v2


[agent]

#
# From neutron.agent
#

# Root helper application. Use 'sudo neutron-rootwrap
# /etc/neutron/rootwrap.conf' to use the real root filter facility. Change to
# 'sudo' to skip the filtering and just run the command directly. (string
# value)
#root_helper_daemon = <None>
root_helper = sudo /usr/bin/neutron-rootwrap /etc/neutron/rootwrap.conf

# Use the root helper when listing the namespaces on a system. This may not be
# required depending on the security configuration. If the root helper is not
# required, set this to False for a performance improvement. (boolean value)
#use_helper_for_ns_read = true

# Root helper daemon application to use when possible. For the agent which
# needs to execute commands in Dom0 in the hypervisor of XenServer, this item
# should be set to 'xenapi_root_helper', so that it will keep a XenAPI session
# to pass commands to Dom0. (string value)
#root_helper_daemon = <None>
{%- if server.root_helper_daemon|default(True) %}
root_helper_daemon = sudo neutron-rootwrap-daemon /etc/neutron/rootwrap.conf
{%- endif %}

# Seconds between nodes reporting state to server; should be less than
# agent_down_time, best if it is half or less than agent_down_time. (floating
# point value)
#report_interval = 30
report_interval = {{ server.get('report_interval', 30) }}

# Log agent heartbeats (boolean value)
#log_agent_heartbeats = false

# Add comments to iptables rules. Set to false to disallow the addition of
# comments to generated iptables rules that describe each rule's purpose.
# System must support the iptables comments module for addition of comments.
# (boolean value)
#comment_iptables_rules = true

# Duplicate every iptables difference calculation to ensure the format being
# generated matches the format of iptables-save. This option should not be
# turned on for production systems because it imposes a performance penalty.
# (boolean value)
#debug_iptables_rules = false

# Action to be executed when a child process dies (string value)
# Possible values:
# respawn - <No description provided>
# exit - <No description provided>
#check_child_processes_action = respawn

# Interval between checks of child process liveness (seconds), use 0 to disable
# (integer value)
#check_child_processes_interval = 60

# Availability zone of this node (string value)
#availability_zone = nova
availability_zone = {{ server.availability_zone|default('nova') }}

[cors]
{%- if server.cors is defined %}
{%- set _data = server.cors %}
{%- include "oslo_templates/files/queens/oslo/_cors.conf" %}
{%- endif %}


[database]
{%- set _data = server.database %}
{%- if _data.ssl is defined and 'cacert_file' not in _data.get('ssl', {}).keys() %}{% do _data['ssl'].update({'cacert_file': server.cacert_file}) %}{% endif %}
{%- include "oslo_templates/files/queens/oslo/_database.conf" %}

[keystone_authtoken]
{%- set _data = server.identity %}
{%- if 'cacert_file' not in _data.keys() %}{% do _data.update({'cacert_file': server.cacert_file}) %}{% endif %}
{%- set auth_type = _data.get('auth_type', 'password') %}
{%- if server.get('cache',{}).members is defined and 'cache' not in _data.keys() %}
{% do _data.update({'cache': server.cache}) %}
{%- endif %}
{%- include "oslo_templates/files/queens/keystonemiddleware/_auth_token.conf" %}
{%- include "oslo_templates/files/queens/keystoneauth/_type_" + auth_type + ".conf" %}


[nova]
{%- set _data = server.get('compute', server.get('identity', {})) %}
{%- if 'protocol' not in _data.keys() %}{% do _data.update({'protocol': server.get('identity', {}).get('protocol', 'http')}) %}{% endif %}
{%- if 'cacert_file' not in _data.keys() %}{% do _data.update({'cacert_file': server.cacert_file}) %}{% endif %}
{%- set auth_type = _data.get('auth_type', 'password') %}
{%- include "oslo_templates/files/queens/keystoneauth/_type_" + auth_type + ".conf" %}


[oslo_concurrency]
{%- set _data = server.get('concurrency', {}) %}
{%- include "oslo_templates/files/queens/oslo/_concurrency.conf" %}


{%- if server.message_queue is defined %}
{%- set _data = server.message_queue %}
{%- if _data.engine == 'rabbitmq' %}
    {%- set messaging_engine = 'rabbit' %}
{%- else %}
    {%- set messaging_engine = _data.engine %}
{%- endif %}
[oslo_messaging_{{ messaging_engine }}]
{%- if _data.ssl is defined and 'cacert_file' not in _data.get('ssl', {}).keys() %}{% do _data['ssl'].update({'cacert_file': server.cacert_file}) %}{% endif %}
{%- include "oslo_templates/files/queens/oslo/messaging/_" + messaging_engine + ".conf" %}
{%- endif %}

[oslo_messaging_notifications]
{%- set _data = server.notification %}
{%- include "oslo_templates/files/queens/oslo/messaging/_notifications.conf" %}


[oslo_middleware]
{%- set _data = server %}
{%- include "oslo_templates/files/queens/oslo/_middleware.conf" %}


[oslo_policy]
{%- if server.oslo_policy is defined %}
{%- set _data = server.oslo_policy %}
{%- include "oslo_templates/files/queens/oslo/_policy.conf" %}
{%- endif %}


[quotas]

#
# From neutron
#

# Default number of resource allowed per tenant. A negative value means
# unlimited. (integer value)
#default_quota = -1
{%- if server.get('quotas',{}).default_quota is defined %}
default_quota = {{ server.quotas.default_quota }}
{%- endif %}

# Number of networks allowed per tenant. A negative value means unlimited.
# (integer value)
#quota_network = 100
{%- if server.get('quotas',{}).quota_network is defined %}
quota_network = {{ server.quotas.quota_network }}
{%- endif %}

# Number of subnets allowed per tenant, A negative value means unlimited.
# (integer value)
#quota_subnet = 100
{%- if server.get('quotas',{}).quota_subnet is defined %}
quota_subnet = {{ server.quotas.quota_subnet }}
{%- endif %}

# Number of ports allowed per tenant. A negative value means unlimited.
# (integer value)
#quota_port = 500
{%- if server.get('quotas',{}).quota_port is defined %}
quota_port = {{ server.quotas.quota_port }}
{%- endif %}

# Default driver to use for quota checks. (string value)
#quota_driver = neutron.db.quota.driver.DbQuotaDriver
{% if server.backend.engine == "contrail" %}
quota_driver = neutron_plugin_contrail.plugins.opencontrail.quota.driver.QuotaDriver
{% endif %}
# Keep in track in the database of current resource quota usage. Plugins which
# do not leverage the neutron database should set this flag to False. (boolean
# value)
#track_quota_usage = true

#
# From neutron.extensions
#

# Number of routers allowed per tenant. A negative value means unlimited.
# (integer value)
#quota_router = 10
{%- if server.get('quotas',{}).quota_router is defined %}
quota_router = {{ server.quotas.quota_router }}
{%- endif %}

# Number of floating IPs allowed per tenant. A negative value means unlimited.
# (integer value)
#quota_floatingip = 50
{%- if server.get('quotas',{}).quota_floatingip is defined %}
quota_floatingip = {{ server.quotas.quota_floatingip }}
{%- endif %}

# Number of security groups allowed per tenant. A negative value means
# unlimited. (integer value)
#quota_security_group = 10
{%- if server.get('quotas',{}).quota_security_group is defined %}
quota_security_group = {{ server.quotas.quota_security_group }}
{%- endif %}

# Number of security rules allowed per tenant. A negative value means
# unlimited. (integer value)
#quota_security_group_rule = 100
{%- if server.get('quotas',{}).quota_security_group_rule is defined %}
quota_security_group_rule = {{ server.quotas.quota_security_group_rule }}
{%- endif %}


[ssl]
{%- include "oslo_templates/files/queens/oslo/service/_ssl.conf" %}

[ovs]
{%- if server.backend.ovsdb_interface is defined %}
ovsdb_interface = {{ server.backend.ovsdb_interface }}
{%- endif %}
{%- if server.backend.ovsdb_connection is defined %}
ovsdb_connection = {{ server.backend.ovsdb_connection }}
{%- endif %}

# Advanced services configs

{% if server.lbaas is defined -%}
{%- include "neutron/files/queens/lbaas.conf" %}
{% endif %}

{% if server.bgp_vpn is defined -%}
{%- include "neutron/files/queens/bgpvpn.conf" %}
{% endif %}

{% if server.sfc is defined -%}
{%- include "neutron/files/queens/plugins/sfc.conf" %}
{% endif %}

{% if server.n_g_s is defined  -%}
{%- include "neutron/files/queens/plugins/_n_g_s.conf" %}
{% endif %}

{%- if server.get('configmap', {}).neutron_server is defined %}
{%- set _data = server.configmap.neutron_server %}
{%- include "oslo_templates/files/configmap/configmap.conf" %}
{%- endif %}

{%- if server.backend.get('extension', {}).get('dns', {}).get('enabled', False) and server.backend.get('extension', {}).get('dns', {}).get('engine', '') == 'designate' %}
[designate]
{%- if server.backend.get('extension', {}).get('dns', {}).get('url', False) %}
url = {{ server.backend.extension.dns.url }}
{%- else %}
#url = <None>
{%- endif %}
auth_region={{ server.identity.region }}
auth_type = password
user_domain_id = {{ server.identity.get('domain', 'default') }}
project_domain_id = {{ server.identity.get('domain', 'default') }}
project_name = {{ server.identity.tenant }}
username = {{ server.identity.user }}
password = {{ server.identity.password }}
auth_url={{ server.identity.get('protocol', 'http') }}://{{ server.identity.host }}:35357
{%- endif %}
