mirror of
git://git.proxmox.com/git/pve-network.git
synced 2025-01-25 10:03:53 +03:00
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 <aderumier@odiso.com>
This commit is contained in:
parent
564fe87dd4
commit
80348b2d6f
@ -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;
|
||||
|
||||
|
||||
|
||||
|
@ -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;
|
||||
|
||||
PVE::Network::SDN::VnetPlugin->register();
|
||||
PVE::Network::SDN::VlanPlugin->register();
|
||||
PVE::Network::SDN::VxlanMulticastPlugin->register();
|
||||
PVE::Network::SDN::Plugin->init();
|
||||
use PVE::Network::SDN;
|
||||
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user