public inbox for pve-devel@lists.proxmox.com
 help / color / mirror / Atom feed
From: Stefan Hanreich <s.hanreich@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [PATCH pve-network v6 08/24] api: refactor prefix list api structure
Date: Fri,  8 May 2026 18:31:17 +0200	[thread overview]
Message-ID: <20260508163134.481912-9-s.hanreich@proxmox.com> (raw)
In-Reply-To: <20260508163134.481912-1-s.hanreich@proxmox.com>

The existing prefix list api structure has been adapted as follows:

GET /prefix-lists
Added a verbose parameter. If it is set, then all properties of the
prefix list are returned, otherwise only the id and state (if
pending=1) are returned from the endpoint.

This commit adds CRUD endpoints for manipulating entries of prefix
lists in the /prefix-lists/{id}/entries subfolder:

GET /prefix-lists/{id}/entries/{seq}
Returns the entry with sequence number {seq}.

POST /prefix-lists/{id}/entries
Creates a new entry in the prefix list. If the sequnce number is given
in the body, then that sequence number is used - otherwise a sequence
number will be auto-generated by taking the highest existing sequence
number and adding 5.

PUT /prefix-lists/{id}/entries/{seq}
Updates the entry with sequence number {seq}. If the body contains the
seq field and it is different from the sequence number given in the
URL, then the sequence number will be changed as wel;.

DELETE /prefix-lists/{id}/entries/{seq}
Deletes the entry with sequence number {seq}.

In order to reuse the schema from the prefix list endpoints, a new
method has been added that allows sharing the prefix list entry
properties among the old and new API endpoints.

Signed-off-by: Stefan Hanreich <s.hanreich@proxmox.com>
---
 src/PVE/API2/Network/SDN/Makefile             |   1 +
 src/PVE/API2/Network/SDN/PrefixLists.pm       | 145 +++---------
 src/PVE/API2/Network/SDN/PrefixLists/Makefile |   9 +
 .../Network/SDN/PrefixLists/PrefixList.pm     | 139 ++++++++++++
 .../SDN/PrefixLists/PrefixListEntry.pm        | 208 ++++++++++++++++++
 src/PVE/Network/SDN/PrefixLists.pm            |  80 ++++---
 6 files changed, 432 insertions(+), 150 deletions(-)
 create mode 100644 src/PVE/API2/Network/SDN/PrefixLists/Makefile
 create mode 100644 src/PVE/API2/Network/SDN/PrefixLists/PrefixList.pm
 create mode 100644 src/PVE/API2/Network/SDN/PrefixLists/PrefixListEntry.pm

diff --git a/src/PVE/API2/Network/SDN/Makefile b/src/PVE/API2/Network/SDN/Makefile
index 770eef24..6b91f8cc 100644
--- a/src/PVE/API2/Network/SDN/Makefile
+++ b/src/PVE/API2/Network/SDN/Makefile
@@ -17,4 +17,5 @@ install:
 	make -C Fabrics install
 	make -C Nodes install
 	make -C RouteMaps install
+	make -C PrefixLists install
 
diff --git a/src/PVE/API2/Network/SDN/PrefixLists.pm b/src/PVE/API2/Network/SDN/PrefixLists.pm
index f2e14d1d..7bd85746 100644
--- a/src/PVE/API2/Network/SDN/PrefixLists.pm
+++ b/src/PVE/API2/Network/SDN/PrefixLists.pm
@@ -3,6 +3,7 @@ package PVE::API2::Network::SDN::PrefixLists;
 use strict;
 use warnings;
 
+use PVE::API2::Network::SDN::PrefixLists::PrefixList;
 use PVE::Exception qw(raise_param_exc);
 use PVE::JSONSchema qw(get_standard_option);
 use PVE::Network::SDN::PrefixLists;
