* [PATCH pve-network 1/2] sdn: frr: add append-only custom frr config
2026-07-01 10:30 [RFC network 0/2] sdn: frr: add append-only custom user config Gabriel Goller
@ 2026-07-01 10:30 ` Gabriel Goller
2026-07-01 10:30 ` [PATCH pve-network 2/2] tests: cover FRR append config files Gabriel Goller
1 sibling, 0 replies; 3+ messages in thread
From: Gabriel Goller @ 2026-07-01 10:30 UTC (permalink / raw)
To: pve-devel
Users sometimes need FRR config that SDN does not model yet. Editing
/etc/frr/frr.conf is not useful because the file is generated and gets
rewritten. frr.conf.local still works, but it is parsed and merged into the
SDN-generated config, and that merge can fail for unsupported constructs.
Append files from /etc/frr/frr.conf.d/*.conf after the full generated FRR
config, including fabric config generated by Rust. Files are read in sorted
filename order and copied without parsing or modifying their content.
Wrap each appended snippet in begin/end marker comments in the installed
configuration. running_config_has_frr() also checks the active /etc/frr/frr.conf
for that marker so that removing the last snippet, or the whole frr.conf.d
directory, still triggers an FRR rewrite. Without that check, stale
appended config remain installed because there would be no remaining SDN
or custom FRR input to trigger a regeneratin of frr.conf.
Build the full candidate config first and validate it with vtysh -C -f before
replacing /etc/frr/frr.conf. If validation fails, keep the old config in place
and include the vtysh output in the error.
Using the append-only user-configuration we can model about 95% of
the possible setups. There are some config constellations that are
impossible to generate, we would need user-editable templates for that.
The problem is that the templates are quite hard to understand and even
harder to correctly modify (i.e. you need to read the code).
Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
---
src/PVE/Network/SDN.pm | 26 ++++++++-
src/PVE/Network/SDN/Frr.pm | 115 ++++++++++++++++++++++++++++++++++---
2 files changed, 130 insertions(+), 11 deletions(-)
diff --git a/src/PVE/Network/SDN.pm b/src/PVE/Network/SDN.pm
index 33a3cf352496..aeba89b6b6cb 100644
--- a/src/PVE/Network/SDN.pm
+++ b/src/PVE/Network/SDN.pm
@@ -113,7 +113,9 @@ sub running_config {
=head3 running_config_has_frr(\%running_config)
Determines whether C<\%running_config> contains any entities that generate an
-FRR configuration. This is used by pve-manager to determine whether a rewrite of
+FRR configuration, whether local FRR custom config files or append snippets
+exist, or whether the active FRR configuration still contains previously
+appended snippets. This is used by pve-manager to determine whether a rewrite of
the FRR configuration is required or not.
If C<\%running_config> is not provided, it will query the current running
@@ -131,8 +133,18 @@ sub running_config_has_frr {
my $prefix_lists = $running_config->{'prefix-lists'}->{ids} // {};
my $local_frr_config = PVE::Network::SDN::Frr::local_frr_config_exists();
-
- return %$controllers || %$fabrics || %$route_maps || %$prefix_lists || $local_frr_config;
+ my $append_frr_config = PVE::Network::SDN::Frr::read_append_frr_config();
+ my $active_frr_config_has_append =
+ PVE::Network::SDN::Frr::active_config_has_append_frr_config();
+
+ return
+ %$controllers
+ || %$fabrics
+ || %$route_maps
+ || %$prefix_lists
+ || $local_frr_config
+ || $append_frr_config ne ''
+ || $active_frr_config_has_append;
}
sub pending_config {
@@ -449,10 +461,14 @@ sub generate_frr_raw_config {
my $frr_config = {};
PVE::Network::SDN::Controllers::generate_frr_config($frr_config, $running_config);
+
PVE::Network::SDN::Frr::append_local_config($frr_config);
my $nodename = PVE::INotify::nodename();
+ # This also appends the FRR config generated by fabrics in Rust. The
+ # frr.conf.d snippets are added later in raw_config_to_string(), after these
+ # raw lines have been rendered and before the final line vty stanza.
return PVE::RS::SDN::get_frr_raw_config(
$frr_config->{'frr'},
$prefix_list_config,
@@ -490,6 +506,10 @@ sub generate_frr_config {
my $needs_restart = PVE::Network::SDN::Frr::set_daemon_status($daemon_status, 1);
my $raw_config = PVE::Network::SDN::generate_frr_raw_config($running_config, $fabric_config);
+
+ # write_raw_config() inserts frr.conf.d/*.conf after the rendered config,
+ # including the fabric FRR config, and before the final line vty stanza. It
+ # validates the complete candidate before installing it as frr.conf.
PVE::Network::SDN::Frr::write_raw_config($raw_config);
PVE::Network::SDN::Frr::apply($needs_restart) if $apply;
diff --git a/src/PVE/Network/SDN/Frr.pm b/src/PVE/Network/SDN/Frr.pm
index f81da325b1ef..9a57eb1a7eb7 100644
--- a/src/PVE/Network/SDN/Frr.pm
+++ b/src/PVE/Network/SDN/Frr.pm
@@ -22,6 +22,12 @@ frr configuration in this format. This format is also used for merging the local
FRR config (a user-defined configuration file) with the controller-generated
configuration.
+The preferred way to use custom frr config is to paste config into files in
+C</etc/frr/frr.conf.d/*.conf>. The config of these files is then appended
+after the generated SDN config and before the final C<line vty> stanza, sorted
+by file name. Validate syntax with C<vtysh -C> before installing the final
+configuration.
+
=head2 raw config
This is generated from the frr config. It is an array where every entry is a
@@ -29,10 +35,14 @@ string that is a FRR configuration line.
=cut
+use File::Temp qw(tempfile);
+
use PVE::RESTEnvironment qw(log_warn);
use PVE::Tools qw(file_get_contents file_set_contents run_command);
my $FRR_CONF_LOCAL_FILE = "/etc/frr/frr.conf.local";
+my $FRR_CONF_APPEND_DIR = "/etc/frr/frr.conf.d";
+my $FRR_CONF_APPEND_BEGIN_MARKER = "! Begin user FRR config from ";
=head3 local_frr_config_exists
@@ -57,8 +67,57 @@ sub read_local_frr_config {
return; # undef
}
+=head3 read_append_frr_config($dir)
+
+Returns custom FRR config from C<$dir/*.conf>, sorted by file name. If C<$dir>
+is not set, C</etc/frr/frr.conf.d> is used.
+
+=cut
+
+sub read_append_frr_config {
+ my ($dir) = @_;
+
+ $dir //= $FRR_CONF_APPEND_DIR;
+
+ my $config = '';
+
+ return $config if !-d $dir;
+
+ for my $file (grep { -f $_ } sort glob("$dir/*.conf")) {
+ my $content = file_get_contents($file);
+ next if $content eq '';
+
+ $config .= "$FRR_CONF_APPEND_BEGIN_MARKER$file\n!\n";
+ $config .= $content;
+ $config .= "\n" if $content !~ /\n\z/;
+ $config .= "!\n! End user FRR config from $file\n!\n";
+ }
+
+ return $config;
+}
+
my $FRR_CONFIG_FILE = "/etc/frr/frr.conf";
+=head3 active_config_has_append_frr_config($file)
+
+Checks whether the active FRR config still contains append-only user config.
+This is used to trigger a rewrite after the last snippet or the whole
+C</etc/frr/frr.conf.d> directory has been removed, so stale appended config gets
+removed from C</etc/frr/frr.conf>.
+
+=cut
+
+sub active_config_has_append_frr_config {
+ my ($file) = @_;
+
+ $file //= $FRR_CONFIG_FILE;
+
+ return 0 if !-e $file;
+
+ my $config = file_get_contents($file);
+ return $config =~ /^\Q$FRR_CONF_APPEND_BEGIN_MARKER\E/m ? 1 : 0;
+}
+
=head3 apply()
Tries to reload FRR with the frr-reload.py script from frr-pythontools. If that
@@ -192,7 +251,7 @@ sub set_daemon_status {
Converts a given C<\@raw_config> to a string representing a complete frr
configuration, ready to be written to /etc/frr/frr.conf. If raw_config is empty,
-returns only the FRR config skeleton.
+returns the FRR config skeleton plus any append snippets.
=cut
@@ -202,6 +261,10 @@ sub raw_config_to_string {
my $nodename = PVE::INotify::nodename();
my @final_config = (
+ "! This file is generated by Proxmox VE SDN.",
+ "! Do not edit directly; changes will be overwritten.",
+ "! For simple custom FRR additions, use /etc/frr/frr.conf.d/*.conf.",
+ "!",
"frr version 10.6.1",
"frr defaults datacenter",
"hostname $nodename",
@@ -211,27 +274,63 @@ sub raw_config_to_string {
push @final_config, @$raw_config;
- push @final_config, (
- "!", "line vty", "!",
- );
+ my $config = join("\n", @final_config) . "\n!\n";
+ my $append_config = read_append_frr_config();
+
+ $config .= $append_config;
+ $config .= "line vty\n!\n";
- return join("\n", @final_config) . "\n";
+ return $config;
}
-=head3 raw_config_to_string(\@raw_config)
+=head3 write_raw_config(\@raw_config)
-Writes a given C<\@raw_config> to /etc/frr/frr.conf.
+Writes a given C<\@raw_config> to /etc/frr/frr.conf. Before replacing the real
+configuration, the full candidate (including append snippets) is validated with
+C<vtysh -C -f>. On validation failure, the frr.conf is not edited.
=cut
+sub validate_config {
+ my ($candidate_file) = @_;
+
+ my $stdout = '';
+ my $stderr = '';
+ eval {
+ run_command(
+ ['vtysh', '-C', '-f', $candidate_file],
+ outfunc => sub { $stdout .= "$_[0]\n"; },
+ errfunc => sub { $stderr .= "$_[0]\n"; },
+ );
+ };
+
+ if (my $err = $@) {
+ my $msg = "FRR configuration validation failed with 'vtysh -C -f $candidate_file': $err";
+ $msg .= "\n" if $msg !~ /\n\z/;
+ $msg .= "vtysh stdout:\n$stdout" if $stdout ne '';
+ $msg .= "vtysh stderr:\n$stderr" if $stderr ne '';
+ die $msg;
+ }
+}
+
sub write_raw_config {
my ($raw_config) = @_;
return if !-d "/etc/frr";
return if !$raw_config;
- file_set_contents("/etc/frr/frr.conf", raw_config_to_string($raw_config));
+ my $candidate = raw_config_to_string($raw_config);
+
+ my ($fh, $candidate_file) = tempfile('frr.conf.XXXXXX', DIR => "/etc/frr");
+ print $fh $candidate;
+ close($fh);
+
+ eval { validate_config($candidate_file); };
+ my $err = $@;
+ unlink $candidate_file;
+ die $err if $err;
+ file_set_contents($FRR_CONFIG_FILE, $candidate);
}
=head3 append_local_config(\%frr_config, $local_config)
--
2.47.3
^ permalink raw reply related [flat|nested] 3+ messages in thread* [PATCH pve-network 2/2] tests: cover FRR append config files
2026-07-01 10:30 [RFC network 0/2] sdn: frr: add append-only custom user config Gabriel Goller
2026-07-01 10:30 ` [PATCH pve-network 1/2] sdn: frr: add append-only custom frr config Gabriel Goller
@ 2026-07-01 10:30 ` Gabriel Goller
1 sibling, 0 replies; 3+ messages in thread
From: Gabriel Goller @ 2026-07-01 10:30 UTC (permalink / raw)
To: pve-devel
Add a frr.conf.d file to one zone test and check that it is added at the end
of the generated FRR config. Also add an empty file in the same directory to
check that it does not add markers.
Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
---
src/test/run_test_zones.pl | 53 +++++++++++++++++++
.../expected_controller_config | 4 ++
.../evpn/auto_mode/expected_controller_config | 4 ++
.../evpn/bgp_ebgp/expected_controller_config | 4 ++
.../expected_controller_config | 4 ++
.../expected_controller_config | 4 ++
.../expected_controller_config | 4 ++
.../bgp_fabric/expected_controller_config | 4 ++
.../bgp_loopback/expected_controller_config | 4 ++
.../expected_controller_config | 4 ++
.../expected_controller_config | 4 ++
.../expected_controller_config | 4 ++
.../evpn/ebgp/expected_controller_config | 4 ++
.../expected_controller_config | 4 ++
.../expected_controller_config | 4 ++
.../expected_controller_config | 4 ++
.../ebgp_loopback/expected_controller_config | 4 ++
.../evpn/ebgp_only/expected_controller_config | 4 ++
.../expected_controller_config | 4 ++
.../expected_controller_config | 4 ++
.../evpn/exitnode/expected_controller_config | 4 ++
.../expected_controller_config | 4 ++
.../expected_controller_config | 4 ++
.../expected_controller_config | 4 ++
.../exitnode_snat/expected_controller_config | 4 ++
.../expected_controller_config | 4 ++
.../expected_controller_config | 4 ++
.../expected_controller_config | 4 ++
.../evpn/ipv4/expected_controller_config | 10 ++++
.../zones/evpn/ipv4/frr.conf.d/00-empty.conf | 0
.../zones/evpn/ipv4/frr.conf.d/10-custom.conf | 1 +
.../evpn/ipv4ipv6/expected_controller_config | 4 ++
.../expected_controller_config | 4 ++
.../evpn/ipv6/expected_controller_config | 4 ++
.../ipv6underlay/expected_controller_config | 4 ++
.../evpn/isis/expected_controller_config | 4 ++
.../isis_loopback/expected_controller_config | 4 ++
.../expected_controller_config | 4 ++
.../expected_controller_config | 4 ++
.../multiplezones/expected_controller_config | 4 ++
.../expected_controller_config | 4 ++
.../expected_controller_config | 4 ++
.../expected_controller_config | 4 ++
.../ospf_fabric/expected_controller_config | 4 ++
.../evpn/routemap/expected_controller_config | 4 ++
.../expected_controller_config | 4 ++
.../expected_controller_config | 4 ++
.../evpn/rt_import/expected_controller_config | 4 ++
.../evpn/vxlanport/expected_controller_config | 4 ++
49 files changed, 244 insertions(+)
create mode 100644 src/test/zones/evpn/ipv4/frr.conf.d/00-empty.conf
create mode 100644 src/test/zones/evpn/ipv4/frr.conf.d/10-custom.conf
diff --git a/src/test/run_test_zones.pl b/src/test/run_test_zones.pl
index dd458b77dd69..e896d35c9a90 100755
--- a/src/test/run_test_zones.pl
+++ b/src/test/run_test_zones.pl
@@ -30,6 +30,8 @@ sub read_sdn_config {
return $sdn_config;
}
+my $read_append_frr_config = \&PVE::Network::SDN::Frr::read_append_frr_config;
+
my @tests = grep { -d } glob './zones/*/*';
foreach my $test (@tests) {
@@ -139,11 +141,15 @@ foreach my $test (@tests) {
if (-e $frr_local_path) {
$frr_local_config = read_file($frr_local_path);
}
+ my $frr_conf_d_path = "$test/frr.conf.d";
my $mocked_frr = Test::MockModule->new('PVE::Network::SDN::Frr');
$mocked_frr->mock(
read_local_frr_config => sub {
return $frr_local_config;
},
+ read_append_frr_config => sub {
+ return $read_append_frr_config->($frr_conf_d_path);
+ },
);
my $name = $test;
@@ -175,5 +181,52 @@ foreach my $test (@tests) {
}
}
+{
+ my $empty_frr_config = {
+ controllers => { ids => {} },
+ fabrics => { ids => {} },
+ 'route-maps' => { ids => {} },
+ 'prefix-lists' => { ids => {} },
+ };
+
+ my $mocked_sdn = Test::MockModule->new('PVE::Network::SDN');
+ $mocked_sdn->mock(
+ running_config => sub {
+ return $empty_frr_config;
+ },
+ );
+
+ my $mocked_frr = Test::MockModule->new('PVE::Network::SDN::Frr');
+ $mocked_frr->mock(
+ local_frr_config_exists => sub { return 0; },
+ read_append_frr_config =>
+ sub { return 'ip prefix-list CUSTOM seq 10 permit 203.0.113.0/24\n'; },
+ active_config_has_append_frr_config => sub { return 0; },
+ );
+
+ ok(
+ PVE::Network::SDN::running_config_has_frr(), 'existing append snippets trigger FRR rewrite',
+ );
+
+ $mocked_frr->mock(
+ read_append_frr_config => sub { return ''; },
+ active_config_has_append_frr_config => sub { return 1; },
+ );
+
+ ok(
+ PVE::Network::SDN::running_config_has_frr(),
+ 'installed append snippet markers trigger cleanup rewrite after snippet or directory removal',
+ );
+
+ $mocked_frr->mock(
+ active_config_has_append_frr_config => sub { return 0; },
+ );
+
+ ok(
+ !PVE::Network::SDN::running_config_has_frr(),
+ 'empty current and active config does not trigger FRR rewrite',
+ );
+}
+
done_testing();
diff --git a/src/test/zones/evpn/advertise_subnets/expected_controller_config b/src/test/zones/evpn/advertise_subnets/expected_controller_config
index 8ab18ef648fc..8b1f2a9523ba 100644
--- a/src/test/zones/evpn/advertise_subnets/expected_controller_config
+++ b/src/test/zones/evpn/advertise_subnets/expected_controller_config
@@ -1,3 +1,7 @@
+! This file is generated by Proxmox VE SDN.
+! Do not edit directly; changes will be overwritten.
+! For simple custom FRR additions, use /etc/frr/frr.conf.d/*.conf.
+!
frr version 10.6.1
frr defaults datacenter
hostname localhost
diff --git a/src/test/zones/evpn/auto_mode/expected_controller_config b/src/test/zones/evpn/auto_mode/expected_controller_config
index 6df5facee554..eacff82dfe00 100644
--- a/src/test/zones/evpn/auto_mode/expected_controller_config
+++ b/src/test/zones/evpn/auto_mode/expected_controller_config
@@ -1,3 +1,7 @@
+! This file is generated by Proxmox VE SDN.
+! Do not edit directly; changes will be overwritten.
+! For simple custom FRR additions, use /etc/frr/frr.conf.d/*.conf.
+!
frr version 10.6.1
frr defaults datacenter
hostname localhost
diff --git a/src/test/zones/evpn/bgp_ebgp/expected_controller_config b/src/test/zones/evpn/bgp_ebgp/expected_controller_config
index 5df95556035a..1b8747b4692b 100644
--- a/src/test/zones/evpn/bgp_ebgp/expected_controller_config
+++ b/src/test/zones/evpn/bgp_ebgp/expected_controller_config
@@ -1,3 +1,7 @@
+! This file is generated by Proxmox VE SDN.
+! Do not edit directly; changes will be overwritten.
+! For simple custom FRR additions, use /etc/frr/frr.conf.d/*.conf.
+!
frr version 10.6.1
frr defaults datacenter
hostname localhost
diff --git a/src/test/zones/evpn/bgp_ebgp_multihop/expected_controller_config b/src/test/zones/evpn/bgp_ebgp_multihop/expected_controller_config
index f11659523d97..8ca372565bab 100644
--- a/src/test/zones/evpn/bgp_ebgp_multihop/expected_controller_config
+++ b/src/test/zones/evpn/bgp_ebgp_multihop/expected_controller_config
@@ -1,3 +1,7 @@
+! This file is generated by Proxmox VE SDN.
+! Do not edit directly; changes will be overwritten.
+! For simple custom FRR additions, use /etc/frr/frr.conf.d/*.conf.
+!
frr version 10.6.1
frr defaults datacenter
hostname localhost
diff --git a/src/test/zones/evpn/bgp_ebgp_reverse_order/expected_controller_config b/src/test/zones/evpn/bgp_ebgp_reverse_order/expected_controller_config
index 4f3eaa3f56aa..ecc0693b0fbd 100644
--- a/src/test/zones/evpn/bgp_ebgp_reverse_order/expected_controller_config
+++ b/src/test/zones/evpn/bgp_ebgp_reverse_order/expected_controller_config
@@ -1,3 +1,7 @@
+! This file is generated by Proxmox VE SDN.
+! Do not edit directly; changes will be overwritten.
+! For simple custom FRR additions, use /etc/frr/frr.conf.d/*.conf.
+!
frr version 10.6.1
frr defaults datacenter
hostname localhost
diff --git a/src/test/zones/evpn/bgp_evpn_routemap_prefix_list/expected_controller_config b/src/test/zones/evpn/bgp_evpn_routemap_prefix_list/expected_controller_config
index 557fc96ad907..c4a6439630d1 100644
--- a/src/test/zones/evpn/bgp_evpn_routemap_prefix_list/expected_controller_config
+++ b/src/test/zones/evpn/bgp_evpn_routemap_prefix_list/expected_controller_config
@@ -1,3 +1,7 @@
+! This file is generated by Proxmox VE SDN.
+! Do not edit directly; changes will be overwritten.
+! For simple custom FRR additions, use /etc/frr/frr.conf.d/*.conf.
+!
frr version 10.6.1
frr defaults datacenter
hostname localhost
diff --git a/src/test/zones/evpn/bgp_fabric/expected_controller_config b/src/test/zones/evpn/bgp_fabric/expected_controller_config
index 24bf62905761..8ebdfb4b2293 100644
--- a/src/test/zones/evpn/bgp_fabric/expected_controller_config
+++ b/src/test/zones/evpn/bgp_fabric/expected_controller_config
@@ -1,3 +1,7 @@
+! This file is generated by Proxmox VE SDN.
+! Do not edit directly; changes will be overwritten.
+! For simple custom FRR additions, use /etc/frr/frr.conf.d/*.conf.
+!
frr version 10.6.1
frr defaults datacenter
hostname localhost
diff --git a/src/test/zones/evpn/bgp_loopback/expected_controller_config b/src/test/zones/evpn/bgp_loopback/expected_controller_config
index 841bc0c2a912..a74a3a045cac 100644
--- a/src/test/zones/evpn/bgp_loopback/expected_controller_config
+++ b/src/test/zones/evpn/bgp_loopback/expected_controller_config
@@ -1,3 +1,7 @@
+! This file is generated by Proxmox VE SDN.
+! Do not edit directly; changes will be overwritten.
+! For simple custom FRR additions, use /etc/frr/frr.conf.d/*.conf.
+!
frr version 10.6.1
frr defaults datacenter
hostname localhost
diff --git a/src/test/zones/evpn/bgp_multipath_relax/expected_controller_config b/src/test/zones/evpn/bgp_multipath_relax/expected_controller_config
index 46e04c682633..c1e571e127a3 100644
--- a/src/test/zones/evpn/bgp_multipath_relax/expected_controller_config
+++ b/src/test/zones/evpn/bgp_multipath_relax/expected_controller_config
@@ -1,3 +1,7 @@
+! This file is generated by Proxmox VE SDN.
+! Do not edit directly; changes will be overwritten.
+! For simple custom FRR additions, use /etc/frr/frr.conf.d/*.conf.
+!
frr version 10.6.1
frr defaults datacenter
hostname localhost
diff --git a/src/test/zones/evpn/combined_bgp_isis/expected_controller_config b/src/test/zones/evpn/combined_bgp_isis/expected_controller_config
index 8b8237330be3..204d2c127389 100644
--- a/src/test/zones/evpn/combined_bgp_isis/expected_controller_config
+++ b/src/test/zones/evpn/combined_bgp_isis/expected_controller_config
@@ -1,3 +1,7 @@
+! This file is generated by Proxmox VE SDN.
+! Do not edit directly; changes will be overwritten.
+! For simple custom FRR additions, use /etc/frr/frr.conf.d/*.conf.
+!
frr version 10.6.1
frr defaults datacenter
hostname localhost
diff --git a/src/test/zones/evpn/disable_arp_nd_suppression/expected_controller_config b/src/test/zones/evpn/disable_arp_nd_suppression/expected_controller_config
index 0c6cc0939d15..b57707fd52ed 100644
--- a/src/test/zones/evpn/disable_arp_nd_suppression/expected_controller_config
+++ b/src/test/zones/evpn/disable_arp_nd_suppression/expected_controller_config
@@ -1,3 +1,7 @@
+! This file is generated by Proxmox VE SDN.
+! Do not edit directly; changes will be overwritten.
+! For simple custom FRR additions, use /etc/frr/frr.conf.d/*.conf.
+!
frr version 10.6.1
frr defaults datacenter
hostname localhost
diff --git a/src/test/zones/evpn/ebgp/expected_controller_config b/src/test/zones/evpn/ebgp/expected_controller_config
index 6df5facee554..eacff82dfe00 100644
--- a/src/test/zones/evpn/ebgp/expected_controller_config
+++ b/src/test/zones/evpn/ebgp/expected_controller_config
@@ -1,3 +1,7 @@
+! This file is generated by Proxmox VE SDN.
+! Do not edit directly; changes will be overwritten.
+! For simple custom FRR additions, use /etc/frr/frr.conf.d/*.conf.
+!
frr version 10.6.1
frr defaults datacenter
hostname localhost
diff --git a/src/test/zones/evpn/ebgp_evpn_ibgp_wan_evpn_ebgp/expected_controller_config b/src/test/zones/evpn/ebgp_evpn_ibgp_wan_evpn_ebgp/expected_controller_config
index 6377aca4de85..303ee214fa0e 100644
--- a/src/test/zones/evpn/ebgp_evpn_ibgp_wan_evpn_ebgp/expected_controller_config
+++ b/src/test/zones/evpn/ebgp_evpn_ibgp_wan_evpn_ebgp/expected_controller_config
@@ -1,3 +1,7 @@
+! This file is generated by Proxmox VE SDN.
+! Do not edit directly; changes will be overwritten.
+! For simple custom FRR additions, use /etc/frr/frr.conf.d/*.conf.
+!
frr version 10.6.1
frr defaults datacenter
hostname localhost
diff --git a/src/test/zones/evpn/ebgp_evpn_ibgp_wan_evpn_ebgp_rt_import/expected_controller_config b/src/test/zones/evpn/ebgp_evpn_ibgp_wan_evpn_ebgp_rt_import/expected_controller_config
index d5ffe91e595e..127ce4f226bd 100644
--- a/src/test/zones/evpn/ebgp_evpn_ibgp_wan_evpn_ebgp_rt_import/expected_controller_config
+++ b/src/test/zones/evpn/ebgp_evpn_ibgp_wan_evpn_ebgp_rt_import/expected_controller_config
@@ -1,3 +1,7 @@
+! This file is generated by Proxmox VE SDN.
+! Do not edit directly; changes will be overwritten.
+! For simple custom FRR additions, use /etc/frr/frr.conf.d/*.conf.
+!
frr version 10.6.1
frr defaults datacenter
hostname localhost
diff --git a/src/test/zones/evpn/ebgp_evpn_ibgp_wan_evpn_ebgp_rt_import_mixed/expected_controller_config b/src/test/zones/evpn/ebgp_evpn_ibgp_wan_evpn_ebgp_rt_import_mixed/expected_controller_config
index b9cc6f3395a7..c0a07d1c56d2 100644
--- a/src/test/zones/evpn/ebgp_evpn_ibgp_wan_evpn_ebgp_rt_import_mixed/expected_controller_config
+++ b/src/test/zones/evpn/ebgp_evpn_ibgp_wan_evpn_ebgp_rt_import_mixed/expected_controller_config
@@ -1,3 +1,7 @@
+! This file is generated by Proxmox VE SDN.
+! Do not edit directly; changes will be overwritten.
+! For simple custom FRR additions, use /etc/frr/frr.conf.d/*.conf.
+!
frr version 10.6.1
frr defaults datacenter
hostname localhost
diff --git a/src/test/zones/evpn/ebgp_loopback/expected_controller_config b/src/test/zones/evpn/ebgp_loopback/expected_controller_config
index 2022f4dc686a..2f23e281e300 100644
--- a/src/test/zones/evpn/ebgp_loopback/expected_controller_config
+++ b/src/test/zones/evpn/ebgp_loopback/expected_controller_config
@@ -1,3 +1,7 @@
+! This file is generated by Proxmox VE SDN.
+! Do not edit directly; changes will be overwritten.
+! For simple custom FRR additions, use /etc/frr/frr.conf.d/*.conf.
+!
frr version 10.6.1
frr defaults datacenter
hostname localhost
diff --git a/src/test/zones/evpn/ebgp_only/expected_controller_config b/src/test/zones/evpn/ebgp_only/expected_controller_config
index b9dde578ee25..f711b83eeefa 100644
--- a/src/test/zones/evpn/ebgp_only/expected_controller_config
+++ b/src/test/zones/evpn/ebgp_only/expected_controller_config
@@ -1,3 +1,7 @@
+! This file is generated by Proxmox VE SDN.
+! Do not edit directly; changes will be overwritten.
+! For simple custom FRR additions, use /etc/frr/frr.conf.d/*.conf.
+!
frr version 10.6.1
frr defaults datacenter
hostname localhost
diff --git a/src/test/zones/evpn/evpn_cluster_ibgp_uplink_ebgp/expected_controller_config b/src/test/zones/evpn/evpn_cluster_ibgp_uplink_ebgp/expected_controller_config
index 7c911a8876ce..99ea845c4904 100644
--- a/src/test/zones/evpn/evpn_cluster_ibgp_uplink_ebgp/expected_controller_config
+++ b/src/test/zones/evpn/evpn_cluster_ibgp_uplink_ebgp/expected_controller_config
@@ -1,3 +1,7 @@
+! This file is generated by Proxmox VE SDN.
+! Do not edit directly; changes will be overwritten.
+! For simple custom FRR additions, use /etc/frr/frr.conf.d/*.conf.
+!
frr version 10.6.1
frr defaults datacenter
hostname localhost
diff --git a/src/test/zones/evpn/evpn_multiple_zones_cluster_ibgp_uplink_ebgp/expected_controller_config b/src/test/zones/evpn/evpn_multiple_zones_cluster_ibgp_uplink_ebgp/expected_controller_config
index a348d145b73d..616afefa0473 100644
--- a/src/test/zones/evpn/evpn_multiple_zones_cluster_ibgp_uplink_ebgp/expected_controller_config
+++ b/src/test/zones/evpn/evpn_multiple_zones_cluster_ibgp_uplink_ebgp/expected_controller_config
@@ -1,3 +1,7 @@
+! This file is generated by Proxmox VE SDN.
+! Do not edit directly; changes will be overwritten.
+! For simple custom FRR additions, use /etc/frr/frr.conf.d/*.conf.
+!
frr version 10.6.1
frr defaults datacenter
hostname localhost
diff --git a/src/test/zones/evpn/exitnode/expected_controller_config b/src/test/zones/evpn/exitnode/expected_controller_config
index e7923027f01e..42fe02fc232b 100644
--- a/src/test/zones/evpn/exitnode/expected_controller_config
+++ b/src/test/zones/evpn/exitnode/expected_controller_config
@@ -1,3 +1,7 @@
+! This file is generated by Proxmox VE SDN.
+! Do not edit directly; changes will be overwritten.
+! For simple custom FRR additions, use /etc/frr/frr.conf.d/*.conf.
+!
frr version 10.6.1
frr defaults datacenter
hostname localhost
diff --git a/src/test/zones/evpn/exitnode_local_routing/expected_controller_config b/src/test/zones/evpn/exitnode_local_routing/expected_controller_config
index 57f85d4e20ef..1659dbe3aee3 100644
--- a/src/test/zones/evpn/exitnode_local_routing/expected_controller_config
+++ b/src/test/zones/evpn/exitnode_local_routing/expected_controller_config
@@ -1,3 +1,7 @@
+! This file is generated by Proxmox VE SDN.
+! Do not edit directly; changes will be overwritten.
+! For simple custom FRR additions, use /etc/frr/frr.conf.d/*.conf.
+!
frr version 10.6.1
frr defaults datacenter
hostname localhost
diff --git a/src/test/zones/evpn/exitnode_local_routing_ipv6/expected_controller_config b/src/test/zones/evpn/exitnode_local_routing_ipv6/expected_controller_config
index 382660ff5f7a..447a92877f1e 100644
--- a/src/test/zones/evpn/exitnode_local_routing_ipv6/expected_controller_config
+++ b/src/test/zones/evpn/exitnode_local_routing_ipv6/expected_controller_config
@@ -1,3 +1,7 @@
+! This file is generated by Proxmox VE SDN.
+! Do not edit directly; changes will be overwritten.
+! For simple custom FRR additions, use /etc/frr/frr.conf.d/*.conf.
+!
frr version 10.6.1
frr defaults datacenter
hostname localhost
diff --git a/src/test/zones/evpn/exitnode_primary/expected_controller_config b/src/test/zones/evpn/exitnode_primary/expected_controller_config
index 056b731f454e..4745ac283464 100644
--- a/src/test/zones/evpn/exitnode_primary/expected_controller_config
+++ b/src/test/zones/evpn/exitnode_primary/expected_controller_config
@@ -1,3 +1,7 @@
+! This file is generated by Proxmox VE SDN.
+! Do not edit directly; changes will be overwritten.
+! For simple custom FRR additions, use /etc/frr/frr.conf.d/*.conf.
+!
frr version 10.6.1
frr defaults datacenter
hostname localhost
diff --git a/src/test/zones/evpn/exitnode_snat/expected_controller_config b/src/test/zones/evpn/exitnode_snat/expected_controller_config
index e7923027f01e..42fe02fc232b 100644
--- a/src/test/zones/evpn/exitnode_snat/expected_controller_config
+++ b/src/test/zones/evpn/exitnode_snat/expected_controller_config
@@ -1,3 +1,7 @@
+! This file is generated by Proxmox VE SDN.
+! Do not edit directly; changes will be overwritten.
+! For simple custom FRR additions, use /etc/frr/frr.conf.d/*.conf.
+!
frr version 10.6.1
frr defaults datacenter
hostname localhost
diff --git a/src/test/zones/evpn/exitnodenullroute/expected_controller_config b/src/test/zones/evpn/exitnodenullroute/expected_controller_config
index df5dc4bd7ae3..f7482cb4dab1 100644
--- a/src/test/zones/evpn/exitnodenullroute/expected_controller_config
+++ b/src/test/zones/evpn/exitnodenullroute/expected_controller_config
@@ -1,3 +1,7 @@
+! This file is generated by Proxmox VE SDN.
+! Do not edit directly; changes will be overwritten.
+! For simple custom FRR additions, use /etc/frr/frr.conf.d/*.conf.
+!
frr version 10.6.1
frr defaults datacenter
hostname localhost
diff --git a/src/test/zones/evpn/frr_local_merge/expected_controller_config b/src/test/zones/evpn/frr_local_merge/expected_controller_config
index 30e5fd0bb7e9..2e9bd3a8b5ad 100644
--- a/src/test/zones/evpn/frr_local_merge/expected_controller_config
+++ b/src/test/zones/evpn/frr_local_merge/expected_controller_config
@@ -1,3 +1,7 @@
+! This file is generated by Proxmox VE SDN.
+! Do not edit directly; changes will be overwritten.
+! For simple custom FRR additions, use /etc/frr/frr.conf.d/*.conf.
+!
frr version 10.6.1
frr defaults datacenter
hostname localhost
diff --git a/src/test/zones/evpn/frr_local_merge_router_without_exit/expected_controller_config b/src/test/zones/evpn/frr_local_merge_router_without_exit/expected_controller_config
index fffd4b8ab52e..d4065f7a4379 100644
--- a/src/test/zones/evpn/frr_local_merge_router_without_exit/expected_controller_config
+++ b/src/test/zones/evpn/frr_local_merge_router_without_exit/expected_controller_config
@@ -1,3 +1,7 @@
+! This file is generated by Proxmox VE SDN.
+! Do not edit directly; changes will be overwritten.
+! For simple custom FRR additions, use /etc/frr/frr.conf.d/*.conf.
+!
frr version 10.6.1
frr defaults datacenter
hostname localhost
diff --git a/src/test/zones/evpn/ipv4/expected_controller_config b/src/test/zones/evpn/ipv4/expected_controller_config
index 0c6cc0939d15..59c03f5416c5 100644
--- a/src/test/zones/evpn/ipv4/expected_controller_config
+++ b/src/test/zones/evpn/ipv4/expected_controller_config
@@ -1,3 +1,7 @@
+! This file is generated by Proxmox VE SDN.
+! Do not edit directly; changes will be overwritten.
+! For simple custom FRR additions, use /etc/frr/frr.conf.d/*.conf.
+!
frr version 10.6.1
frr defaults datacenter
hostname localhost
@@ -40,5 +44,11 @@ exit
route-map MAP_VTEP_OUT permit 1
exit
!
+! Begin user FRR config from ./zones/evpn/ipv4/frr.conf.d/10-custom.conf
+!
+ip prefix-list CUSTOM seq 10 permit 203.0.113.0/24
+!
+! End user FRR config from ./zones/evpn/ipv4/frr.conf.d/10-custom.conf
+!
line vty
!
diff --git a/src/test/zones/evpn/ipv4/frr.conf.d/00-empty.conf b/src/test/zones/evpn/ipv4/frr.conf.d/00-empty.conf
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/src/test/zones/evpn/ipv4/frr.conf.d/10-custom.conf b/src/test/zones/evpn/ipv4/frr.conf.d/10-custom.conf
new file mode 100644
index 000000000000..8408174b4c4c
--- /dev/null
+++ b/src/test/zones/evpn/ipv4/frr.conf.d/10-custom.conf
@@ -0,0 +1 @@
+ip prefix-list CUSTOM seq 10 permit 203.0.113.0/24
diff --git a/src/test/zones/evpn/ipv4ipv6/expected_controller_config b/src/test/zones/evpn/ipv4ipv6/expected_controller_config
index 0c6cc0939d15..b57707fd52ed 100644
--- a/src/test/zones/evpn/ipv4ipv6/expected_controller_config
+++ b/src/test/zones/evpn/ipv4ipv6/expected_controller_config
@@ -1,3 +1,7 @@
+! This file is generated by Proxmox VE SDN.
+! Do not edit directly; changes will be overwritten.
+! For simple custom FRR additions, use /etc/frr/frr.conf.d/*.conf.
+!
frr version 10.6.1
frr defaults datacenter
hostname localhost
diff --git a/src/test/zones/evpn/ipv4ipv6nogateway/expected_controller_config b/src/test/zones/evpn/ipv4ipv6nogateway/expected_controller_config
index 0c6cc0939d15..b57707fd52ed 100644
--- a/src/test/zones/evpn/ipv4ipv6nogateway/expected_controller_config
+++ b/src/test/zones/evpn/ipv4ipv6nogateway/expected_controller_config
@@ -1,3 +1,7 @@
+! This file is generated by Proxmox VE SDN.
+! Do not edit directly; changes will be overwritten.
+! For simple custom FRR additions, use /etc/frr/frr.conf.d/*.conf.
+!
frr version 10.6.1
frr defaults datacenter
hostname localhost
diff --git a/src/test/zones/evpn/ipv6/expected_controller_config b/src/test/zones/evpn/ipv6/expected_controller_config
index 0c6cc0939d15..b57707fd52ed 100644
--- a/src/test/zones/evpn/ipv6/expected_controller_config
+++ b/src/test/zones/evpn/ipv6/expected_controller_config
@@ -1,3 +1,7 @@
+! This file is generated by Proxmox VE SDN.
+! Do not edit directly; changes will be overwritten.
+! For simple custom FRR additions, use /etc/frr/frr.conf.d/*.conf.
+!
frr version 10.6.1
frr defaults datacenter
hostname localhost
diff --git a/src/test/zones/evpn/ipv6underlay/expected_controller_config b/src/test/zones/evpn/ipv6underlay/expected_controller_config
index 038fec7ba9fc..79518a4065eb 100644
--- a/src/test/zones/evpn/ipv6underlay/expected_controller_config
+++ b/src/test/zones/evpn/ipv6underlay/expected_controller_config
@@ -1,3 +1,7 @@
+! This file is generated by Proxmox VE SDN.
+! Do not edit directly; changes will be overwritten.
+! For simple custom FRR additions, use /etc/frr/frr.conf.d/*.conf.
+!
frr version 10.6.1
frr defaults datacenter
hostname localhost
diff --git a/src/test/zones/evpn/isis/expected_controller_config b/src/test/zones/evpn/isis/expected_controller_config
index b8285a1af4dd..d2bb0d582248 100644
--- a/src/test/zones/evpn/isis/expected_controller_config
+++ b/src/test/zones/evpn/isis/expected_controller_config
@@ -1,3 +1,7 @@
+! This file is generated by Proxmox VE SDN.
+! Do not edit directly; changes will be overwritten.
+! For simple custom FRR additions, use /etc/frr/frr.conf.d/*.conf.
+!
frr version 10.6.1
frr defaults datacenter
hostname localhost
diff --git a/src/test/zones/evpn/isis_loopback/expected_controller_config b/src/test/zones/evpn/isis_loopback/expected_controller_config
index 54a9e79cbcba..e1360722987a 100644
--- a/src/test/zones/evpn/isis_loopback/expected_controller_config
+++ b/src/test/zones/evpn/isis_loopback/expected_controller_config
@@ -1,3 +1,7 @@
+! This file is generated by Proxmox VE SDN.
+! Do not edit directly; changes will be overwritten.
+! For simple custom FRR additions, use /etc/frr/frr.conf.d/*.conf.
+!
frr version 10.6.1
frr defaults datacenter
hostname localhost
diff --git a/src/test/zones/evpn/isis_standalone/expected_controller_config b/src/test/zones/evpn/isis_standalone/expected_controller_config
index 0a95b4f43603..bdf138342d0b 100644
--- a/src/test/zones/evpn/isis_standalone/expected_controller_config
+++ b/src/test/zones/evpn/isis_standalone/expected_controller_config
@@ -1,3 +1,7 @@
+! This file is generated by Proxmox VE SDN.
+! Do not edit directly; changes will be overwritten.
+! For simple custom FRR additions, use /etc/frr/frr.conf.d/*.conf.
+!
frr version 10.6.1
frr defaults datacenter
hostname localhost
diff --git a/src/test/zones/evpn/multipath_relax/expected_controller_config b/src/test/zones/evpn/multipath_relax/expected_controller_config
index 0cca068a8ba1..e4f5fe8886ec 100644
--- a/src/test/zones/evpn/multipath_relax/expected_controller_config
+++ b/src/test/zones/evpn/multipath_relax/expected_controller_config
@@ -1,3 +1,7 @@
+! This file is generated by Proxmox VE SDN.
+! Do not edit directly; changes will be overwritten.
+! For simple custom FRR additions, use /etc/frr/frr.conf.d/*.conf.
+!
frr version 10.6.1
frr defaults datacenter
hostname localhost
diff --git a/src/test/zones/evpn/multiplezones/expected_controller_config b/src/test/zones/evpn/multiplezones/expected_controller_config
index 73689a4ccd60..db3fbe71f84d 100644
--- a/src/test/zones/evpn/multiplezones/expected_controller_config
+++ b/src/test/zones/evpn/multiplezones/expected_controller_config
@@ -1,3 +1,7 @@
+! This file is generated by Proxmox VE SDN.
+! Do not edit directly; changes will be overwritten.
+! For simple custom FRR additions, use /etc/frr/frr.conf.d/*.conf.
+!
frr version 10.6.1
frr defaults datacenter
hostname localhost
diff --git a/src/test/zones/evpn/openfabric_fabric/expected_controller_config b/src/test/zones/evpn/openfabric_fabric/expected_controller_config
index 153cc2f58830..6cf423da331e 100644
--- a/src/test/zones/evpn/openfabric_fabric/expected_controller_config
+++ b/src/test/zones/evpn/openfabric_fabric/expected_controller_config
@@ -1,3 +1,7 @@
+! This file is generated by Proxmox VE SDN.
+! Do not edit directly; changes will be overwritten.
+! For simple custom FRR additions, use /etc/frr/frr.conf.d/*.conf.
+!
frr version 10.6.1
frr defaults datacenter
hostname localhost
diff --git a/src/test/zones/evpn/openfabric_fabric_ipv6/expected_controller_config b/src/test/zones/evpn/openfabric_fabric_ipv6/expected_controller_config
index fc6ebeb63b14..891d5d7d3250 100644
--- a/src/test/zones/evpn/openfabric_fabric_ipv6/expected_controller_config
+++ b/src/test/zones/evpn/openfabric_fabric_ipv6/expected_controller_config
@@ -1,3 +1,7 @@
+! This file is generated by Proxmox VE SDN.
+! Do not edit directly; changes will be overwritten.
+! For simple custom FRR additions, use /etc/frr/frr.conf.d/*.conf.
+!
frr version 10.6.1
frr defaults datacenter
hostname localhost
diff --git a/src/test/zones/evpn/openfabric_fabric_ipv6_only/expected_controller_config b/src/test/zones/evpn/openfabric_fabric_ipv6_only/expected_controller_config
index f3f633a9ebdf..4d1a4a1f9c8f 100644
--- a/src/test/zones/evpn/openfabric_fabric_ipv6_only/expected_controller_config
+++ b/src/test/zones/evpn/openfabric_fabric_ipv6_only/expected_controller_config
@@ -1,3 +1,7 @@
+! This file is generated by Proxmox VE SDN.
+! Do not edit directly; changes will be overwritten.
+! For simple custom FRR additions, use /etc/frr/frr.conf.d/*.conf.
+!
frr version 10.6.1
frr defaults datacenter
hostname localhost
diff --git a/src/test/zones/evpn/ospf_fabric/expected_controller_config b/src/test/zones/evpn/ospf_fabric/expected_controller_config
index 554d71c28595..292bfa03594f 100644
--- a/src/test/zones/evpn/ospf_fabric/expected_controller_config
+++ b/src/test/zones/evpn/ospf_fabric/expected_controller_config
@@ -1,3 +1,7 @@
+! This file is generated by Proxmox VE SDN.
+! Do not edit directly; changes will be overwritten.
+! For simple custom FRR additions, use /etc/frr/frr.conf.d/*.conf.
+!
frr version 10.6.1
frr defaults datacenter
hostname localhost
diff --git a/src/test/zones/evpn/routemap/expected_controller_config b/src/test/zones/evpn/routemap/expected_controller_config
index 2cec1c34634c..e1e79b9fb6b9 100644
--- a/src/test/zones/evpn/routemap/expected_controller_config
+++ b/src/test/zones/evpn/routemap/expected_controller_config
@@ -1,3 +1,7 @@
+! This file is generated by Proxmox VE SDN.
+! Do not edit directly; changes will be overwritten.
+! For simple custom FRR additions, use /etc/frr/frr.conf.d/*.conf.
+!
frr version 10.6.1
frr defaults datacenter
hostname localhost
diff --git a/src/test/zones/evpn/routemap_exit_node/expected_controller_config b/src/test/zones/evpn/routemap_exit_node/expected_controller_config
index 1220e0151bab..4f06d7760d91 100644
--- a/src/test/zones/evpn/routemap_exit_node/expected_controller_config
+++ b/src/test/zones/evpn/routemap_exit_node/expected_controller_config
@@ -1,3 +1,7 @@
+! This file is generated by Proxmox VE SDN.
+! Do not edit directly; changes will be overwritten.
+! For simple custom FRR additions, use /etc/frr/frr.conf.d/*.conf.
+!
frr version 10.6.1
frr defaults datacenter
hostname localhost
diff --git a/src/test/zones/evpn/routemap_prefix_list/expected_controller_config b/src/test/zones/evpn/routemap_prefix_list/expected_controller_config
index cb912dc8ddc5..c6b6fd2f27e1 100644
--- a/src/test/zones/evpn/routemap_prefix_list/expected_controller_config
+++ b/src/test/zones/evpn/routemap_prefix_list/expected_controller_config
@@ -1,3 +1,7 @@
+! This file is generated by Proxmox VE SDN.
+! Do not edit directly; changes will be overwritten.
+! For simple custom FRR additions, use /etc/frr/frr.conf.d/*.conf.
+!
frr version 10.6.1
frr defaults datacenter
hostname localhost
diff --git a/src/test/zones/evpn/rt_import/expected_controller_config b/src/test/zones/evpn/rt_import/expected_controller_config
index 2476822dfa58..23dc7492b287 100644
--- a/src/test/zones/evpn/rt_import/expected_controller_config
+++ b/src/test/zones/evpn/rt_import/expected_controller_config
@@ -1,3 +1,7 @@
+! This file is generated by Proxmox VE SDN.
+! Do not edit directly; changes will be overwritten.
+! For simple custom FRR additions, use /etc/frr/frr.conf.d/*.conf.
+!
frr version 10.6.1
frr defaults datacenter
hostname localhost
diff --git a/src/test/zones/evpn/vxlanport/expected_controller_config b/src/test/zones/evpn/vxlanport/expected_controller_config
index 0c6cc0939d15..b57707fd52ed 100644
--- a/src/test/zones/evpn/vxlanport/expected_controller_config
+++ b/src/test/zones/evpn/vxlanport/expected_controller_config
@@ -1,3 +1,7 @@
+! This file is generated by Proxmox VE SDN.
+! Do not edit directly; changes will be overwritten.
+! For simple custom FRR additions, use /etc/frr/frr.conf.d/*.conf.
+!
frr version 10.6.1
frr defaults datacenter
hostname localhost
--
2.47.3
^ permalink raw reply related [flat|nested] 3+ messages in thread