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

Gabriel Goller g.goller at proxmox.com
Wed Jul 2 16:50:32 CEST 2025


From: Stefan Hanreich <s.hanreich at proxmox.com>

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         | 71 +++++++++++++++++++++++++++-------
 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(+), 26 deletions(-)

diff --git a/src/PVE/Network/SDN.pm b/src/PVE/Network/SDN.pm
index 0c51927157f0..1a0bc769a252 100644
--- a/src/PVE/Network/SDN.pm
+++ b/src/PVE/Network/SDN.pm
@@ -287,21 +287,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 94f4e97a2f46..5ef4606710f8 100644
--- a/src/PVE/Network/SDN/Fabrics.pm
+++ b/src/PVE/Network/SDN/Fabrics.pm
@@ -72,4 +72,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 007d746bf601..5f30df396c96 100644
--- a/src/PVE/Network/SDN/Zones.pm
+++ b/src/PVE/Network/SDN/Zones.pm
@@ -179,16 +179,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 6052e2b1ac9f..991f1e318102 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