[PATCH pve-network v5 28/46] api2: add route map module

Stefan Hanreich
2026-05-05T15:39:19Z

This module contains the following API endpoint:

GET /route-maps/<id> - lists all route map entries for the route map
<id>

Signed-off-by: Stefan Hanreich <s.hanreich@proxmox.com>

add route maps api module

Signed-off-by: Stefan Hanreich <s.hanreich@proxmox.com>
---
src/PVE/API2/Network/SDN/Makefile | 1 +
src/PVE/API2/Network/SDN/RouteMaps.pm | 6 ++
src/PVE/API2/Network/SDN/RouteMaps/Makefile | 8 ++
.../API2/Network/SDN/RouteMaps/RouteMap.pm | 87 +++++++++++++++++++
4 files changed, 102 insertions(+)
create mode 100644 src/PVE/API2/Network/SDN/RouteMaps/Makefile
create mode 100644 src/PVE/API2/Network/SDN/RouteMaps/RouteMap.pm

diff --git a/src/PVE/API2/Network/SDN/Makefile b/src/PVE/API2/Network/SDN/Makefile
index 6f1449a..770eef2 100644
--- a/src/PVE/API2/Network/SDN/Makefile
+++ b/src/PVE/API2/Network/SDN/Makefile
@@ -16,4 +16,5 @@ install:
for i in ${SOURCES}; do install -D -m 0644 $$i ${PERL5DIR}/PVE/API2/Network/SDN/$$i; done
make -C Fabrics install
make -C Nodes install
+ make -C RouteMaps install

diff --git a/src/PVE/API2/Network/SDN/RouteMaps.pm b/src/PVE/API2/Network/SDN/RouteMaps.pm
index 33d800b..8a7936d 100644
--- a/src/PVE/API2/Network/SDN/RouteMaps.pm
+++ b/src/PVE/API2/Network/SDN/RouteMaps.pm
@@ -3,6 +3,7 @@ package PVE::API2::Network::SDN::RouteMaps;
use strict;
use warnings;

+use PVE::API2::Network::SDN::RouteMaps::RouteMap;
use PVE::Exception qw(raise_param_exc);
use PVE::JSONSchema qw(get_standard_option);
use PVE::Network::SDN::RouteMaps;
@@ -11,6 +12,11 @@ use PVE::Tools qw(extract_param);
use PVE::RESTHandler;
use base qw(PVE::RESTHandler);

+__PACKAGE__->register_method({
+ subclass => "PVE::API2::Network::SDN::RouteMaps::RouteMap",
+ path => '{route-map-id}',
+});
+
__PACKAGE__->register_method({
name => 'list_route_maps',
path => '',
diff --git a/src/PVE/API2/Network/SDN/RouteMaps/Makefile b/src/PVE/API2/Network/SDN/RouteMaps/Makefile
new file mode 100644
index 0000000..3d0a928
--- /dev/null
+++ b/src/PVE/API2/Network/SDN/RouteMaps/Makefile
@@ -0,0 +1,8 @@
+SOURCES=RouteMap.pm\
+
+
+PERL5DIR=${DESTDIR}/usr/share/perl5
+
+.PHONY: install
+install:
+ for i in ${SOURCES}; do install -D -m 0644 $$i ${PERL5DIR}/PVE/API2/Network/SDN/RouteMaps/$$i; done
diff --git a/src/PVE/API2/Network/SDN/RouteMaps/RouteMap.pm b/src/PVE/API2/Network/SDN/RouteMaps/RouteMap.pm
new file mode 100644
index 0000000..2dbea09
--- /dev/null
+++ b/src/PVE/API2/Network/SDN/RouteMaps/RouteMap.pm
@@ -0,0 +1,87 @@
+package PVE::API2::Network::SDN::RouteMaps::RouteMap;
+
+use strict;
+use warnings;
+
+use PVE::JSONSchema qw(get_standard_option);
+use PVE::Exception qw(raise_param_exc);
+use PVE::Tools qw(extract_param);
+
+use PVE::RESTHandler;
+use base qw(PVE::RESTHandler);
+
+__PACKAGE__->register_method({
+ name => 'list_route_map_entries',
+ path => '',
+ method => 'GET',
+ permissions => {
+ check =>
+ ['perm', '/sdn/route-maps/{route-map-id}', ['SDN.Audit', 'SDN.Allocate'], any => 1],
+ },
+ description => "List all entries for a given Route Map",
+ parameters => {
+ properties => {
+ 'route-map-id' => get_standard_option('pve-sdn-route-map-id'),
+ running => {
+ type => 'boolean',
+ optional => 1,
+ description => "Display running config.",
+ },
+ pending => {
+ type => 'boolean',
+ optional => 1,
+ description => "Display pending config.",
+ },
+ },
+ },
+ returns => {
+ type => 'array',
+ items => {
+ type => "object",
+ properties => PVE::Network::SDN::RouteMaps::route_map_properties(0),
+ },
+ links => [{ rel => 'child', href => "{order}" }],
+ },
+ code => sub {
+ my ($param) = @_;
+
+ my $pending = extract_param($param, 'pending');
+ my $running = extract_param($param, 'running');
+ my $route_map_id = extract_param($param, 'route-map-id');
+
+ my $digest;
+ my $route_map_entries;
+
+ if ($pending) {
+ my $current_config = PVE::Network::SDN::RouteMaps::config();
+ my $running_config = PVE::Network::SDN::RouteMaps::config(1);
+
+ my $pending_route_maps = PVE::Network::SDN::pending_config(
+ { 'route-maps' => { ids => $running_config->list() } },
+ { ids => $current_config->list() },
+ 'route-maps',
+ );
+
+ $digest = $current_config->digest();
+ $route_map_entries = $pending_route_maps->{ids};
+ } elsif ($running) {
+ $route_map_entries =
+ PVE::Network::SDN::RouteMaps::config(1)->list_route_map($route_map_id);
+ } else {
+ my $current_config = PVE::Network::SDN::RouteMaps::config();
+
+ $digest = $current_config->digest();
+ $route_map_entries = $current_config->list_route_map($route_map_id);
+ }
+
+ my @res;
+ for my $route_map_id (sort keys $route_map_entries->%*) {
+ $route_map_entries->{$route_map_id}->{digest} = $digest if $digest;
+ push @res, $route_map_entries->{$route_map_id};
+ }
+
+ return \@res;
+ },
+});
+
+1;
--
2.47.3