@@ -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::PrefixLists::PrefixList",
+    path => '{id}',
+});
+
 __PACKAGE__->register_method({
     name => 'list_prefix_lists',
     path => '',
@@ -33,6 +39,11 @@ __PACKAGE__->register_method({
                 optional => 1,
                 description => "Display pending config.",
             },
+            verbose => {
+                type => 'boolean',
+                optional => 1,
+                description => "If 0, only returns id - otherwise returns all properties.",
+            },
         },
     },
     returns => {
@@ -48,6 +59,7 @@ __PACKAGE__->register_method({
 
         my $pending = extract_param($param, 'pending');
         my $running = extract_param($param, 'running');
+        my $verbose = extract_param($param, 'verbose');
 
         my $digest;
         my $prefix_lists;
@@ -86,41 +98,23 @@ __PACKAGE__->register_method({
                     $prefix_list_privs,
                     1,
                 );
-            $prefix_lists->{$prefix_list_id}->{digest} = $digest if $digest;
-            push @res, $prefix_lists->{$prefix_list_id};
-        }
-
-        return \@res;
-    },
-});
 
-__PACKAGE__->register_method({
-    name => 'get_prefix_list_entry',
-    path => '{id}',
-    method => 'GET',
-    permissions => {
-        check => ['perm', '/sdn/prefix-lists/{id}', ['SDN.Audit']],
-    },
-    description => "Get Prefix List",
-    parameters => {
-        properties => {
-            id => get_standard_option('pve-sdn-prefix-list-id'),
-        },
-    },
-    returns => {
-        type => "object",
-        properties => {},
-    },
-    code => sub {
-        my ($param) = @_;
+            if ($verbose) {
+                $prefix_lists->{$prefix_list_id}->{digest} = $digest if $digest;
+                push @res, $prefix_lists->{$prefix_list_id};
+            } else {
+                my $data = {
+                    id => $prefix_list_id,
+                };
 
-        my $prefix_list_id = extract_param($param, 'id');
-        my $prefix_list_entry = PVE::Network::SDN::PrefixLists::config()->get($prefix_list_id);
+                $data->{state} = $prefix_lists->{$prefix_list_id}->{state}
+                    if $pending && $prefix_lists->{$prefix_list_id}->{state};
 
-        raise_param_exc({ 'id' => "$prefix_list_id doesn't exist" })
-            if !$prefix_list_entry;
+                push @res, $data;
+            }
+        }
 
-        return $prefix_list_entry;
+        return \@res;
     },
 });
 
@@ -166,93 +160,4 @@ __PACKAGE__->register_method({
     },
 });
 
-__PACKAGE__->register_method({
-    name => 'update_prefix_list_entry',
-    path => '{id}',
-    method => 'PUT',
-    protected => 1,
-    permissions => {
-        check => ['perm', '/sdn/prefix-lists/{id}', ['SDN.Allocate']],
-    },
-    description => "Update Prefix List",
-    parameters => {
-        properties => {
-            digest => get_standard_option('pve-config-digest'),
-            'lock-token' => get_standard_option('pve-sdn-lock-token'),
-            PVE::Network::SDN::PrefixLists::prefix_list_properties(1)->%*,
-        },
-    },
-    returns => {
-        type => "null",
-    },
-    code => sub {
-        my ($param) = @_;
-
-        my $lock_token = extract_param($param, 'lock-token');
-
-        PVE::Network::SDN::lock_sdn_config(
-            sub {
-                my $config = PVE::Network::SDN::PrefixLists::config();
-
-                my $digest = extract_param($param, 'digest');
-                PVE::Tools::assert_if_modified($config->digest(), $digest) if $digest;
-
-                my $prefix_list_id = extract_param($param, 'id');
-                my $delete = extract_param($param, 'delete');
-
-                $config->update($prefix_list_id, $param, $delete);
-                PVE::Network::SDN::PrefixLists::write_config($config);
-            },
-            "updating prefix list failed",
-            $lock_token,
-        );
-
-        return;
-    },
-});
-
-__PACKAGE__->register_method({
-    name => 'delete_prefix_list_entry',
-    path => '{id}',
-    method => 'DELETE',
-    protected => 1,
-    permissions => {
-        check => ['perm', '/sdn/prefix-lists/{id}', ['SDN.Allocate']],
-    },
-    description => "Delete Prefix List",
-    parameters => {
-        properties => {
-            id => get_standard_option('pve-sdn-prefix-list-id'),
-            'lock-token' => get_standard_option('pve-sdn-lock-token'),
-        },
-    },
-    returns => {
-        type => "null",
-    },
-    code => sub {
-        my ($param) = @_;
-
-        my $lock_token = extract_param($param, 'lock-token');
-
-        PVE::Network::SDN::lock_sdn_config(
-            sub {
-                my $config = PVE::Network::SDN::PrefixLists::config();
-
-                my $digest = extract_param($param, 'digest');
-                PVE::Tools::assert_if_modified($config->digest(), $digest) if $digest;
-
-                my $prefix_list_id = extract_param($param, 'id');
-                PVE::Network::SDN::PrefixLists::check_references($prefix_list_id);
-
-                $config->delete($prefix_list_id);
-                PVE::Network::SDN::PrefixLists::write_config($config);
-            },
-            "deleting prefix list failed",
-            $lock_token,
-        );
-
-        return;
-    },
-});
-
 1;
