[pve-devel] [PATCH pve-network 2/4] sdn: use .version and global lock

Alexandre Derumier aderumier at odiso.com
Mon Apr 13 08:20:41 CEST 2020


---
 PVE/API2/Network/SDN/Controllers.pm | 14 +++++++--
 PVE/API2/Network/SDN/Vnets.pm       | 14 +++++++--
 PVE/API2/Network/SDN/Zones.pm       | 13 ++++++--
 PVE/Network/SDN.pm                  | 46 +++++++++++++++++++++++++++++
 PVE/Network/SDN/Vnets.pm            |  9 ------
 PVE/Network/SDN/Zones.pm            |  9 ------
 6 files changed, 78 insertions(+), 27 deletions(-)

diff --git a/PVE/API2/Network/SDN/Controllers.pm b/PVE/API2/Network/SDN/Controllers.pm
index 50491eb..0f8dcbe 100644
--- a/PVE/API2/Network/SDN/Controllers.pm
+++ b/PVE/API2/Network/SDN/Controllers.pm
@@ -6,6 +6,7 @@ use warnings;
 use PVE::SafeSyslog;
 use PVE::Tools qw(extract_param);
 use PVE::Cluster qw(cfs_read_file cfs_write_file);
+use PVE::Network::SDN;
 use PVE::Network::SDN::Zones;
 use PVE::Network::SDN::Controllers;
 use PVE::Network::SDN::Controllers::Plugin;
