]> git.proxmox.com Git - pve-network.git/commitdiff
add tap|veth create|plug
authorAlexandre Derumier <aderumier@odiso.com>
Mon, 9 Mar 2020 09:24:13 +0000 (10:24 +0100)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Tue, 10 Mar 2020 17:58:58 +0000 (18:58 +0100)
PVE/Network/SDN/Vnets.pm
PVE/Network/SDN/Zones.pm
PVE/Network/SDN/Zones/Plugin.pm
PVE/Network/SDN/Zones/QinQPlugin.pm
PVE/Network/SDN/Zones/VlanPlugin.pm

index f17c2785edb764601178b94988912d2a230f7a50..725605bbc0cf985c9eed24d60dc69e3bcba37062 100644 (file)
@@ -56,4 +56,12 @@ sub complete_sdn_vnet {
     return  $cmdname eq 'add' ? [] : [ PVE::Network::SDN::Vnets::sdn_vnet_ids($cfg) ];
 }
 
+sub get_vnet {
+    my ($vnetid) = @_;
+
+    my $cfg = PVE::Network::SDN::Vnets::config();
+    my $vnet = PVE::Network::SDN::Vnets::sdn_vnets_config($cfg, $vnetid, 1);
+    return $vnet;
+}
+
 1;
index 4a154f44bc5fdc31485a55ec1f800d37ec5c00ff..17ef507409442753d034801e6ba07872d74172e3 100644 (file)
@@ -8,6 +8,7 @@ use JSON;
 
 use PVE::Tools qw(extract_param dir_glob_regex run_command);
 use PVE::Cluster qw(cfs_read_file cfs_write_file cfs_lock_file);
+use PVE::Network;
 
 use PVE::Network::SDN::Vnets;
 use PVE::Network::SDN::Zones::VlanPlugin;