diff --git a/src/PVE/API2/Network/SDN/PrefixLists/Makefile b/src/PVE/API2/Network/SDN/PrefixLists/Makefile
new file mode 100644
index 00000000..815a4b09
--- /dev/null
+++ b/src/PVE/API2/Network/SDN/PrefixLists/Makefile
@@ -0,0 +1,9 @@
+SOURCES=PrefixList.pm\
+		PrefixListEntry.pm
+
+
+PERL5DIR=${DESTDIR}/usr/share/perl5
+
+.PHONY: install
+install:
+	for i in ${SOURCES}; do install -D -m 0644 $$i ${PERL5DIR}/PVE/API2/Network/SDN/PrefixLists/$$i; done
diff --git a/src/PVE/API2/Network/SDN/PrefixLists/PrefixList.pm b/src/PVE/API2/Network/SDN/PrefixLists/PrefixList.pm
new file mode 100644
index 00000000..d0332441
--- /dev/null
+++ b/src/PVE/API2/Network/SDN/PrefixLists/PrefixList.pm
@@ -0,0 +1,139 @@
+package PVE::API2::Network::SDN::PrefixLists::PrefixList;
+
+use strict;
+use warnings;
+
+use PVE::API2::Network::SDN::PrefixLists::PrefixListEntry;
+use PVE::Exception qw(raise_param_exc);
+use PVE::JSONSchema qw(get_standard_option);
+use PVE::Network::SDN::PrefixLists;
+use PVE::Tools qw(extract_param);
+
+use PVE::RESTHandler;
+use base qw(PVE::RESTHandler);
+
+__PACKAGE__->register_method({
+    subclass => "PVE::API2::Network::SDN::PrefixLists::PrefixListEntry",
+    path => 'entries',
+});
+
+__PACKAGE__->register_method({
+    name => 'get_prefix_list',
+    path => '',
+    method => 'GET',
+    permissions => {
+        check => ['perm', '/sdn/prefix-lists/{id}', ['SDN.Audit']],
+    },
+    description => "Get Prefix List",
+    parameters => {
+        properties => {
+            id => get_standard_option('pve-sdn-prefix-list-id'),
+        },
+    },
+    returns => {
+        type => "object",
+        properties => {},
+    },
+    code => sub {
+        my ($param) = @_;
+
+        my $prefix_list_id = extract_param($param, 'id');
+        my $prefix_list_entry = PVE::Network::SDN::PrefixLists::config()->get($prefix_list_id);
+
+        raise_param_exc({ 'id' => "$prefix_list_id doesn't exist" })
+            if !$prefix_list_entry;
+
+        return $prefix_list_entry;
+    },
+});
+
+__PACKAGE__->register_method({
+    name => 'update_prefix_list',
+    path => '',
+    method => 'PUT',
+    protected => 1,
+    permissions => {
+        check => ['perm', '/sdn/prefix-lists/{id}', ['SDN.Allocate']],
+    },
+    description => "Update Prefix List",
+    parameters => {
+        properties => {
+            digest => get_standard_option('pve-config-digest'),
+            'lock-token' => get_standard_option('pve-sdn-lock-token'),
+            PVE::Network::SDN::PrefixLists::prefix_list_properties(1)->%*,
+        },
+    },
+    returns => {
+        type => "null",
+    },
+    code => sub {
+        my ($param) = @_;
+
+        my $lock_token = extract_param($param, 'lock-token');
+
+        PVE::Network::SDN::lock_sdn_config(
+            sub {
+                my $config = PVE::Network::SDN::PrefixLists::config();
+
+                my $digest = extract_param($param, 'digest');
+                PVE::Tools::assert_if_modified($config->digest(), $digest) if $digest;
+
+                my $prefix_list_id = extract_param($param, 'id');
+                my $delete = extract_param($param, 'delete');
+
+                $config->update($prefix_list_id, $param, $delete);
+                PVE::Network::SDN::PrefixLists::write_config($config);
+            },
+            "updating prefix list failed",
+            $lock_token,
+        );
+
+        return;
+    },
+});
+
+__PACKAGE__->register_method({
+    name => 'delete_prefix_list',
+    path => '',
+    method => 'DELETE',
+    protected => 1,
+    permissions => {
+        check => ['perm', '/sdn/prefix-lists/{id}', ['SDN.Allocate']],
+    },
+    description => "Delete Prefix List",
+    parameters => {
+        properties => {
+            id => get_standard_option('pve-sdn-prefix-list-id'),
+            'lock-token' => get_standard_option('pve-sdn-lock-token'),
+        },
+    },
+    returns => {
+        type => "null",
+    },
+    code => sub {
+        my ($param) = @_;
+
+        my $lock_token = extract_param($param, 'lock-token');
+
+        PVE::Network::SDN::lock_sdn_config(
+            sub {
+                my $config = PVE::Network::SDN::PrefixLists::config();
+
+                my $digest = extract_param($param, 'digest');
+                PVE::Tools::assert_if_modified($config->digest(), $digest) if $digest;
+
+                my $prefix_list_id = extract_param($param, 'id');
+                PVE::Network::SDN::PrefixLists::check_references($prefix_list_id);
+
+                $config->delete($prefix_list_id);
+                PVE::Network::SDN::PrefixLists::write_config($config);
+            },
+            "deleting prefix list failed",
+            $lock_token,
+        );
+
+        return;
+    },
+});
+
+1;
diff --git a/src/PVE/API2/Network/SDN/PrefixLists/PrefixListEntry.pm b/src/PVE/API2/Network/SDN/PrefixLists/PrefixListEntry.pm
new file mode 100644
index 00000000..612fdb92
--- /dev/null
+++ b/src/PVE/API2/Network/SDN/PrefixLists/PrefixListEntry.pm
@@ -0,0 +1,208 @@
+package PVE::API2::Network::SDN::PrefixLists::PrefixListEntry;
+
+use strict;
+use warnings;
+
+use PVE::Exception qw(raise_param_exc);
+use PVE::JSONSchema qw(get_standard_option);
+use PVE::Network::SDN::PrefixLists;
+use PVE::Tools qw(extract_param);
+
+use PVE::RESTHandler;
+use base qw(PVE::RESTHandler);
+
+__PACKAGE__->register_method({
+    name => 'get_prefix_list_entries',
+    path => '',
+    method => 'GET',
+    permissions => {
+        check => ['perm', '/sdn/prefix-lists/{id}', ['SDN.Audit']],
+    },
+    description => "Get Prefix List",
+    parameters => {
+        properties => {
+            id => get_standard_option('pve-sdn-prefix-list-id'),
+        },
+    },
+    returns => {
+        type => 'array',
+        items => {
+            type => "object",
+            properties => {},
+        },
+        links => [{ rel => 'child', href => "{seq}" }],
+    },
+    code => sub {
+        my ($param) = @_;
+
+        my $prefix_list_id = extract_param($param, 'id');
+        return PVE::Network::SDN::PrefixLists::config()->list_entries($prefix_list_id);
+    },
+});
+
+__PACKAGE__->register_method({
+    name => 'get_prefix_list_entry',
+    path => '{url_seq}',
+    method => 'GET',
+    permissions => {
+        check => ['perm', '/sdn/prefix-lists/{id}', ['SDN.Audit']],
+    },
+    description => "Get Prefix List",
+    parameters => {
+        properties => {
+            id => get_standard_option('pve-sdn-prefix-list-id'),
+        },
+    },
+    returns => {
+        type => "object",
+        properties => {},
+    },
+    code => sub {
+        my ($param) = @_;
+
+        my $prefix_list_id = extract_param($param, 'id');
+        my $seq_nr = extract_param($param, 'url_seq');
+        my $prefix_list_entry = PVE::Network::SDN::PrefixLists::config()->get_entry($prefix_list_id, $seq_nr);
+
+        raise_param_exc({ 'id' => "entry $seq_nr in prefix list $prefix_list_id doesn't exist" })
+            if !$prefix_list_entry;
+
+        return $prefix_list_entry;
+    },
+});
+
+__PACKAGE__->register_method({
+    name => 'update_prefix_list_entry',
+    path => '{url_seq}',
+    method => 'PUT',
+    protected => 1,
+    permissions => {
+        check => ['perm', '/sdn/prefix-lists/{id}', ['SDN.Allocate']],
+    },
+    description => "Update Prefix List",
+    parameters => {
+        properties => {
+            digest => get_standard_option('pve-config-digest'),
+            'lock-token' => get_standard_option('pve-sdn-lock-token'),
+            PVE::Network::SDN::PrefixLists::prefix_list_entry_properties(1, 1)->%*,
+        },
+    },
+    returns => {
+        type => "null",
+    },
+    code => sub {
+        my ($param) = @_;
+
+        my $lock_token = extract_param($param, 'lock-token');
+
+        PVE::Network::SDN::lock_sdn_config(
+            sub {
+                my $config = PVE::Network::SDN::PrefixLists::config();
+
+                my $digest = extract_param($param, 'digest');
+                PVE::Tools::assert_if_modified($config->digest(), $digest) if $digest;
+
+                my $prefix_list_id = extract_param($param, 'id');
+                my $old_seq = extract_param($param, 'url_seq');
+                my $delete = extract_param($param, 'delete');
+
+                $config->update_entry($prefix_list_id, $old_seq, $param, $delete);
+                PVE::Network::SDN::PrefixLists::write_config($config);
+            },
+            "updating prefix list entry failed",
+            $lock_token,
+        );
+
+        return;
+    },
+});
+
+__PACKAGE__->register_method({
+    name => 'delete_prefix_list_entry',
+    path => '{url_seq}',
+    method => 'DELETE',
+    protected => 1,
+    permissions => {
+        check => ['perm', '/sdn/prefix-lists/{id}', ['SDN.Allocate']],
+    },
+    description => "Delete Prefix List",
+    parameters => {
+        properties => {
+            id => get_standard_option('pve-sdn-prefix-list-id'),
+            'lock-token' => get_standard_option('pve-sdn-lock-token'),
+        },
+    },
+    returns => {
+        type => "null",
+    },
+    code => sub {
+        my ($param) = @_;
+
+        my $lock_token = extract_param($param, 'lock-token');
+
+        PVE::Network::SDN::lock_sdn_config(
+            sub {
+                my $config = PVE::Network::SDN::PrefixLists::config();
+
+                my $digest = extract_param($param, 'digest');
+                PVE::Tools::assert_if_modified($config->digest(), $digest) if $digest;
+
+                my $prefix_list_id = extract_param($param, 'id');
+                my $seq_nr = extract_param($param, 'url_seq');
+
+                $config->delete_entry($prefix_list_id, $seq_nr);
+                PVE::Network::SDN::PrefixLists::write_config($config);
+            },
+            "deleting prefix list entry failed",
+            $lock_token,
+        );
+
+        return;
+    },
+});
+
+__PACKAGE__->register_method({
+    name => 'create_prefix_list_entry',
+    path => '',
+    method => 'POST',
+    protected => 1,
+    permissions => {
+        check => ['perm', '/sdn/prefix-lists/{id}', ['SDN.Allocate']],
+    },
+    description => "Delete Prefix List",
+    parameters => {
+        properties => {
+            id => get_standard_option('pve-sdn-prefix-list-id'),
+            'lock-token' => get_standard_option('pve-sdn-lock-token'),
+            PVE::Network::SDN::PrefixLists::prefix_list_entry_properties(0, 1)->%*,
+        },
+    },
+    returns => {
+        type => "null",
+    },
+    code => sub {
+        my ($param) = @_;
+
+        my $lock_token = extract_param($param, 'lock-token');
+
+        PVE::Network::SDN::lock_sdn_config(
+            sub {
+                my $config = PVE::Network::SDN::PrefixLists::config();
+
+                my $digest = extract_param($param, 'digest');
+                PVE::Tools::assert_if_modified($config->digest(), $digest) if $digest;
+
+                my $prefix_list_id = extract_param($param, 'id');
+
+                $config->create_entry($prefix_list_id, $param);
+                PVE::Network::SDN::PrefixLists::write_config($config);
+            },
+            "creating prefix list entry failed",
+            $lock_token,
+        );
+
+        return;
+    },
+});
+
+1;
diff --git a/src/PVE/Network/SDN/PrefixLists.pm b/src/PVE/Network/SDN/PrefixLists.pm
index efe1463e..3b27d61b 100644
--- a/src/PVE/Network/SDN/PrefixLists.pm
+++ b/src/PVE/Network/SDN/PrefixLists.pm
@@ -105,44 +105,66 @@ sub check_references {
     }
 }
 
