On 2026-02-03 17:04, Gabriel Goller wrote:
> The structured frr config can be deserialized by rust and rendered using
> the templates (isis and bgp) in proxmox-frr.
>
> Co-authored-by: Stefan Hanreich <[email protected]>
> Signed-off-by: Gabriel Goller <[email protected]>
> ---
> src/PVE/Network/SDN.pm | 11 +-
> src/PVE/Network/SDN/Controllers/BgpPlugin.pm | 104 ++---
> src/PVE/Network/SDN/Controllers/EvpnPlugin.pm | 372 +++++++++---------
> src/PVE/Network/SDN/Controllers/IsisPlugin.pm | 28 +-
> src/PVE/Network/SDN/Fabrics.pm | 14 +-
> src/PVE/Network/SDN/Frr.pm | 163 +-------
> 6 files changed, 276 insertions(+), 416 deletions(-)
>
[..]
>
> -Converts a given C<\%frr_config> to the raw config format.
> +Iterates over all bgp route-maps in C<\$frr_config> and renumbers their
> sequence
> +numbers to be consecutive, starting from 1 and incrementing by 1 for each
> entry.
>
> =cut
>
> -sub to_raw_config {
> +sub fix_routemap_seqs {
> my ($frr_config) = @_;
>
> - my $raw_config = [];
> + my $routemaps = $frr_config->{'frr'}->{'bgp'}->{'routemaps'};
we should check if `routemaps`(and probably also `bgp`) exists, either
here, or where we call this in `generate_frr_raw_config`. but here is
probably better
> - generate_frr_vrf($raw_config, $frr_config->{frr}->{vrf});
> - generate_frr_interfaces($raw_config, $frr_config->{frr_interfaces});
> - generate_frr_recurse($raw_config, $frr_config->{frr}, undef, 0);
> - generate_frr_list($raw_config, $frr_config->{frr_access_list},
> "access-list");
> - generate_frr_list($raw_config, $frr_config->{frr_prefix_list}, "ip
> prefix-list");
> - generate_frr_list($raw_config, $frr_config->{frr_prefix_list_v6}, "ipv6
> prefix-list");
> - generate_frr_simple_list($raw_config,
> $frr_config->{frr_bgp_community_list});
> - generate_frr_routemap($raw_config, $frr_config->{frr_routemap});
> - generate_frr_simple_list($raw_config, $frr_config->{frr_ip_protocol});
> -
> - return $raw_config;
> + foreach my $id (sort keys %$routemaps) {
> + my $routemap = $routemaps->{$id};
> + my $order = 0;
> + foreach my $seq (@$routemap) {
> + $order++;
> + $seq->{seq} = $order;
> + }
> + }
> }
>
> =head3 raw_config_to_string(\@raw_config)
> @@ -339,139 +337,4 @@ sub append_local_config {
> }
> }
>
[..]
> 1;