@@ -217,21 +218,80 @@ sub status {
 sub get_bridge_vlan {
     my ($vnetid) = @_;
 
-    my $vnet_cfg = PVE::Cluster::cfs_read_file('sdn/vnets.cfg');
-    my $zone_cfg = PVE::Cluster::cfs_read_file('sdn/zones.cfg');
-    my $nodename = PVE::INotify::nodename();
+    my $vnet = PVE::Network::SDN::Vnets::get_vnet($vnetid);
 
-    my $vnet = $vnet_cfg->{ids}->{$vnetid};
-    return if !$vnet;
+    #fallback if classic bridge
+    return ($vnetid, undef) if !$vnet;
 
+    my $zone_cfg = PVE::Network::SDN::Zones::config();
     my $zoneid = $vnet->{zone};
     my $tag = $vnet->{tag};
 
-    die "vnet $vnetid is not allowed on this node" if defined($zone_cfg->{ids}->{$zoneid}->{nodes}) && !$zone_cfg->{ids}->{$zoneid}->{nodes}->{$nodename};
+    my $plugin_config = $zone_cfg->{ids}->{$zoneid};
+    my $plugin = PVE::Network::SDN::Zones::Plugin->lookup($plugin_config->{type});
+    return $plugin->get_bridge_vlan($plugin_config, $vnetid, $tag);
+}
+
+sub tap_create {
+    my ($iface, $bridge) = @_;
+
+    my $vnet = PVE::Network::SDN::Vnets::get_vnet($bridge);
+
+    #fallback if classic bridge
+    if(!$vnet) {
+       PVE::Network::tap_create($iface, $bridge);
+        return;
+    }
+
+    my $zone_cfg = PVE::Network::SDN::Zones::config();
+    my $zoneid = $vnet->{zone};
+
+    my $plugin_config = $zone_cfg->{ids}->{$zoneid};
+    my $plugin = PVE::Network::SDN::Zones::Plugin->lookup($plugin_config->{type});
+    $plugin->tap_create($plugin_config, $vnet, $iface, $bridge);
+}
+
+sub veth_create {
+    my ($veth, $vethpeer, $bridge, $hwaddr) = @_;
+
+    my $vnet = PVE::Network::SDN::Vnets::get_vnet($bridge);
+
+    #fallback if classic bridge
+    if(!$vnet) {
+       PVE::Network::veth_create($veth, $vethpeer, $bridge, $hwaddr);
+        return;
+    }
+
+    my $zone_cfg = PVE::Network::SDN::Zones::config();
+    my $zoneid = $vnet->{zone};
+
+    my $plugin_config = $zone_cfg->{ids}->{$zoneid};
+    my $plugin = PVE::Network::SDN::Zones::Plugin->lookup($plugin_config->{type});
+    $plugin->veth_create($plugin_config, $vnet, $veth, $vethpeer, $bridge, $hwaddr);
+}
+
+sub tap_plug {
+    my ($iface, $bridge, $tag, $firewall, $trunks, $rate) = @_;
+
+    my $vnet = PVE::Network::SDN::Vnets::get_vnet($bridge);
+
+    #fallback if classic bridge
+    if(!$vnet) {
+       PVE::Network::tap_plug($iface, $bridge, $tag, $firewall, $trunks, $rate);
+       return;
+    }
+
+    my $zone_cfg = PVE::Network::SDN::Zones::config();
+    my $nodename = PVE::INotify::nodename();
+
+    my $zoneid = $vnet->{zone};
+    $tag = $vnet->{tag};
+
+    die "vnet $bridge is not allowed on this node" if defined($zone_cfg->{ids}->{$zoneid}->{nodes}) && !$zone_cfg->{ids}->{$zoneid}->{nodes}->{$nodename};
 
     my $plugin_config = $zone_cfg->{ids}->{$zoneid};
     my $plugin = PVE::Network::SDN::Zones::Plugin->lookup($plugin_config->{type});
-    return $plugin->get_bridge_vlan($plugin_config, $zoneid, $vnetid, $tag);
+    $plugin->tap_plug($plugin_config, $vnet, $iface, $bridge, $firewall, $rate);
 }
 
 1;
index 13a6e573bf9e1c4aa414c332c7fc620fcf67f091..e4adcbd73927473c7048dd0e2204c267012e733f 100644 (file)
@@ -6,6 +6,7 @@ use warnings;
 use PVE::Tools qw(run_command);
 use PVE::JSONSchema;
 use PVE::Cluster;
+use PVE::Network;
 
 use Data::Dumper;
 use PVE::JSONSchema qw(get_standard_option);
@@ -208,17 +209,45 @@ sub status {
 
 
 sub get_bridge_vlan {
-    my ($class, $plugin_config, $zoneid, $vnetid, $tag) = @_;
+    my ($class, $plugin_config, $vnetid, $tag) = @_;
 
-    my $bridge = $plugin_config->{bridge};
-    die "bridge $bridge is missing" if !-d "/sys/class/net/$bridge/";
-
-    $bridge = $vnetid;
+    my $bridge = $vnetid;
     $tag = undef;
 
+    die "bridge $bridge is missing" if !-d "/sys/class/net/$bridge/";
+
     return ($bridge, $tag);
 }
 
+sub tap_create {
+    my ($class, $plugin_config, $vnet, $iface, $vnetid) = @_;
+
+    my ($bridge, undef) = $class->get_bridge_vlan($plugin_config, $vnetid);
+    die "unable to get bridge setting\n" if !$bridge;
+
+    PVE::Network::tap_create($iface, $bridge);
+}
+
+sub veth_create {
+    my ($class, $plugin_config, $vnet, $veth, $vethpeer, $vnetid, $hwaddr) = @_;
+
+    my ($bridge, undef) = $class->get_bridge_vlan($plugin_config, $vnetid);
+    die "unable to get bridge setting\n" if !$bridge;
+
+    PVE::Network::veth_create($veth, $vethpeer, $bridge, $hwaddr);
+}
+
+sub tap_plug {
+    my ($class, $plugin_config, $vnet, $iface, $vnetid, $firewall, $rate) = @_;
+
+    my $tag = $vnet->{tag};
+
+    ($vnetid, $tag) = $class->get_bridge_vlan($plugin_config, $vnetid, $tag);
+    my $trunks = undef;
+
+    PVE::Network::tap_plug($iface, $vnetid, $tag, $firewall, $trunks, $rate);
+}
+
 #helper
 
 sub get_uplink_iface {
index 0557499fe8f186886b328cbd349f9349f2d67e8f..3f0697f780344def362254a6e0814070de0d87de 100644 (file)
@@ -83,7 +83,7 @@ sub status {
 }
 
 sub get_bridge_vlan {
-    my ($class, $plugin_config, $zoneid, $vnetid, $tag) = @_;
+    my ($class, $plugin_config, $vnetid, $tag) = @_;
 
     my $bridge = $plugin_config->{bridge};
     die "bridge $bridge is missing" if !-d "/sys/class/net/$bridge/";
index bc13e6735dea56689fa4b44cc7e5339b41d6af79..28d6a00c035bcd08053df001d83745b993f0a425 100644 (file)
@@ -62,9 +62,10 @@ sub status {
 }
 
 sub get_bridge_vlan {
-    my ($class, $plugin_config, $zoneid, $vnetid, $tag) = @_;
+    my ($class, $plugin_config, $vnetid, $tag) = @_;
 
     my $bridge = $plugin_config->{bridge};
+
     die "bridge $bridge is missing" if !-d "/sys/class/net/$bridge/";
 
     my $vlan_aware = PVE::Tools::file_read_firstline("/sys/class/net/$bridge/bridge/vlan_filtering");