+sub prefix_list_entry_properties {
+    my ($update, $standalone) = @_;
+
+    my $properties = {
+        action => {
+            type => 'string',
+            enum => ['permit', 'deny'],
+            optional => $update,
+        },
+        prefix => {
+            type => 'string',
+            format => 'CIDR',
+            optional => $update,
+        },
+        le => {
+            type => 'integer',
+            minimum => 0,
+            maximum => 128,
+            optional => 1,
+        },
+        ge => {
+            type => 'integer',
+            minimum => 0,
+            maximum => 128,
+            optional => 1,
+        },
+        seq => {
+            type => 'integer',
+            minimum => 0,
+            maximum => 2**32 - 1,
+            optional => 1,
+        },
+    };
+
+    if ($update && $standalone) {
+        $properties->{delete} = {
+            type => 'array',
+            optional => 1,
+            items => {
+                type => 'string',
+                enum => ['le', 'ge', 'seq'],
+            },
+        };
+    }
+
+    return $properties;
+}
+
 sub prefix_list_properties {
     my ($update) = @_;
 
     my $properties = {
+        id => get_standard_option('pve-sdn-prefix-list-id'),
         digest => get_standard_option('pve-config-digest'),
         entries => {
             type => 'array',
             optional => 1,
             items => {
                 type => 'string',
-                format => {
-                    action => {
-                        type => 'string',
-                        enum => ['permit', 'deny'],
-                    },
-                    prefix => {
-                        type => 'string',
-                        format => 'CIDR',
-                    },
-                    le => {
-                        type => 'integer',
-                        minimum => 0,
-                        maximum => 128,
-                        optional => 1,
-                    },
-                    ge => {
-                        type => 'integer',
-                        minimum => 0,
-                        maximum => 128,
-                        optional => 1,
-                    },
-                    seq => {
-                        type => 'integer',
-                        minimum => 0,
-                        maximum => 2**32 - 1,
-                        optional => 1,
-                    },
-                },
+                format => prefix_list_entry_properties($update, 0),
             },
         },
     };
@@ -156,8 +178,6 @@ sub prefix_list_properties {
                 enum => ['entries'],
             },
         };
