{#
Copyright 2017-present Open Networking Foundation

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
#}

; inventory.ini, generated from ansible/roles/genconfig/templates/inventory.ini.j2
; ** DO NOT EDIT THIS FILE MANUALLY! **
; Edit the Pod Config (or Scenario) and rerun `make config` to regenerate it

{% macro group_template(groupname) %}
{% if inventory_groups[groupname] %}
{% for g_key, g_val in inventory_groups[groupname].iteritems() %}
{{ g_key }}{% if g_val %} {% for key, val in g_val.iteritems() %}{{ key ~ "=" ~ val ~ " "}}{% endfor %}{% endif %}

{% endfor %}
{% endif %}
{% endmacro %}

[config]
{{ group_template('config') }}

[build]
{{ group_template('build') }}

[head]
{{ group_template('head') }}

[compute]
{{ group_template('compute') }}

