[pve-devel] [PATCH pve-network v3 12/21] fabrics: generate ifupdown configuration

Stefan Hanreich s.hanreich at proxmox.com
Thu May 22 18:17:01 CEST 2025


Currently, the ifupdown config generation is handled solely by the
zones plugin. Since the fabrics need to generate ifupdown
configuration as well, we create a new helper in the SDN module. It
then in turn calls into the zone and fabrics plugin, and merges the
generated raw configuration before writing it to the
/etc/network/interfaces.d/sdn file.

Co-authored-by: Gabriel Goller <g.goller at proxmox.com>
Signed-off-by: Stefan Hanreich <s.hanreich at proxmox.com>
---
 src/PVE/Network/SDN.pm         | 68 ++++++++++++++++++++++++++++------
 src/PVE/Network/SDN/Fabrics.pm |  7 ++++
 src/PVE/Network/SDN/Zones.pm   | 10 -----
 src/test/run_test_zones.pl     |  2 +-
 4 files changed, 64 insertions(+), 23 deletions(-)

diff --git a/src/PVE/Network/SDN.pm b/src/PVE/Network/SDN.pm
index 4b735b5..79e19b1 100644
--- a/src/PVE/Network/SDN.pm
+++ b/src/PVE/Network/SDN.pm
@@ -237,18 +237,62 @@ sub get_local_vnets {
     return $vnets;
 }
 
-sub generate_zone_config {
-    my $raw_config = PVE::Network::SDN::Zones::generate_etc_network_config();
-    if ($raw_config) {
-	eval {
-	    my $net_cfg = PVE::INotify::read_file('interfaces', 1);
-	    my $opts = $net_cfg->{data}->{options};
-	    log_warn("missing 'source /etc/network/interfaces.d/sdn' directive for SDN support!\n")
-		if ! grep { $_->[1] =~ m!^source /etc/network/interfaces.d/(:?sdn|\*)! } @$opts;
-	};
-	log_warn("Failed to read network interfaces definition - $@") if $@;
-    }
-    PVE::Network::SDN::Zones::write_etc_network_config($raw_config);
+=head3 generate_raw_etc_network_config()
+
+Generate the /etc/network/interfaces.d/sdn config file from the Zones
+and Fabrics configuration and return it as a String.
+
+=cut
+
+sub generate_raw_etc_network_config {
+    my $raw_config = "";
+
+    my $zone_config = PVE::Network::SDN::Zones::generate_etc_network_config();
+    $raw_config .= $zone_config if $zone_config;
+
+    my $fabric_config = PVE::Network::SDN::Fabrics::generate_etc_network_config();
+    $raw_config .= $fabric_config if $fabric_config;
+
+    return $raw_config;
+}
+
+=head3 ⋅write_raw_etc_network_config($raw_config)
+
+Writes a network configuration as generated by C<generate_raw_etc_network_config>
+to /etc/network/interfaces.d/sdn.
+
+=cut
+
+sub write_raw_etc_network_config {
+    my ($raw_config) = @_;
+    my $local_network_sdn_file = "/etc/network/interfaces.d/sdn";
+
+    die "no network config supplied" if !defined $raw_config;
+
+    eval {
+	my $net_cfg = PVE::INotify::read_file('interfaces', 1);
+	my $opts = $net_cfg->{data}->{options};
+	log_warn("missing 'source /etc/network/interfaces.d/sdn' directive for SDN support!\n")
+	    if ! grep { $_->[1] =~ m!^source /etc/network/interfaces.d/(:?sdn|\*)! } @$opts;
+    };
+
+    log_warn("Failed to read network interfaces definition - $@") if $@;
+
+    my $writefh = IO::File->new($local_network_sdn_file,">");
+    print $writefh $raw_config;
+    $writefh->close();
+}
+
+=head3 ⋅generate_etc_network_config()
+
+Generates the network configuration for all SDN plugins and writes it to the SDN
+interfaces files (/etc/network/interfaces.d/sdn).
+
+=cut
+
+sub generate_etc_network_config {
+    my $raw_config = PVE::Network::SDN::generate_raw_etc_network_config();
+    PVE::Network::SDN::write_raw_etc_network_config($raw_config);
 }
 
 =head3 generate_frr_raw_config(\%running_config, \%fabric_config)
diff --git a/src/PVE/Network/SDN/Fabrics.pm b/src/PVE/Network/SDN/Fabrics.pm
index 4950a88..3ac01cd 100644
--- a/src/PVE/Network/SDN/Fabrics.pm
+++ b/src/PVE/Network/SDN/Fabrics.pm
@@ -74,4 +74,11 @@ sub generate_frr_raw_config {
     return \@raw_config;
 }
 
+sub generate_etc_network_config {
+    my $nodename = PVE::INotify::nodename();
+    my $fabric_config = PVE::Network::SDN::Fabrics::config(1);
+
+    return $fabric_config->get_interfaces_etc_network_config($nodename);
+}
+
 1;
diff --git a/src/PVE/Network/SDN/Zones.pm b/src/PVE/Network/SDN/Zones.pm
index c1c7745..131ca5e 100644
--- a/src/PVE/Network/SDN/Zones.pm
+++ b/src/PVE/Network/SDN/Zones.pm
@@ -168,16 +168,6 @@ sub generate_etc_network_config {
     return $raw_network_config;
 }
 
-sub write_etc_network_config {
-    my ($rawconfig) = @_;
-
-    return if !$rawconfig;
-
-    my $writefh = IO::File->new($local_network_sdn_file,">");
-    print $writefh $rawconfig;
-    $writefh->close();
-}
-
 sub read_etc_network_config_version {
     my $versionstr = PVE::Tools::file_read_firstline($local_network_sdn_file);
 
diff --git a/src/test/run_test_zones.pl b/src/test/run_test_zones.pl
index 4137da6..794cbdb 100755
--- a/src/test/run_test_zones.pl
+++ b/src/test/run_test_zones.pl
@@ -129,7 +129,7 @@ foreach my $test (@tests) {
     my $name = $test;
     my $expected = read_file("./$test/expected_sdn_interfaces");
 
-    my $result = eval { PVE::Network::SDN::Zones::generate_etc_network_config() };
+    my $result = eval { PVE::Network::SDN::generate_raw_etc_network_config() };
 
     if (my $err = $@) {
 	diag("got unexpected error - $err");
-- 
2.39.5




More information about the pve-devel mailing list