From 95aa8788b8463e549d26d9eb301dfbba75b49da3 Mon Sep 17 00:00:00 2001 From: Alexandre Derumier Date: Thu, 5 Jul 2018 02:56:30 +0200 Subject: [PATCH] Inotify : add vxlan interface support --- src/PVE/INotify.pm | 47 ++++++++++++++++- .../t.create_network.pl | 51 +++++++++++++++++++ 2 files changed, 97 insertions(+), 1 deletion(-) diff --git a/src/PVE/INotify.pm b/src/PVE/INotify.pm index 0b9ea4a..dbc9868 100644 --- a/src/PVE/INotify.pm +++ b/src/PVE/INotify.pm @@ -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 { diff --git a/test/etc_network_interfaces/t.create_network.pl b/test/etc_network_interfaces/t.create_network.pl index e4f15ac..edc15fd 100644 --- a/test/etc_network_interfaces/t.create_network.pl +++ b/test/etc_network_interfaces/t.create_network.pl @@ -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()); -- 2.39.2