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