@@ -136,7 +137,7 @@ __PACKAGE__->register_method ({
         PVE::Cluster::check_cfs_quorum();
         mkdir("/etc/pve/sdn");
 
-        PVE::Network::SDN::Controllers::lock_sdn_controllers_config(
+        PVE::Network::SDN::lock_sdn_config(
 	    sub {
 
 		my $controller_cfg = PVE::Network::SDN::Controllers::config();
@@ -151,6 +152,8 @@ __PACKAGE__->register_method ({
 
 		PVE::Network::SDN::Controllers::write_config($controller_cfg);
 
+		PVE::Network::SDN::increase_version();
+
 	    }, "create sdn controller object failed");
 
 	return undef;
@@ -173,7 +176,7 @@ __PACKAGE__->register_method ({
 	my $id = extract_param($param, 'controller');
 	my $digest = extract_param($param, 'digest');
 
-        PVE::Network::SDN::Controllers::lock_sdn_controllers_config(
+        PVE::Network::SDN::lock_sdn_config(
 	 sub {
 
 	    my $controller_cfg = PVE::Network::SDN::Controllers::config();
@@ -193,6 +196,9 @@ __PACKAGE__->register_method ({
 
 	    PVE::Network::SDN::Controllers::write_config($controller_cfg);
 
+	    PVE::Network::SDN::increase_version();
+
+
 	    }, "update sdn controller object failed");
 
 	return undef;
@@ -221,7 +227,7 @@ __PACKAGE__->register_method ({
 
 	my $id = extract_param($param, 'controller');
 
-        PVE::Network::SDN::Controllers::lock_sdn_controllers_config(
+        PVE::Network::SDN::lock_sdn_config(
 	    sub {
 
 		my $cfg = PVE::Network::SDN::Controllers::config();
@@ -237,6 +243,8 @@ __PACKAGE__->register_method ({
 		delete $cfg->{ids}->{$id};
 		PVE::Network::SDN::Controllers::write_config($cfg);
 
+		PVE::Network::SDN::increase_version();
+
 	    }, "delete sdn controller object failed");
 
 
diff --git a/PVE/API2/Network/SDN/Vnets.pm b/PVE/API2/Network/SDN/Vnets.pm
index a9561f1..8f70bab 100644
--- a/PVE/API2/Network/SDN/Vnets.pm
+++ b/PVE/API2/Network/SDN/Vnets.pm
@@ -6,6 +6,7 @@ use warnings;
 use PVE::SafeSyslog;
 use PVE::Tools qw(extract_param);
 use PVE::Cluster qw(cfs_read_file cfs_write_file);
+use PVE::Network::SDN;
 use PVE::Network::SDN::Vnets;
 use PVE::Network::SDN::VnetPlugin;
 
@@ -116,7 +117,7 @@ __PACKAGE__->register_method ({
         PVE::Cluster::check_cfs_quorum();
         mkdir("/etc/pve/sdn");
 
-        PVE::Network::SDN::Vnets::lock_sdn_vnets_config(
+        PVE::Network::SDN::lock_sdn_config(
 	    sub {
 
 		my $cfg = PVE::Network::SDN::Vnets::config();
@@ -132,6 +133,9 @@ __PACKAGE__->register_method ({
 
 		PVE::Network::SDN::Vnets::write_config($cfg);
 
+		PVE::Network::SDN::increase_version();
+
+
 	    }, "create sdn vnet object failed");
 
 	return undef;
@@ -154,7 +158,7 @@ __PACKAGE__->register_method ({
 	my $id = extract_param($param, 'vnet');
 	my $digest = extract_param($param, 'digest');
 
-        PVE::Network::SDN::Vnets::lock_sdn_vnets_config(
+        PVE::Network::SDN::lock_sdn_config(
 	 sub {
 
 	    my $cfg = PVE::Network::SDN::Vnets::config();
@@ -168,6 +172,8 @@ __PACKAGE__->register_method ({
 
 	    PVE::Network::SDN::Vnets::write_config($cfg);
 
+	    PVE::Network::SDN::increase_version();
+
 	    }, "update sdn vnet object failed");
 
 	return undef;
@@ -196,7 +202,7 @@ __PACKAGE__->register_method ({
 
 	my $id = extract_param($param, 'vnet');
 
-        PVE::Network::SDN::Vnets::lock_sdn_vnets_config(
+        PVE::Network::SDN::lock_sdn_config(
 	    sub {
 
 		my $cfg = PVE::Network::SDN::Vnets::config();
@@ -210,6 +216,8 @@ __PACKAGE__->register_method ({
 		delete $cfg->{ids}->{$id};
 		PVE::Network::SDN::Vnets::write_config($cfg);
 
+		PVE::Network::SDN::increase_version();
+
 	    }, "delete sdn vnet object failed");
 
 
diff --git a/PVE/API2/Network/SDN/Zones.pm b/PVE/API2/Network/SDN/Zones.pm
index 9ea2189..3201b10 100644
--- a/PVE/API2/Network/SDN/Zones.pm
+++ b/PVE/API2/Network/SDN/Zones.pm
@@ -6,6 +6,7 @@ use warnings;
 use PVE::SafeSyslog;
 use PVE::Tools qw(extract_param);
 use PVE::Cluster qw(cfs_read_file cfs_write_file);
+use PVE::Network::SDN;
 use PVE::Network::SDN::Vnets;
 use PVE::Network::SDN::Zones;
 use PVE::Network::SDN::Zones::Plugin;
@@ -143,7 +144,7 @@ __PACKAGE__->register_method ({
         PVE::Cluster::check_cfs_quorum();
         mkdir("/etc/pve/sdn");
 
-        PVE::Network::SDN::Zones::lock_sdn_zones_config(
+        PVE::Network::SDN::lock_sdn_config(
 	    sub {
 
 		my $zone_cfg = PVE::Network::SDN::Zones::config();
@@ -159,6 +160,8 @@ __PACKAGE__->register_method ({
 
 		PVE::Network::SDN::Zones::write_config($zone_cfg);
 
+		PVE::Network::SDN::increase_version();
+
 	    }, "create sdn zone object failed");
 
 	return undef;
@@ -181,7 +184,7 @@ __PACKAGE__->register_method ({
 	my $id = extract_param($param, 'zone');
 	my $digest = extract_param($param, 'digest');
 
-        PVE::Network::SDN::Zones::lock_sdn_zones_config(
+        PVE::Network::SDN::lock_sdn_config(
 	 sub {
 
 	    my $zone_cfg = PVE::Network::SDN::Zones::config();
@@ -202,6 +205,8 @@ __PACKAGE__->register_method ({
 
 	    PVE::Network::SDN::Zones::write_config($zone_cfg);
 
+	    PVE::Network::SDN::increase_version();
+
 	    }, "update sdn zone object failed");
 
 	return undef;
@@ -230,7 +235,7 @@ __PACKAGE__->register_method ({
 
 	my $id = extract_param($param, 'zone');
 
-        PVE::Network::SDN::Zones::lock_sdn_zones_config(
+        PVE::Network::SDN::lock_sdn_config(
 	    sub {
 
 		my $cfg = PVE::Network::SDN::Zones::config();
@@ -246,6 +251,8 @@ __PACKAGE__->register_method ({
 		delete $cfg->{ids}->{$id};
 		PVE::Network::SDN::Zones::write_config($cfg);
 
+		PVE::Network::SDN::increase_version();
+
 	    }, "delete sdn zone object failed");
 
 
diff --git a/PVE/Network/SDN.pm b/PVE/Network/SDN.pm
index 2b423a7..108a1ab 100644
--- a/PVE/Network/SDN.pm
+++ b/PVE/Network/SDN.pm
@@ -12,6 +12,28 @@ use PVE::Network::SDN::Zones;
 use PVE::Tools qw(extract_param dir_glob_regex run_command);
 use PVE::Cluster qw(cfs_read_file cfs_write_file cfs_lock_file);
 
+
+my $version_cfg = "sdn/.version";
+
+my $parse_version_cfg = sub {
+    my ($filename, $raw) = @_;
+
+    warn "invalid sdn version" if $raw !~ m/\d+$/;
+
+    return $raw,
+};
+
+my $write_version_cfg = sub {
+    my ($filename, $version) = @_;
+
+    warn "invalid sdn version" if $version !~ m/\d+$/;
+
+    return $version;
+};
+
+PVE::Cluster::cfs_register_file($version_cfg, $parse_version_cfg, $write_version_cfg);
+
+
 # improve me : move status code inside plugins ?
 
 sub ifquery_check {
@@ -46,6 +68,30 @@ sub status {
     return($zone_status, $vnet_status);
 }
 
+
+sub increase_version {
+
+    my $version = cfs_read_file($version_cfg);
+
+    if($version) {
+	$version++;
+    } else {
+	$version = 1;
+    }
+
+    cfs_write_file($version_cfg, $version);
+}
+
+sub lock_sdn_config {
+    my ($code, $errmsg) = @_;
+
+    cfs_lock_file($version_cfg, undef, $code);
+
+    if (my $err = $@) {
+        $errmsg ? die "$errmsg: $err" : die $err;
+    }
+}
+
 sub get_local_vnets {
 
     my $rpcenv = PVE::RPCEnvironment::get();
diff --git a/PVE/Network/SDN/Vnets.pm b/PVE/Network/SDN/Vnets.pm
index ef698e8..97814e6 100644
--- a/PVE/Network/SDN/Vnets.pm
+++ b/PVE/Network/SDN/Vnets.pm
@@ -31,15 +31,6 @@ sub write_config {
     cfs_write_file("sdn/vnets.cfg", $cfg);
 }
 
-sub lock_sdn_vnets_config {
-    my ($code, $errmsg) = @_;
-
-    cfs_lock_file("sdn/vnets.cfg", undef, $code);
-    if (my $err = $@) {
-        $errmsg ? die "$errmsg: $err" : die $err;
-    }
-}
-
 sub sdn_vnets_ids {
     my ($cfg) = @_;
 
diff --git a/PVE/Network/SDN/Zones.pm b/PVE/Network/SDN/Zones.pm
index 9791494..8f12976 100644
--- a/PVE/Network/SDN/Zones.pm
+++ b/PVE/Network/SDN/Zones.pm
@@ -55,15 +55,6 @@ sub write_config {
     cfs_write_file("sdn/zones.cfg", $cfg);
 }
 
-sub lock_sdn_zones_config {
-    my ($code, $errmsg) = @_;
-
-    cfs_lock_file("sdn/zones.cfg", undef, $code);
-    if (my $err = $@) {
-        $errmsg ? die "$errmsg: $err" : die $err;
-    }
-}
-
 sub sdn_zones_ids {
     my ($cfg) = @_;
 
-- 
2.20.1




More information about the pve-devel mailing list