]> git.proxmox.com Git - pve-network.git/commitdiff
zones: vxlan : remove uplink-id and multicast
authorAlexandre Derumier <aderumier@odiso.com>
Thu, 28 Nov 2019 08:40:25 +0000 (09:40 +0100)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Thu, 28 Nov 2019 13:15:25 +0000 (14:15 +0100)
only unicast for now, as multicast is not too much used currently.

remove uplink-id like for evpn

Signed-off-by: Alexandre Derumier <aderumier@odiso.com>
PVE/Network/SDN/Zones.pm
PVE/Network/SDN/Zones/EvpnPlugin.pm
PVE/Network/SDN/Zones/Plugin.pm
PVE/Network/SDN/Zones/QinQPlugin.pm
PVE/Network/SDN/Zones/VlanPlugin.pm
PVE/Network/SDN/Zones/VxlanPlugin.pm
test/documentation.txt

index 022d061890ca06af96308a73a873db91d0fe80be..e70721350ae90e46dc8fdecc96f0e6f4b8f1aa95 100644 (file)
@@ -79,22 +79,7 @@ sub generate_etc_network_config {
     my $controller_cfg = PVE::Cluster::cfs_read_file('sdn/controllers.cfg');
     return if !$vnet_cfg && !$zone_cfg;
 
-    #read main config for physical interfaces
-    my $current_config_file = "/etc/network/interfaces";
-    my $fh = IO::File->new($current_config_file);
-    my $interfaces_config = PVE::INotify::read_etc_network_interfaces(1,$fh);
-    $fh->close();
-
-    #check uplinks
-    my $uplinks = {};
-    foreach my $id (keys %{$interfaces_config->{ifaces}}) {
-       my $interface = $interfaces_config->{ifaces}->{$id};
-       if (my $uplink = $interface->{'uplink-id'}) {
-           die "uplink-id $uplink is already defined on $uplinks->{$uplink}" if $uplinks->{$uplink};
-           $interface->{name} = $id;
-           $uplinks->{$interface->{'uplink-id'}} = $interface;
-       }
-    }
+    my $interfaces_config = PVE::INotify::read_file('interfaces');
 
     #generate configuration
     my $config = {};
@@ -125,7 +110,7 @@ sub generate_etc_network_config {
        }
 
        my $plugin = PVE::Network::SDN::Zones::Plugin->lookup($plugin_config->{type});
-       $plugin->generate_sdn_config($plugin_config, $zone, $id, $vnet, $uplinks, $controller, $config);
+       $plugin->generate_sdn_config($plugin_config, $zone, $id, $vnet, $controller, $interfaces_config, $config);
     }
 
     my $raw_network_config = "";
