some functions from Qemu w.r.t. pending changes can be moved to AbstractConfig, in order to make them available for both QemuConfig and LXC::Config.
Signed-off-by: Oguz Bektas <o.bek...@proxmox.com> --- PVE/AbstractConfig.pm | 79 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/PVE/AbstractConfig.pm b/PVE/AbstractConfig.pm index e0d0f10..18522b9 100644 --- a/PVE/AbstractConfig.pm +++ b/PVE/AbstractConfig.pm @@ -68,6 +68,85 @@ sub write_config { PVE::Cluster::cfs_write_file($cfspath, $conf); } +## Pending changes related + +sub split_flagged_list { + my ($class, $text) = @_; + $text ||= ''; + $text =~ s/[,;]/ /g; + $text =~ s/^\s+//; + return { map { /^(!?)(.*)$/ && ($2, $1) } ($text =~ /\S+/g) }; +} + +sub join_flagged_list { + my ($class, $how, $lst) = @_; + join $how, map { $lst->{$_} . $_ } keys %$lst; +} + +sub vmconfig_delete_pending_option { + my ($class, $conf, $key, $force) = @_; + + delete $conf->{pending}->{$key}; + my $pending_delete_hash = $class->split_flagged_list($conf->{pending}->{delete}); + $pending_delete_hash->{$key} = $force ? '!' : ''; + $conf->{pending}->{delete} = $class->join_flagged_list(',', $pending_delete_hash); +} + +sub vmconfig_undelete_pending_option { + my ($class, $conf, $key) = @_; + + my $pending_delete_hash = $class->split_flagged_list($conf->{pending}->{delete}); + delete $pending_delete_hash->{$key}; + + if (%$pending_delete_hash) { + $conf->{pending}->{delete} = $class->join_flagged_list(',', $pending_delete_hash); + } else { + delete $conf->{pending}->{delete}; + } +} + +sub vmconfig_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->split_flagged_list($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->join_flagged_list(',', $pending_delete_hash); + } else { + delete $conf->{pending}->{delete}; + } + + return $changes; +} + +sub vmconfig_hotplug_pending { + my ($class, $vmid, $conf, $storecfg, $selection, $errors) = @_; + die "implement me - abstract method\n"; +} + +sub vmconfig_apply_pending { + my ($class, $vmid, $conf, $storecfg) = @_; + die "implement me - abstract method\n"; +} + + # 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 _______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel