5
0
mirror of git://git.proxmox.com/git/pve-network.git synced 2025-01-07 21:18:01 +03:00

add a sample test to generate config

generate /etc/network/interfaces.d/vnet

reloading is not yet implemented

Signed-off-by: Alexandre Derumier <aderumier@odiso.com>
This commit is contained in:
Alexandre Derumier 2019-03-27 18:24:10 +01:00 committed by Dietmar Maurer
parent b0ed2beab0
commit 8df9fab504

95
test/generateconfig.pl Normal file
View File

@ -0,0 +1,95 @@
use strict;
use warnings;
use File::Copy;
use PVE::Cluster qw(cfs_read_file);
use PVE::Network::Vnet;
use PVE::Network::Plugin;
use PVE::Network::VlanPlugin;
use PVE::Network::VxlanMulticastPlugin;
PVE::Network::VlanPlugin->register();
PVE::Network::VxlanMulticastPlugin->register();
PVE::Network::Plugin->init();
my $rawconfig = generate_network_config();
verify_merged_config($rawconfig);
write_final_config($rawconfig);
print $rawconfig;
sub generate_network_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};
$uplinks->{$interface->{'uplink-id'}} = $id;
}
}
my $vnet_cfg = PVE::Cluster::cfs_read_file('network/vnet.cfg');
my $transport_cfg = PVE::Cluster::cfs_read_file('network/transports.cfg');
#generate configuration
my $rawconfig = "";
foreach my $id (keys %{$vnet_cfg->{ids}}) {
my $vnet = $vnet_cfg->{ids}->{$id};
my $zone = $vnet->{transportzone};
my $plugin_config = $transport_cfg->{ids}->{$zone};
die "zone $zone don't exist" if !defined($plugin_config);
my $plugin = PVE::Network::Plugin->lookup($plugin_config->{type});
$rawconfig .= $plugin->generate_network_config($plugin_config, $zone, $id, $vnet, $interfaces_config, $uplinks);
}
return $rawconfig;
}
#implement reload (split and reuse code from API2/Network.pm for bridge delete verification)
sub verify_merged_config {
my ($rawconfig) = @_;
#merge main network intefaces and vnet file for possible conflict verification
my $tmp_merged_network_interfaces = "/var/tmp/pve-merged_network_interfaces";
copy("/etc/network/interfaces", $tmp_merged_network_interfaces);
my $writefh = IO::File->new($tmp_merged_network_interfaces, '>>');
print $writefh $rawconfig;
$writefh->close();
my $readfh = IO::File->new($tmp_merged_network_interfaces);
my $merged_interfaces_config = PVE::INotify::read_etc_network_interfaces(1,$readfh);
$readfh->close();
unlink $tmp_merged_network_interfaces;
PVE::INotify::__write_etc_network_interfaces($merged_interfaces_config, 1);
}
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();
}