From: Stefan Hanreich <s.hanre...@proxmox.com>

Currently, the ifupdown 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.

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

diff --git a/src/PVE/Network/SDN.pm b/src/PVE/Network/SDN.pm
index 12f0f9361389..24879dc0e76a 100644
--- a/src/PVE/Network/SDN.pm
+++ b/src/PVE/Network/SDN.pm
@@ -220,18 +220,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 d716c68feac4..05336a5730ac 100644
--- a/src/PVE/Network/SDN/Fabrics.pm
+++ b/src/PVE/Network/SDN/Fabrics.pm
@@ -102,6 +102,20 @@ 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);
+
+    my $raw_config = "";
+    for my $protocol (sort keys %$fabric_config) {
+       my $protocol_config = $fabric_config->{$protocol};
+       $raw_config .= 
$protocol_config->get_interfaces_etc_network_config($nodename);
+    }
+
+    return $raw_config;
+}
+
 sub write_config {
     my ($config) = @_;
 
diff --git a/src/PVE/Network/SDN/Zones.pm b/src/PVE/Network/SDN/Zones.pm
index c1c7745f894e..131ca5ea136d 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 4137da6b2687..794cbdb1d12b 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



_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to