From: "Shannon Sterz" <s.sterz@proxmox.com>
To: "Gabriel Goller" <g.goller@proxmox.com>
Cc: pve-devel@lists.proxmox.com
Subject: Re: [PATCH proxmox-ve-rs v7 02/21] frr: add proxmox-frr-templates package that contains templates
Date: Thu, 26 Mar 2026 16:15:25 +0100 [thread overview]
Message-ID: <DHCT9KKX3SXI.2KDKEWFSPOXEM@proxmox.com> (raw)
In-Reply-To: <20260323134934.243110-3-g.goller@proxmox.com>
On Mon Mar 23, 2026 at 2:48 PM CET, Gabriel Goller wrote:
> This debian package contains the jinja template files used to generate
> the frr config. Currently only the fabrics template files are here, the
> rest will be added in later commits. When installing this package the
> templates will be installed to `/usr/share/proxmox-frr/templates/`.
> `proxmox-frr` will then use `include_str!` to embed the templates into
> the binary.
>
> This package will only be published to the `devel` channel.
>
> Reviewed-by: Hannes Laimer <h.laimer@proxmox.com>
> Tested-by: Stefan Hanreich <s.hanreich@proxmox.com>
> Co-authored-by: Stefan Hanreich <s.hanreich@proxmox.com>
> Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
> ---
> Makefile | 8 +++
> proxmox-frr-templates/.gitignore | 1 +
> proxmox-frr-templates/Makefile | 50 +++++++++++++++++++
> proxmox-frr-templates/debian/changelog | 5 ++
> proxmox-frr-templates/debian/control | 17 +++++++
> proxmox-frr-templates/debian/copyright | 18 +++++++
> .../debian/proxmox-frr-templates.install | 1 +
> proxmox-frr-templates/debian/rules | 5 ++
> .../templates/access_lists.jinja | 6 +++
> proxmox-frr-templates/templates/fabricd.jinja | 29 +++++++++++
> .../templates/frr.conf.jinja | 5 ++
> .../templates/interface.jinja | 12 +++++
> proxmox-frr-templates/templates/ospfd.jinja | 18 +++++++
> .../templates/protocol_routemaps.jinja | 10 ++++
> .../templates/route_maps.jinja | 22 ++++++++
> 15 files changed, 207 insertions(+)
> create mode 100644 proxmox-frr-templates/.gitignore
> create mode 100644 proxmox-frr-templates/Makefile
> create mode 100644 proxmox-frr-templates/debian/changelog
> create mode 100644 proxmox-frr-templates/debian/control
> create mode 100644 proxmox-frr-templates/debian/copyright
> create mode 100644 proxmox-frr-templates/debian/proxmox-frr-templates.install
> create mode 100755 proxmox-frr-templates/debian/rules
> create mode 100644 proxmox-frr-templates/templates/access_lists.jinja
> create mode 100644 proxmox-frr-templates/templates/fabricd.jinja
> create mode 100644 proxmox-frr-templates/templates/frr.conf.jinja
> create mode 100644 proxmox-frr-templates/templates/interface.jinja
> create mode 100644 proxmox-frr-templates/templates/ospfd.jinja
> create mode 100644 proxmox-frr-templates/templates/protocol_routemaps.jinja
> create mode 100644 proxmox-frr-templates/templates/route_maps.jinja
>
> diff --git a/Makefile b/Makefile
> index 812bc8e691bf..58e4475161a1 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -2,6 +2,8 @@
>
> CRATES != echo proxmox-*/Cargo.toml | sed -e 's|/Cargo.toml||g'
>
> +BUILDDIR = build
> +
> # By default we just run checks:
> .PHONY: all
> all: check
> @@ -25,6 +27,12 @@ dinstall:
> $(MAKE) deb
> sudo -k dpkg -i build/librust-*.deb
>
> +proxmox-frr-templates-deb:
> + mkdir -p "${BUILDDIR}/proxmox-frr-templates"
> + cp -r proxmox-frr-templates/* "${BUILDDIR}/proxmox-frr-templates"
> + cd "${BUILDDIR}/proxmox-frr-templates"; dpkg-buildpackage -b -uc -us
> + touch $@
> +
> %-deb:
> ./build.sh $*
> touch $@
> diff --git a/proxmox-frr-templates/.gitignore b/proxmox-frr-templates/.gitignore
> new file mode 100644
> index 000000000000..796b96d1c402
> --- /dev/null
> +++ b/proxmox-frr-templates/.gitignore
> @@ -0,0 +1 @@
> +/build
> diff --git a/proxmox-frr-templates/Makefile b/proxmox-frr-templates/Makefile
> new file mode 100644
> index 000000000000..0b010ed71e7a
> --- /dev/null
> +++ b/proxmox-frr-templates/Makefile
> @@ -0,0 +1,50 @@
> +include /usr/share/dpkg/default.mk
> +
> +PACKAGE=proxmox-frr-templates
> +
> +GITVERSION:=$(shell git rev-parse HEAD)
> +
> +BUILDDIR ?= build/$(PACKAGE)-$(DEB_VERSION)
> +DSC=$(PACKAGE)_$(DEB_VERSION).dsc
> +
> +PVE_DEB=$(PACKAGE)_$(DEB_VERSION_UPSTREAM_REVISION)_all.deb
> +
> +DEBS=$(PVE_DEB)
> +
> +all: deb
> +deb: $(DEBS)
> +
> +$(BUILDDIR):
> + rm -rf $(BUILDDIR)
> + mkdir -p $(BUILDDIR)
> + cp -a debian $(BUILDDIR)/
> + cp -a templates $(BUILDDIR)/ || true
> + echo "git clone git://git.proxmox.com/git/proxmox-ve-rs.git\\ngit checkout $(GITVERSION)" > $(BUILDDIR)/debian/SOURCE
> +
> +$(PVE_DEB): $(BUILDDIR)
> + cd $(BUILDDIR); dpkg-buildpackage -b -uc -us
> + lintian build/$(DEBS)
> +
> +dsc: $(DSC)
> + $(MAKE) clean
> + $(MAKE) $(DSC)
> + lintian build/$(DSC)
> +
> +$(DSC): $(BUILDDIR)
> + cd $(BUILDDIR); dpkg-buildpackage -S -uc -us
> +
> +sbuild: $(DSC)
> + sbuild build/$(DSC)
> +
> +.PHONY: upload
> +upload: UPLOAD_DIST ?= $(DEB_DISTRIBUTION)
> +upload: $(DEBS)
> + tar cf - build/$(DEBS)|ssh repoman@repo.proxmox.com -- upload --product devel --dist $(UPLOAD_DIST)
> +
> +.PHONY: distclean
> +distclean: clean
> +
> +.PHONY: clean
> +clean:
> + rm -rf build
> +
> diff --git a/proxmox-frr-templates/debian/changelog b/proxmox-frr-templates/debian/changelog
> new file mode 100644
> index 000000000000..e70d0e12dfa8
> --- /dev/null
> +++ b/proxmox-frr-templates/debian/changelog
> @@ -0,0 +1,5 @@
> +proxmox-frr-templates (0.1.0-1) trixie; urgency=medium
> +
> + * Initial release.
> +
> + -- Proxmox Support Team <support@proxmox.com> Wed, 21 Jan 2026 15:53:51 +0100
> diff --git a/proxmox-frr-templates/debian/control b/proxmox-frr-templates/debian/control
> new file mode 100644
> index 000000000000..d144d3f5f6b0
> --- /dev/null
> +++ b/proxmox-frr-templates/debian/control
> @@ -0,0 +1,17 @@
> +Source: proxmox-frr-templates
> +Section: admin
> +Priority: important
> +Maintainer: Proxmox Support Team <support@proxmox.com>
> +Standards-Version: 4.7.2
> +Rules-Requires-Root: no
> +Build-Depends: debhelper-compat (= 13)
> +Vcs-Git: git://git.proxmox.com/git/proxmox-ve-rs.git
> +Vcs-Browser: https://git.proxmox.com/?p=proxmox-ve-rs.git
> +Homepage: https://proxmox.com
> +
> +Package: proxmox-frr-templates
> +Architecture: all
> +Depends: ${misc:Depends}
> +Description: Provides template files which are used by the Proxmox VE SDN stack
> + to generate FRR config files.
> +
> diff --git a/proxmox-frr-templates/debian/copyright b/proxmox-frr-templates/debian/copyright
> new file mode 100644
> index 000000000000..1ea8a56b4f58
> --- /dev/null
> +++ b/proxmox-frr-templates/debian/copyright
> @@ -0,0 +1,18 @@
> +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
> +
> +Files:
> + *
> +Copyright: 2019 - 2025 Proxmox Server Solutions GmbH <support@proxmox.com>
tiny nit: but it's 2026 already ;)
> +License: AGPL-3.0-or-later
> + This program is free software: you can redistribute it and/or modify it under
> + the terms of the GNU Affero General Public License as published by the Free
> + Software Foundation, either version 3 of the License, or (at your option) any
> + later version.
> + .
> + This program is distributed in the hope that it will be useful, but WITHOUT
> + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
> + FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
> + details.
> + .
> + You should have received a copy of the GNU Affero General Public License along
> + with this program. If not, see <https://www.gnu.org/licenses/>.
> diff --git a/proxmox-frr-templates/debian/proxmox-frr-templates.install b/proxmox-frr-templates/debian/proxmox-frr-templates.install
> new file mode 100644
> index 000000000000..a8e3df9d7260
> --- /dev/null
> +++ b/proxmox-frr-templates/debian/proxmox-frr-templates.install
> @@ -0,0 +1 @@
> +templates/* /usr/share/proxmox-frr/templates
> diff --git a/proxmox-frr-templates/debian/rules b/proxmox-frr-templates/debian/rules
> new file mode 100755
> index 000000000000..abde6ef2247c
> --- /dev/null
> +++ b/proxmox-frr-templates/debian/rules
> @@ -0,0 +1,5 @@
> +#!/usr/bin/make -f
> +
> +%:
> + dh $@
> +
> diff --git a/proxmox-frr-templates/templates/access_lists.jinja b/proxmox-frr-templates/templates/access_lists.jinja
> new file mode 100644
> index 000000000000..25f27a293529
> --- /dev/null
> +++ b/proxmox-frr-templates/templates/access_lists.jinja
> @@ -0,0 +1,6 @@
> +{% for access_list_name, access_list in access_lists | items %}
> +!
> +{% for rule in access_list %}
> +{{ "ipv6 " if rule.is_ipv6 }}access-list {{ access_list_name }} {{ ("seq " ~ rule.seq ~ " ") if rule.seq }}{{ rule.action }} {{ rule.network }}
> +{% endfor%}
> +{% endfor %}
> diff --git a/proxmox-frr-templates/templates/fabricd.jinja b/proxmox-frr-templates/templates/fabricd.jinja
> new file mode 100644
> index 000000000000..068959a97e0e
> --- /dev/null
> +++ b/proxmox-frr-templates/templates/fabricd.jinja
> @@ -0,0 +1,29 @@
> +{% from "interface.jinja" import interface %}
> +{% for router_name, router_config in openfabric.router|items %}
> +!
> +router openfabric {{ router_name }}
> + net {{ router_config.net }}
> +exit
> +{% endfor %}
> +{% for interface_name, interface_config in openfabric.interfaces|items %}
> +{% call interface(interface_name, interface_config.addresses_v4, interface_config.addresses_v6) %}
> +{% if interface_config.fabric_id and interface_config.is_ipv4 %}
> + ip router openfabric {{ interface_config.fabric_id }}
> +{% endif %}
> +{% if interface_config.fabric_id and interface_config.is_ipv6 %}
> + ipv6 router openfabric {{ interface_config.fabric_id }}
> +{% endif %}
> +{% if interface_config.passive %}
> + openfabric passive
> +{% endif %}
> +{% if interface_config.hello_interval %}
> + openfabric hello-interval {{ interface_config.hello_interval}}
> +{% endif %}
> +{% if interface_config.hello_multiplier %}
> + openfabric hello-multiplier {{ interface_config.hello_multiplier}}
> +{% endif %}
> +{% if interface_config.csnp_interval %}
> + openfabric csnp-interval {{ interface_config.csnp_interval}}
> +{% endif %}
> +{%- endcall %}
> +{%- endfor %}
> diff --git a/proxmox-frr-templates/templates/frr.conf.jinja b/proxmox-frr-templates/templates/frr.conf.jinja
> new file mode 100644
> index 000000000000..8458c6a61112
> --- /dev/null
> +++ b/proxmox-frr-templates/templates/frr.conf.jinja
> @@ -0,0 +1,5 @@
> +{% include "fabricd.jinja" %}
> +{% include "ospfd.jinja" %}
> +{% include "access_lists.jinja" %}
> +{% include "route_maps.jinja" %}
> +{% include "protocol_routemaps.jinja" %}
> diff --git a/proxmox-frr-templates/templates/interface.jinja b/proxmox-frr-templates/templates/interface.jinja
> new file mode 100644
> index 000000000000..4c5014844fc8
> --- /dev/null
> +++ b/proxmox-frr-templates/templates/interface.jinja
> @@ -0,0 +1,12 @@
> +{% macro interface(name, addresses_v4, addresses_v6) %}
> +!
> +interface {{ name }}
> +{% for address in addresses_v6 %}
> + ipv6 address {{address}}
> +{% endfor %}
> +{% for address in addresses_v4 %}
> + ip address {{address}}
> +{% endfor %}
> +{{ caller() -}}
> +exit
> +{% endmacro %}
> diff --git a/proxmox-frr-templates/templates/ospfd.jinja b/proxmox-frr-templates/templates/ospfd.jinja
> new file mode 100644
> index 000000000000..0a59623de517
> --- /dev/null
> +++ b/proxmox-frr-templates/templates/ospfd.jinja
> @@ -0,0 +1,18 @@
> +{% from "interface.jinja" import interface %}
> +{% if ospf.router %}
> +!
> +router ospf
> + ospf router-id {{ ospf.router.router_id }}
> +exit
> +{% endif %}
> +{% for interface_name, interface_config in ospf.interfaces|items %}
> +{% call interface(interface_name, interface_config.addresses_v4, interface_config.addresses_v6) %}
> + ip ospf area {{ interface_config.area }}
> +{% if interface_config.passive %}
> + ip ospf passive
> +{% endif %}
> +{% if interface_config.network_type %}
> + ip ospf network {{ interface_config.network_type }}
> +{% endif %}
> +{% endcall %}
> +{% endfor %}
> diff --git a/proxmox-frr-templates/templates/protocol_routemaps.jinja b/proxmox-frr-templates/templates/protocol_routemaps.jinja
> new file mode 100644
> index 000000000000..38c00b6407ee
> --- /dev/null
> +++ b/proxmox-frr-templates/templates/protocol_routemaps.jinja
> @@ -0,0 +1,10 @@
> +{% for protocol_name, protocol_routemap in protocol_routemaps | items %}
> +!
> +{% if protocol_routemap.v4 %}
> +ip protocol {{ protocol_name }} route-map {{ protocol_routemap.v4 }}
> +{% endif %}
> +{% if protocol_routemap.v6 %}
> +!
> +ipv6 protocol {{ protocol_name }} route-map {{ protocol_routemap.v6 }}
> +{% endif %}
> +{% endfor %}
> diff --git a/proxmox-frr-templates/templates/route_maps.jinja b/proxmox-frr-templates/templates/route_maps.jinja
> new file mode 100644
> index 000000000000..172c68290475
> --- /dev/null
> +++ b/proxmox-frr-templates/templates/route_maps.jinja
> @@ -0,0 +1,22 @@
> +{% for name, routemap_list in routemaps | items %}
> +{% for routemap in routemap_list %}
> +!
> +route-map {{ name }} {{ routemap.action }} {{ routemap.seq }}
> +{% for match in routemap.matches %}
> +{% if match.value.list_type == "prefixlist" %}
> + match {{ match.protocol_type }} {{ match.match_type }} prefix-list {{ match.value.list_name }}
> +{% elif match.value.list_type == "accesslist" %}
> + match {{ match.protocol_type }} {{ match.match_type }} {{ match.value.list_name }}
> +{% elif match.match_type == "next-hop" %}
> + match {{ match.protocol_type }} next-hop {{ match.value }}
> +{% endif %}
> +{% endfor %}
> +{% for set in routemap.sets %}
> + set {{ set.set_type }} {{ set.value }}
> +{% endfor %}
> +{% for line in routemap.custom_frr_config %}
> +{{ line }}
> +{% endfor %}
> +exit
> +{% endfor %}
> +{% endfor %}
next prev parent reply other threads:[~2026-03-26 15:15 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-23 13:48 [PATCH manager/network/proxmox{-ve-rs,-perl-rs} v7 00/21] Generate frr config using jinja templates and rust types Gabriel Goller
2026-03-23 13:48 ` [PATCH proxmox-ve-rs v7 01/21] ve-config: firewall: cargo fmt Gabriel Goller
2026-03-23 13:48 ` [PATCH proxmox-ve-rs v7 02/21] frr: add proxmox-frr-templates package that contains templates Gabriel Goller
2026-03-26 15:15 ` Shannon Sterz [this message]
2026-03-27 9:07 ` Gabriel Goller
2026-03-27 9:12 ` Gabriel Goller
2026-03-27 10:10 ` Thomas Lamprecht
2026-03-27 10:17 ` Gabriel Goller
2026-03-23 13:48 ` [PATCH proxmox-ve-rs v7 03/21] ve-config: remove FrrConfigBuilder struct Gabriel Goller
2026-03-23 13:48 ` [PATCH proxmox-ve-rs v7 04/21] sdn-types: support variable-length NET identifier Gabriel Goller
2026-03-26 15:15 ` Shannon Sterz
2026-03-27 9:25 ` Gabriel Goller
2026-03-23 13:48 ` [PATCH proxmox-ve-rs v7 05/21] frr: add template serializer and serialize fabrics using templates Gabriel Goller
2026-03-27 0:37 ` Thomas Lamprecht
2026-03-27 9:45 ` Gabriel Goller
2026-03-23 13:48 ` [PATCH proxmox-ve-rs v7 06/21] frr: add isis configuration and templates Gabriel Goller
2026-03-27 0:41 ` Thomas Lamprecht
2026-03-27 9:53 ` Gabriel Goller
2026-03-23 13:48 ` [PATCH proxmox-ve-rs v7 07/21] frr: support custom frr configuration lines Gabriel Goller
2026-03-23 13:48 ` [PATCH proxmox-ve-rs v7 08/21] frr: add bgp support with templates and serialization Gabriel Goller
2026-03-27 0:50 ` Thomas Lamprecht
2026-03-27 10:05 ` Gabriel Goller
2026-03-23 13:48 ` [PATCH proxmox-ve-rs v7 09/21] frr: enable minijinja strict undefined behavior mode Gabriel Goller
2026-03-23 13:49 ` [PATCH proxmox-ve-rs v7 10/21] frr: add vtysh integration tests for proxmox-frr Gabriel Goller
2026-03-24 9:03 ` Gabriel Goller
2026-03-23 13:49 ` [PATCH proxmox-perl-rs v7 11/21] sdn: add function to generate the frr config for all daemons Gabriel Goller
2026-03-23 13:49 ` [PATCH pve-network v7 12/21] tests: use Test::Differences to make test assertions Gabriel Goller
2026-03-23 13:49 ` [PATCH pve-network v7 13/21] test: add tests for frr.conf.local merging Gabriel Goller
2026-03-23 13:49 ` [PATCH pve-network v7 14/21] test: bgp: add some various integration tests Gabriel Goller
2026-03-23 13:49 ` [PATCH pve-network v7 15/21] sdn: write structured frr config that can be rendered using templates Gabriel Goller
2026-03-23 13:49 ` [PATCH pve-network v7 16/21] sdn: remove duplicate comment line '!' in frr config Gabriel Goller
2026-03-23 13:49 ` [PATCH pve-network v7 17/21] tests: rearrange some statements in the " Gabriel Goller
2026-03-23 13:49 ` [PATCH pve-network v7 18/21] sdn: adjust frr.conf.local merging to rust template types Gabriel Goller
2026-03-23 13:49 ` [PATCH pve-network v7 19/21] test: adjust frr_local_merge test for new template generation Gabriel Goller
2026-03-23 13:49 ` [PATCH pve-network v7 20/21] api: add dry-run endpoint for sdn apply to preview changes Gabriel Goller
2026-03-27 1:07 ` Thomas Lamprecht
2026-03-23 13:49 ` [PATCH pve-manager v7 21/21] sdn: add dry-run diff view for sdn apply Gabriel Goller
2026-03-26 13:40 ` [PATCH manager/network/proxmox{-ve-rs,-perl-rs} v7 00/21] Generate frr config using jinja templates and rust types Wolfgang Bumiller
2026-03-27 1:11 ` Thomas Lamprecht
2026-03-27 10:06 ` Gabriel Goller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=DHCT9KKX3SXI.2KDKEWFSPOXEM@proxmox.com \
--to=s.sterz@proxmox.com \
--cc=g.goller@proxmox.com \
--cc=pve-devel@lists.proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox