From 80348b2d6fad36443b6ab83b5f8c4e734afd9af8 Mon Sep 17 00:00:00 2001 From: Alexandre Derumier Date: Thu, 29 Aug 2019 12:32:42 +0200 Subject: [PATCH] add generate_etc_network_config && write_etc_network_config subs moved from test script, also skip vnet generation instead die in case of error Signed-off-by: Alexandre Derumier --- PVE/Network/SDN.pm | 73 +++++++++++++++++++++++++++++++++++++ test/generateconfig.pl | 81 ++---------------------------------------- 2 files changed, 76 insertions(+), 78 deletions(-) diff --git a/PVE/Network/SDN.pm b/PVE/Network/SDN.pm index 8078c3f..9488f4f 100644 --- a/PVE/Network/SDN.pm +++ b/PVE/Network/SDN.pm @@ -91,4 +91,77 @@ sub status { return $interfaces; } + +sub generate_etc_network_config { + + my $sdn_cfg = PVE::Cluster::cfs_read_file('sdn.cfg'); + return if !$sdn_cfg; + + #read main config for physical interfaces + my $current_config_file = "/etc/network/interfaces"; + my $fh = IO::File->new($current_config_file); + my $interfaces_config = PVE::INotify::read_etc_network_interfaces(1,$fh); + $fh->close(); + + #check uplinks + my $uplinks = {}; + foreach my $id (keys %{$interfaces_config->{ifaces}}) { + my $interface = $interfaces_config->{ifaces}->{$id}; + if (my $uplink = $interface->{'uplink-id'}) { + die "uplink-id $uplink is already defined on $uplinks->{$uplink}" if $uplinks->{$uplink}; + $interface->{name} = $id; + $uplinks->{$interface->{'uplink-id'}} = $interface; + } + } + + my $vnet_cfg = undef; + my $transport_cfg = undef; + + foreach my $id (keys %{$sdn_cfg->{ids}}) { + if ($sdn_cfg->{ids}->{$id}->{type} eq 'vnet') { + $vnet_cfg->{ids}->{$id} = $sdn_cfg->{ids}->{$id}; + } else { + $transport_cfg->{ids}->{$id} = $sdn_cfg->{ids}->{$id}; + } + } + + #generate configuration + my $rawconfig = ""; + foreach my $id (keys %{$vnet_cfg->{ids}}) { + my $vnet = $vnet_cfg->{ids}->{$id}; + my $zone = $vnet->{transportzone}; + + if(!$zone) { + warn "can't generate vnet $vnet : zone $zone don't exist"; + next; + } + + my $plugin_config = $transport_cfg->{ids}->{$zone}; + + if (!defined($plugin_config)) { + warn "can't generate vnet $vnet : zone $zone don't exist"; + next; + } + + my $plugin = PVE::Network::SDN::Plugin->lookup($plugin_config->{type}); + $rawconfig .= $plugin->generate_sdn_config($plugin_config, $zone, $id, $vnet, $uplinks); + } + + return $rawconfig; +} + +sub write_etc_network_config { + my ($rawconfig) = @_; + + return if !$rawconfig; + my $sdn_interfaces_file = "/etc/network/interfaces.d/sdn"; + + my $writefh = IO::File->new($sdn_interfaces_file,">"); + print $writefh $rawconfig; + $writefh->close(); +} + 1; + + + diff --git a/test/generateconfig.pl b/test/generateconfig.pl index 0a652b8..1be9afd 100644 --- a/test/generateconfig.pl +++ b/test/generateconfig.pl @@ -3,84 +3,9 @@ use warnings; use File::Copy; use PVE::Cluster qw(cfs_read_file); -use PVE::Network::SDN::Plugin; -use PVE::Network::SDN::VnetPlugin; -use PVE::Network::SDN::VlanPlugin; -use PVE::Network::SDN::VxlanMulticastPlugin; +use PVE::Network::SDN; -PVE::Network::SDN::VnetPlugin->register(); -PVE::Network::SDN::VlanPlugin->register(); -PVE::Network::SDN::VxlanMulticastPlugin->register(); -PVE::Network::SDN::Plugin->init(); - -my $rawconfig = generate_sdn_config(); +my $rawconfig = PVE::Network::SDN::generate_etc_network_config(); +PVE::Network::SDN::write_etc_network_config($rawconfig); print $rawconfig; -write_final_config($rawconfig); - -sub generate_sdn_config { - - #only support ifupdown2 - die "you need ifupdown2 to reload networking\n" if !-e '/usr/share/ifupdown2'; - - #read main config for physical interfaces - my $current_config_file = "/etc/network/interfaces"; - my $fh = IO::File->new($current_config_file); - my $interfaces_config = PVE::INotify::read_etc_network_interfaces(1,$fh); - $fh->close(); - - #check uplinks - my $uplinks = {}; - foreach my $id (keys %{$interfaces_config->{ifaces}}) { - my $interface = $interfaces_config->{ifaces}->{$id}; - if (my $uplink = $interface->{'uplink-id'}) { - die "uplink-id $uplink is already defined on $uplinks->{$uplink}" if $uplinks->{$uplink}; - $interface->{name} = $id; - $uplinks->{$interface->{'uplink-id'}} = $interface; - } - } - - my $sdn_cfg = PVE::Cluster::cfs_read_file('sdn.cfg'); - my $vnet_cfg = undef; - my $transport_cfg = undef; - - foreach my $id (keys %{$sdn_cfg->{ids}}) { - if ($sdn_cfg->{ids}->{$id}->{type} eq 'vnet') { - $vnet_cfg->{ids}->{$id} = $sdn_cfg->{ids}->{$id}; - } else { - $transport_cfg->{ids}->{$id} = $sdn_cfg->{ids}->{$id}; - } - } - - #generate configuration - my $rawconfig = ""; - foreach my $id (keys %{$vnet_cfg->{ids}}) { - my $vnet = $vnet_cfg->{ids}->{$id}; - my $zone = $vnet->{transportzone}; - - die "zone $zone don't exist" if !$zone; - my $plugin_config = $transport_cfg->{ids}->{$zone}; - die "zone $zone don't exist" if !defined($plugin_config); - my $plugin = PVE::Network::SDN::Plugin->lookup($plugin_config->{type}); - $rawconfig .= $plugin->generate_sdn_config($plugin_config, $zone, $id, $vnet, $uplinks); - } - -return $rawconfig; -} - - -sub write_final_config { - my ($rawconfig) = @_; - #now write final separate filename - my $tmp_file = "/var/tmp/pve-vnet.cfg"; - - my $vnet_interfaces_file = "/etc/network/interfaces.d/vnet"; - - my $writefh = IO::File->new($vnet_interfaces_file,">"); - print $writefh $rawconfig; - $writefh->close(); -} - - - - -- 2.39.2