]>
git.proxmox.com Git - pve-container.git/blob - src/PVE/API2/LXC/Status.pm
0e0d884be0f2603e14a75a30c56e2f5bea643c64
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
::HA
::Env
::PVE2
;
20 use PVE
::JSONSchema
qw(get_standard_option);
21 use base
qw(PVE::RESTHandler);
23 use Data
::Dumper
; # fixme: remove
25 __PACKAGE__-
>register_method({
30 description
=> "Directory index",
35 additionalProperties
=> 0,
37 node
=> get_standard_option
('pve-node'),
38 vmid
=> get_standard_option
('pve-vmid'),
46 subdir
=> { type
=> 'string' },
49 links
=> [ { rel
=> 'child', href
=> "{subdir}" } ],
55 my $conf = PVE
::LXC
::Config-
>load_config($param->{vmid
});
58 { subdir
=> 'current' },
59 { subdir
=> 'start' },
61 { subdir
=> 'shutdown' },
62 { subdir
=> 'migrate' },
68 __PACKAGE__-
>register_method({
73 protected
=> 1, # openvz /proc entries are only readable by root
74 description
=> "Get virtual machine status.",
76 check
=> ['perm', '/vms/{vmid}', [ 'VM.Audit' ]],
79 additionalProperties
=> 0,
81 node
=> get_standard_option
('pve-node'),
82 vmid
=> get_standard_option
('pve-vmid'),
85 returns
=> { type
=> 'object' },
90 my $conf = PVE
::LXC
::Config-
>load_config($param->{vmid
});
92 my $vmstatus = PVE
::LXC
::vmstatus
($param->{vmid
});
93 my $status = $vmstatus->{$param->{vmid
}};
95 $status->{ha
} = PVE
::HA
::Config
::get_service_status
("ct:$param->{vmid}");
100 __PACKAGE__-
>register_method({
106 description
=> "Start the container.",
108 check
=> ['perm', '/vms/{vmid}', [ 'VM.PowerMgmt' ]],
111 additionalProperties
=> 0,
113 node
=> get_standard_option
('pve-node'),
114 vmid
=> get_standard_option
('pve-vmid', { completion
=> \
&PVE
::LXC
::complete_ctid_stopped
}),
115 skiplock
=> get_standard_option
('skiplock'),
124 my $rpcenv = PVE
::RPCEnvironment
::get
();
126 my $authuser = $rpcenv->get_user();
128 my $node = extract_param
($param, 'node');
130 my $vmid = extract_param
($param, 'vmid');
132 my $skiplock = extract_param
($param, 'skiplock');
133 raise_param_exc
({ skiplock
=> "Only root may use this option." })
134 if $skiplock && $authuser ne 'root@pam';
136 die "CT $vmid already running\n" if PVE
::LXC
::check_running
($vmid);
138 PVE
::Cluster
::check_cfs_quorum
();
140 if (PVE
::HA
::Config
::vm_is_ha_managed
($vmid) && $rpcenv->{type
} ne 'ha') {
145 my $service = "ct:$vmid";
147 my $cmd = ['ha-manager', 'enable', $service];
149 print "Executing HA start for CT $vmid\n";
151 PVE
::Tools
::run_command
($cmd);
156 return $rpcenv->fork_worker('hastart', $vmid, $authuser, $hacmd);
164 syslog
('info', "starting CT $vmid: $upid\n");
166 my $conf = PVE
::LXC
::Config-
>load_config($vmid);
168 die "you can't start a CT if it's a template\n"
169 if PVE
::LXC
::Config-
>is_template($conf);
171 if (!$skiplock && !PVE
::LXC
::Config-
>has_lock($conf, 'mounted')) {
172 PVE
::LXC
::Config-
>check_lock($conf);
175 my $storage_cfg = cfs_read_file
("storage.cfg");
177 PVE
::LXC
::update_lxc_config
($storage_cfg, $vmid, $conf);
179 local $ENV{PVE_SKIPLOCK
}=1 if $skiplock;
181 my $cmd = ['lxc-start', '-n', $vmid];
188 return $rpcenv->fork_worker('vzstart', $vmid, $authuser, $realcmd);
191 return PVE
::LXC
::Config-
>lock_config($vmid, $lockcmd);
195 __PACKAGE__-
>register_method({
201 description
=> "Stop the container. This will abruptly stop all processes running in the container.",
203 check
=> ['perm', '/vms/{vmid}', [ 'VM.PowerMgmt' ]],
206 additionalProperties
=> 0,
208 node
=> get_standard_option
('pve-node'),
209 vmid
=> get_standard_option
('pve-vmid', { completion
=> \
&PVE
::LXC
::complete_ctid_running
}),
210 skiplock
=> get_standard_option
('skiplock'),
219 my $rpcenv = PVE
::RPCEnvironment
::get
();
221 my $authuser = $rpcenv->get_user();
223 my $node = extract_param
($param, 'node');
225 my $vmid = extract_param
($param, 'vmid');
227 my $skiplock = extract_param
($param, 'skiplock');
228 raise_param_exc
({ skiplock
=> "Only root may use this option." })
229 if $skiplock && $authuser ne 'root@pam';
231 die "CT $vmid not running\n" if !PVE
::LXC
::check_running
($vmid);
233 if (PVE
::HA
::Config
::vm_is_ha_managed
($vmid) && $rpcenv->{type
} ne 'ha') {
238 my $service = "ct:$vmid";
240 my $cmd = ['ha-manager', 'disable', $service];
242 print "Executing HA stop for CT $vmid\n";
244 PVE
::Tools
::run_command
($cmd);
249 return $rpcenv->fork_worker('hastop', $vmid, $authuser, $hacmd);
257 syslog
('info', "stopping CT $vmid: $upid\n");
259 my $conf = PVE
::LXC
::Config-
>load_config($vmid);
261 if (!$skiplock && !PVE
::LXC
::Config-
>has_lock($conf, 'mounted')) {
262 PVE
::LXC
::Config-
>check_lock($conf);
265 my $cmd = ['lxc-stop', '-n', $vmid, '--kill'];
272 return $rpcenv->fork_worker('vzstop', $vmid, $authuser, $realcmd);
275 return PVE
::LXC
::Config-
>lock_config($vmid, $lockcmd);
279 __PACKAGE__-
>register_method({
280 name
=> 'vm_shutdown',
285 description
=> "Shutdown the container. This will trigger a clean shutdown " .
286 "of the container, see lxc-stop(1) for details.",
288 check
=> ['perm', '/vms/{vmid}', [ 'VM.PowerMgmt' ]],
291 additionalProperties
=> 0,
293 node
=> get_standard_option
('pve-node'),
294 vmid
=> get_standard_option
('pve-vmid', { completion
=> \
&PVE
::LXC
::complete_ctid_running
}),
296 description
=> "Wait maximal timeout seconds.",
303 description
=> "Make sure the Container stops.",
316 my $rpcenv = PVE
::RPCEnvironment
::get
();
318 my $authuser = $rpcenv->get_user();
320 my $node = extract_param
($param, 'node');
322 my $vmid = extract_param
($param, 'vmid');
324 my $timeout = extract_param
($param, 'timeout');
326 die "CT $vmid not running\n" if !PVE
::LXC
::check_running
($vmid);
332 syslog
('info', "shutdown CT $vmid: $upid\n");
334 my $cmd = ['lxc-stop', '-n', $vmid];
336 $timeout = 60 if !defined($timeout);
338 my $conf = PVE
::LXC
::Config-
>load_config($vmid);
340 PVE
::LXC
::Config-
>check_lock($conf);
342 my $storage_cfg = PVE
::Storage
::config
();
344 push @$cmd, '--timeout', $timeout;
346 eval { run_command
($cmd, timeout
=> $timeout+5); };
348 if ($err && $param->{forceStop
}) {
350 warn "shutdown failed - forcing stop now\n";
352 my $cmd = ['lxc-stop', '-n', $vmid, '--kill'];
356 # make sure container is stopped
357 $cmd = ['lxc-wait', '-n', $vmid, '-t', 5, '-s', 'STOPPED'];
366 return $rpcenv->fork_worker('vzshutdown', $vmid, $authuser, $realcmd);
369 return PVE
::LXC
::Config-
>lock_config($vmid, $lockcmd);
372 __PACKAGE__-
>register_method({
373 name
=> 'vm_suspend',
378 description
=> "Suspend the container.",
380 check
=> ['perm', '/vms/{vmid}', [ 'VM.PowerMgmt' ]],
383 additionalProperties
=> 0,
385 node
=> get_standard_option
('pve-node'),
386 vmid
=> get_standard_option
('pve-vmid', { completion
=> \
&PVE
::LXC
::complete_ctid_running
}),
395 my $rpcenv = PVE
::RPCEnvironment
::get
();
397 my $authuser = $rpcenv->get_user();
399 my $node = extract_param
($param, 'node');
401 my $vmid = extract_param
($param, 'vmid');
403 die "CT $vmid not running\n" if !PVE
::LXC
::check_running
($vmid);
409 syslog
('info', "suspend CT $vmid: $upid\n");
411 my $conf = PVE
::LXC
::Config-
>load_config($vmid);
413 PVE
::LXC
::Config-
>check_lock($conf);
415 my $cmd = ['lxc-checkpoint', '-n', $vmid, '-s', '-D', '/var/lib/vz/dump'];
422 return $rpcenv->fork_worker('vzsuspend', $vmid, $authuser, $realcmd);
425 return PVE
::LXC
::Config-
>lock_config($vmid, $lockcmd);
428 __PACKAGE__-
>register_method({
434 description
=> "Resume the container.",
436 check
=> ['perm', '/vms/{vmid}', [ 'VM.PowerMgmt' ]],
439 additionalProperties
=> 0,
441 node
=> get_standard_option
('pve-node'),
442 vmid
=> get_standard_option
('pve-vmid', { completion
=> \
&PVE
::LXC
::complete_ctid_stopped
}),
451 my $rpcenv = PVE
::RPCEnvironment
::get
();
453 my $authuser = $rpcenv->get_user();
455 my $node = extract_param
($param, 'node');
457 my $vmid = extract_param
($param, 'vmid');
459 die "CT $vmid already running\n" if PVE
::LXC
::check_running
($vmid);
464 syslog
('info', "resume CT $vmid: $upid\n");
466 my $cmd = ['lxc-checkpoint', '-n', $vmid, '-r', '--foreground',
467 '-D', '/var/lib/vz/dump'];
474 my $upid = $rpcenv->fork_worker('vzresume', $vmid, $authuser, $realcmd);