From 5bda8607a441d6d55a552aa6d8fa6364cdf048b9 Mon Sep 17 00:00:00 2001 From: Alexandre Derumier Date: Thu, 29 Aug 2019 12:32:52 +0200 Subject: [PATCH] add update_delete hook on frr related options Signed-off-by: Alexandre Derumier --- 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.39.2