snapshot_apply_config, snapshot_prepare and snapshot_commit
like in QemuServer.pm
---
 src/PVE/LXC.pm | 53 ++++++++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 42 insertions(+), 11 deletions(-)

diff --git a/src/PVE/LXC.pm b/src/PVE/LXC.pm
index 2aaa6a7..b393d10 100644
--- a/src/PVE/LXC.pm
+++ b/src/PVE/LXC.pm
@@ -1743,11 +1743,35 @@ my $snapshot_copy_config = sub {
        next if $k eq 'lock';
        next if $k eq 'digest';
        next if $k eq 'description';
+       next if $k =~ m/^unused\d+$/;
 
        $dest->{$k} = $source->{$k};
     }
 };
 
+my $snapshot_apply_config = sub {
+    my ($conf, $snap) = @_;
+
+    # copy snapshot list
+    my $newconf = {
+       snapshots => $conf->{snapshots},
+    };
+
+    # keep description and list of unused disks
+    foreach my $k (keys %$conf) {
+       next if !($k =~ m/^unused\d+$/ || $k eq 'description');
+       $newconf->{$k} = $conf->{$k};
+    }
+
+    &$snapshot_copy_config($snap, $newconf);
+
+    return $newconf;
+};
+
+my $snapshot_save_vmstate = sub {
+    die "implement me - snapshot_save_vmstate\n";
+};
+
 sub snapshot_prepare {
     my ($vmid, $snapname, $save_vmstate, $comment) = @_;
 
@@ -1768,17 +1792,22 @@ sub snapshot_prepare {
            if defined($conf->{snapshots}->{$snapname});
 
        my $storecfg = PVE::Storage::config();
+
+       # workaround until mp snapshots are implemented
        my $feature = $snapname eq 'vzdump' ? 'vzdump' : 'snapshot';
        die "snapshot feature is not available\n" if !has_feature($feature, 
$conf, $storecfg);
 
        $snap = $conf->{snapshots}->{$snapname} = {};
 
+       if ($save_vmstate && check_running($vmid)) {
+           &$snapshot_save_vmstate($vmid, $conf, $snapname, $storecfg);
+       }
+
        &$snapshot_copy_config($conf, $snap);
 
-       $snap->{'snapstate'} = "prepare";
-       $snap->{'snaptime'} = time();
-       $snap->{'description'} = $comment if $comment;
-       $conf->{snapshots}->{$snapname} = $snap;
+       $snap->{snapstate} = "prepare";
+       $snap->{snaptime} = time();
+       $snap->{description} = $comment if $comment;
 
        write_config($vmid, $conf);
     };
@@ -1798,18 +1827,20 @@ sub snapshot_commit {
        die "missing snapshot lock\n"
            if !($conf->{lock} && $conf->{lock} eq 'snapshot');
 
-       die "snapshot '$snapname' does not exist\n"
-           if !defined($conf->{snapshots}->{$snapname});
+       my $snap = $conf->{snapshots}->{$snapname};
+       die "snapshot '$snapname' does not exist\n" if !defined($snap);
 
        die "wrong snapshot state\n"
-           if !($conf->{snapshots}->{$snapname}->{'snapstate'} && 
-                $conf->{snapshots}->{$snapname}->{'snapstate'} eq "prepare");
+           if !($snap->{snapstate} && $snap->{snapstate} eq "prepare");
 
-       delete $conf->{snapshots}->{$snapname}->{'snapstate'};
+       delete $snap->{snapstate};
        delete $conf->{lock};
-       $conf->{parent} = $snapname;
 
-       write_config($vmid, $conf);
+       my $newconf = &$snapshot_apply_config($conf, $snap);
+
+       $newconf->{parent} = $snapname;
+
+       write_config($vmid, $newconf);
     };
 
     lock_config($vmid, $updatefn);
-- 
2.1.4


_______________________________________________
pve-devel mailing list
pve-devel@pve.proxmox.com
http://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to