index c80408a7426f1876251c1302bebb8b3884056fbd..25c82c79b2330ba5c12bac31ad74d5b2190561a1 100644 (file)
@@ -37,7 +37,7 @@ sub options {
 
 # Plugin implementation
 sub generate_sdn_config {
-    my ($class, $plugin_config, $zoneid, $vnetid, $vnet, $uplinks, $controller, $config) = @_;
+    my ($class, $plugin_config, $zoneid, $vnetid, $vnet, $controller, $interfaces_config, $config) = @_;
 
     my $tag = $vnet->{tag};
     my $alias = $vnet->{alias};
@@ -54,7 +54,7 @@ sub generate_sdn_config {
     my ($ifaceip, $iface) = PVE::Network::SDN::Controllers::EvpnPlugin::find_local_ip_interface(\@peers);
 
     my $mtu = 1450;
-    $mtu = $uplinks->{$iface}->{mtu} - 50 if $uplinks->{$iface}->{mtu};
+    $mtu = $interfaces_config->{$iface}->{mtu} - 50 if $interfaces_config->{$iface}->{mtu};
     $mtu = $vnet->{mtu} if $vnet->{mtu};
 
     #vxlan interface
index 7dd66e25a2d39f5a289a80dd8acd0ea75bdbf6b3..4d0732e31a7589547fd7af485f34d2eff7a8887b 100644 (file)
@@ -96,7 +96,7 @@ sub parse_section_header {
 }
 
 sub generate_sdn_config {
-    my ($class, $plugin_config, $zoneid, $vnetid, $vnet, $uplinks, $controller, $config) = @_;
+    my ($class, $plugin_config, $zoneid, $vnetid, $vnet, $controller, $interfaces_config, $config) = @_;
 
     die "please implement inside plugin";
 }
@@ -179,26 +179,4 @@ sub parse_tag_number_or_range {
     return (scalar(@elements) > 1);
 }
 
-#to be move to Network.pm helper
-sub get_first_local_ipv4_from_interface {
-    my ($interface) = @_;
-
-    my $cmd = ['/sbin/ip', 'address', 'show', 'dev', $interface];
-
-    my $IP = "";
-
-    my $code = sub {
-       my $line = shift;
-
-       if ($line =~ m!^\s*inet\s+($PVE::Tools::IPRE)(?:/\d+|\s+peer\s+)!) {
-           $IP = $1;
-           return;
-       }
-    };
-
-    PVE::Tools::run_command($cmd, outfunc => $code);
-
-    return $IP;
-}
-
 1;
index 42b0decb86d5e9aa56a1f7c607f7ad57c134f005..63f4528f5bb47f39fa28034020d085d9a9b20678 100644 (file)
@@ -38,7 +38,7 @@ sub options {
 
 # Plugin implementation
 sub generate_sdn_config {
-    my ($class, $plugin_config, $zoneid, $vnetid, $vnet, $uplinks, $controller, $config) = @_;
+    my ($class, $plugin_config, $zoneid, $vnetid, $vnet, $controller, $interfaces_config, $config) = @_;
 
     my $tag = $vnet->{tag};
     my $zone_tag = $plugin_config->{tag};
@@ -50,6 +50,17 @@ sub generate_sdn_config {
     die "missing vlan tag" if !$tag;
     die "missing zone vlan tag" if !$zone_tag;
 
+    #check uplinks
+    my $uplinks = {};
+    foreach my $id (keys %{$interfaces_config->{ifaces}}) {
+       my $interface = $interfaces_config->{ifaces}->{$id};
+       if (my $uplink = $interface->{'uplink-id'}) {
+           die "uplink-id $uplink is already defined on $uplinks->{$uplink}" if $uplinks->{$uplink};
+           $interface->{name} = $id;
+           $uplinks->{$interface->{'uplink-id'}} = $interface;
+       }
+    }
+
     my $iface = $uplinks->{$uplink}->{name};
     $iface = "uplink${uplink}" if !$iface;
     $iface .= ".$zone_tag";
index 8951e9ba2687efb325910a5b83f296cbfac25c6f..adb698f7e3c05ad53c36a0cc788a6f2c531dc924 100644 (file)
@@ -39,7 +39,7 @@ sub options {
 
 # Plugin implementation
 sub generate_sdn_config {
-    my ($class, $plugin_config, $zoneid, $vnetid, $vnet, $uplinks, $controller, $config) = @_;
+    my ($class, $plugin_config, $zoneid, $vnetid, $vnet, $controller, $interfaces_config, $config) = @_;
 
     my $tag = $vnet->{tag};
     my $mtu = $vnet->{mtu};
@@ -48,6 +48,17 @@ sub generate_sdn_config {
 
     die "missing vlan tag" if !$tag;
 
+    #check uplinks
+    my $uplinks = {};
+    foreach my $id (keys %{$interfaces_config->{ifaces}}) {
+       my $interface = $interfaces_config->{ifaces}->{$id};
+       if (my $uplink = $interface->{'uplink-id'}) {
+           die "uplink-id $uplink is already defined on $uplinks->{$uplink}" if $uplinks->{$uplink};
+           $interface->{name} = $id;
+           $uplinks->{$interface->{'uplink-id'}} = $interface;
+        }
+    }
+
     my $iface = $uplinks->{$uplink}->{name};
     $iface = "uplink${uplink}" if !$iface;
     $iface .= ".$tag";
index a95d794ed561503428b978b157802b69aba6dc74..66d8a954709b9952982575df0429f52437d7fd6b 100644 (file)
@@ -5,6 +5,7 @@ use warnings;
 use PVE::Network::SDN::Zones::Plugin;
 use PVE::Tools qw($IPV4RE);
 use PVE::INotify;
+use PVE::Network::SDN::Controllers::EvpnPlugin;
 
 use base('PVE::Network::SDN::Zones::Plugin');
 
@@ -17,39 +18,16 @@ sub pve_verify_sdn_vxlanrange {
    return $vxlanstr;
 }
 
-PVE::JSONSchema::register_format('ipv4-multicast', \&parse_ipv4_multicast);
-sub parse_ipv4_multicast {
-    my ($ipv4, $noerr) = @_;
-
-    if ($ipv4 !~ m/^(?:$IPV4RE)$/) {
-        return undef if $noerr;
-        die "value does not look like a valid multicast IPv4 address\n";
-    }
-
-    if ($ipv4 =~ m/^(\d+)\.\d+.\d+.\d+/) {
-       if($1 < 224 || $1 > 239) {
-           return undef if $noerr;
-           die "value does not look like a valid multicast IPv4 address\n";
-       }
-    }
-
-    return $ipv4;
-}
-
 sub type {
     return 'vxlan';
 }
 
 sub properties {
     return {
-        'multicast-address' => {
-            description => "Multicast address.",
-            type => 'string', format => 'ipv4-multicast'
+        'peers' => {
+            description => "peers address list.",
+            type => 'string', format => 'ip-list'
         },
-       'unicast-address' => {
-           description => "Unicast peers address ip list.",
-           type => 'string',  format => 'ip-list'
-       },
     };
 }
 
@@ -57,15 +35,13 @@ sub options {
 
     return {
         nodes => { optional => 1},
-       'uplink-id' => { optional => 0 },
-        'multicast-address' => { optional => 1 },
-        'unicast-address' => { optional => 1 },
+        peers => { optional => 0 },
     };
 }
 
 # Plugin implementation
 sub generate_sdn_config {
-    my ($class, $plugin_config, $zoneid, $vnetid, $vnet, $uplinks, $controller, $config) = @_;
+    my ($class, $plugin_config, $zoneid, $vnetid, $vnet, $controller, $interfaces_config, $config) = @_;
 
     my $tag = $vnet->{tag};
     my $alias = $vnet->{alias};
@@ -73,36 +49,23 @@ sub generate_sdn_config {
     my $ipv6 = $vnet->{ipv6};
     my $mac = $vnet->{mac};
     my $multicastaddress = $plugin_config->{'multicast-address'};
-    my @unicastaddress = split(',', $plugin_config->{'unicast-address'}) if $plugin_config->{'unicast-address'};
-
-    my $uplink = $plugin_config->{'uplink-id'};
+    my @peers = split(',', $plugin_config->{'peers'}) if $plugin_config->{'peers'};
 
     die "missing vxlan tag" if !$tag;
-    my $iface = "uplink$uplink";
-    my $ifaceip = "";
 
-    if($uplinks->{$uplink}->{name}) {
-       $iface = $uplinks->{$uplink}->{name};
-       $ifaceip = PVE::Network::SDN::Zones::Plugin::get_first_local_ipv4_from_interface($iface);
-    }
+    my ($ifaceip, $iface) = PVE::Network::SDN::Controllers::EvpnPlugin::find_local_ip_interface(\@peers);
 
     my $mtu = 1450;
-    $mtu = $uplinks->{$uplink}->{mtu} - 50 if $uplinks->{$uplink}->{mtu};
+    $mtu = $interfaces_config->{$iface}->{mtu} - 50 if $interfaces_config->{$iface}->{mtu};
     $mtu = $vnet->{mtu} if $vnet->{mtu};
 
     #vxlan interface
     my @iface_config = ();
     push @iface_config, "vxlan-id $tag";
 
-    if($multicastaddress) {
-       push @iface_config, "vxlan-svcnodeip $multicastaddress";
-       push @iface_config, "vxlan-physdev $iface";
-    } elsif (@unicastaddress) {
-
-       foreach my $address (@unicastaddress) {
-           next if $address eq $ifaceip;
-           push @iface_config, "vxlan_remoteip $address";
-       }
+    foreach my $address (@peers) {
+       next if $address eq $ifaceip;
+       push @iface_config, "vxlan_remoteip $address";
     }
 
     push @iface_config, "mtu $mtu" if $mtu;
index 575027b36d1b9af0948787afe5eade35c72bd7b3..a091dc4b03781c7c5753af4ec301217094b0b286 100644 (file)
@@ -5,11 +5,8 @@ Here a sample of command with pvesh to manage the sdn.
 pvesh create /cluster/sdn/zones/ --zone vlanzone --type vlan --uplink-id 1
 
 
-#create a layer2 vxlan multicast transportzone
-pvesh create /cluster/sdn/zones/ --zone vxlanmulticastzone --type vxlan --uplink-id 1 --multicast-address 239.192.114.23
-
 #create a layer2 vxlan unicast transportzone
-pvesh create /cluster/sdn/zones/ --zone vxlanunicastzone --type vxlan --uplink-id 1 --unicast-address 192.168.0.1,192.168.0.2,192.168.0.3
+pvesh create /cluster/sdn/zones/ --zone vxlanunicastzone --type vxlan --peers 192.168.0.1,192.168.0.2,192.168.0.3
 
 #create an controller
 pvesh create /cluster/sdn/controllers/ --controller frrrouter1 --type evpn --peers 192.168.0.1,192.168.0.2,192.168.0.3 --asn 1234 --gateway-nodes pxnode1,pxnode2 --gateway-external-peers 192.168.0.253,192.168.0.254