[pve-devel] [PATCH guest-common 1/2] move pending changes related functions into AbstractConfig

Oguz Bektas o.bektas at proxmox.com
Wed Sep 4 18:00:01 CEST 2019


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.bektas at 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




More information about the pve-devel mailing list