mirror of
https://git.proxmox.com/git/qemu-server
synced 2025-04-28 17:37:36 +00:00
split snapshot into separate methods.
We also start background tasks now. I also removed the 'digest'and 'force' parameters, because I think we do not need them here.
This commit is contained in:
parent
22c377f0b7
commit
7e7d7b6113
179
PVE/API2/Qemu.pm
179
PVE/API2/Qemu.pm
@ -456,6 +456,8 @@ __PACKAGE__->register_method({
|
|||||||
{ subdir => 'rrd' },
|
{ subdir => 'rrd' },
|
||||||
{ subdir => 'rrddata' },
|
{ subdir => 'rrddata' },
|
||||||
{ subdir => 'monitor' },
|
{ subdir => 'monitor' },
|
||||||
|
{ subdir => 'snapshot' },
|
||||||
|
{ subdir => 'rollback' },
|
||||||
];
|
];
|
||||||
|
|
||||||
return $res;
|
return $res;
|
||||||
@ -1884,9 +1886,49 @@ __PACKAGE__->register_method({
|
|||||||
}});
|
}});
|
||||||
|
|
||||||
__PACKAGE__->register_method({
|
__PACKAGE__->register_method({
|
||||||
name => 'snapshot_vm',
|
name => 'snapshot_list',
|
||||||
path => '{vmid}/snapshot',
|
path => '{vmid}/snapshot',
|
||||||
method => 'PUT',
|
method => 'GET',
|
||||||
|
description => "List all snapshots.",
|
||||||
|
permissions => {
|
||||||
|
check => ['perm', '/vms/{vmid}', [ 'VM.Audit' ]],
|
||||||
|
},
|
||||||
|
proxyto => 'node',
|
||||||
|
protected => 1, # qemu pid files are only readable by root
|
||||||
|
parameters => {
|
||||||
|
additionalProperties => 0,
|
||||||
|
properties => {
|
||||||
|
vmid => get_standard_option('pve-vmid'),
|
||||||
|
node => get_standard_option('pve-node'),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
returns => {
|
||||||
|
type => 'array',
|
||||||
|
items => {
|
||||||
|
type => "object",
|
||||||
|
properties => {},
|
||||||
|
},
|
||||||
|
links => [ { rel => 'child', href => "{name}" } ],
|
||||||
|
},
|
||||||
|
code => sub {
|
||||||
|
my ($param) = @_;
|
||||||
|
|
||||||
|
my $conf = PVE::QemuServer::load_config($param->{vmid});
|
||||||
|
my $snaphash = $conf->{snapshots} || {};
|
||||||
|
|
||||||
|
my $res = [];
|
||||||
|
|
||||||
|
foreach my $name (keys %$snaphash) {
|
||||||
|
push @$res, { name => $name };
|
||||||
|
}
|
||||||
|
|
||||||
|
return $res;
|
||||||
|
}});
|
||||||
|
|
||||||
|
__PACKAGE__->register_method({
|
||||||
|
name => 'snapshot',
|
||||||
|
path => '{vmid}/snapshot',
|
||||||
|
method => 'POST',
|
||||||
protected => 1,
|
protected => 1,
|
||||||
proxyto => 'node',
|
proxyto => 'node',
|
||||||
description => "Snapshot a VM.",
|
description => "Snapshot a VM.",
|
||||||
@ -1898,12 +1940,6 @@ __PACKAGE__->register_method({
|
|||||||
properties => {
|
properties => {
|
||||||
node => get_standard_option('pve-node'),
|
node => get_standard_option('pve-node'),
|
||||||
vmid => get_standard_option('pve-vmid'),
|
vmid => get_standard_option('pve-vmid'),
|
||||||
skiplock => get_standard_option('skiplock'),
|
|
||||||
action => {
|
|
||||||
type => 'string',
|
|
||||||
description => "Action",
|
|
||||||
enum => [ 'create', 'delete', 'rollback' ],
|
|
||||||
},
|
|
||||||
snapname => {
|
snapname => {
|
||||||
type => 'string',
|
type => 'string',
|
||||||
description => "The name of the snapshot",
|
description => "The name of the snapshot",
|
||||||
@ -1919,15 +1955,12 @@ __PACKAGE__->register_method({
|
|||||||
type => 'boolean',
|
type => 'boolean',
|
||||||
description => "Freeze the filesystem",
|
description => "Freeze the filesystem",
|
||||||
},
|
},
|
||||||
digest => {
|
|
||||||
type => 'string',
|
|
||||||
description => 'Prevent changes if current configuration file has different SHA1 digest. This can be used to prevent concurrent modifications.',
|
|
||||||
maxLength => 40,
|
|
||||||
optional => 1,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
returns => { type => 'null'},
|
returns => {
|
||||||
|
type => 'string',
|
||||||
|
description => "the task ID.",
|
||||||
|
},
|
||||||
code => sub {
|
code => sub {
|
||||||
my ($param) = @_;
|
my ($param) = @_;
|
||||||
|
|
||||||
@ -1939,38 +1972,120 @@ __PACKAGE__->register_method({
|
|||||||
|
|
||||||
my $vmid = extract_param($param, 'vmid');
|
my $vmid = extract_param($param, 'vmid');
|
||||||
|
|
||||||
my $digest = extract_param($param, 'digest');
|
|
||||||
|
|
||||||
my $action = extract_param($param, 'action');
|
|
||||||
|
|
||||||
my $snapname = extract_param($param, 'snapname');
|
my $snapname = extract_param($param, 'snapname');
|
||||||
|
|
||||||
my $vmstate = extract_param($param, 'vmstate');
|
my $vmstate = extract_param($param, 'vmstate');
|
||||||
|
|
||||||
my $freezefs = extract_param($param, 'freezefs');
|
my $freezefs = extract_param($param, 'freezefs');
|
||||||
|
|
||||||
my $skiplock = extract_param($param, 'skiplock');
|
|
||||||
raise_param_exc({ skiplock => "Only root may use this option." })
|
|
||||||
if $skiplock && $authuser ne 'root@pam';
|
|
||||||
|
|
||||||
|
|
||||||
# fixme: digest?
|
|
||||||
# fixme: access rights?
|
# fixme: access rights?
|
||||||
# &$check_storage_access($rpcenv, $authuser, $storecfg, $vmid, $conf);
|
# &$check_storage_access($rpcenv, $authuser, $storecfg, $vmid, $conf);
|
||||||
# fixme: need to implement a check to see if all storages support snapshots
|
# fixme: need to implement a check to see if all storages support snapshots
|
||||||
|
|
||||||
if($action eq 'create') {
|
my $realcmd = sub {
|
||||||
PVE::Cluster::log_msg('info', $authuser, "snapshot VM $vmid: $snapname");
|
PVE::Cluster::log_msg('info', $authuser, "snapshot VM $vmid: $snapname");
|
||||||
PVE::QemuServer::snapshot_create($vmid, $snapname, $vmstate, $freezefs);
|
PVE::QemuServer::snapshot_create($vmid, $snapname, $vmstate, $freezefs);
|
||||||
} elsif($action eq 'rollback'){
|
};
|
||||||
|
|
||||||
|
return $rpcenv->fork_worker('qmsnapshot', $vmid, $authuser, $realcmd);
|
||||||
|
}});
|
||||||
|
|
||||||
|
__PACKAGE__->register_method({
|
||||||
|
name => 'rollback',
|
||||||
|
path => '{vmid}/rollback',
|
||||||
|
method => 'POST',
|
||||||
|
protected => 1,
|
||||||
|
proxyto => 'node',
|
||||||
|
description => "Rollback VM state to specified snapshot.",
|
||||||
|
permissions => {
|
||||||
|
check => ['perm', '/vms/{vmid}', [ 'VM.Config.Disk' ]],
|
||||||
|
},
|
||||||
|
parameters => {
|
||||||
|
additionalProperties => 0,
|
||||||
|
properties => {
|
||||||
|
node => get_standard_option('pve-node'),
|
||||||
|
vmid => get_standard_option('pve-vmid'),
|
||||||
|
snapname => {
|
||||||
|
type => 'string',
|
||||||
|
description => "The name of the snapshot",
|
||||||
|
maxLength => 40,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
returns => {
|
||||||
|
type => 'string',
|
||||||
|
description => "the task ID.",
|
||||||
|
},
|
||||||
|
code => sub {
|
||||||
|
my ($param) = @_;
|
||||||
|
|
||||||
|
my $rpcenv = PVE::RPCEnvironment::get();
|
||||||
|
|
||||||
|
my $authuser = $rpcenv->get_user();
|
||||||
|
|
||||||
|
my $node = extract_param($param, 'node');
|
||||||
|
|
||||||
|
my $vmid = extract_param($param, 'vmid');
|
||||||
|
|
||||||
|
my $snapname = extract_param($param, 'snapname');
|
||||||
|
|
||||||
|
# fixme: access rights?
|
||||||
|
|
||||||
|
my $realcmd = sub {
|
||||||
PVE::Cluster::log_msg('info', $authuser, "rollback snapshot VM $vmid: $snapname");
|
PVE::Cluster::log_msg('info', $authuser, "rollback snapshot VM $vmid: $snapname");
|
||||||
PVE::QemuServer::snapshot_rollback($vmid, $snapname);
|
PVE::QemuServer::snapshot_rollback($vmid, $snapname);
|
||||||
} elsif($action eq 'delete') {
|
};
|
||||||
PVE::Cluster::log_msg('info', $authuser, "delete snapshot VM $vmid: $snapname");
|
|
||||||
PVE::QemuServer::snapshot_delete($vmid, $snapname, $vmstate);
|
|
||||||
}
|
|
||||||
|
|
||||||
return undef;
|
return $rpcenv->fork_worker('qmrollback', $vmid, $authuser, $realcmd);
|
||||||
|
}});
|
||||||
|
|
||||||
|
__PACKAGE__->register_method({
|
||||||
|
name => 'delsnapshot',
|
||||||
|
path => '{vmid}/snapshot/{snapname}',
|
||||||
|
method => 'DELETE',
|
||||||
|
protected => 1,
|
||||||
|
proxyto => 'node',
|
||||||
|
description => "Delete a VM snapshot.",
|
||||||
|
permissions => {
|
||||||
|
check => ['perm', '/vms/{vmid}', [ 'VM.Config.Disk' ]],
|
||||||
|
},
|
||||||
|
parameters => {
|
||||||
|
additionalProperties => 0,
|
||||||
|
properties => {
|
||||||
|
node => get_standard_option('pve-node'),
|
||||||
|
vmid => get_standard_option('pve-vmid'),
|
||||||
|
snapname => {
|
||||||
|
type => 'string',
|
||||||
|
description => "The name of the snapshot",
|
||||||
|
maxLength => 40,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
returns => {
|
||||||
|
type => 'string',
|
||||||
|
description => "the task ID.",
|
||||||
|
},
|
||||||
|
code => sub {
|
||||||
|
my ($param) = @_;
|
||||||
|
|
||||||
|
my $rpcenv = PVE::RPCEnvironment::get();
|
||||||
|
|
||||||
|
my $authuser = $rpcenv->get_user();
|
||||||
|
|
||||||
|
my $node = extract_param($param, 'node');
|
||||||
|
|
||||||
|
my $vmid = extract_param($param, 'vmid');
|
||||||
|
|
||||||
|
my $snapname = extract_param($param, 'snapname');
|
||||||
|
|
||||||
|
# fixme: access rights?
|
||||||
|
|
||||||
|
my $realcmd = sub {
|
||||||
|
PVE::Cluster::log_msg('info', $authuser, "delete snapshot VM $vmid: $snapname");
|
||||||
|
PVE::QemuServer::snapshot_delete($vmid, $snapname);
|
||||||
|
};
|
||||||
|
|
||||||
|
return $rpcenv->fork_worker('qmdelsnaphot', $vmid, $authuser, $realcmd);
|
||||||
}});
|
}});
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
8
qm
8
qm
@ -433,10 +433,14 @@ my $cmddef = {
|
|||||||
|
|
||||||
showcmd => [ __PACKAGE__, 'showcmd', ['vmid']],
|
showcmd => [ __PACKAGE__, 'showcmd', ['vmid']],
|
||||||
|
|
||||||
snapshot => [ "PVE::API2::Qemu", 'snapshot_vm', ['vmid', 'action', 'snapname'], { node => $nodename } ],
|
|
||||||
|
|
||||||
status => [ __PACKAGE__, 'status', ['vmid']],
|
status => [ __PACKAGE__, 'status', ['vmid']],
|
||||||
|
|
||||||
|
snapshot => [ "PVE::API2::Qemu", 'snapshot', ['vmid', 'snapname'], { node => $nodename } , $upid_exit ],
|
||||||
|
|
||||||
|
delsnapshot => [ "PVE::API2::Qemu", 'delsnapshot', ['vmid', 'snapname'], { node => $nodename } , $upid_exit ],
|
||||||
|
|
||||||
|
rollback => [ "PVE::API2::Qemu", 'rollback', ['vmid', 'snapname'], { node => $nodename } , $upid_exit ],
|
||||||
|
|
||||||
start => [ "PVE::API2::Qemu", 'vm_start', ['vmid'], { node => $nodename } , $upid_exit ],
|
start => [ "PVE::API2::Qemu", 'vm_start', ['vmid'], { node => $nodename } , $upid_exit ],
|
||||||
|
|
||||||
stop => [ "PVE::API2::Qemu", 'vm_stop', ['vmid'], { node => $nodename }, $upid_exit ],
|
stop => [ "PVE::API2::Qemu", 'vm_stop', ['vmid'], { node => $nodename }, $upid_exit ],
|
||||||
|
Loading…
Reference in New Issue
Block a user