From 4ac94c72a2d9f127b9ce90b2ecfaf55a656b76e0 Mon Sep 17 00:00:00 2001 From: Alexandre Derumier Date: Fri, 20 Sep 2019 08:45:05 +0200 Subject: [PATCH] network_interfaces: use allow-ovs for OVSBridge new openvswitch-switch service use "ifup --allow-ovs", and this race with "auto ..." used by networking service bug reported here: https://forum.proxmox.com/threads/so-is-openvswitch-bonding-just-broken-on-pve-6-whats-going-on.58020/ This is also fixing ovs with ifupdown2 Openvswitch github have a note about this: https://github.com/openvswitch/ovs/commit/e0dfd67b456c8ea36cc2e2f23039a300dbbedfed#diff-555e6da95251766b76e83867900bd8fe Signed-off-by: Alexandre Derumier --- src/PVE/INotify.pm | 20 ++++++++++--------- .../t.list-interfaces.pl | 2 +- .../t.ovs_bridge_allow.pl | 6 +++--- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/PVE/INotify.pm b/src/PVE/INotify.pm index 6a7f110..b3e5ab0 100644 --- a/src/PVE/INotify.pm +++ b/src/PVE/INotify.pm @@ -1142,7 +1142,9 @@ sub __read_etc_network_interfaces { # from the {options} hash for them to be removed correctly. @$options = grep {defined($_)} map { my ($pri, $line) = @$_; - if ($line =~ /^allow-(\S+)\s+(.*)$/) { + if ($line =~ /^allow-ovs\s+(.*)$/) { + undef; + } elsif ($line =~ /^allow-(\S+)\s+(.*)$/) { my $bridge = $1; my @ports = split(/\s+/, $2); if (defined(my $br = $ifaces->{$bridge})) { @@ -1254,6 +1256,7 @@ sub __interface_to_string { $done->{ovs_type} = 1; $raw .= "\tovs_ports $d->{ovs_ports}\n" if $d->{ovs_ports}; + $done->{ovs_ports} = 1; } elsif ($d->{type} eq 'OVSPort' || $d->{type} eq 'OVSIntPort' || $d->{type} eq 'OVSBond') { @@ -1293,12 +1296,7 @@ sub __interface_to_string { if ($d->{ovs_bridge}) { - if ($ifupdown2) { - $raw = "auto $iface\n$raw"; - } else { - $raw = "allow-$d->{ovs_bridge} $iface\n$raw"; - } - + $raw = "allow-$d->{ovs_bridge} $iface\n$raw"; $raw .= "\tovs_bridge $d->{ovs_bridge}\n"; $done->{ovs_bridge} = 1; } @@ -1592,7 +1590,6 @@ NETWORKDOC return $a cmp $b; } keys %$ifaces) { next if $printed->{$iface}; - my $d = $ifaces->{$iface}; my $pri = $d->{priority} // 0; if (@options && $options[0]->[0] < $pri) { @@ -1603,7 +1600,12 @@ NETWORKDOC } $printed->{$iface} = 1; - $raw .= "auto $iface\n" if $d->{autostart}; + if ($d->{type} eq 'OVSBridge') { + $raw .= "allow-ovs $iface\n"; + } elsif ($d->{autostart}) { + $raw .= "auto $iface\n" if $d->{autostart}; + } + my $i = 0; # some options should be printed only once $raw .= __interface_to_string($iface, $d, $_, !$i++, $ifupdown2) foreach @{$d->{families}}; } diff --git a/test/etc_network_interfaces/t.list-interfaces.pl b/test/etc_network_interfaces/t.list-interfaces.pl index 41907ae..7e37afa 100644 --- a/test/etc_network_interfaces/t.list-interfaces.pl +++ b/test/etc_network_interfaces/t.list-interfaces.pl @@ -53,7 +53,7 @@ iface vmbr0 inet6 static source-directory before-ovs.d -auto vmbr1 +allow-ovs vmbr1 iface vmbr1 inet static address $wanted{vmbr1}->{address} netmask $wanted{vmbr1}->{netmask} diff --git a/test/etc_network_interfaces/t.ovs_bridge_allow.pl b/test/etc_network_interfaces/t.ovs_bridge_allow.pl index 6d22243..45fad2e 100644 --- a/test/etc_network_interfaces/t.ovs_bridge_allow.pl +++ b/test/etc_network_interfaces/t.ovs_bridge_allow.pl @@ -39,7 +39,7 @@ iface eth2 inet manual iface eth3 inet manual -auto vmbr0 +allow-ovs vmbr0 iface vmbr0 inet static address $ip netmask $nm @@ -67,7 +67,7 @@ iface eth2 inet manual iface eth3 inet manual -auto vmbr0 +allow-ovs vmbr0 iface vmbr0 inet static address $ip netmask $nm @@ -102,7 +102,7 @@ iface eth3 inet manual iface eth2 inet manual -auto vmbr0 +allow-ovs vmbr0 iface vmbr0 inet static address $ip netmask $nm -- 2.39.2