diff options
| author | Stefan Hanreich <s.hanreich@proxmox.com> | 2025-07-16 15:08:07 +0200 |
|---|---|---|
| committer | Thomas Lamprecht <t.lamprecht@proxmox.com> | 2025-07-17 00:10:42 +0200 |
| commit | aff710c146d642e5304a179aadd5fb865245a20e (patch) | |
| tree | 0b0ad61983b497213c98d186fc73fdc90c79dc64 | |
| parent | 3999d93ac05c3c60a41d1ffb2d98ab352f91df3f (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.pm | 69 | ||||
| -rw-r--r-- | src/PVE/Network/SDN/Fabrics.pm | 7 | ||||
| -rw-r--r-- | src/PVE/Network/SDN/Zones.pm | 10 | ||||
| -rwxr-xr-x | src/test/run_test_zones.pl | 2 |
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"); |
