]> git.proxmox.com Git - pve-network.git/blobdiff - PVE/Network/SDN/Zones.pm
zones : tap_plug: add support for disable bridge learning
[pve-network.git] / PVE / Network / SDN / Zones.pm
index 1f225dc03e8d827b8d34578698fa4e1d8e6c6a86..32586e7f778268218e944a374285c8865ed3ed00 100644 (file)
@@ -3,7 +3,6 @@ package PVE::Network::SDN::Zones;
 use strict;
 use warnings;
 
-use Data::Dumper;
 use JSON;
 
 use PVE::Tools qw(extract_param dir_glob_regex run_command);
@@ -67,7 +66,7 @@ sub sdn_zones_ids {
 sub complete_sdn_zone {
     my ($cmdname, $pname, $cvalue) = @_;
 
-    my $cfg = PVE::Network::SDN::config();
+    my $cfg = PVE::Network::SDN::running_config();
 
     return  $cmdname eq 'add' ? [] : [ PVE::Network::SDN::sdn_zones_ids($cfg) ];
 }
@@ -77,7 +76,7 @@ sub get_zone {
 
     my $cfg = {};
     if($running) {
-        my $cfg = PVE::Network::SDN::config();
+        my $cfg = PVE::Network::SDN::running_config();
         $cfg = $cfg->{vnets};
     } else {
         $cfg = PVE::Network::SDN::Zones::config();
@@ -91,7 +90,7 @@ sub get_zone {
 
 sub generate_etc_network_config {
 
-    my $cfg = PVE::Network::SDN::config();
+    my $cfg = PVE::Network::SDN::running_config();
 
     my $version = $cfg->{version};
     my $vnet_cfg = $cfg->{vnets};
@@ -131,7 +130,7 @@ sub generate_etc_network_config {
 
        my $plugin = PVE::Network::SDN::Zones::Plugin->lookup($plugin_config->{type});
        eval {
-           $plugin->generate_sdn_config($plugin_config, $zone, $id, $vnet, $controller, $subnet_cfg, $interfaces_config, $config);
+           $plugin->generate_sdn_config($plugin_config, $zone, $id, $vnet, $controller, $controller_cfg, $subnet_cfg, $interfaces_config, $config);
        };
        if (my $err = $@) {
            warn "zone $zone : vnet $id : $err\n";
@@ -205,7 +204,7 @@ sub status {
     my $err_config = undef;
 
     my $local_version = PVE::Network::SDN::Zones::read_etc_network_config_version();
-    my $cfg = PVE::Network::SDN::config();
+    my $cfg = PVE::Network::SDN::running_config();
     my $sdn_version = $cfg->{version};
 
     return if !$sdn_version;
@@ -228,7 +227,6 @@ sub status {
 
     my $status = ifquery_check();
 
-    
     my $vnet_cfg = $cfg->{vnets};
     my $zone_cfg = $cfg->{zones};
     my $nodename = PVE::INotify::nodename();
@@ -237,15 +235,23 @@ sub status {
     my $zone_status = {};
 
     for my $id (sort keys %{$zone_cfg->{ids}}) {
+       next if defined($zone_cfg->{ids}->{$id}->{nodes}) && !$zone_cfg->{ids}->{$id}->{nodes}->{$nodename};
        $zone_status->{$id}->{status} = $err_config ? 'pending' : 'available';
     }
 
     foreach my $id (sort keys %{$vnet_cfg->{ids}}) {
        my $vnet = $vnet_cfg->{ids}->{$id};
        my $zone = $vnet->{zone};
-       next if !$zone;
+       next if !defined($zone);
 
        my $plugin_config = $zone_cfg->{ids}->{$zone};
+
+       if (!defined($plugin_config)) {
+           $vnet_status->{$id}->{status} = 'error';
+           $vnet_status->{$id}->{statusmsg} = "unknown zone '$zone' configured";
+           next;
+       }
+
        next if defined($plugin_config->{nodes}) && !$plugin_config->{nodes}->{$nodename};
 
        $vnet_status->{$id}->{zone} = $zone;
@@ -302,7 +308,9 @@ sub tap_plug {
 
     my $vnet = PVE::Network::SDN::Vnets::get_vnet($bridge, 1);
     if (!$vnet) { # fallback for classic bridge
-       PVE::Network::tap_plug($iface, $bridge, $tag, $firewall, $trunks, $rate);
+       my $interfaces_config = PVE::INotify::read_file('interfaces');
+       my $disablelearning = 1 if $interfaces_config->{ifaces}->{$bridge} && $interfaces_config->{ifaces}->{$bridge}->{'bridge-disable-mac-learning'};
+       PVE::Network::tap_plug($iface, $bridge, $tag, $firewall, $trunks, $rate, $disablelearning);
        return;
     }