]> git.proxmox.com Git - pve-manager.git/commitdiff
api: network reload: more granular OVS change check
authorThomas Lamprecht <t.lamprecht@proxmox.com>
Tue, 26 Nov 2019 10:43:39 +0000 (11:43 +0100)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Tue, 26 Nov 2019 10:43:43 +0000 (11:43 +0100)
Just because OVS is installed it doesn't mean that OVS interface
(changes) are configured - so check for that.

Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
PVE/API2/Network.pm

index fa605ba78cc84c531859701009e8b95f72a64634..60178c8637f0f6b3e87f83fae2d9e235854fb8f1 100644 (file)
@@ -554,7 +554,25 @@ __PACKAGE__->register_method({
        my $new_config_file = "/etc/network/interfaces.new";
 
        die "you need ifupdown2 to reload networking\n" if !-e '/usr/share/ifupdown2';
-       die "ifupdown2 reload is not compatible if openvswitch currently" if -x '/usr/bin/ovs-vsctl';
+
+       if (-x '/usr/bin/ovs-vsctl') {
+           my $ovs_configured = sub {
+               my $ifaces = shift;
+               my @ovstypes = grep { $_->{type} =~ /^ovs\S+/i } values %$ifaces;
+               return scalar(@ovstypes) > 0;
+           };
+           my $tmp = PVE::INotify::read_file('interfaces', 1);
+           my $ifaces = $tmp->{data}->{ifaces};
+           my $changes = $tmp->{changes};
+
+           if ($ovs_configured->($ifaces)) {
+               die "There are OpenVSwitch configured interfaces, but ifupdown2 ".
+                   " reload is not compatible with openvswitch currently\n";
+           } elsif ($changes && $changes =~ /^\s*(?:[+-])?\s*(ovs_type|allow-ovs)/mi) {
+               die "Changes include OpenVSwitch interfaces, but ifupdown2 ".
+                   "reload is not compatible with openvswitch currently\n";
+           }
+       }
 
        my $worker = sub {