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
next prev 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