From 810ee08809ff7cb2278919998b3951dcbb0786ab Mon Sep 17 00:00:00 2001 From: Oguz Bektas Date: Mon, 14 Oct 2019 10:28:33 +0200 Subject: [PATCH] abstractconfig: add pending changes related helpers use a better naming scheme for methods from qemuserver: 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 parse_pending_delete now has a better representation of the force value, which is encoded in a perl hash i.e. $conf->{$opt}->{force} = 1 or 0 depending on if the string in config has '!' or not. Signed-off-by: Oguz Bektas --- PVE/AbstractConfig.pm | 69 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/PVE/AbstractConfig.pm b/PVE/AbstractConfig.pm index 26235fa..8558692 100644 --- a/PVE/AbstractConfig.pm +++ b/PVE/AbstractConfig.pm @@ -68,6 +68,75 @@ sub write_config { PVE::Cluster::cfs_write_file($cfspath, $conf); } +# Pending changes related + +sub parse_pending_delete { + my ($class, $data) = @_; + $data ||= ''; + $data =~ s/[,;]/ /g; + $data =~ s/^\s+//; + return { map { /^(!?)(.*)$/ && ($2, { 'force' => $1 eq '!' ? 1 : 0 } ) } ($data =~ /\S+/g) }; +} + +sub print_pending_delete { + my ($class, $delete_hash) = @_; + join ",", map { ( $delete_hash->{$_}->{force} ? '!' : '' ) . $_ } keys %$delete_hash; +} + +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} = $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}}) { + next if $opt eq 'delete'; # just to be sure + 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.39.2