]> git.proxmox.com Git - pve-network.git/commitdiff
sdn: fix : pending parser
authorAlexandre Derumier <aderumier@odiso.com>
Wed, 25 Nov 2020 09:01:39 +0000 (10:01 +0100)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Wed, 25 Nov 2020 11:04:00 +0000 (12:04 +0100)
PVE/API2/Network/SDN/Zones.pm
PVE/Network/SDN.pm
PVE/Network/SDN/Zones/Plugin.pm

index 5ae577b3840f9c5cc5a4db17b21cc3f8bc3c8dc0..5bbdd36ef18228b15af63a9f326a505e0bec3dfd 100644 (file)
@@ -38,12 +38,20 @@ my $api_sdn_zones_config = sub {
     $scfg->{digest} = $cfg->{digest};
 
     if ($scfg->{nodes}) {
-        $scfg->{nodes} = PVE::Network::SDN::Zones::Plugin->encode_value($scfg->{type}, 'nodes', $scfg->{nodes});
+        $scfg->{nodes} = PVE::Network::SDN::encode_value($scfg->{type}, 'nodes', $scfg->{nodes});
+    }
+
+    if ($scfg->{exitnodes}) {
+        $scfg->{exitnodes} = PVE::Network::SDN::encode_value($scfg->{type}, 'exitnodes', $scfg->{exitnodes});
     }
 
     my $pending = $scfg->{pending};
     if ($pending->{nodes}) {
-        $pending->{nodes} = PVE::Network::SDN::Zones::Plugin->encode_value($scfg->{type}, 'nodes', $pending->{nodes});
+        $pending->{nodes} = PVE::Network::SDN::encode_value($scfg->{type}, 'nodes', $pending->{nodes});
+    }
+
+    if ($pending->{exitnodes}) {
+        $pending->{exitnodes} = PVE::Network::SDN::encode_value($scfg->{type}, 'exitnodes', $pending->{exitnodes});
     }
 
     return $scfg;
index 3cd73ffb4b1615256e36df23fbe112582da3a3cb..c0c5672a1ffd38c6fea0348cb29e72f47c26632c 100644 (file)
@@ -6,6 +6,8 @@ use warnings;
 use Data::Dumper;
 use JSON;
 
+use PVE::JSONSchema;
+
 use PVE::Network::SDN::Vnets;
 use PVE::Network::SDN::Zones;
 use PVE::Network::SDN::Controllers;
@@ -96,7 +98,11 @@ sub pending_config {
            $pending->{$id}->{$key} = $running_object->{$key};
            if(!keys %{$config_object}) {
                $pending->{$id}->{state} = "deleted";
-           } elsif ($running_object->{$key} ne $config_object->{$key}) {
+           } 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})) {
                $pending->{$id}->{state} = "changed";
            }
        }
@@ -107,8 +113,8 @@ sub pending_config {
        my $config_object = $config_objects->{$id};
 
        foreach my $key (sort keys %{$config_object}) {
-           my $config_value = $config_object->{$key} if $config_object->{$key};
-           my $running_value = $running_object->{$key} if $running_object->{$key};
+           my $config_value = PVE::Network::SDN::encode_value(undef, $key, $config_object->{$key}) if $config_object->{$key};
+           my $running_value = PVE::Network::SDN::encode_value(undef, $key, $running_object->{$key}) if $running_object->{$key};
            if($key eq 'type' || $key eq 'vnet') {
                $pending->{$id}->{$key} = $config_value;
            } else {
@@ -210,5 +216,38 @@ sub generate_controller_config {
     PVE::Network::SDN::Controllers::reload_controller() if $reload;
 }
 
+
+sub decode_value {
+    my ($type, $key, $value) = @_;
+
+    if ($key eq 'nodes') {
+        my $res = {};
+
+        foreach my $node (PVE::Tools::split_list($value)) {
+            if (PVE::JSONSchema::pve_verify_node_name($node)) {
+                $res->{$node} = 1;
+            }
+        }
+
+        return $res;
+    }
+
+   return $value;
+}
+
+sub encode_value {
+    my ($type, $key, $value) = @_;
+
+    if ($key eq 'nodes' || $key eq 'exitnodes') {
+        if(ref($value) eq 'HASH') {
+            return join(',', sort keys(%$value));
+        } else {
+            return $value;
+        }
+    }
+
+    return $value;
+}
+
 1;
 
index 8592e3cc0a36a8c4d6ddac2d2fffb3837c20aa04..ebb5c7ec7e1fdfc2227534e53f5f1f3455786564 100644 (file)
@@ -55,34 +55,6 @@ sub private {
     return $defaultData;
 }
 
-sub decode_value {
-    my ($class, $type, $key, $value) = @_;
-
-    if ($key eq 'nodes') {
-        my $res = {};
-
-        foreach my $node (PVE::Tools::split_list($value)) {
-            if (PVE::JSONSchema::pve_verify_node_name($node)) {
-                $res->{$node} = 1;
-            }
-        }
-
-        return $res;
-    }
-
-   return $value;
-}
-
-sub encode_value {
-    my ($class, $type, $key, $value) = @_;
-
-    if ($key eq 'nodes') {
-        return join(',', keys(%$value));
-    }
-
-    return $value;
-}
-
 sub parse_section_header {
     my ($class, $line) = @_;