[pve-devel] [PATCH pve-network v4 01/21] sdn: fix value returned by pending_config
Stefan Hanreich
s.hanreich at proxmox.com
Fri Jul 4 16:29:54 CEST 2025
looks like some unrelated formatting changes are here? The previous
commit only contained one line of changes.
https://lore.proxmox.com/pve-devel/20250522161731.537011-35-s.hanreich@proxmox.com/
On 7/2/25 16:50, Gabriel Goller wrote:
> From: Stefan Hanreich <s.hanreich at proxmox.com>
>
> For special types that were encoded by the encode_value function in
> SDN, we returned the encoded value in the API, rather than the actual
> value. Since we use the encoded value only for comparison, we need to
> return the original value instead of the encoded value.
>
> Signed-off-by: Stefan Hanreich <s.hanreich at proxmox.com>
> ---
> src/PVE/Network/SDN.pm | 120 ++++++++++++++++++++++++++++++-----------
> 1 file changed, 89 insertions(+), 31 deletions(-)
>
> diff --git a/src/PVE/Network/SDN.pm b/src/PVE/Network/SDN.pm
> index ef938c461d0a..391c6e26c7c7 100644
> --- a/src/PVE/Network/SDN.pm
> +++ b/src/PVE/Network/SDN.pm
> @@ -24,7 +24,9 @@ use PVE::Network::SDN::Dhcp;
> my $running_cfg = "sdn/.running-config";
>
> my $parse_running_cfg = sub {
> - my ($filename, $raw) = @_;
> + my (
> + $filename, $raw,
> + ) = @_;
>
> my $cfg = {};
>
> @@ -37,14 +39,18 @@ my $parse_running_cfg = sub {
> };
>
> my $write_running_cfg = sub {
> - my ($filename, $cfg) = @_;
> + my (
> + $filename, $cfg,
> + ) = @_;
>
> my $json = to_json($cfg);
>
> return $json;
> };
>
> -PVE::Cluster::cfs_register_file($running_cfg, $parse_running_cfg, $write_running_cfg);
> +PVE::Cluster::cfs_register_file(
> + $running_cfg, $parse_running_cfg, $write_running_cfg,
> +);
>
> # improve me : move status code inside plugins ?
>
> @@ -74,8 +80,12 @@ sub ifquery_check {
>
> sub status {
>
> - my ($zone_status, $vnet_status) = PVE::Network::SDN::Zones::status();
> - return ($zone_status, $vnet_status);
> + my (
> + $zone_status, $vnet_status,
> + ) = PVE::Network::SDN::Zones::status();
> + return (
> + $zone_status, $vnet_status,
> + );
> }
>
> sub running_config {
> @@ -83,7 +93,9 @@ sub running_config {
> }
>
> sub pending_config {
> - my ($running_cfg, $cfg, $type) = @_;
> + my (
> + $running_cfg, $cfg, $type,
> + ) = @_;
>
> my $pending = {};
>
> @@ -100,8 +112,12 @@ sub pending_config {
> } elsif (!defined($config_object->{$key})) {
> $pending->{$id}->{"pending"}->{$key} = 'deleted';
> $pending->{$id}->{state} = "changed";
> - } elsif (PVE::Network::SDN::encode_value(undef, $key, $running_object->{$key}) ne
> - PVE::Network::SDN::encode_value(undef, $key, $config_object->{$key})
> + } elsif (
> + PVE::Network::SDN::encode_value(
> + undef, $key, $running_object->{$key},
> + ) ne PVE::Network::SDN::encode_value(
> + undef, $key, $config_object->{$key},
> + )
> ) {
> $pending->{$id}->{state} = "changed";
> }
> @@ -115,18 +131,25 @@ sub pending_config {
> my $config_object = $config_objects->{$id};
>
> foreach my $key (sort keys %{$config_object}) {
> - my $config_value = PVE::Network::SDN::encode_value(undef, $key, $config_object->{$key});
> - my $running_value =
> - PVE::Network::SDN::encode_value(undef, $key, $running_object->{$key});
> + my $config_value = PVE::Network::SDN::encode_value(
> + undef, $key, $config_object->{$key},
> + );
> + my $running_value = PVE::Network::SDN::encode_value(
> + undef, $key, $running_object->{$key},
> + );
> if ($key eq 'type' || $key eq 'vnet') {
> $pending->{$id}->{$key} = $config_value;
> } else {
> - $pending->{$id}->{"pending"}->{$key} = $config_value
> - if !defined($running_value) || ($config_value ne $running_value);
> + $pending->{$id}->{"pending"}->{$key} = $config_object->{$key}
> + if !defined($running_value)
> + || ($config_value ne $running_value);
> }
> if (!keys %{$running_object}) {
> $pending->{$id}->{state} = "new";
> - } elsif (!defined($running_value) && defined($config_value)) {
> + } elsif (
> + !defined($running_value)
> + && defined($config_value)
> + ) {
> $pending->{$id}->{state} = "changed";
> }
> }
> @@ -134,7 +157,9 @@ sub pending_config {
> if $pending->{$id}->{state} && !defined($pending->{$id}->{"pending"});
> }
>
> - return { ids => $pending };
> + return {
> + ids => $pending,
> + };
>
> }
>
> @@ -167,13 +192,19 @@ sub commit_config {
> subnets => $subnets,
> };
>
> - cfs_write_file($running_cfg, $cfg);
> + cfs_write_file(
> + $running_cfg, $cfg,
> + );
> }
>
> sub lock_sdn_config {
> - my ($code, $errmsg) = @_;
> + my (
> + $code, $errmsg,
> + ) = @_;
>
> - cfs_lock_file($running_cfg, undef, $code);
> + cfs_lock_file(
> + $running_cfg, undef, $code,
> + );
>
> if (my $err = $@) {
> $errmsg ? die "$errmsg: $err" : die $err;
> @@ -198,16 +229,22 @@ sub get_local_vnets {
>
> foreach my $vnetid (@vnetids) {
>
> - my $vnet = PVE::Network::SDN::Vnets::sdn_vnets_config($vnets_cfg, $vnetid);
> + my $vnet = PVE::Network::SDN::Vnets::sdn_vnets_config(
> + $vnets_cfg, $vnetid,
> + );
> my $zoneid = $vnet->{zone};
> my $comments = $vnet->{alias};
>
> my $privs = ['SDN.Audit', 'SDN.Use'];
>
> next if !$zoneid;
> - next if !$rpcenv->check_sdn_bridge($authuser, $zoneid, $vnetid, $privs, 1);
> + next if !$rpcenv->check_sdn_bridge(
> + $authuser, $zoneid, $vnetid, $privs, 1,
> + );
>
> - my $zone_config = PVE::Network::SDN::Zones::sdn_zones_config($zones_cfg, $zoneid);
> + my $zone_config = PVE::Network::SDN::Zones::sdn_zones_config(
> + $zones_cfg, $zoneid,
> + );
>
> next if defined($zone_config->{nodes}) && !$zone_config->{nodes}->{$nodename};
> my $ipam = $zone_config->{ipam} ? 1 : 0;
> @@ -228,7 +265,9 @@ sub generate_zone_config {
> my $raw_config = PVE::Network::SDN::Zones::generate_etc_network_config();
> if ($raw_config) {
> eval {
> - my $net_cfg = PVE::INotify::read_file('interfaces', 1);
> + my $net_cfg = PVE::INotify::read_file(
> + 'interfaces', 1,
> + );
> my $opts = $net_cfg->{data}->{options};
> log_warn(
> "missing 'source /etc/network/interfaces.d/sdn' directive for SDN support!\n")
> @@ -255,13 +294,19 @@ sub generate_dhcp_config {
> }
>
> sub encode_value {
> - my ($type, $key, $value) = @_;
> + my (
> + $type, $key, $value,
> + ) = @_;
>
> if ($key eq 'nodes' || $key eq 'exitnodes' || $key eq 'dhcp-range') {
> if (ref($value) eq 'HASH') {
> - return join(',', sort keys(%$value));
> + return join(
> + ',', sort keys(%$value),
> + );
> } elsif (ref($value) eq 'ARRAY') {
> - return join(',', sort @$value);
> + return join(
> + ',', sort @$value,
> + );
> } else {
> return $value;
> }
> @@ -272,29 +317,42 @@ sub encode_value {
>
> #helpers
> sub api_request {
> - my ($method, $url, $headers, $data, $expected_fingerprint) = @_;
> + my (
> + $method, $url, $headers, $data, $expected_fingerprint,
> + ) = @_;
>
> my $encoded_data = $data ? to_json($data) : undef;
>
> - my $req = HTTP::Request->new($method, $url, $headers, $encoded_data);
> + my $req = HTTP::Request->new(
> + $method, $url, $headers, $encoded_data,
> + );
>
> - my $ua = LWP::UserAgent->new(protocols_allowed => ['http', 'https'], timeout => 30);
> + my $ua = LWP::UserAgent->new(
> + protocols_allowed => ['http', 'https'],
> + timeout => 30,
> + );
> my $datacenter_cfg = PVE::Cluster::cfs_read_file('datacenter.cfg');
> if (my $proxy = $datacenter_cfg->{http_proxy}) {
> - $ua->proxy(['http', 'https'], $proxy);
> + $ua->proxy(
> + ['http', 'https'], $proxy,
> + );
> } else {
> $ua->env_proxy;
> }
>
> if (defined($expected_fingerprint)) {
> my $ssl_verify_callback = sub {
> - my (undef, undef, undef, undef, $cert, $depth) = @_;
> + my (
> + undef, undef, undef, undef, $cert, $depth,
> + ) = @_;
>
> # we don't care about intermediate or root certificates, always return as valid as the
> # callback will be executed for all levels and all must be valid.
> return 1 if $depth != 0;
>
> - my $fingerprint = Net::SSLeay::X509_get_fingerprint($cert, 'sha256');
> + my $fingerprint = Net::SSLeay::X509_get_fingerprint(
> + $cert, 'sha256',
> + );
>
> return $fingerprint eq $expected_fingerprint ? 1 : 0;
> };
More information about the pve-devel
mailing list