]>
git.proxmox.com Git - pve-container.git/blob - src/PVE/API2/LXC/Status.pm
2989e9b86efa26708b7d5b09dba0ce17be5fadb7
1 package PVE
::API2
::LXC
::Status
;
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);
22 if (!$ENV{PVE_GENERATING_DOCS
}) {
23 require PVE
::HA
::Env
::PVE2
;
24 import PVE
::HA
::Env
::PVE2
;
25 require PVE
::HA
::Config
;
26 import PVE
::HA
::Config
;
30 __PACKAGE__-
>register_method({
35 description
=> "Directory index",
40 additionalProperties
=> 0,
42 node
=> get_standard_option
('pve-node'),
43 vmid
=> get_standard_option
('pve-vmid'),
51 subdir
=> { type
=> 'string' },
54 links
=> [ { rel
=> 'child', href
=> "{subdir}" } ],
60 my $conf = PVE
::LXC
::Config-
>load_config($param->{vmid
});
63 { subdir
=> 'current' },
64 { subdir
=> 'start' },
66 { subdir
=> 'shutdown' },
67 { subdir
=> 'migrate' },
73 __PACKAGE__-
>register_method({
78 protected
=> 1, # openvz /proc entries are only readable by root
79 description
=> "Get virtual machine status.",
81 check
=> ['perm', '/vms/{vmid}', [ 'VM.Audit' ]],
84 additionalProperties
=> 0,
86 node
=> get_standard_option
('pve-node'),
87 vmid
=> get_standard_option
('pve-vmid'),
90 returns
=> { type
=> 'object' },
95 my $conf = PVE
::LXC
::Config-
>load_config($param->{vmid
});
97 my $vmstatus = PVE
::LXC
::vmstatus
($param->{vmid
});
98 my $status = $vmstatus->{$param->{vmid
}};
100 $status->{ha
} = PVE
::HA
::Config
::get_service_status
("ct:$param->{vmid}");
105 __PACKAGE__-
>register_method({
111 description
=> "Start the container.",
113 check
=> ['perm', '/vms/{vmid}', [ 'VM.PowerMgmt' ]],
116 additionalProperties
=> 0,
118 node
=> get_standard_option
('pve-node'),
119 vmid
=> get_standard_option
('pve-vmid', { completion
=> \
&PVE
::LXC
::complete_ctid_stopped
}),
120 skiplock
=> get_standard_option
('skiplock'),
129 my $rpcenv = PVE
::RPCEnvironment
::get
();
131 my $authuser = $rpcenv->get_user();
133 my $node = extract_param
($param, 'node');
135 my $vmid = extract_param
($param, 'vmid');
137 my $skiplock = extract_param
($param, 'skiplock');
138 raise_param_exc
({ skiplock
=> "Only root may use this option." })
139 if $skiplock && $authuser ne 'root@pam';
141 die "CT $vmid already running\n" if PVE
::LXC
::check_running
($vmid);
143 PVE
::Cluster
::check_cfs_quorum
();
145 if (PVE
::HA
::Config
::vm_is_ha_managed
($vmid) && $rpcenv->{type
} ne 'ha') {
150 my $service = "ct:$vmid";
152 my $cmd = ['ha-manager', 'set', $service, '--state', 'started'];
154 print "Requesting HA start for CT $vmid\n";
156 PVE
::Tools
::run_command
($cmd);
161 return $rpcenv->fork_worker('hastart', $vmid, $authuser, $hacmd);
169 syslog
('info', "starting CT $vmid: $upid\n");
171 my $conf = PVE
::LXC
::Config-
>load_config($vmid);
173 die "you can't start a CT if it's a template\n"
174 if PVE
::LXC
::Config-
>is_template($conf);
176 if (!$skiplock && !PVE
::LXC
::Config-
>has_lock($conf, 'mounted')) {
177 PVE
::LXC
::Config-
>check_lock($conf);
180 if ($conf->{unprivileged
}) {
181 PVE
::LXC
::Config-
>foreach_mountpoint($conf, sub {
182 my ($ms, $mountpoint) = @_;
183 die "Quotas are not supported by unprivileged containers.\n" if $mountpoint->{quota
};
188 my $storage_cfg = cfs_read_file
("storage.cfg");
190 PVE
::LXC
::update_lxc_config
($vmid, $conf);
192 local $ENV{PVE_SKIPLOCK
}=1 if $skiplock;
194 my $cmd = ['systemctl', 'start', "pve-container\@$vmid"];
201 return $rpcenv->fork_worker('vzstart', $vmid, $authuser, $realcmd);
204 return PVE
::LXC
::Config-
>lock_config($vmid, $lockcmd);
208 __PACKAGE__-
>register_method({
214 description
=> "Stop the container. This will abruptly stop all processes running in the container.",
216 check
=> ['perm', '/vms/{vmid}', [ 'VM.PowerMgmt' ]],
219 additionalProperties
=> 0,
221 node
=> get_standard_option
('pve-node'),
222 vmid
=> get_standard_option
('pve-vmid', { completion
=> \
&PVE
::LXC
::complete_ctid_running
}),
223 skiplock
=> get_standard_option
('skiplock'),
232 my $rpcenv = PVE
::RPCEnvironment
::get
();
234 my $authuser = $rpcenv->get_user();
236 my $node = extract_param
($param, 'node');
238 my $vmid = extract_param
($param, 'vmid');
240 my $skiplock = extract_param
($param, 'skiplock');
241 raise_param_exc
({ skiplock
=> "Only root may use this option." })
242 if $skiplock && $authuser ne 'root@pam';
244 die "CT $vmid not running\n" if !PVE
::LXC
::check_running
($vmid);
246 if (PVE
::HA
::Config
::vm_is_ha_managed
($vmid) && $rpcenv->{type
} ne 'ha') {
251 my $service = "ct:$vmid";
253 my $cmd = ['ha-manager', 'set', $service, '--state', 'stopped'];
255 print "Requesting HA stop for CT $vmid\n";
257 PVE
::Tools
::run_command
($cmd);
262 return $rpcenv->fork_worker('hastop', $vmid, $authuser, $hacmd);
270 syslog
('info', "stopping CT $vmid: $upid\n");
272 my $conf = PVE
::LXC
::Config-
>load_config($vmid);
274 if (!$skiplock && !PVE
::LXC
::Config-
>has_lock($conf, 'mounted')) {
275 PVE
::LXC
::Config-
>check_lock($conf);
278 my $cmd = ['lxc-stop', '-n', $vmid, '--kill'];
285 return $rpcenv->fork_worker('vzstop', $vmid, $authuser, $realcmd);
288 return PVE
::LXC
::Config-
>lock_config($vmid, $lockcmd);
292 __PACKAGE__-
>register_method({
293 name
=> 'vm_shutdown',
298 description
=> "Shutdown the container. This will trigger a clean shutdown " .
299 "of the container, see lxc-stop(1) for details.",
301 check
=> ['perm', '/vms/{vmid}', [ 'VM.PowerMgmt' ]],
304 additionalProperties
=> 0,
306 node
=> get_standard_option
('pve-node'),
307 vmid
=> get_standard_option
('pve-vmid', { completion
=> \
&PVE
::LXC
::complete_ctid_running
}),
309 description
=> "Wait maximal timeout seconds.",
316 description
=> "Make sure the Container stops.",
329 my $rpcenv = PVE
::RPCEnvironment
::get
();
331 my $authuser = $rpcenv->get_user();
333 my $node = extract_param
($param, 'node');
335 my $vmid = extract_param
($param, 'vmid');
337 my $timeout = extract_param
($param, 'timeout');
339 die "CT $vmid not running\n" if !PVE
::LXC
::check_running
($vmid);
341 if (PVE
::HA
::Config
::vm_is_ha_managed
($vmid) &&
342 $rpcenv->{type
} ne 'ha') {
347 my $service = "ct:$vmid";
349 my $cmd = ['ha-manager', 'set', $service, '--state', 'stopped'];
351 print "Requesting HA stop for CT $vmid\n";
353 PVE
::Tools
::run_command
($cmd);
358 return $rpcenv->fork_worker('hastop', $vmid, $authuser, $hacmd);
365 syslog
('info', "shutdown CT $vmid: $upid\n");
367 my $cmd = ['lxc-stop', '-n', $vmid];
369 $timeout = 60 if !defined($timeout);
371 my $conf = PVE
::LXC
::Config-
>load_config($vmid);
373 PVE
::LXC
::Config-
>check_lock($conf);
375 my $storage_cfg = PVE
::Storage
::config
();
377 push @$cmd, '--timeout', $timeout;
379 eval { run_command
($cmd, timeout
=> $timeout+5); };
381 if ($err && $param->{forceStop
}) {
383 warn "shutdown failed - forcing stop now\n";
385 my $cmd = ['lxc-stop', '-n', $vmid, '--kill'];
389 # make sure container is stopped
390 $cmd = ['lxc-wait', '-n', $vmid, '-t', 5, '-s', 'STOPPED'];
399 return $rpcenv->fork_worker('vzshutdown', $vmid, $authuser, $realcmd);
402 return PVE
::LXC
::Config-
>lock_config($vmid, $lockcmd);
405 __PACKAGE__-
>register_method({
406 name
=> 'vm_suspend',
411 description
=> "Suspend the container.",
413 check
=> ['perm', '/vms/{vmid}', [ 'VM.PowerMgmt' ]],
416 additionalProperties
=> 0,
418 node
=> get_standard_option
('pve-node'),
419 vmid
=> get_standard_option
('pve-vmid', { completion
=> \
&PVE
::LXC
::complete_ctid_running
}),
428 my $rpcenv = PVE
::RPCEnvironment
::get
();
430 my $authuser = $rpcenv->get_user();
432 my $node = extract_param
($param, 'node');
434 my $vmid = extract_param
($param, 'vmid');
436 die "CT $vmid not running\n" if !PVE
::LXC
::check_running
($vmid);
442 syslog
('info', "suspend CT $vmid: $upid\n");
444 my $conf = PVE
::LXC
::Config-
>load_config($vmid);
446 PVE
::LXC
::Config-
>check_lock($conf);
448 my $cmd = ['lxc-checkpoint', '-n', $vmid, '-s', '-D', '/var/lib/vz/dump'];
455 return $rpcenv->fork_worker('vzsuspend', $vmid, $authuser, $realcmd);
458 return PVE
::LXC
::Config-
>lock_config($vmid, $lockcmd);
461 __PACKAGE__-
>register_method({
467 description
=> "Resume the container.",
469 check
=> ['perm', '/vms/{vmid}', [ 'VM.PowerMgmt' ]],
472 additionalProperties
=> 0,
474 node
=> get_standard_option
('pve-node'),
475 vmid
=> get_standard_option
('pve-vmid', { completion
=> \
&PVE
::LXC
::complete_ctid_stopped
}),
484 my $rpcenv = PVE
::RPCEnvironment
::get
();
486 my $authuser = $rpcenv->get_user();
488 my $node = extract_param
($param, 'node');
490 my $vmid = extract_param
($param, 'vmid');
492 die "CT $vmid already running\n" if PVE
::LXC
::check_running
($vmid);
497 syslog
('info', "resume CT $vmid: $upid\n");
499 my $cmd = ['lxc-checkpoint', '-n', $vmid, '-r', '--foreground',
500 '-D', '/var/lib/vz/dump'];
507 my $upid = $rpcenv->fork_worker('vzresume', $vmid, $authuser, $realcmd);