protocols {
    bgp {
        {%- for internet_exchange in internet_exchanges %}
        {%- for address_family, sessions in internet_exchange.sessions.items() %}
        {%- if sessions|length > 0 %}
        replace: group ipv{{ address_family }}-{{ internet_exchange.slug }} {
            type external;
            multipath;
            advertise-inactive;
            {%- if internet_exchange.import_routing_policies %}
            import [ {{ internet_exchange.import_routing_policies | map(attribute='slug') | join(' ') }} ];
            {%- else %}
            import import-all;
            {%- endif %}
            family {% if address_family == 6 %}inet6{% else %}inet{% endif %} {
                unicast;
            }
            {%- if internet_exchange.export_routing_policies %}
            export [ {{ internet_exchange.export_routing_policies | map(attribute='slug') | join(' ') }} ];
            {%- else %}
            export export-all;
            {%- endif %}
            {%- for session in sessions %}
            {% if not session.enabled %}inactive: {% endif %}neighbor {{ session.ip_address }} {
                description "Peering: AS{{ session.autonomous_system.asn }} - {{ session.autonomous_system.name }}";
                {%- if address_family == 6 and session.autonomous_system.ipv6_max_prefixes > 0 %}
                family inet6 {
                    unicast {
                        prefix-limit {
                            maximum {{ session.autonomous_system.ipv6_max_prefixes }};
                        }
                    }
                }
                {%- endif %}
                {%- if address_family == 4 and session.autonomous_system.ipv4_max_prefixes > 0 %}
                family inet {
                    unicast {
                        prefix-limit {
                            maximum {{ session.autonomous_system.ipv4_max_prefixes }};
                        }
                    }
                }
                {%- endif %}
                {%- if session.import_routing_policies %}
                import [ {{ session.import_routing_policies | map(attribute='slug') | join(' ') }} ];
                {%- endif %}
                {%- if session.export_routing_policies %}
                export [ {{ session.export_routing_policies | map(attribute='slug') | join(' ') }} ];
                {%- endif %}
                {%- if session.password %}
                {%- if session.encrypted_password %}
                authentication-key "{{ session.encrypted_password }}";
                {%- else %}
                authentication-key "{{ session.password }}";
                {%- endif %}
                {%- endif %}
                peer-as {{ session.autonomous_system.asn }};
            }
            {%- endfor %}
        }
        {%- endif %}
        {%- endfor %}
        {%- endfor %}

        {%- for bgp_group in bgp_groups %}
        {%- for address_family, sessions in bgp_group.sessions.items() %}
        {%- if sessions|length > 0 %}
        replace: group ipv{{ address_family }}-{{ bgp_group.slug }} {
            type external;
            multipath;
            advertise-inactive;
            {%- if bgp_group.import_routing_policies %}
            import [ {{ bgp_group.import_routing_policies | map(attribute='slug') | join(' ') }} ];
            {%- else %}
            import import-all;
            {%- endif %}
            family {% if address_family == 6 %}inet6{% else %}inet{% endif %} {
                unicast;
            }
            {%- if bgp_group.export_routing_policies %}
            export [ {{ bgp_group.export_routing_policies | map(attribute='slug') | join(' ') }} ];
            {%- else %}
            export export-all;
            {%- endif %}
            {%- for session in sessions %}
            {% if not session.enabled %}inactive: {% endif %}neighbor {{ session.ip_address }} {
                description "Peering: AS{{ session.autonomous_system.asn }} - {{ session.autonomous_system.name }}";
                {%- if address_family == 6 and session.autonomous_system.ipv6_max_prefixes > 0 %}
                family inet6 {
                    unicast {
                        prefix-limit {
                            maximum {{ session.autonomous_system.ipv6_max_prefixes }};
                        }
                    }
                }
                {%- endif %}
                {%- if address_family == 4 and session.autonomous_system.ipv4_max_prefixes > 0 %}
                family inet {
                    unicast {
                        prefix-limit {
                            maximum {{ session.autonomous_system.ipv4_max_prefixes }};
                        }
                    }
                }
                {%- endif %}
                {%- if session.import_routing_policies %}
                import [ {{ session.import_routing_policies | map(attribute='slug') | join(' ') }} ];
                {%- endif %}
                {%- if session.export_routing_policies %}
                export [ {{ session.export_routing_policies | map(attribute='slug') | join(' ') }} ];
                {%- endif %}
                {%- if session.password %}
                {%- if session.encrypted_password %}
                authentication-key "{{ session.encrypted_password }}";
                {%- else %}
                authentication-key "{{ session.password }}";
                {%- endif %}
                {%- endif %}
                peer-as {{ session.autonomous_system.asn }};
            }
            {%- endfor %}
        }
        {%- endif %}
        {%- endfor %}
        {%- endfor %}
    }
}
policy-options {
    {%- for community in communities %}
    community {{ community.name }} members {{ community.value }};
    {%- endfor %}
}