mirror of
https://git.proxmox.com/git/qemu-server
synced 2025-08-15 19:02:44 +00:00
copy_vm: allow to copy from snapshot
This commit is contained in:
parent
4e4f83fea0
commit
9076d880a8
@ -1742,7 +1742,6 @@ __PACKAGE__->register_method({
|
|||||||
optional => 1,
|
optional => 1,
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
|
|
||||||
},
|
},
|
||||||
returns => {
|
returns => {
|
||||||
type => 'boolean'
|
type => 'boolean'
|
||||||
@ -1807,6 +1806,10 @@ __PACKAGE__->register_method({
|
|||||||
type => 'string', format => 'pve-poolid',
|
type => 'string', format => 'pve-poolid',
|
||||||
description => "Add the new VM to the specified pool.",
|
description => "Add the new VM to the specified pool.",
|
||||||
},
|
},
|
||||||
|
snapname => get_standard_option('pve-snapshot-name', {
|
||||||
|
requires => 'full',
|
||||||
|
optional => 1,
|
||||||
|
}),
|
||||||
storage => get_standard_option('pve-storage-id', {
|
storage => get_standard_option('pve-storage-id', {
|
||||||
description => "Target storage for full copy.",
|
description => "Target storage for full copy.",
|
||||||
requires => 'full',
|
requires => 'full',
|
||||||
@ -1844,6 +1847,8 @@ __PACKAGE__->register_method({
|
|||||||
$rpcenv->check_pool_exist($pool);
|
$rpcenv->check_pool_exist($pool);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
my $snapname = extract_param($param, 'snapname');
|
||||||
|
|
||||||
my $storage = extract_param($param, 'storage');
|
my $storage = extract_param($param, 'storage');
|
||||||
|
|
||||||
my $storecfg = PVE::Storage::config();
|
my $storecfg = PVE::Storage::config();
|
||||||
@ -1872,9 +1877,12 @@ __PACKAGE__->register_method({
|
|||||||
|
|
||||||
die "unexpected state change\n" if $verify_running != $running;
|
die "unexpected state change\n" if $verify_running != $running;
|
||||||
|
|
||||||
&$check_storage_access_copy($rpcenv, $authuser, $storecfg, $conf, $storage);
|
die "snapshot '$snapname' does not exist\n"
|
||||||
|
if $snapname && !defined( $conf->{snapshots}->{$snapname});
|
||||||
|
|
||||||
# fixme: snapshots??
|
my $oldconf = $snapname ? $conf->{snapshots}->{$snapname} : $conf;
|
||||||
|
|
||||||
|
&$check_storage_access_copy($rpcenv, $authuser, $storecfg, $oldconf, $storage);
|
||||||
|
|
||||||
my $conffile = PVE::QemuServer::config_file($newid);
|
my $conffile = PVE::QemuServer::config_file($newid);
|
||||||
|
|
||||||
@ -1893,10 +1901,13 @@ __PACKAGE__->register_method({
|
|||||||
my $newconf = { lock => 'copy' };
|
my $newconf = { lock => 'copy' };
|
||||||
my $drives = {};
|
my $drives = {};
|
||||||
my $vollist = [];
|
my $vollist = [];
|
||||||
foreach my $opt (keys %$conf) {
|
|
||||||
my $value = $conf->{$opt};
|
|
||||||
|
|
||||||
next if $opt eq 'snapshots'; # do not copy snapshot info
|
foreach my $opt (keys %$oldconf) {
|
||||||
|
my $value = $oldconf->{$opt};
|
||||||
|
|
||||||
|
# do not copy snapshot related info
|
||||||
|
next if $opt eq 'snapshots' || $opt eq 'parent' || $opt eq 'snaptime' ||
|
||||||
|
$opt eq 'vmstate' || $opt eq 'snapstate';
|
||||||
|
|
||||||
# always change MAC! address
|
# always change MAC! address
|
||||||
if ($opt =~ m/^net(\d+)$/) {
|
if ($opt =~ m/^net(\d+)$/) {
|
||||||
@ -1941,7 +1952,7 @@ __PACKAGE__->register_method({
|
|||||||
print "copy drive $opt ($drive->{file})\n";
|
print "copy drive $opt ($drive->{file})\n";
|
||||||
$newvolid = PVE::Storage::vdisk_alloc($storecfg, $storeid, $newid, $fmt, undef, ($size/1024));
|
$newvolid = PVE::Storage::vdisk_alloc($storecfg, $storeid, $newid, $fmt, undef, ($size/1024));
|
||||||
|
|
||||||
PVE::QemuServer::qemu_img_convert($drive->{file}, $newvolid, $size);
|
PVE::QemuServer::qemu_img_convert($drive->{file}, $newvolid, $size, $snapname);
|
||||||
}
|
}
|
||||||
|
|
||||||
my ($size) = PVE::Storage::volume_size_info($storecfg, $newvolid, 3);
|
my ($size) = PVE::Storage::volume_size_info($storecfg, $newvolid, 3);
|
||||||
|
Loading…
Reference in New Issue
Block a user