* [pve-devel] [PATCH-SERIES pve-network/pve-manager/pve-docs] sdn: add isis controller
@ 2023-09-13 11:38 Alexandre Derumier
2023-09-13 11:38 ` [pve-devel] [PATCH pve-network 1/3] controller: evpn: fix find_bgp_controller Alexandre Derumier
` (6 more replies)
0 siblings, 7 replies; 8+ messages in thread
From: Alexandre Derumier @ 2023-09-13 11:38 UTC (permalink / raw)
To: pve-devel
Hi,
This patch serie add support for the isis routing protocol for underlay network,
instead bgp.
This was a request of a proxmox user, the implementation has been tested
https://forum.proxmox.com/threads/integrating-proxmox-sdn-with-existing-sdn-network.131946
pve-network:
Alexandre Derumier (3):
controller: evpn: fix find_bgp_controller
controllers: frr: add parsing of "interfaces" section
controllers: add isis router plugin
src/PVE/Network/SDN/Controllers.pm | 2 +
src/PVE/Network/SDN/Controllers/EvpnPlugin.pm | 57 ++++++--
src/PVE/Network/SDN/Controllers/IsisPlugin.pm | 123 ++++++++++++++++++
src/PVE/Network/SDN/Controllers/Makefile | 2 +-
src/PVE/Network/SDN/Zones/EvpnPlugin.pm | 10 +-
.../evpn/isis/expected_controller_config | 58 +++++++++
.../zones/evpn/isis/expected_sdn_interfaces | 41 ++++++
src/test/zones/evpn/isis/interfaces | 7 +
src/test/zones/evpn/isis/sdn_config | 49 +++++++
.../isis_loopback/expected_controller_config | 59 +++++++++
.../isis_loopback/expected_sdn_interfaces | 41 ++++++
src/test/zones/evpn/isis_loopback/interfaces | 12 ++
src/test/zones/evpn/isis_loopback/sdn_config | 50 +++++++
13 files changed, 499 insertions(+), 12 deletions(-)
create mode 100644 src/PVE/Network/SDN/Controllers/IsisPlugin.pm
create mode 100644 src/test/zones/evpn/isis/expected_controller_config
create mode 100644 src/test/zones/evpn/isis/expected_sdn_interfaces
create mode 100644 src/test/zones/evpn/isis/interfaces
create mode 100644 src/test/zones/evpn/isis/sdn_config
create mode 100644 src/test/zones/evpn/isis_loopback/expected_controller_config
create mode 100644 src/test/zones/evpn/isis_loopback/expected_sdn_interfaces
create mode 100644 src/test/zones/evpn/isis_loopback/interfaces
create mode 100644 src/test/zones/evpn/isis_loopback/sdn_config
pve-manager:
Alexandre Derumier (1):
sdn: controllers: add isis controller
www/manager6/Makefile | 1 +
www/manager6/Utils.js | 5 ++
www/manager6/sdn/controllers/IsisEdit.js | 61 ++++++++++++++++++++++++
3 files changed, 67 insertions(+)
create mode 100644 www/manager6/sdn/controllers/IsisEdit.js
pve-docs:
Alexandre Derumier (2):
sdn: add notes about bgp controller
sdn: add isis controller documentation
pvesdn.adoc | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)
--
2.39.2
^ permalink raw reply [flat|nested] 8+ messages in thread
* [pve-devel] [PATCH pve-network 1/3] controller: evpn: fix find_bgp_controller
2023-09-13 11:38 [pve-devel] [PATCH-SERIES pve-network/pve-manager/pve-docs] sdn: add isis controller Alexandre Derumier
@ 2023-09-13 11:38 ` Alexandre Derumier
2023-09-13 11:38 ` [pve-devel] [PATCH pve-docs 1/2] sdn: add notes about bgp controller Alexandre Derumier
` (5 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Alexandre Derumier @ 2023-09-13 11:38 UTC (permalink / raw)
To: pve-devel
---
src/PVE/Network/SDN/Controllers/EvpnPlugin.pm | 13 ++++++-------
1 file changed, 6 insertions(+), 7 deletions(-)
diff --git a/src/PVE/Network/SDN/Controllers/EvpnPlugin.pm b/src/PVE/Network/SDN/Controllers/EvpnPlugin.pm
index 6da9c40..fd4b801 100644
--- a/src/PVE/Network/SDN/Controllers/EvpnPlugin.pm
+++ b/src/PVE/Network/SDN/Controllers/EvpnPlugin.pm
@@ -295,18 +295,17 @@ sub on_update_hook {
sub find_bgp_controller {
my ($nodename, $controller_cfg) = @_;
- my $controller = undef;
+ my $res = undef;
foreach my $id (keys %{$controller_cfg->{ids}}) {
- $controller = $controller_cfg->{ids}->{$id};
- next if $controller->{type} ne 'bgp';
- next if $controller->{node} ne $nodename;
+ my $controller = $controller_cfg->{ids}->{$id};
+ next if $controller->{type} ne 'bgp';
+ next if $controller->{node} ne $nodename;
+ $res = $controller;
last;
}
-
- return $controller;
+ return $res;
}
-
sub generate_frr_recurse{
my ($final_config, $content, $parentkey, $level) = @_;
--
2.39.2
^ permalink raw reply [flat|nested] 8+ messages in thread
* [pve-devel] [PATCH pve-docs 1/2] sdn: add notes about bgp controller
2023-09-13 11:38 [pve-devel] [PATCH-SERIES pve-network/pve-manager/pve-docs] sdn: add isis controller Alexandre Derumier
2023-09-13 11:38 ` [pve-devel] [PATCH pve-network 1/3] controller: evpn: fix find_bgp_controller Alexandre Derumier
@ 2023-09-13 11:38 ` Alexandre Derumier
2023-09-13 11:38 ` [pve-devel] [PATCH pve-manager 1/1] sdn: controllers: add isis controller Alexandre Derumier
` (4 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Alexandre Derumier @ 2023-09-13 11:38 UTC (permalink / raw)
To: pve-devel
---
pvesdn.adoc | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/pvesdn.adoc b/pvesdn.adoc
index 8b1fe33..4ac0911 100644
--- a/pvesdn.adoc
+++ b/pvesdn.adoc
@@ -353,6 +353,10 @@ The BGP controller is not used directly by a zone.
You can use it to configure FRR to manage BGP peers.
For BGP-EVPN, it can be used to define a different ASN by node, so doing EBGP.
+It can also be used to export evpn routes to a external bgp peer.
+
+NOTE: By default, for a simple full mesh evpn, you don't need to define any extra
+BGP Controller.
Configuration options:
--
2.39.2
^ permalink raw reply [flat|nested] 8+ messages in thread
* [pve-devel] [PATCH pve-manager 1/1] sdn: controllers: add isis controller
2023-09-13 11:38 [pve-devel] [PATCH-SERIES pve-network/pve-manager/pve-docs] sdn: add isis controller Alexandre Derumier
2023-09-13 11:38 ` [pve-devel] [PATCH pve-network 1/3] controller: evpn: fix find_bgp_controller Alexandre Derumier
2023-09-13 11:38 ` [pve-devel] [PATCH pve-docs 1/2] sdn: add notes about bgp controller Alexandre Derumier
@ 2023-09-13 11:38 ` Alexandre Derumier
2023-09-13 11:38 ` [pve-devel] [PATCH pve-network 2/3] controllers: frr: add parsing of "interfaces" section Alexandre Derumier
` (3 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Alexandre Derumier @ 2023-09-13 11:38 UTC (permalink / raw)
To: pve-devel
---
www/manager6/Makefile | 1 +
www/manager6/Utils.js | 5 ++
www/manager6/sdn/controllers/IsisEdit.js | 61 ++++++++++++++++++++++++
3 files changed, 67 insertions(+)
create mode 100644 www/manager6/sdn/controllers/IsisEdit.js
diff --git a/www/manager6/Makefile b/www/manager6/Makefile
index 59a5d8a7..6d6d8b1e 100644
--- a/www/manager6/Makefile
+++ b/www/manager6/Makefile
@@ -277,6 +277,7 @@ JSSRC= \
sdn/controllers/Base.js \
sdn/controllers/EvpnEdit.js \
sdn/controllers/BgpEdit.js \
+ sdn/controllers/IsisEdit.js \
sdn/IpamView.js \
sdn/ipams/Base.js \
sdn/ipams/NetboxEdit.js \
diff --git a/www/manager6/Utils.js b/www/manager6/Utils.js
index 6d4842df..77c5f91c 100644
--- a/www/manager6/Utils.js
+++ b/www/manager6/Utils.js
@@ -895,6 +895,11 @@ Ext.define('PVE.Utils', {
ipanel: 'BgpInputPanel',
faIcon: 'crosshairs',
},
+ isis: {
+ name: 'isis',
+ ipanel: 'IsisInputPanel',
+ faIcon: 'crosshairs',
+ },
},
sdnipamSchema: {
diff --git a/www/manager6/sdn/controllers/IsisEdit.js b/www/manager6/sdn/controllers/IsisEdit.js
new file mode 100644
index 00000000..2e333fa5
--- /dev/null
+++ b/www/manager6/sdn/controllers/IsisEdit.js
@@ -0,0 +1,61 @@
+Ext.define('PVE.sdn.controllers.IsisInputPanel', {
+ extend: 'PVE.panel.SDNControllerBase',
+
+ onlineHelp: 'pvesdn_controller_plugin_evpn',
+
+ onGetValues: function(values) {
+ var me = this;
+
+ if (me.isCreate) {
+ values.type = me.type;
+ values.controller = 'isis' + values.node;
+ } else {
+ delete values.controller;
+ }
+
+ return values;
+ },
+
+ initComponent: function() {
+ var me = this;
+
+ me.items = [
+ {
+ xtype: 'pveNodeSelector',
+ name: 'node',
+ fieldLabel: gettext('Node'),
+ multiSelect: false,
+ autoSelect: false,
+ allowBlank: false,
+ },
+ {
+ xtype: 'textfield',
+ name: 'isis-domain',
+ fieldLabel: 'Domain',
+ allowBlank: false,
+ },
+ {
+ xtype: 'textfield',
+ name: 'isis-net',
+ fieldLabel: 'Network entity title',
+ allowBlank: false,
+ },
+ {
+ xtype: 'textfield',
+ name: 'isis-ifaces',
+ fieldLabel: gettext('Interfaces'),
+ allowBlank: false,
+ },
+ ];
+
+ me.advancedItems = [
+ {
+ xtype: 'textfield',
+ name: 'loopback',
+ fieldLabel: gettext('Loopback Interface'),
+ },
+ ];
+
+ me.callParent();
+ },
+});
--
2.39.2
^ permalink raw reply [flat|nested] 8+ messages in thread
* [pve-devel] [PATCH pve-network 2/3] controllers: frr: add parsing of "interfaces" section
2023-09-13 11:38 [pve-devel] [PATCH-SERIES pve-network/pve-manager/pve-docs] sdn: add isis controller Alexandre Derumier
` (2 preceding siblings ...)
2023-09-13 11:38 ` [pve-devel] [PATCH pve-manager 1/1] sdn: controllers: add isis controller Alexandre Derumier
@ 2023-09-13 11:38 ` Alexandre Derumier
2023-09-13 11:38 ` [pve-devel] [PATCH pve-docs 2/2] sdn: add isis controller documentation Alexandre Derumier
` (2 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Alexandre Derumier @ 2023-09-13 11:38 UTC (permalink / raw)
To: pve-devel
---
src/PVE/Network/SDN/Controllers/EvpnPlugin.pm | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/src/PVE/Network/SDN/Controllers/EvpnPlugin.pm b/src/PVE/Network/SDN/Controllers/EvpnPlugin.pm
index fd4b801..f1dd20f 100644
--- a/src/PVE/Network/SDN/Controllers/EvpnPlugin.pm
+++ b/src/PVE/Network/SDN/Controllers/EvpnPlugin.pm
@@ -384,6 +384,20 @@ sub generate_frr_ip_protocol {
foreach my $rule (sort @$ips) {
push @{$final_config}, $rule;
}
+
+}
+
+sub generate_frr_interfaces {
+ my ($final_config, $interfaces) = @_;
+
+ foreach my $k (sort keys %$interfaces) {
+ my $iface = $interfaces->{$k};
+ push @{$final_config}, "!";
+ push @{$final_config}, "interface $k";
+ foreach my $rule (sort @$iface) {
+ push @{$final_config}, " $rule";
+ }
+ }
}
sub generate_frr_routemap {
@@ -445,6 +459,7 @@ sub generate_controller_rawconfig {
}
generate_frr_vrf($final_config, $config->{frr}->{vrf});
+ generate_frr_interfaces($final_config, $config->{frr_interfaces});
generate_frr_recurse($final_config, $config->{frr}, undef, 0);
generate_frr_list($final_config, $config->{frr_access_list}, "access-list");
generate_frr_list($final_config, $config->{frr_prefix_list}, "ip prefix-list");
@@ -481,6 +496,9 @@ sub parse_merge_frr_local_config {
} elsif ($line =~ m/^vrf (.+)$/) {
$section = \$config->{'frr'}->{'vrf'}->{$1};
next;
+ } elsif ($line =~ m/^interface (.+)$/) {
+ $section = \$config->{'frr_interfaces'}->{$1};
+ next;
} elsif ($line =~ m/address-family (.+)$/) {
$section = \$config->{'frr'}->{'router'}->{$router}->{'address-family'}->{$1};
next;
--
2.39.2
^ permalink raw reply [flat|nested] 8+ messages in thread
* [pve-devel] [PATCH pve-docs 2/2] sdn: add isis controller documentation
2023-09-13 11:38 [pve-devel] [PATCH-SERIES pve-network/pve-manager/pve-docs] sdn: add isis controller Alexandre Derumier
` (3 preceding siblings ...)
2023-09-13 11:38 ` [pve-devel] [PATCH pve-network 2/3] controllers: frr: add parsing of "interfaces" section Alexandre Derumier
@ 2023-09-13 11:38 ` Alexandre Derumier
2023-09-13 11:38 ` [pve-devel] [PATCH pve-network 3/3] controllers: add isis router plugin Alexandre Derumier
2023-10-25 11:22 ` [pve-devel] applied-series: [PATCH-SERIES pve-network/pve-manager/pve-docs] sdn: add isis controller Fabian Grünbichler
6 siblings, 0 replies; 8+ messages in thread
From: Alexandre Derumier @ 2023-09-13 11:38 UTC (permalink / raw)
To: pve-devel
---
pvesdn.adoc | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)
diff --git a/pvesdn.adoc b/pvesdn.adoc
index 4ac0911..401cc6f 100644
--- a/pvesdn.adoc
+++ b/pvesdn.adoc
@@ -379,6 +379,27 @@ ebgp-mutltihop:: Increase the number of hops to reach peers, in case they are
bgp-multipath-as-path-relax:: Allow ECMP if your peers have different ASN.
+
+[[pvesdn_controller_plugin_ISIS]]
+ISIS Controller
+~~~~~~~~~~~~~~~
+
+The ISIS controller is not used directly by a zone.
+You can use it to configure FRR to export evpn routes to an ISIS domain.
+
+Configuration options:
+
+node:: The node of this ISIS controller.
+
+domain:: A unique ISIS domain.
+
+network entity title:: A Unique ISIS network address that identifies this node.
+
+interfaces:: A list of physical interface(s) used by ISIS.
+
+loopback:: Use a loopback or dummy interface as the source of the EVPN network
+ (for multipath).
+
[[pvesdn_config_ipam]]
IPAMs
-----
--
2.39.2
^ permalink raw reply [flat|nested] 8+ messages in thread
* [pve-devel] [PATCH pve-network 3/3] controllers: add isis router plugin
2023-09-13 11:38 [pve-devel] [PATCH-SERIES pve-network/pve-manager/pve-docs] sdn: add isis controller Alexandre Derumier
` (4 preceding siblings ...)
2023-09-13 11:38 ` [pve-devel] [PATCH pve-docs 2/2] sdn: add isis controller documentation Alexandre Derumier
@ 2023-09-13 11:38 ` Alexandre Derumier
2023-10-25 11:22 ` [pve-devel] applied-series: [PATCH-SERIES pve-network/pve-manager/pve-docs] sdn: add isis controller Fabian Grünbichler
6 siblings, 0 replies; 8+ messages in thread
From: Alexandre Derumier @ 2023-09-13 11:38 UTC (permalink / raw)
To: pve-devel
---
src/PVE/Network/SDN/Controllers.pm | 2 +
src/PVE/Network/SDN/Controllers/EvpnPlugin.pm | 28 +++-
src/PVE/Network/SDN/Controllers/IsisPlugin.pm | 123 ++++++++++++++++++
src/PVE/Network/SDN/Controllers/Makefile | 2 +-
src/PVE/Network/SDN/Zones/EvpnPlugin.pm | 10 +-
.../evpn/isis/expected_controller_config | 58 +++++++++
.../zones/evpn/isis/expected_sdn_interfaces | 41 ++++++
src/test/zones/evpn/isis/interfaces | 7 +
src/test/zones/evpn/isis/sdn_config | 49 +++++++
.../isis_loopback/expected_controller_config | 59 +++++++++
.../isis_loopback/expected_sdn_interfaces | 41 ++++++
src/test/zones/evpn/isis_loopback/interfaces | 12 ++
src/test/zones/evpn/isis_loopback/sdn_config | 50 +++++++
13 files changed, 476 insertions(+), 6 deletions(-)
create mode 100644 src/PVE/Network/SDN/Controllers/IsisPlugin.pm
create mode 100644 src/test/zones/evpn/isis/expected_controller_config
create mode 100644 src/test/zones/evpn/isis/expected_sdn_interfaces
create mode 100644 src/test/zones/evpn/isis/interfaces
create mode 100644 src/test/zones/evpn/isis/sdn_config
create mode 100644 src/test/zones/evpn/isis_loopback/expected_controller_config
create mode 100644 src/test/zones/evpn/isis_loopback/expected_sdn_interfaces
create mode 100644 src/test/zones/evpn/isis_loopback/interfaces
create mode 100644 src/test/zones/evpn/isis_loopback/sdn_config
diff --git a/src/PVE/Network/SDN/Controllers.pm b/src/PVE/Network/SDN/Controllers.pm
index a23048e..f5a6b86 100644
--- a/src/PVE/Network/SDN/Controllers.pm
+++ b/src/PVE/Network/SDN/Controllers.pm
@@ -14,10 +14,12 @@ use PVE::Network::SDN::Zones;
use PVE::Network::SDN::Controllers::EvpnPlugin;
use PVE::Network::SDN::Controllers::BgpPlugin;
+use PVE::Network::SDN::Controllers::IsisPlugin;
use PVE::Network::SDN::Controllers::FaucetPlugin;
use PVE::Network::SDN::Controllers::Plugin;
PVE::Network::SDN::Controllers::EvpnPlugin->register();
PVE::Network::SDN::Controllers::BgpPlugin->register();
+PVE::Network::SDN::Controllers::IsisPlugin->register();
PVE::Network::SDN::Controllers::FaucetPlugin->register();
PVE::Network::SDN::Controllers::Plugin->init();
diff --git a/src/PVE/Network/SDN/Controllers/EvpnPlugin.pm b/src/PVE/Network/SDN/Controllers/EvpnPlugin.pm
index f1dd20f..3ac7d7e 100644
--- a/src/PVE/Network/SDN/Controllers/EvpnPlugin.pm
+++ b/src/PVE/Network/SDN/Controllers/EvpnPlugin.pm
@@ -53,11 +53,15 @@ sub generate_controller_config {
my $loopback = undef;
my $autortas = undef;
my $bgprouter = find_bgp_controller($local_node, $controller_cfg);
+ my $isisrouter = find_isis_controller($local_node, $controller_cfg);
+
if ($bgprouter) {
$ebgp = 1 if $plugin_config->{'asn'} ne $bgprouter->{asn};
$loopback = $bgprouter->{loopback} if $bgprouter->{loopback};
$asn = $bgprouter->{asn} if $bgprouter->{asn};
$autortas = $plugin_config->{'asn'} if $ebgp;
+ } elsif ($isisrouter) {
+ $loopback = $isisrouter->{loopback} if $isisrouter->{loopback};
}
return if !$asn;
@@ -86,10 +90,8 @@ sub generate_controller_config {
push @controller_config, "neighbor VTEP remote-as $remoteas";
push @controller_config, "neighbor VTEP bfd";
- if($ebgp && $loopback) {
- push @controller_config, "neighbor VTEP ebgp-multihop 10";
- push @controller_config, "neighbor VTEP update-source $loopback";
- }
+ push @controller_config, "neighbor VTEP ebgp-multihop 10" if $ebgp && $loopback;
+ push @controller_config, "neighbor VTEP update-source $loopback" if $loopback;
# VTEP peers
foreach my $address (@peers) {
@@ -136,11 +138,15 @@ sub generate_controller_zone_config {
my $loopback = undef;
my $autortas = undef;
my $bgprouter = find_bgp_controller($local_node, $controller_cfg);
+ my $isisrouter = find_isis_controller($local_node, $controller_cfg);
+
if($bgprouter) {
$ebgp = 1 if $controller->{'asn'} ne $bgprouter->{asn};
$loopback = $bgprouter->{loopback} if $bgprouter->{loopback};
$asn = $bgprouter->{asn} if $bgprouter->{asn};
$autortas = $controller->{'asn'} if $ebgp;
+ } elsif ($isisrouter) {
+ $loopback = $isisrouter->{loopback} if $isisrouter->{loopback};
}
return if !$vrf || !$vrfvxlan || !$asn;
@@ -306,6 +312,20 @@ sub find_bgp_controller {
return $res;
}
+sub find_isis_controller {
+ my ($nodename, $controller_cfg) = @_;
+
+ my $res = undef;
+ foreach my $id (keys %{$controller_cfg->{ids}}) {
+ my $controller = $controller_cfg->{ids}->{$id};
+ next if $controller->{type} ne 'isis';
+ next if $controller->{node} ne $nodename;
+ $res = $controller;
+ last;
+ }
+ return $res;
+}
+
sub generate_frr_recurse{
my ($final_config, $content, $parentkey, $level) = @_;
diff --git a/src/PVE/Network/SDN/Controllers/IsisPlugin.pm b/src/PVE/Network/SDN/Controllers/IsisPlugin.pm
new file mode 100644
index 0000000..afea82e
--- /dev/null
+++ b/src/PVE/Network/SDN/Controllers/IsisPlugin.pm
@@ -0,0 +1,123 @@
+package PVE::Network::SDN::Controllers::IsisPlugin;
+
+use strict;
+use warnings;
+
+use PVE::INotify;
+use PVE::JSONSchema qw(get_standard_option);
+use PVE::Tools qw(run_command file_set_contents file_get_contents);
+
+use PVE::Network::SDN::Controllers::Plugin;
+use PVE::Network::SDN::Zones::Plugin;
+use Net::IP;
+
+use base('PVE::Network::SDN::Controllers::Plugin');
+
+sub type {
+ return 'isis';
+}
+
+sub properties {
+ return {
+ 'isis-domain' => {
+ description => "ISIS domain.",
+ type => 'string'
+ },
+ 'isis-ifaces' => {
+ description => "ISIS interface.",
+ type => 'string', format => 'pve-iface-list',
+ },
+ 'isis-net' => {
+ description => "ISIS network entity title.",
+ type => 'string'
+ },
+ };
+}
+
+sub options {
+ return {
+ 'isis-domain' => { optional => 0 },
+ 'isis-net' => { optional => 0 },
+ 'isis-ifaces' => { optional => 0 },
+ 'node' => { optional => 0 },
+ 'loopback' => { optional => 1 },
+ };
+}
+
+# Plugin implementation
+sub generate_controller_config {
+ my ($class, $plugin_config, $controller, $id, $uplinks, $config) = @_;
+
+ my $isis_ifaces = $plugin_config->{'isis-ifaces'};
+ my $isis_net = $plugin_config->{'isis-net'};
+ my $isis_domain = $plugin_config->{'isis-domain'};
+ my $local_node = PVE::INotify::nodename();
+
+ return if !$isis_ifaces || !$isis_net || !$isis_domain;
+ return if $local_node ne $plugin_config->{node};
+
+ my @router_config = (
+ "net $isis_net",
+ "redistribute ipv4 connected level-1",
+ "redistribute ipv6 connected level-1",
+ "log-adjacency-changes",
+ );
+
+ push(@{$config->{frr}->{router}->{"isis $isis_domain"}}, @router_config);
+
+ my @iface_config = (
+ "ip router isis $isis_domain"
+ );
+
+ my @ifaces = PVE::Tools::split_list($isis_ifaces);
+ for my $iface (sort @ifaces) {
+ push(@{$config->{frr_interfaces}->{$iface}}, @iface_config);
+ }
+
+ return $config;
+}
+
+sub generate_controller_zone_config {
+ my ($class, $plugin_config, $controller, $controller_cfg, $id, $uplinks, $config) = @_;
+
+}
+
+sub on_delete_hook {
+ my ($class, $controllerid, $zone_cfg) = @_;
+
+}
+
+sub on_update_hook {
+ my ($class, $controllerid, $controller_cfg) = @_;
+
+ # we can only have 1 bgp controller by node
+ my $local_node = PVE::INotify::nodename();
+ my $controllernb = 0;
+ foreach my $id (keys %{$controller_cfg->{ids}}) {
+ next if $id eq $controllerid;
+ my $controller = $controller_cfg->{ids}->{$id};
+ next if $controller->{type} ne "isis";
+ next if $controller->{node} ne $local_node;
+ $controllernb++;
+ die "only 1 bgp or isis controller can be defined" if $controllernb > 1;
+ }
+}
+
+sub generate_controller_rawconfig {
+ my ($class, $plugin_config, $config) = @_;
+ return "";
+}
+
+sub write_controller_config {
+ my ($class, $plugin_config, $config) = @_;
+ return;
+}
+
+sub reload_controller {
+ my ($class) = @_;
+ return;
+}
+
+1;
+
+
diff --git a/src/PVE/Network/SDN/Controllers/Makefile b/src/PVE/Network/SDN/Controllers/Makefile
index 11686a3..fd9f881 100644
--- a/src/PVE/Network/SDN/Controllers/Makefile
+++ b/src/PVE/Network/SDN/Controllers/Makefile
@@ -1,4 +1,4 @@
-SOURCES=Plugin.pm FaucetPlugin.pm EvpnPlugin.pm BgpPlugin.pm
+SOURCES=Plugin.pm FaucetPlugin.pm EvpnPlugin.pm BgpPlugin.pm IsisPlugin.pm
PERL5DIR=${DESTDIR}/usr/share/perl5
diff --git a/src/PVE/Network/SDN/Zones/EvpnPlugin.pm b/src/PVE/Network/SDN/Zones/EvpnPlugin.pm
index b155abc..5df05f9 100644
--- a/src/PVE/Network/SDN/Zones/EvpnPlugin.pm
+++ b/src/PVE/Network/SDN/Zones/EvpnPlugin.pm
@@ -119,8 +119,16 @@ sub generate_sdn_config {
warn "vlan-aware vnet can't be enabled with evpn plugin" if $vnet->{vlanaware};
my @peers = PVE::Tools::split_list($controller->{'peers'});
+
+ my $loopback = undef;
my $bgprouter = PVE::Network::SDN::Controllers::EvpnPlugin::find_bgp_controller($local_node, $controller_cfg);
- my $loopback = $bgprouter->{loopback} if $bgprouter->{loopback};
+ my $isisrouter = PVE::Network::SDN::Controllers::EvpnPlugin::find_isis_controller($local_node, $controller_cfg);
+ if ($bgprouter->{loopback}) {
+ $loopback = $bgprouter->{loopback};
+ } elsif ($isisrouter->{loopback}) {
+ $loopback = $isisrouter->{loopback};
+ }
+
my ($ifaceip, $iface) = PVE::Network::SDN::Zones::Plugin::find_local_ip_interface_peers(\@peers, $loopback);
my $is_evpn_gateway = $plugin_config->{'exitnodes'}->{$local_node};
my $exitnodes_local_routing = $plugin_config->{'exitnodes-local-routing'};
diff --git a/src/test/zones/evpn/isis/expected_controller_config b/src/test/zones/evpn/isis/expected_controller_config
new file mode 100644
index 0000000..8d1706a
--- /dev/null
+++ b/src/test/zones/evpn/isis/expected_controller_config
@@ -0,0 +1,58 @@
+frr version 8.5.1
+frr defaults datacenter
+hostname localhost
+log syslog informational
+service integrated-vtysh-config
+!
+!
+vrf vrf_myzone
+ vni 1000
+exit-vrf
+!
+interface eth0
+ ip router isis isis1
+!
+interface eth1
+ ip router isis isis1
+!
+router bgp 65000
+ bgp router-id 192.168.0.1
+ no bgp hard-administrative-reset
+ no bgp graceful-restart notification
+ no bgp default ipv4-unicast
+ coalesce-time 1000
+ neighbor VTEP peer-group
+ neighbor VTEP remote-as 65000
+ neighbor VTEP bfd
+ neighbor 192.168.0.2 peer-group VTEP
+ neighbor 192.168.0.3 peer-group VTEP
+ !
+ address-family l2vpn evpn
+ neighbor VTEP route-map MAP_VTEP_IN in
+ neighbor VTEP route-map MAP_VTEP_OUT out
+ neighbor VTEP activate
+ advertise-all-vni
+ exit-address-family
+exit
+!
+router bgp 65000 vrf vrf_myzone
+ bgp router-id 192.168.0.1
+ no bgp hard-administrative-reset
+ no bgp graceful-restart notification
+exit
+!
+router isis isis1
+ net 47.0023.0000.0000.0000.0000.0000.0000.1900.0004.00
+ redistribute ipv4 connected level-1
+ redistribute ipv6 connected level-1
+ log-adjacency-changes
+exit
+!
+route-map MAP_VTEP_IN permit 1
+exit
+!
+route-map MAP_VTEP_OUT permit 1
+exit
+!
+line vty
+!
\ No newline at end of file
diff --git a/src/test/zones/evpn/isis/expected_sdn_interfaces b/src/test/zones/evpn/isis/expected_sdn_interfaces
new file mode 100644
index 0000000..4cf13e0
--- /dev/null
+++ b/src/test/zones/evpn/isis/expected_sdn_interfaces
@@ -0,0 +1,41 @@
+#version:1
+
+auto myvnet
+iface myvnet
+ address 10.0.0.1/24
+ bridge_ports vxlan_myvnet
+ bridge_stp off
+ bridge_fd 0
+ mtu 1450
+ ip-forward on
+ arp-accept on
+ vrf vrf_myzone
+
+auto vrf_myzone
+iface vrf_myzone
+ vrf-table auto
+ post-up ip route add vrf vrf_myzone unreachable default metric 4278198272
+
+auto vrfbr_myzone
+iface vrfbr_myzone
+ bridge-ports vrfvx_myzone
+ bridge_stp off
+ bridge_fd 0
+ mtu 1450
+ vrf vrf_myzone
+
+auto vrfvx_myzone
+iface vrfvx_myzone
+ vxlan-id 1000
+ vxlan-local-tunnelip 192.168.0.1
+ bridge-learning off
+ bridge-arp-nd-suppress on
+ mtu 1450
+
+auto vxlan_myvnet
+iface vxlan_myvnet
+ vxlan-id 100
+ vxlan-local-tunnelip 192.168.0.1
+ bridge-learning off
+ bridge-arp-nd-suppress on
+ mtu 1450
diff --git a/src/test/zones/evpn/isis/interfaces b/src/test/zones/evpn/isis/interfaces
new file mode 100644
index 0000000..2426e0f
--- /dev/null
+++ b/src/test/zones/evpn/isis/interfaces
@@ -0,0 +1,7 @@
+auto vmbr0
+iface vmbr0 inet static
+ address 192.168.0.1/24
+ gateway 192.168.0.254
+ bridge-ports eth0
+ bridge-stp off
+ bridge-fd 0
\ No newline at end of file
diff --git a/src/test/zones/evpn/isis/sdn_config b/src/test/zones/evpn/isis/sdn_config
new file mode 100644
index 0000000..5963c18
--- /dev/null
+++ b/src/test/zones/evpn/isis/sdn_config
@@ -0,0 +1,49 @@
+{
+ version => 1,
+ vnets => {
+ ids => {
+ myvnet => {
+ tag => "100",
+ type => "vnet",
+ zone => "myzone",
+ },
+ },
+ },
+
+ zones => {
+ ids => {
+ myzone => {
+ ipam => "pve",
+ type => "evpn",
+ controller => "evpnctl",
+ 'vrf-vxlan' => 1000,
+ },
+ },
+ },
+ controllers => {
+ ids => {
+ evpnctl => {
+ type => "evpn",
+ 'peers' => '192.168.0.1,192.168.0.2,192.168.0.3',
+ asn => "65000",
+ },
+ localhost => {
+ type => "isis",
+ 'isis-domain' => 'isis1',
+ 'isis-ifaces' => 'eth1,eth0',
+ 'isis-net' => "47.0023.0000.0000.0000.0000.0000.0000.1900.0004.00",
+ node => "localhost",
+ },
+ },
+ },
+
+ subnets => {
+ ids => {
+ 'myzone-10.0.0.0-24' => {
+ 'type' => 'subnet',
+ 'vnet' => 'myvnet',
+ 'gateway' => '10.0.0.1',
+ },
+ },
+ },
+}
diff --git a/src/test/zones/evpn/isis_loopback/expected_controller_config b/src/test/zones/evpn/isis_loopback/expected_controller_config
new file mode 100644
index 0000000..7b034c4
--- /dev/null
+++ b/src/test/zones/evpn/isis_loopback/expected_controller_config
@@ -0,0 +1,59 @@
+frr version 8.5.1
+frr defaults datacenter
+hostname localhost
+log syslog informational
+service integrated-vtysh-config
+!
+!
+vrf vrf_myzone
+ vni 1000
+exit-vrf
+!
+interface eth0
+ ip router isis isis1
+!
+interface eth1
+ ip router isis isis1
+!
+router bgp 65000
+ bgp router-id 10.0.0.1
+ no bgp hard-administrative-reset
+ no bgp graceful-restart notification
+ no bgp default ipv4-unicast
+ coalesce-time 1000
+ neighbor VTEP peer-group
+ neighbor VTEP remote-as 65000
+ neighbor VTEP bfd
+ neighbor VTEP update-source dummy1
+ neighbor 10.0.0.2 peer-group VTEP
+ neighbor 10.0.0.3 peer-group VTEP
+ !
+ address-family l2vpn evpn
+ neighbor VTEP route-map MAP_VTEP_IN in
+ neighbor VTEP route-map MAP_VTEP_OUT out
+ neighbor VTEP activate
+ advertise-all-vni
+ exit-address-family
+exit
+!
+router bgp 65000 vrf vrf_myzone
+ bgp router-id 10.0.0.1
+ no bgp hard-administrative-reset
+ no bgp graceful-restart notification
+exit
+!
+router isis isis1
+ net 47.0023.0000.0000.0000.0000.0000.0000.1900.0004.00
+ redistribute ipv4 connected level-1
+ redistribute ipv6 connected level-1
+ log-adjacency-changes
+exit
+!
+route-map MAP_VTEP_IN permit 1
+exit
+!
+route-map MAP_VTEP_OUT permit 1
+exit
+!
+line vty
+!
\ No newline at end of file
diff --git a/src/test/zones/evpn/isis_loopback/expected_sdn_interfaces b/src/test/zones/evpn/isis_loopback/expected_sdn_interfaces
new file mode 100644
index 0000000..e595dc9
--- /dev/null
+++ b/src/test/zones/evpn/isis_loopback/expected_sdn_interfaces
@@ -0,0 +1,41 @@
+#version:1
+
+auto myvnet
+iface myvnet
+ address 10.0.0.1/24
+ bridge_ports vxlan_myvnet
+ bridge_stp off
+ bridge_fd 0
+ mtu 1450
+ ip-forward on
+ arp-accept on
+ vrf vrf_myzone
+
+auto vrf_myzone
+iface vrf_myzone
+ vrf-table auto
+ post-up ip route add vrf vrf_myzone unreachable default metric 4278198272
+
+auto vrfbr_myzone
+iface vrfbr_myzone
+ bridge-ports vrfvx_myzone
+ bridge_stp off
+ bridge_fd 0
+ mtu 1450
+ vrf vrf_myzone
+
+auto vrfvx_myzone
+iface vrfvx_myzone
+ vxlan-id 1000
+ vxlan-local-tunnelip 10.0.0.1
+ bridge-learning off
+ bridge-arp-nd-suppress on
+ mtu 1450
+
+auto vxlan_myvnet
+iface vxlan_myvnet
+ vxlan-id 100
+ vxlan-local-tunnelip 10.0.0.1
+ bridge-learning off
+ bridge-arp-nd-suppress on
+ mtu 1450
diff --git a/src/test/zones/evpn/isis_loopback/interfaces b/src/test/zones/evpn/isis_loopback/interfaces
new file mode 100644
index 0000000..41ae25f
--- /dev/null
+++ b/src/test/zones/evpn/isis_loopback/interfaces
@@ -0,0 +1,12 @@
+auto vmbr0
+iface vmbr0 inet static
+ address 192.168.0.1/24
+ gateway 192.168.0.254
+ bridge-ports eth0
+ bridge-stp off
+ bridge-fd 0
+
+auto dummy1
+iface dummy1 inet static
+ address 10.0.0.1/32
+ link-type dummy
\ No newline at end of file
diff --git a/src/test/zones/evpn/isis_loopback/sdn_config b/src/test/zones/evpn/isis_loopback/sdn_config
new file mode 100644
index 0000000..786a3e7
--- /dev/null
+++ b/src/test/zones/evpn/isis_loopback/sdn_config
@@ -0,0 +1,50 @@
+{
+ version => 1,
+ vnets => {
+ ids => {
+ myvnet => {
+ tag => "100",
+ type => "vnet",
+ zone => "myzone",
+ },
+ },
+ },
+
+ zones => {
+ ids => {
+ myzone => {
+ ipam => "pve",
+ type => "evpn",
+ controller => "evpnctl",
+ 'vrf-vxlan' => 1000,
+ },
+ },
+ },
+ controllers => {
+ ids => {
+ evpnctl => {
+ type => "evpn",
+ 'peers' => '10.0.0.1,10.0.0.2,10.0.0.3',
+ asn => "65000",
+ },
+ localhost => {
+ type => "isis",
+ 'isis-domain' => 'isis1',
+ 'isis-ifaces' => 'eth1,eth0',
+ 'isis-net' => "47.0023.0000.0000.0000.0000.0000.0000.1900.0004.00",
+ loopback => 'dummy1',
+ node => "localhost",
+ },
+ },
+ },
+
+ subnets => {
+ ids => {
+ 'myzone-10.0.0.0-24' => {
+ 'type' => 'subnet',
+ 'vnet' => 'myvnet',
+ 'gateway' => '10.0.0.1',
+ },
+ },
+ },
+}
--
2.39.2
^ permalink raw reply [flat|nested] 8+ messages in thread
* [pve-devel] applied-series: [PATCH-SERIES pve-network/pve-manager/pve-docs] sdn: add isis controller
2023-09-13 11:38 [pve-devel] [PATCH-SERIES pve-network/pve-manager/pve-docs] sdn: add isis controller Alexandre Derumier
` (5 preceding siblings ...)
2023-09-13 11:38 ` [pve-devel] [PATCH pve-network 3/3] controllers: add isis router plugin Alexandre Derumier
@ 2023-10-25 11:22 ` Fabian Grünbichler
6 siblings, 0 replies; 8+ messages in thread
From: Fabian Grünbichler @ 2023-10-25 11:22 UTC (permalink / raw)
To: Proxmox VE development discussion
On September 13, 2023 1:38 pm, Alexandre Derumier wrote:
> Hi,
> This patch serie add support for the isis routing protocol for underlay network,
> instead bgp.
>
> This was a request of a proxmox user, the implementation has been tested
> https://forum.proxmox.com/threads/integrating-proxmox-sdn-with-existing-sdn-network.131946
>
>
> pve-network:
>
> Alexandre Derumier (3):
> controller: evpn: fix find_bgp_controller
> controllers: frr: add parsing of "interfaces" section
> controllers: add isis router plugin
>
> src/PVE/Network/SDN/Controllers.pm | 2 +
> src/PVE/Network/SDN/Controllers/EvpnPlugin.pm | 57 ++++++--
> src/PVE/Network/SDN/Controllers/IsisPlugin.pm | 123 ++++++++++++++++++
> src/PVE/Network/SDN/Controllers/Makefile | 2 +-
> src/PVE/Network/SDN/Zones/EvpnPlugin.pm | 10 +-
> .../evpn/isis/expected_controller_config | 58 +++++++++
> .../zones/evpn/isis/expected_sdn_interfaces | 41 ++++++
> src/test/zones/evpn/isis/interfaces | 7 +
> src/test/zones/evpn/isis/sdn_config | 49 +++++++
> .../isis_loopback/expected_controller_config | 59 +++++++++
> .../isis_loopback/expected_sdn_interfaces | 41 ++++++
> src/test/zones/evpn/isis_loopback/interfaces | 12 ++
> src/test/zones/evpn/isis_loopback/sdn_config | 50 +++++++
> 13 files changed, 499 insertions(+), 12 deletions(-)
> create mode 100644 src/PVE/Network/SDN/Controllers/IsisPlugin.pm
> create mode 100644 src/test/zones/evpn/isis/expected_controller_config
> create mode 100644 src/test/zones/evpn/isis/expected_sdn_interfaces
> create mode 100644 src/test/zones/evpn/isis/interfaces
> create mode 100644 src/test/zones/evpn/isis/sdn_config
> create mode 100644 src/test/zones/evpn/isis_loopback/expected_controller_config
> create mode 100644 src/test/zones/evpn/isis_loopback/expected_sdn_interfaces
> create mode 100644 src/test/zones/evpn/isis_loopback/interfaces
> create mode 100644 src/test/zones/evpn/isis_loopback/sdn_config
>
>
> pve-manager:
>
> Alexandre Derumier (1):
> sdn: controllers: add isis controller
>
> www/manager6/Makefile | 1 +
> www/manager6/Utils.js | 5 ++
> www/manager6/sdn/controllers/IsisEdit.js | 61 ++++++++++++++++++++++++
> 3 files changed, 67 insertions(+)
> create mode 100644 www/manager6/sdn/controllers/IsisEdit.js
>
>
> pve-docs:
>
> Alexandre Derumier (2):
> sdn: add notes about bgp controller
> sdn: add isis controller documentation
>
> pvesdn.adoc | 25 +++++++++++++++++++++++++
> 1 file changed, 25 insertions(+)
>
> --
> 2.39.2
>
>
> _______________________________________________
> pve-devel mailing list
> pve-devel@lists.proxmox.com
> https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
>
>
>
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2023-10-25 11:22 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-09-13 11:38 [pve-devel] [PATCH-SERIES pve-network/pve-manager/pve-docs] sdn: add isis controller Alexandre Derumier
2023-09-13 11:38 ` [pve-devel] [PATCH pve-network 1/3] controller: evpn: fix find_bgp_controller Alexandre Derumier
2023-09-13 11:38 ` [pve-devel] [PATCH pve-docs 1/2] sdn: add notes about bgp controller Alexandre Derumier
2023-09-13 11:38 ` [pve-devel] [PATCH pve-manager 1/1] sdn: controllers: add isis controller Alexandre Derumier
2023-09-13 11:38 ` [pve-devel] [PATCH pve-network 2/3] controllers: frr: add parsing of "interfaces" section Alexandre Derumier
2023-09-13 11:38 ` [pve-devel] [PATCH pve-docs 2/2] sdn: add isis controller documentation Alexandre Derumier
2023-09-13 11:38 ` [pve-devel] [PATCH pve-network 3/3] controllers: add isis router plugin Alexandre Derumier
2023-10-25 11:22 ` [pve-devel] applied-series: [PATCH-SERIES pve-network/pve-manager/pve-docs] sdn: add isis controller Fabian Grünbichler
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal