Zones previously expected a complete config, but the API schema
also contains a 'delete' parameter via the SectionConfig's
updateSchema() helper. This was not handled, and instead failed to
validate as part of the config.

The same is true for vnets and subnets, while ipams, dns and
controller entries followed our usual update procedures (but also
ignored the 'delete' parameter).

Since all of our SectionConfig based API endpoints are supposed to
take changes, rather than complete configs, this changes these
endpoints to not replace the full configuration anymore.

This is a major break for automation tools (the web UI already passed
the full config each time).

Cc: Alexandre Derumier <aderum...@odiso.com>
Signed-off-by: Wolfgang Bumiller <w.bumil...@proxmox.com>
---
 src/PVE/API2/Network/SDN/Zones.pm | 18 +++++++++++++++---
 1 file changed, 15 insertions(+), 3 deletions(-)

diff --git a/src/PVE/API2/Network/SDN/Zones.pm 
b/src/PVE/API2/Network/SDN/Zones.pm
index 1c3356e..b09c9ad 100644
--- a/src/PVE/API2/Network/SDN/Zones.pm
+++ b/src/PVE/API2/Network/SDN/Zones.pm
@@ -261,6 +261,11 @@ __PACKAGE__->register_method ({
 
        my $id = extract_param($param, 'zone');
        my $digest = extract_param($param, 'digest');
+       my $delete = extract_param($param, 'delete');
+
+       if ($delete) {
+           $delete = [ PVE::Tools::split_list($delete) ];
+       }
 
        PVE::Network::SDN::lock_sdn_config(sub {
            my $zone_cfg = PVE::Network::SDN::Zones::config();
@@ -274,8 +279,17 @@ __PACKAGE__->register_method ({
            my $plugin = 
PVE::Network::SDN::Zones::Plugin->lookup($scfg->{type});
            my $opts = $plugin->check_config($id, $param, 0, 1);
 
-           if ($opts->{ipam} && !$scfg->{ipam} || $opts->{ipam} ne 
$scfg->{ipam}) {
+           my $old_ipam = $scfg->{ipam};
+
+           if ($delete) {
+               my $options = $plugin->private()->{options}->{$scfg->{type}};
+               PVE::SectionConfig::delete_from_config($scfg, $options, $opts, 
$delete);
+           }
 
+           $scfg->{$_} = $opts->{$_} for keys $opts->%*;
+
+           my $new_ipam = $scfg->{ipam};
+           if (!$new_ipam != !$old_ipam || (($new_ipam//'') ne 
($old_ipam//''))) {
                # don't allow ipam change if subnet are defined for now, need 
to implement resync ipam content
                my $subnets_cfg = PVE::Network::SDN::Subnets::config();
                for my $subnetid (sort keys %{$subnets_cfg->{ids}}) {
@@ -285,8 +299,6 @@ __PACKAGE__->register_method ({
                }
            }
 
-           $zone_cfg->{ids}->{$id} = $opts;
-
            my $dnsserver = $opts->{dns};
            raise_param_exc({ dns => "$dnsserver don't exist"}) if $dnsserver 
&& !$dns_cfg->{ids}->{$dnsserver};
 
-- 
2.39.2



_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to