-    } else {
-        $properties->{id} = get_standard_option('pve-sdn-prefix-list-id');
     }
 
     return $properties;
-- 
2.47.3





  parent reply	other threads:[~2026-05-08 16:33 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-05-08 16:31 [PATCH manager/network/proxmox{-ve-rs,-perl-rs} v6 00/24] Add support for route maps / prefix lists to SDN Stefan Hanreich
2026-05-08 16:31 ` [PATCH proxmox-ve-rs v6 01/24] sdn: prefix lists: refactor section config and api format Stefan Hanreich
2026-05-08 16:31 ` [PATCH proxmox-ve-rs v6 02/24] prefix lists: implement validation for prefix lists Stefan Hanreich
2026-05-08 16:31 ` [PATCH proxmox-perl-rs v6 03/24] sdn: prefix lists: refactor existing API endpoint Stefan Hanreich
2026-05-08 16:31 ` [PATCH proxmox-perl-rs v6 04/24] sdn: prefix lists: add crud methods for prefix list entries Stefan Hanreich
2026-05-08 16:31 ` [PATCH proxmox-perl-rs v6 05/24] sdn: prefix lists: validate prefix lists Stefan Hanreich
2026-05-08 16:31 ` [PATCH proxmox-perl-rs v6 06/24] sdn: route maps: add route map list method Stefan Hanreich
2026-05-08 16:31 ` [PATCH pve-network v6 07/24] api: refactor route map api structure Stefan Hanreich
2026-05-08 16:31 ` Stefan Hanreich [this message]
2026-05-08 16:31 ` [PATCH pve-manager v6 09/24] ui: sdn: add route map selector Stefan Hanreich
2026-05-08 16:31 ` [PATCH pve-manager v6 10/24] ui: sdn: add prefix list selector Stefan Hanreich
2026-05-08 16:31 ` [PATCH pve-manager v6 11/24] ui: sdn: add panel for managing prefix lists Stefan Hanreich
2026-05-08 16:31 ` [PATCH pve-manager v6 12/24] ui: sdn: add panel for managing route map entries Stefan Hanreich
2026-05-08 16:31 ` [PATCH pve-manager v6 13/24] ui: sdn: bgp controller: allow configuring route maps Stefan Hanreich
2026-05-08 16:31 ` [PATCH pve-manager v6 14/24] ui: sdn: evpn " Stefan Hanreich
2026-05-08 16:31 ` [PATCH pve-manager v6 15/24] ui: sdn: openfabric: add route filter Stefan Hanreich
2026-05-08 16:31 ` [PATCH pve-manager v6 16/24] ui: sdn: ospf: add route filter setting Stefan Hanreich
2026-05-08 16:31 ` [PATCH pve-manager v6 17/24] ui: sdn: prefix list: add missing subjects Stefan Hanreich
2026-05-08 16:31 ` [PATCH pve-manager v6 18/24] sdn: do not fail rendering record data if pending property is missing Stefan Hanreich
2026-05-08 16:31 ` [PATCH pve-manager v6 19/24] ui: sdn: prefix list: adapt to changed api structure Stefan Hanreich
2026-05-08 16:31 ` [PATCH pve-manager v6 20/24] ui: sdn: route maps: adapt to new route map " Stefan Hanreich
2026-05-08 16:31 ` [PATCH pve-manager v6 21/24] ui: sdn: prefix lists: route maps: use integerfields for numbers Stefan Hanreich
2026-05-08 16:31 ` [PATCH pve-manager v6 22/24] ui: sdn: prefix list panel: reload data on deleting prefix list entry Stefan Hanreich
2026-05-08 16:31 ` [PATCH pve-manager v6 23/24] ui: prefix list panel: delete empty le and get properties Stefan Hanreich
2026-05-08 16:31 ` [PATCH pve-manager v6 24/24] ui: prefix list entry panel: make prefix required Stefan Hanreich

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260508163134.481912-9-s.hanreich@proxmox.com \
    --to=s.hanreich@proxmox.com \
    --cc=pve-devel@lists.proxmox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal