[pve-devel] [PATCH qemu-server 2/4] add 'qm cleanup'
Dominik Csapak
d.csapak at proxmox.com
Wed Oct 17 12:00:19 CEST 2018
On 10/17/18 11:20 AM, Wolfgang Bumiller wrote:
> 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?
>
this is the same cleanup we call in the tap downscript
it is a simple call which does all the necessary things :)
>> + }
>> + }
>> +
>> + 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