[pve-devel] [PATCH v2 guest-common 01/18] refactor pending changes related config code into AbstractConfig
Oguz Bektas
o.bektas at proxmox.com
Mon Sep 30 14:44:33 CEST 2019
also use a better naming scheme for methods:
split_flagged_list -> parse_pending_delete
join_flagged_list -> print_pending_delete
vmconfig_delete_pending_option -> add_to_pending_delete
vmconfig_undelete_pending_option -> remove_from_pending_delete
vmconfig_cleanup_pending -> cleanup_pending
Signed-off-by: Oguz Bektas <o.bektas at proxmox.com>
---
PVE/AbstractConfig.pm | 68 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 68 insertions(+)
diff --git a/PVE/AbstractConfig.pm b/PVE/AbstractConfig.pm
index e0d0f10..910ca86 100644
--- a/PVE/AbstractConfig.pm
+++ b/PVE/AbstractConfig.pm
@@ -68,6 +68,74 @@ sub write_config {
PVE::Cluster::cfs_write_file($cfspath, $conf);
}
+# Pending changes related
+
+sub parse_pending_delete {
+ my ($class, $text) = @_;
+ $text ||= '';
+ $text =~ s/[,;]/ /g;
+ $text =~ s/^\s+//;
+ return { map { /^(!?)(.*)$/ && ($2, $1) } ($text =~ /\S+/g) };
+}
+
+sub print_pending_delete {
+ my ($class, $how, $lst) = @_;
+ join $how, map { $lst->{$_} . $_ } keys %$lst;
+}
+
+sub add_to_pending_delete {
+ my ($class, $conf, $key, $force) = @_;
+
+ delete $conf->{pending}->{$key};
+ my $pending_delete_hash = $class->parse_pending_delete($conf->{pending}->{delete});
+ $pending_delete_hash->{$key} = $force ? '!' : '';
+ $conf->{pending}->{delete} = $class->print_pending_delete(',', $pending_delete_hash);
+}
+
+sub remove_from_pending_delete {
+ my ($class, $conf, $key) = @_;
+
+ my $pending_delete_hash = $class->parse_pending_delete($conf->{pending}->{delete});
+ delete $pending_delete_hash->{$key};
+
+ if (%$pending_delete_hash) {
+ $conf->{pending}->{delete} = $class->print_pending_delete(',', $pending_delete_hash);
+ } else {
+ delete $conf->{pending}->{delete};
+ }
+}
+
+sub cleanup_pending {
+ my ($class, $conf) = @_;
+
+ # remove pending changes when nothing changed
+ my $changes;
+ foreach my $opt (keys %{$conf->{pending}}) {
+ if (defined($conf->{$opt}) && ($conf->{pending}->{$opt} eq $conf->{$opt})) {
+ $changes = 1;
+ delete $conf->{pending}->{$opt};
+ }
+ }
+
+ my $current_delete_hash = $class->parse_pending_delete($conf->{pending}->{delete});
+ my $pending_delete_hash = {};
+ while (my ($opt, $force) = each %$current_delete_hash) {
+ if (defined($conf->{$opt})) {
+ $pending_delete_hash->{$opt} = $force;
+ } else {
+ $changes = 1;
+ }
+ }
+
+ if (%$pending_delete_hash) {
+ $conf->{pending}->{delete} = $class->print_pending_delete(',', $pending_delete_hash);
+ } else {
+ delete $conf->{pending}->{delete};
+ }
+
+ return $changes;
+}
+
# Lock config file using flock, run $code with @param, unlock config file.
# $timeout is the maximum time to aquire the flock
sub lock_config_full {
--
2.20.1
More information about the pve-devel
mailing list