]>
git.proxmox.com Git - pve-container.git/blob - src/PVE/API2/LXC/Snapshot.pm
1 package PVE
::API2
::LXC
::Snapshot
;
7 use PVE
::Tools
qw(extract_param run_command);
8 use PVE
::Exception
qw(raise raise_param_exc);
10 use PVE
::Cluster
qw(cfs_read_file);
11 use PVE
::AccessControl
;
15 use PVE
::RPCEnvironment
;
18 use PVE
::JSONSchema
qw(get_standard_option);
19 use base
qw(PVE::RESTHandler);
21 __PACKAGE__-
>register_method({
25 description
=> "List all snapshots.",
27 check
=> ['perm', '/vms/{vmid}', [ 'VM.Audit' ]],
30 protected
=> 1, # lxc pid files are only readable by root
32 additionalProperties
=> 0,
34 vmid
=> get_standard_option
('pve-vmid', { completion
=> \
&PVE
::LXC
::complete_ctid
}),
35 node
=> get_standard_option
('pve-node'),
44 links
=> [ { rel
=> 'child', href
=> "{name}" } ],
49 my $vmid = $param->{vmid
};
51 my $conf = PVE
::LXC
::Config-
>load_config($vmid);
52 my $snaphash = $conf->{snapshots
} || {};
56 foreach my $name (keys %$snaphash) {
57 my $d = $snaphash->{$name};
60 snaptime
=> $d->{snaptime
} || 0,
61 description
=> $d->{description
} || '',
63 $item->{parent
} = $d->{parent
} if defined($d->{parent
});
64 $item->{snapstate
} = $d->{snapstate
} if $d->{snapstate
};
68 my $running = PVE
::LXC
::check_running
($vmid) ?
1 : 0;
69 my $current = { name
=> 'current', digest
=> $conf->{digest
}, running
=> $running };
70 $current->{parent
} = $conf->{parent
} if defined($conf->{parent
});
77 use Data
::Dumper
; # fixme: remove
78 __PACKAGE__-
>register_method({
84 description
=> "Snapshot a container.",
86 check
=> ['perm', '/vms/{vmid}', [ 'VM.Snapshot' ]],
89 additionalProperties
=> 0,
91 node
=> get_standard_option
('pve-node'),
92 vmid
=> get_standard_option
('pve-vmid', { completion
=> \
&PVE
::LXC
::complete_ctid
}),
93 snapname
=> get_standard_option
('pve-lxc-snapshot-name'),
97 # description => "Save the vmstate",
102 description
=> "A textual description or comment.",
108 description
=> "the task ID.",
113 my $rpcenv = PVE
::RPCEnvironment
::get
();
115 my $authuser = $rpcenv->get_user();
117 my $node = extract_param
($param, 'node');
119 my $vmid = extract_param
($param, 'vmid');
121 my $snapname = extract_param
($param, 'snapname');
123 die "unable to use snapshot name 'current' (reserved name)\n"
124 if $snapname eq 'current';
126 die "unable to use snapshot name 'vzdump' (reserved name)\n"
127 if $snapname eq 'vzdump';
130 PVE
::Cluster
::log_msg
('info', $authuser, "snapshot container $vmid: $snapname");
131 PVE
::LXC
::Config-
>snapshot_create($vmid, $snapname, 0, $param->{description
});
134 return $rpcenv->fork_worker('pctsnapshot', $vmid, $authuser, $realcmd);
137 __PACKAGE__-
>register_method({
138 name
=> 'delsnapshot',
139 path
=> '{snapname}',
143 description
=> "Delete a LXC snapshot.",
145 check
=> ['perm', '/vms/{vmid}', [ 'VM.Snapshot' ]],
148 additionalProperties
=> 0,
150 node
=> get_standard_option
('pve-node'),
151 vmid
=> get_standard_option
('pve-vmid'),
152 snapname
=> get_standard_option
('pve-lxc-snapshot-name'),
156 description
=> "For removal from config file, even if removing disk snapshots fails.",
162 description
=> "the task ID.",
167 my $rpcenv = PVE
::RPCEnvironment
::get
();
169 my $authuser = $rpcenv->get_user();
171 my $node = extract_param
($param, 'node');
173 my $vmid = extract_param
($param, 'vmid');
175 my $snapname = extract_param
($param, 'snapname');
178 PVE
::Cluster
::log_msg
('info', $authuser, "delete snapshot VM $vmid: $snapname");
179 PVE
::LXC
::Config-
>snapshot_delete($vmid, $snapname, $param->{force
});
182 return $rpcenv->fork_worker('lxcdelsnapshot', $vmid, $authuser, $realcmd);
185 __PACKAGE__-
>register_method({
186 name
=> 'snapshot_cmd_idx',
187 path
=> '{snapname}',
194 additionalProperties
=> 0,
196 vmid
=> get_standard_option
('pve-vmid'),
197 node
=> get_standard_option
('pve-node'),
198 snapname
=> get_standard_option
('pve-lxc-snapshot-name'),
207 links
=> [ { rel
=> 'child', href
=> "{cmd}" } ],
214 push @$res, { cmd
=> 'rollback' };
215 push @$res, { cmd
=> 'config' };
220 __PACKAGE__-
>register_method({
222 path
=> '{snapname}/rollback',
226 description
=> "Rollback LXC state to specified snapshot.",
228 check
=> ['perm', '/vms/{vmid}', [ 'VM.Snapshot' ]],
231 additionalProperties
=> 0,
233 node
=> get_standard_option
('pve-node'),
234 vmid
=> get_standard_option
('pve-vmid'),
235 snapname
=> get_standard_option
('pve-lxc-snapshot-name'),
240 description
=> "the task ID.",
245 my $rpcenv = PVE
::RPCEnvironment
::get
();
247 my $authuser = $rpcenv->get_user();
249 my $node = extract_param
($param, 'node');
251 my $vmid = extract_param
($param, 'vmid');
253 my $snapname = extract_param
($param, 'snapname');
256 PVE
::Cluster
::log_msg
('info', $authuser, "rollback snapshot LXC $vmid: $snapname");
257 PVE
::LXC
::Config-
>snapshot_rollback($vmid, $snapname);
260 return $rpcenv->fork_worker('lxcrollback', $vmid, $authuser, $realcmd);
263 __PACKAGE__-
>register_method({
264 name
=> 'update_snapshot_config',
265 path
=> '{snapname}/config',
269 description
=> "Update snapshot metadata.",
271 check
=> ['perm', '/vms/{vmid}', [ 'VM.Snapshot' ]],
274 additionalProperties
=> 0,
276 node
=> get_standard_option
('pve-node'),
277 vmid
=> get_standard_option
('pve-vmid'),
278 snapname
=> get_standard_option
('pve-lxc-snapshot-name'),
282 description
=> "A textual description or comment.",
286 returns
=> { type
=> 'null' },
290 my $rpcenv = PVE
::RPCEnvironment
::get
();
292 my $authuser = $rpcenv->get_user();
294 my $vmid = extract_param
($param, 'vmid');
296 my $snapname = extract_param
($param, 'snapname');
298 return undef if !defined($param->{description
});
302 my $conf = PVE
::LXC
::Config-
>load_config($vmid);
303 PVE
::LXC
::Config-
>check_lock($conf);
305 my $snap = $conf->{snapshots
}->{$snapname};
307 die "snapshot '$snapname' does not exist\n" if !defined($snap);
309 $snap->{description
} = $param->{description
} if defined($param->{description
});
311 PVE
::LXC
::Config-
>write_config($vmid, $conf, 1);
314 PVE
::LXC
::Config-
>lock_config($vmid, $updatefn);
319 __PACKAGE__-
>register_method({
320 name
=> 'get_snapshot_config',
321 path
=> '{snapname}/config',
324 description
=> "Get snapshot configuration",
326 check
=> ['perm', '/vms/{vmid}', [ 'VM.Snapshot' ]],
329 additionalProperties
=> 0,
331 node
=> get_standard_option
('pve-node'),
332 vmid
=> get_standard_option
('pve-vmid'),
333 snapname
=> get_standard_option
('pve-lxc-snapshot-name'),
336 returns
=> { type
=> "object" },
340 my $rpcenv = PVE
::RPCEnvironment
::get
();
342 my $authuser = $rpcenv->get_user();
344 my $vmid = extract_param
($param, 'vmid');
346 my $snapname = extract_param
($param, 'snapname');
348 my $conf = PVE
::LXC
::Config-
>load_config($vmid);
350 my $snap = $conf->{snapshots
}->{$snapname};
352 die "snapshot '$snapname' does not exist\n" if !defined($snap);