From ba7ac021b595726fc2cdd5ec8368fcd89a5119e9 Mon Sep 17 00:00:00 2001 From: Alexandre Derumier Date: Thu, 28 Nov 2019 09:40:25 +0100 Subject: [PATCH] zones: vxlan : remove uplink-id and multicast only unicast for now, as multicast is not too much used currently. remove uplink-id like for evpn Signed-off-by: Alexandre Derumier --- PVE/Network/SDN/Zones.pm | 19 +-------- PVE/Network/SDN/Zones/EvpnPlugin.pm | 4 +- PVE/Network/SDN/Zones/Plugin.pm | 24 +---------- PVE/Network/SDN/Zones/QinQPlugin.pm | 13 +++++- PVE/Network/SDN/Zones/VlanPlugin.pm | 13 +++++- PVE/Network/SDN/Zones/VxlanPlugin.pm | 61 ++++++---------------------- test/documentation.txt | 5 +-- 7 files changed, 42 insertions(+), 97 deletions(-) diff --git a/PVE/Network/SDN/Zones.pm b/PVE/Network/SDN/Zones.pm index 022d061..e707213 100644 --- a/PVE/Network/SDN/Zones.pm +++ b/PVE/Network/SDN/Zones.pm @@ -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 = ""; diff --git a/PVE/Network/SDN/Zones/EvpnPlugin.pm b/PVE/Network/SDN/Zones/EvpnPlugin.pm index c80408a..25c82c7 100644 --- a/PVE/Network/SDN/Zones/EvpnPlugin.pm +++ b/PVE/Network/SDN/Zones/EvpnPlugin.pm @@ -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 diff --git a/PVE/Network/SDN/Zones/Plugin.pm b/PVE/Network/SDN/Zones/Plugin.pm index 7dd66e2..4d0732e 100644 --- a/PVE/Network/SDN/Zones/Plugin.pm +++ b/PVE/Network/SDN/Zones/Plugin.pm @@ -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; diff --git a/PVE/Network/SDN/Zones/QinQPlugin.pm b/PVE/Network/SDN/Zones/QinQPlugin.pm index 42b0dec..63f4528 100644 --- a/PVE/Network/SDN/Zones/QinQPlugin.pm +++ b/PVE/Network/SDN/Zones/QinQPlugin.pm @@ -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"; diff --git a/PVE/Network/SDN/Zones/VlanPlugin.pm b/PVE/Network/SDN/Zones/VlanPlugin.pm index 8951e9b..adb698f 100644 --- a/PVE/Network/SDN/Zones/VlanPlugin.pm +++ b/PVE/Network/SDN/Zones/VlanPlugin.pm @@ -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"; diff --git a/PVE/Network/SDN/Zones/VxlanPlugin.pm b/PVE/Network/SDN/Zones/VxlanPlugin.pm index a95d794..66d8a95 100644 --- a/PVE/Network/SDN/Zones/VxlanPlugin.pm +++ b/PVE/Network/SDN/Zones/VxlanPlugin.pm @@ -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; diff --git a/test/documentation.txt b/test/documentation.txt index 575027b..a091dc4 100644 --- a/test/documentation.txt +++ b/test/documentation.txt @@ -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 -- 2.39.2