Inotify : add vxlan interface support
authorAlexandre Derumier <aderumier@odiso.com>
Thu, 5 Jul 2018 00:56:30 +0000 (02:56 +0200)
committerWolfgang Bumiller <w.bumiller@proxmox.com>
Tue, 10 Jul 2018 09:38:54 +0000 (11:38 +0200)
src/PVE/INotify.pm
test/etc_network_interfaces/t.create_network.pl

index 0b9ea4a..dbc9868 100644 (file)
@@ -914,6 +914,11 @@ sub __read_etc_network_interfaces {
                            }
                        }
                        $d->{$id} = $value;
+                   } elsif ($id eq 'vxlan-id' || $id eq 'vxlan-svcnodeip' || 
+                            $id eq 'vxlan-physdev' || $id eq 'vxlan-local-tunnelip') {
+                       $d->{$id} = $value;
+                   } elsif ($id eq 'vxlan-remoteip') {
+                       push @{$d->{$id}}, $value;
                    } else {
                        push @{$f->{options}}, $option;
                    }
@@ -1010,7 +1015,9 @@ sub __read_etc_network_interfaces {
        } elsif ($iface =~ m/^lo$/) {
            $d->{type} = 'loopback';
        } else {
-           if (!$d->{ovs_type}) {
+           if ($d->{'vxlan-id'}) {
+               $d->{type} = 'vxlan';
+           } elsif (!$d->{ovs_type}) {
                $d->{type} = 'unknown';
            } elsif ($d->{ovs_type} eq 'OVSIntPort') {
                $d->{type} = $d->{ovs_type};
@@ -1118,6 +1125,19 @@ sub __interface_to_string {
            $raw .= "\tbond-xmit-hash-policy $d->{'bond_xmit_hash_policy'}\n";
        }
        $done->{'bond_xmit_hash_policy'} = 1;
+    } elsif ($d->{type} eq 'vxlan') {
+
+        foreach my $k (qw(vxlan-id vxlan-svcnodeip vxlan-physdev vxlan-local-tunnelip)) {
+            $raw .= "\t$k $d->{$k}\n" if $d->{$k};
+           $done->{$k} = 1;
+        }
+
+       if ($d->{'vxlan-remoteip'}) {
+           foreach my $remoteip (@{$d->{'vxlan-remoteip'}}) {
+               $raw .= "\tvxlan-remoteip $remoteip\n";
+           }
+           $done->{'vxlan-remoteip'} = 1;
+       }
 
     } elsif ($d->{type} eq 'OVSBridge') {
 
@@ -1290,6 +1310,30 @@ sub __write_etc_network_interfaces {
        }
     }
 
+    # check vxlan
+    my $vxlans = {};
+    foreach my $iface (keys %$ifaces) {
+       my $d = $ifaces->{$iface};
+
+       if ($d->{type} eq 'vxlan' && $d->{'vxlan-id'}) {
+           my $vxlanid = $d->{'vxlan-id'};
+           die "iface $iface : duplicate vxlan-id $vxlanid already used in $vxlans->{$vxlanid}\n" if $vxlans->{$vxlanid};
+           $vxlans->{$vxlanid} = $iface;
+       }
+
+       my $ips = 0;
+       ++$ips if defined $d->{'vxlan-svcnodeip'};
+       ++$ips if defined $d->{'vxlan-remoteip'};
+       ++$ips if defined $d->{'vxlan-local-tunnelip'};
+       if ($ips > 1) {
+            die "ifac $iface : vxlan-svcnodeip, vxlan-remoteip and vxlan-localtunnelip are mutually exclusive\n";
+       }
+
+       if (defined($d->{'vxlan-svcnodeip'}) != defined($d->{'vxlan-physdev'})) {
+           die "iface $iface : vxlan-svcnodeip and vxlan-physdev must be define together\n";
+       }
+    }
+
     my $raw = <<'NETWORKDOC';
 # network interface settings; autogenerated
 # Please do NOT modify this file directly, unless you know what
@@ -1311,6 +1355,7 @@ NETWORKDOC
        eth => 200000,
        bond => 300000,
        bridge => 400000,
+       vxlan => 500000,
    };
 
     my $lookup_type_prio = sub {
index e4f15ac..edc15fd 100644 (file)
@@ -8,6 +8,11 @@ r(load('brbase'));
 my $ip = '192.168.0.2';
 my $nm = '255.255.255.0';
 my $gw = '192.168.0.1';
+my $svcnodeip = '239.192.105.237';
+my $physdev = 'eth0';
+my $remoteip1 = '192.168.0.3';
+my $remoteip2 = '192.168.0.4';
+
 
 $config->{ifaces}->{eth1} = {
     type => 'eth',
@@ -19,6 +24,35 @@ $config->{ifaces}->{eth1} = {
     autostart => 1
 };
 
+$config->{ifaces}->{vxlan1} = {
+    type => 'vxlan',
+    method => 'manual',
+    families => ['inet'],
+    'vxlan-id' => 1,
+    'vxlan-svcnodeip' => $svcnodeip,
+    'vxlan-physdev' => $physdev,
+    autostart => 1
+};
+
+$config->{ifaces}->{vxlan2} = {
+    type => 'vxlan',
+    method => 'manual',
+    families => ['inet'],
+    'vxlan-id' => 2,
+    'vxlan-local-tunnelip' => $ip,
+    autostart => 1
+};
+
+$config->{ifaces}->{vxlan3} = {
+    type => 'vxlan',
+    method => 'manual',
+    families => ['inet'],
+    'vxlan-id' => 3,
+    'vxlan-remoteip' => [$remoteip1, $remoteip2],
+    autostart => 1
+};
+
+
 expect load('loopback') . <<"CHECK";
 source-directory interfaces.d
 
@@ -39,6 +73,23 @@ iface vmbr0 inet static
        bridge-stp off
        bridge-fd 0
 
+auto vxlan1
+iface vxlan1 inet manual
+       vxlan-id 1
+       vxlan-svcnodeip $svcnodeip
+       vxlan-physdev $physdev
+
+auto vxlan2
+iface vxlan2 inet manual
+       vxlan-id 2
+       vxlan-local-tunnelip $ip
+
+auto vxlan3
+iface vxlan3 inet manual
+       vxlan-id 3
+       vxlan-remoteip $remoteip1
+       vxlan-remoteip $remoteip2
+
 CHECK
 
 save('if', w());