[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