summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Hanreich <s.hanreich@proxmox.com>2025-07-16 15:08:07 +0200
committerThomas Lamprecht <t.lamprecht@proxmox.com>2025-07-17 00:10:42 +0200
commitaff710c146d642e5304a179aadd5fb865245a20e (patch)
tree0b0ad61983b497213c98d186fc73fdc90c79dc64
parent3999d93ac05c3c60a41d1ffb2d98ab352f91df3f (diff)
fabrics: generate ifupdown configuration
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@proxmox.com> Signed-off-by: Stefan Hanreich <s.hanreich@proxmox.com> Link: https://lore.proxmox.com/20250716130837.585796-47-g.goller@proxmox.com
-rw-r--r--src/PVE/Network/SDN.pm69
-rw-r--r--src/PVE/Network/SDN/Fabrics.pm7
-rw-r--r--src/PVE/Network/SDN/Zones.pm10
-rwxr-xr-xsrc/test/run_test_zones.pl2
4 files changed, 64 insertions, 24 deletions
diff --git a/src/PVE/Network/SDN.pm b/src/PVE/Network/SDN.pm
index 46c8580..8c584f6 100644
--- a/src/PVE/Network/SDN.pm
+++ b/src/PVE/Network/SDN.pm
@@ -251,19 +251,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 94f4e97..5ef4606 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 007d746..5f30df3 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 266bd9b..917f40a 100755
--- a/src/test/run_test_zones.pl
+++ b/src/test/run_test_zones.pl
@@ -134,7 +134,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");