[pve-devel] [PATCH qemu-server 2/4] add 'qm cleanup'
Wolfgang Bumiller
w.bumiller at proxmox.com
Wed Oct 17 11:20:08 CEST 2018
On Tue, Oct 16, 2018 at 12:07:04PM +0200, Dominik Csapak wrote:
> this is intended to be used with qmeventd, to do
> the necessary cleanups when qemu crashes or is being
> shut down from within the guest
>
> this can also be the point where we could introduce
> shutdown/stop/reboot hooks
>
> Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
> ---
> PVE/CLI/qm.pm | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 65 insertions(+)
>
> diff --git a/PVE/CLI/qm.pm b/PVE/CLI/qm.pm
> index 46a7e2f..6a14c12 100755
> --- a/PVE/CLI/qm.pm
> +++ b/PVE/CLI/qm.pm
> @@ -18,6 +18,7 @@ use PVE::SafeSyslog;
> use PVE::INotify;
> use PVE::RPCEnvironment;
> use PVE::Exception qw(raise_param_exc);
> +use PVE::Network;
> use PVE::QemuServer;
> use PVE::QemuServer::ImportDisk;
> use PVE::QemuServer::OVF;
> @@ -722,6 +723,68 @@ __PACKAGE__->register_method({
> return { result => $res };
> }});
>
> +__PACKAGE__->register_method({
> + name => 'cleanup',
> + path => 'cleanup',
> + method => 'POST',
> + protected => 1,
> + description => "Cleans up resources like tap devices, vgpus, etc. Called after a vm shuts down, crashes, etc.",
> + parameters => {
> + additionalProperties => 0,
> + properties => {
> + node => get_standard_option('pve-node'),
> + vmid => get_standard_option('pve-vmid', {
> + completion => \&PVE::QemuServer::complete_vmid_running }),
> + 'clean-shutdown' => {
> + type => 'boolean',
> + description => "Indicates if qemu shutdown cleanly.",
> + },
> + 'guest-requested' => {
> + type => 'boolean',
> + description => "Indicates if the shutdown was requested by the guest or via qmp.",
> + },
> + 'was-reset' => {
> + type => 'boolean',
> + description => "Indicates if it was actually a reset, but -no-reboot was given to qemu.",
> + },
> + },
> + },
> + returns => { type => 'null', },
> + code => sub {
> + my ($param) = @_;
> +
> + my $vmid = $param->{vmid};
> + my $clean = $param->{'clean-shutdown'};
> + my $guest = $param->{'guest-requested'};
> + my $reset = $param->{'was-reset'};
> +
> + my $storecfg = PVE::Storage::config();
> +
> + PVE::QemuConfig->lock_config($vmid, sub {
> + my $conf = PVE::QemuConfig->load_config ($vmid);
> + my $pid = PVE::QemuServer::check_running ($vmid);
> + die "vm still running\n" if $pid;
> +
> +
> + if (!$clean) {
> + # we have to cleanup the tap devices after a crash
> +
> + foreach my $opt (keys %$conf) {
> + next if $opt !~ m/^net(\d)+$/;
> + my $interface = $1;
> + PVE::Network::tap_unplug("tap${vmid}i${interface}");
I thought they disappear anyway and this was supposed to clean up
firewall bridges?
> + }
> + }
> +
> + if (!$clean || $guest) {
> + # vm was shutdown from inside the guest or crashed, doing api cleanup
> + PVE::QemuServer::vm_stop_cleanup($storecfg, $vmid, $conf, 0, 0);
> + }
> + });
> +
> + return undef;
> + }});
> +
> my $print_agent_result = sub {
> my ($data) = @_;
>
> @@ -904,6 +967,8 @@ our $cmddef = {
>
> importovf => [ __PACKAGE__, 'importovf', ['vmid', 'manifest', 'storage']],
>
> + cleanup => [ __PACKAGE__, 'cleanup', ['vmid', 'clean-shutdown', 'guest-requested', 'was-reset'], { node => $nodename }],
> +
> };
>
> 1;
> --
> 2.11.0
More information about the pve-devel
mailing list