Signed-off-by: Alexandre Derumier <aderum...@odiso.com>
---
 PVE/Network/SDN/FrrPlugin.pm   | 20 ++++++++++++++++---
 PVE/Network/SDN/VxlanPlugin.pm | 35 ++++++++++++++++++++++++++++++++++
 2 files changed, 52 insertions(+), 3 deletions(-)

diff --git a/PVE/Network/SDN/FrrPlugin.pm b/PVE/Network/SDN/FrrPlugin.pm
index 0ea6d48..a628cf2 100644
--- a/PVE/Network/SDN/FrrPlugin.pm
+++ b/PVE/Network/SDN/FrrPlugin.pm
@@ -73,13 +73,27 @@ sub generate_frr_config {
 }
 
 sub on_delete_hook {
-    my ($class, $transportid, $sdn_cfg) = @_;
+    my ($class, $routerid, $sdn_cfg) = @_;
 
+    # verify that transport is associated to this router
+    foreach my $id (keys %{$sdn_cfg->{ids}}) {
+        my $sdn = $sdn_cfg->{ids}->{$id};
+        die "router $routerid is used by $id"
+            if (defined($sdn->{router}) && $sdn->{router} eq $routerid);
+    }
 }
 
 sub on_update_hook {
-    my ($class, $transportid, $sdn_cfg) = @_;
-
+    my ($class, $routerid, $sdn_cfg) = @_;
+
+    # verify that asn is not already used by another router
+    my $asn = $sdn_cfg->{ids}->{$routerid}->{asn};
+    foreach my $id (keys %{$sdn_cfg->{ids}}) {
+       next if $id eq $routerid;
+        my $sdn = $sdn_cfg->{ids}->{$id};
+        die "asn $asn is already used by $id"
+            if (defined($sdn->{asn}) && $sdn->{asn} eq $asn);
+    }
 }
 
 1;
diff --git a/PVE/Network/SDN/VxlanPlugin.pm b/PVE/Network/SDN/VxlanPlugin.pm
index 99cd2af..b0b48c4 100644
--- a/PVE/Network/SDN/VxlanPlugin.pm
+++ b/PVE/Network/SDN/VxlanPlugin.pm
@@ -235,6 +235,41 @@ sub on_update_hook {
            }
        }
     }
+
+    # verify that router exist
+    if (defined($sdn_cfg->{ids}->{$transportid}->{router})) {
+       my $router = $sdn_cfg->{ids}->{$transportid}->{router};
+       if (!defined($sdn_cfg->{ids}->{$router})) {
+           die "router $router don't exist";
+       } else {
+           die "$router is not a router type" if 
$sdn_cfg->{ids}->{$router}->{type} ne 'frr';
+       }
+
+       #vrf && vrf-vxlan need to be defined with router
+       my $vrf = $sdn_cfg->{ids}->{$transportid}->{vrf};
+       if (!defined($vrf)) {
+           die "missing vrf option";
+       } else {
+           # verify that vrf is not already declared in another transport
+           foreach my $id (keys %{$sdn_cfg->{ids}}) {
+               next if $id eq $transportid;
+               die "vrf $vrf is already declared in $id"
+                       if (defined($sdn_cfg->{ids}->{$id}->{vrf}) && 
$sdn_cfg->{ids}->{$id}->{vrf} eq $vrf);
+           }
+       }
+
+       my $vrfvxlan = $sdn_cfg->{ids}->{$transportid}->{'vrf-vxlan'};
+       if (!defined($vrfvxlan)) {
+           die "missing vrf-vxlan option";
+       } else {
+           # verify that vrf-vxlan is not already declared in another transport
+           foreach my $id (keys %{$sdn_cfg->{ids}}) {
+               next if $id eq $transportid;
+               die "vrf-vxlan $vrfvxlan is already declared in $id"
+                       if (defined($sdn_cfg->{ids}->{$id}->{'vrf-vxlan'}) && 
$sdn_cfg->{ids}->{$id}->{'vrf-vxlan'} eq $vrfvxlan);
+           }
+       }
+    } 
 }
 
 1;
-- 
2.20.1

_______________________________________________
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to