On November 4, 2019 2:57 pm, Stefan Reiter wrote:
> QMP and monitor helpers are moved from QemuServer.pm.
> 
> By using only vm_running_locally instead of check_running, a cyclic
> dependency to QemuConfig is avoided. This also means that the $nocheck
> parameter serves no more purpose, and has thus been removed along with
> vm_mon_cmd_nocheck.
> 
> Care has been taken to avoid errors resulting from
> this, and occasionally a manual check for a VM's existance inserted on
> the callsite.
> 
> Methods have been renamed to avoid redundant naming:
> * vm_qmp_command -> qmp_cmd
> * vm_mon_cmd -> mon_cmd
> * vm_human_monitor_command -> hmp_cmd
> 
> mon_cmd is exported since it has many users. This patch also changes all
> non-package users of vm_qmp_command to use the mon_cmd helper. Includes
> mocking for tests.
> 
> Signed-off-by: Stefan Reiter <s.rei...@proxmox.com>
> ---
> 
> Sorry for the long patch, but almost all changes are just callers of
> mon_cmd/qmp_cmd being renamed.
> 
> 
>  PVE/API2/Qemu.pm         |  15 ++--
>  PVE/API2/Qemu/Agent.pm   |   7 +-
>  PVE/CLI/qm.pm            |  13 +--
>  PVE/QemuConfig.pm        |  15 ++--
>  PVE/QemuMigrate.pm       |  21 ++---
>  PVE/QemuServer.pm        | 184 +++++++++++++--------------------------
>  PVE/QemuServer/Agent.pm  |   3 +-
>  PVE/QemuServer/Makefile  |   1 +
>  PVE/QemuServer/Memory.pm |   9 +-
>  PVE/VZDump/QemuServer.pm |  13 +--

this last one is missing a 'use PVE::QMPClient' - not related to your 
patch, but while your at it ;)

rest looks good, but I did not repeat your in-depth analysis of each call-site!

I wonder whether it would be worthwhile to move the queue functionality 
into Monitor.pm as well, to de-couple the low-level QMPClient and the 
rest of the code base completely? could be easily done as follow-up 
though.

>  test/snapshot-test.pm    |  19 ++--
>  11 files changed, 130 insertions(+), 170 deletions(-)
> 
> diff --git a/PVE/API2/Qemu.pm b/PVE/API2/Qemu.pm
> index b2c0b0d..b828e08 100644
> --- a/PVE/API2/Qemu.pm
> +++ b/PVE/API2/Qemu.pm
> @@ -20,6 +20,7 @@ use PVE::ReplicationConfig;
>  use PVE::GuestHelpers;
>  use PVE::QemuConfig;
>  use PVE::QemuServer;
> +use PVE::QemuServer::Monitor qw(mon_cmd);
>  use PVE::QemuMigrate;
>  use PVE::RPCEnvironment;
>  use PVE::AccessControl;
> @@ -1835,8 +1836,8 @@ __PACKAGE__->register_method({
>       my ($ticket, undef, $remote_viewer_config) =
>           PVE::AccessControl::remote_viewer_config($authuser, $vmid, $node, 
> $proxy, $title, $port);
>  
> -     PVE::QemuServer::vm_mon_cmd($vmid, "set_password", protocol => 'spice', 
> password => $ticket);
> -     PVE::QemuServer::vm_mon_cmd($vmid, "expire_password", protocol => 
> 'spice', time => "+30");
> +     mon_cmd($vmid, "set_password", protocol => 'spice', password => 
> $ticket);
> +     mon_cmd($vmid, "expire_password", protocol => 'spice', time => "+30");
>  
>       return $remote_viewer_config;
>      }});
> @@ -2261,7 +2262,8 @@ __PACKAGE__->register_method({
>       # checking the qmp status here to get feedback to the gui/cli/api
>       # and the status query should not take too long
>       my $qmpstatus = eval {
> -         PVE::QemuServer::vm_qmp_command($vmid, { execute => "query-status" 
> }, 0);
> +         PVE::QemuConfig::vm_exists_on_node($vmid);
> +         mon_cmd($vmid, "query-status");
>       };
>       my $err = $@ if $@;
>  
> @@ -2341,7 +2343,8 @@ __PACKAGE__->register_method({
>       my $vmid = extract_param($param, 'vmid');
>  
>       my $qmpstatus = eval {
> -         PVE::QemuServer::vm_qmp_command($vmid, { execute => "query-status" 
> }, 0);
> +         PVE::QemuConfig::vm_exists_on_node($vmid);
> +         mon_cmd($vmid, "query-status");
>       };
>       my $err = $@ if $@;
>  
> @@ -3093,7 +3096,7 @@ __PACKAGE__->register_method({
>                   PVE::QemuConfig->write_config($vmid, $conf);
>  
>                   if ($running && 
> PVE::QemuServer::parse_guest_agent($conf)->{fstrim_cloned_disks} && 
> PVE::QemuServer::qga_check_running($vmid)) {
> -                     eval { PVE::QemuServer::vm_mon_cmd($vmid, 
> "guest-fstrim"); };
> +                     eval { mon_cmd($vmid, "guest-fstrim"); };
>                   }
>  
>                   eval {
> @@ -3449,7 +3452,7 @@ __PACKAGE__->register_method({
>  
>       my $res = '';
>       eval {
> -         $res = PVE::QemuServer::vm_human_monitor_command($vmid, 
> $param->{command});
> +         $res = PVE::QemuServer::Monitor::hmp_cmd($vmid, $param->{command});
>       };
>       $res = "ERROR: $@" if $@;
>  
> diff --git a/PVE/API2/Qemu/Agent.pm b/PVE/API2/Qemu/Agent.pm
> index 839146c..6792825 100644
> --- a/PVE/API2/Qemu/Agent.pm
> +++ b/PVE/API2/Qemu/Agent.pm
> @@ -7,6 +7,7 @@ use PVE::RESTHandler;
>  use PVE::JSONSchema qw(get_standard_option);
>  use PVE::QemuServer;
>  use PVE::QemuServer::Agent qw(agent_available agent_cmd check_agent_error);
> +use PVE::QemuServer::Monitor qw(mon_cmd);
>  use MIME::Base64 qw(encode_base64 decode_base64);
>  use JSON;
>  
> @@ -190,7 +191,7 @@ sub register_command {
>           agent_available($vmid, $conf);
>  
>           my $cmd = $param->{command} // $command;
> -         my $res = PVE::QemuServer::vm_mon_cmd($vmid, "guest-$cmd");
> +         my $res = mon_cmd($vmid, "guest-$cmd");
>  
>           return { result => $res };
>       }});
> @@ -415,7 +416,7 @@ __PACKAGE__->register_method({
>       my $content = "";
>  
>       while ($bytes_left > 0 && !$eof) {
> -         my $read = PVE::QemuServer::vm_mon_cmd($vmid, "guest-file-read", 
> handle => $qgafh, count => int($read_size));
> +         my $read = mon_cmd($vmid, "guest-file-read", handle => $qgafh, 
> count => int($read_size));
>           check_agent_error($read, "can't read from file");
>  
>           $content .= decode_base64($read->{'buf-b64'});
> @@ -423,7 +424,7 @@ __PACKAGE__->register_method({
>           $eof = $read->{eof} // 0;
>       }
>  
> -     my $res = PVE::QemuServer::vm_mon_cmd($vmid, "guest-file-close", handle 
> => $qgafh);
> +     my $res = mon_cmd($vmid, "guest-file-close", handle => $qgafh);
>       check_agent_error($res, "can't close file", 1);
>  
>       my $result = {
> diff --git a/PVE/CLI/qm.pm b/PVE/CLI/qm.pm
> index 1a841b7..61ffa1d 100755
> --- a/PVE/CLI/qm.pm
> +++ b/PVE/CLI/qm.pm
> @@ -27,9 +27,11 @@ use PVE::Tools qw(extract_param);
>  
>  use PVE::API2::Qemu::Agent;
>  use PVE::API2::Qemu;
> +use PVE::QemuConfig;
>  use PVE::QemuServer::Helpers;
>  use PVE::QemuServer::Agent qw(agent_available);
>  use PVE::QemuServer::ImportDisk;
> +use PVE::QemuServer::Monitor qw(mon_cmd);
>  use PVE::QemuServer::OVF;
>  use PVE::QemuServer;
>  
> @@ -210,15 +212,16 @@ __PACKAGE__->register_method ({
>       my ($param) = @_;
>  
>       my $vmid = $param->{vmid};
> +     PVE::QemuConfig::vm_exists_on_node($vmid);
>       my $vnc_socket = PVE::QemuServer::Helpers::vnc_socket($vmid);
>  
>       if (my $ticket = $ENV{LC_PVE_TICKET}) {  # NOTE: ssh on debian only 
> pass LC_* variables
> -         PVE::QemuServer::vm_mon_cmd($vmid, "change", device => 'vnc', 
> target => "unix:$vnc_socket,password");
> -         PVE::QemuServer::vm_mon_cmd($vmid, "set_password", protocol => 
> 'vnc', password => $ticket);
> -         PVE::QemuServer::vm_mon_cmd($vmid, "expire_password", protocol => 
> 'vnc', time => "+30");
> +         mon_cmd($vmid, "change", device => 'vnc', target => 
> "unix:$vnc_socket,password");
> +         mon_cmd($vmid, "set_password", protocol => 'vnc', password => 
> $ticket);
> +         mon_cmd($vmid, "expire_password", protocol => 'vnc', time => "+30");
>       } else {
>           # FIXME: remove or allow to add tls-creds object, as x509 vnc param 
> is removed with qemu 4??
> -         PVE::QemuServer::vm_mon_cmd($vmid, "change", device => 'vnc', 
> target => "unix:$vnc_socket,password");
> +         mon_cmd($vmid, "change", device => 'vnc', target => 
> "unix:$vnc_socket,password");
>       }
>  
>       run_vnc_proxy($vnc_socket);
> @@ -398,7 +401,7 @@ __PACKAGE__->register_method ({
>           last if $input =~ m/^\s*q(uit)?\s*$/;
>  
>           eval {
> -             print PVE::QemuServer::vm_human_monitor_command ($vmid, $input);
> +             print PVE::QemuServer::Monitor::hmp_cmd($vmid, $input);
>           };
>           print "ERROR: $@" if $@;
>       }
> diff --git a/PVE/QemuConfig.pm b/PVE/QemuConfig.pm
> index bca2725..e2e722d 100644
> --- a/PVE/QemuConfig.pm
> +++ b/PVE/QemuConfig.pm
> @@ -6,6 +6,7 @@ use warnings;
>  use PVE::AbstractConfig;
>  use PVE::INotify;
>  use PVE::QemuServer::Helpers;
> +use PVE::QemuServer::Monitor qw(mon_cmd);
>  use PVE::QemuServer;
>  use PVE::Storage;
>  use PVE::Tools;
> @@ -193,10 +194,10 @@ sub __snapshot_freeze {
>      my ($class, $vmid, $unfreeze) = @_;
>  
>      if ($unfreeze) {
> -     eval { PVE::QemuServer::vm_mon_cmd($vmid, "guest-fsfreeze-thaw"); };
> +     eval { mon_cmd($vmid, "guest-fsfreeze-thaw"); };
>       warn "guest-fsfreeze-thaw problems - $@" if $@;
>      } else {
> -     eval { PVE::QemuServer::vm_mon_cmd($vmid, "guest-fsfreeze-freeze"); };
> +     eval { mon_cmd($vmid, "guest-fsfreeze-freeze"); };
>       warn "guest-fsfreeze-freeze problems - $@" if $@;
>      }
>  }
> @@ -212,9 +213,9 @@ sub __snapshot_create_vol_snapshots_hook {
>               my $path = PVE::Storage::path($storecfg, $snap->{vmstate});
>               PVE::Storage::activate_volumes($storecfg, [$snap->{vmstate}]);
>  
> -             PVE::QemuServer::vm_mon_cmd($vmid, "savevm-start", statefile => 
> $path);
> +             mon_cmd($vmid, "savevm-start", statefile => $path);
>               for(;;) {
> -                 my $stat = PVE::QemuServer::vm_mon_cmd_nocheck($vmid, 
> "query-savevm");
> +                 my $stat = mon_cmd($vmid, "query-savevm");
>                   if (!$stat->{status}) {
>                       die "savevm not active\n";
>                   } elsif ($stat->{status} eq 'active') {
> @@ -227,18 +228,18 @@ sub __snapshot_create_vol_snapshots_hook {
>                   }
>               }
>           } else {
> -             PVE::QemuServer::vm_mon_cmd($vmid, "savevm-start");
> +             mon_cmd($vmid, "savevm-start");
>           }
>       } elsif ($hook eq "after") {
>           eval {
> -             PVE::QemuServer::vm_mon_cmd($vmid, "savevm-end");
> +             mon_cmd($vmid, "savevm-end");
>               PVE::Storage::deactivate_volumes($storecfg, [$snap->{vmstate}]) 
> if $snap->{vmstate};
>           };
>           warn $@ if $@;
>       } elsif ($hook eq "after-freeze") {
>           # savevm-end is async, we need to wait
>           for (;;) {
> -             my $stat = PVE::QemuServer::vm_mon_cmd_nocheck($vmid, 
> "query-savevm");
> +             my $stat = mon_cmd($vmid, "query-savevm");
>               if (!$stat->{bytes}) {
>                   last;
>               } else {
> diff --git a/PVE/QemuMigrate.pm b/PVE/QemuMigrate.pm
> index 626b837..ce06af0 100644
> --- a/PVE/QemuMigrate.pm
> +++ b/PVE/QemuMigrate.pm
> @@ -11,6 +11,7 @@ use PVE::Tools;
>  use PVE::Cluster;
>  use PVE::Storage;
>  use PVE::QemuServer;
> +use PVE::QemuServer::Monitor qw(mon_cmd);
>  use Time::HiRes qw( usleep );
>  use PVE::RPCEnvironment;
>  use PVE::ReplicationConfig;
> @@ -551,7 +552,7 @@ sub phase2 {
>  
>      my $spice_ticket;
>      if (PVE::QemuServer::vga_conf_has_spice($conf->{vga})) {
> -     my $res = PVE::QemuServer::vm_mon_cmd($vmid, 'query-spice');
> +     my $res = mon_cmd($vmid, 'query-spice');
>       $spice_ticket = $res->{ticket};
>      }
>  
> @@ -706,7 +707,7 @@ sub phase2 {
>      $migrate_speed *= 1024;
>      $self->log('info', "migrate_set_speed: $migrate_speed");
>      eval {
> -        PVE::QemuServer::vm_mon_cmd_nocheck($vmid, "migrate_set_speed", 
> value => int($migrate_speed));
> +     mon_cmd($vmid, "migrate_set_speed", value => int($migrate_speed));
>      };
>      $self->log('info', "migrate_set_speed error: $@") if $@;
>  
> @@ -715,7 +716,7 @@ sub phase2 {
>      if (defined($migrate_downtime)) {
>       $self->log('info', "migrate_set_downtime: $migrate_downtime");
>       eval {
> -         PVE::QemuServer::vm_mon_cmd_nocheck($vmid, "migrate_set_downtime", 
> value => int($migrate_downtime*100)/100);
> +         mon_cmd($vmid, "migrate_set_downtime", value => 
> int($migrate_downtime*100)/100);
>       };
>       $self->log('info', "migrate_set_downtime error: $@") if $@;
>      }
> @@ -733,7 +734,7 @@ sub phase2 {
>  
>      $self->log('info', "set cachesize: $cachesize");
>      eval {
> -     PVE::QemuServer::vm_mon_cmd_nocheck($vmid, "migrate-set-cache-size", 
> value => int($cachesize));
> +     mon_cmd($vmid, "migrate-set-cache-size", value => int($cachesize));
>      };
>      $self->log('info', "migrate-set-cache-size error: $@") if $@;
>  
> @@ -749,7 +750,7 @@ sub phase2 {
>       $self->log('info', "spice client_migrate_info");
>  
>       eval {
> -         PVE::QemuServer::vm_mon_cmd_nocheck($vmid, "client_migrate_info", 
> protocol => 'spice',
> +         mon_cmd($vmid, "client_migrate_info", protocol => 'spice',
>                                               hostname => $proxyticket, 
> 'port' => 0, 'tls-port' => $spice_port,
>                                               'cert-subject' => $subject);
>       };
> @@ -759,7 +760,7 @@ sub phase2 {
>  
>      $self->log('info', "start migrate command to $ruri");
>      eval {
> -        PVE::QemuServer::vm_mon_cmd_nocheck($vmid, "migrate", uri => $ruri);
> +     mon_cmd($vmid, "migrate", uri => $ruri);
>      };
>      my $merr = $@;
>      $self->log('info', "migrate uri => $ruri failed: $merr") if $merr;
> @@ -777,7 +778,7 @@ sub phase2 {
>       usleep($usleep);
>       my $stat;
>       eval {
> -         $stat = PVE::QemuServer::vm_mon_cmd_nocheck($vmid, "query-migrate");
> +         $stat = mon_cmd($vmid, "query-migrate");
>       };
>       if (my $err = $@) {
>           $err_count++;
> @@ -846,7 +847,7 @@ sub phase2 {
>                   $migrate_downtime *= 2;
>                   $self->log('info', "migrate_set_downtime: 
> $migrate_downtime");
>                   eval {
> -                     PVE::QemuServer::vm_mon_cmd_nocheck($vmid, 
> "migrate_set_downtime", value => int($migrate_downtime*100)/100);
> +                     mon_cmd($vmid, "migrate_set_downtime", value => 
> int($migrate_downtime*100)/100);
>                   };
>                   $self->log('info', "migrate_set_downtime error: $@") if $@;
>               }
> @@ -873,7 +874,7 @@ sub phase2_cleanup {
>  
>      $self->log('info', "migrate_cancel");
>      eval {
> -     PVE::QemuServer::vm_mon_cmd_nocheck($vmid, "migrate_cancel");
> +     mon_cmd($vmid, "migrate_cancel");
>      };
>      $self->log('info', "migrate_cancel error: $@") if $@;
>  
> @@ -1024,7 +1025,7 @@ sub phase3_cleanup {
>       if (PVE::QemuServer::vga_conf_has_spice($conf->{vga}) && 
> $self->{running}) {
>           $self->log('info', "Waiting for spice server migration");
>           while (1) {
> -             my $res = PVE::QemuServer::vm_mon_cmd_nocheck($vmid, 
> 'query-spice');
> +             my $res = mon_cmd($vmid, 'query-spice');
>               last if int($res->{'migrated'}) == 1;
>               last if $timer > 50;
>               $timer ++;
> diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
> index cc9288f..5b5de10 100644
> --- a/PVE/QemuServer.pm
> +++ b/PVE/QemuServer.pm
> @@ -32,7 +32,6 @@ use PVE::INotify;
>  use PVE::JSONSchema qw(get_standard_option);
>  use PVE::ProcFSTools;
>  use PVE::RPCEnvironment;
> -use PVE::SafeSyslog;
>  use PVE::Storage;
>  use PVE::SysFSTools;
>  use PVE::Systemd;
> @@ -43,6 +42,7 @@ use PVE::QemuConfig;
>  use PVE::QemuServer::Helpers;
>  use PVE::QemuServer::Cloudinit;
>  use PVE::QemuServer::Memory;
> +use PVE::QemuServer::Monitor qw(mon_cmd);
>  use PVE::QemuServer::PCI qw(print_pci_addr print_pcie_addr 
> print_pcie_root_port);
>  use PVE::QemuServer::USB qw(parse_usb_device);
>  
> @@ -4062,7 +4062,7 @@ sub config_to_command {
>  sub spice_port {
>      my ($vmid) = @_;
>  
> -    my $res = vm_mon_cmd($vmid, 'query-spice');
> +    my $res = mon_cmd($vmid, 'query-spice');
>  
>      return $res->{'tls-port'} || $res->{'port'} || die "no spice port\n";
>  }
> @@ -4070,7 +4070,7 @@ sub spice_port {
>  sub vm_devices_list {
>      my ($vmid) = @_;
>  
> -    my $res = vm_mon_cmd($vmid, 'query-pci');
> +    my $res = mon_cmd($vmid, 'query-pci');
>      my $devices_to_check = [];
>      my $devices = {};
>      foreach my $pcibus (@$res) {
> @@ -4089,14 +4089,14 @@ sub vm_devices_list {
>       $devices_to_check = $to_check;
>      }
>  
> -    my $resblock = vm_mon_cmd($vmid, 'query-block');
> +    my $resblock = mon_cmd($vmid, 'query-block');
>      foreach my $block (@$resblock) {
>       if($block->{device} =~ m/^drive-(\S+)/){
>               $devices->{$1} = 1;
>       }
>      }
>  
> -    my $resmice = vm_mon_cmd($vmid, 'query-mice');
> +    my $resmice = mon_cmd($vmid, 'query-mice');
>      foreach my $mice (@$resmice) {
>       if ($mice->{name} eq 'QEMU HID Tablet') {
>           $devices->{tablet} = 1;
> @@ -4107,7 +4107,7 @@ sub vm_devices_list {
>      # for usb devices there is no query-usb
>      # but we can iterate over the entries in
>      # qom-list path=/machine/peripheral
> -    my $resperipheral = vm_mon_cmd($vmid, 'qom-list', path => 
> '/machine/peripheral');
> +    my $resperipheral = mon_cmd($vmid, 'qom-list', path => 
> '/machine/peripheral');
>      foreach my $per (@$resperipheral) {
>       if ($per->{name} =~ m/^usb\d+$/) {
>           $devices->{$per->{name}} = 1;
> @@ -4288,13 +4288,13 @@ sub qemu_deviceadd {
>      $devicefull = "driver=".$devicefull;
>      my %options =  split(/[=,]/, $devicefull);
>  
> -    vm_mon_cmd($vmid, "device_add" , %options);
> +    mon_cmd($vmid, "device_add" , %options);
>  }
>  
>  sub qemu_devicedel {
>      my ($vmid, $deviceid) = @_;
>  
> -    my $ret = vm_mon_cmd($vmid, "device_del", id => $deviceid);
> +    my $ret = mon_cmd($vmid, "device_del", id => $deviceid);
>  }
>  
>  sub qemu_iothread_add {
> @@ -4323,7 +4323,7 @@ sub qemu_iothread_del {
>  sub qemu_objectadd {
>      my($vmid, $objectid, $qomtype) = @_;
>  
> -    vm_mon_cmd($vmid, "object-add", id => $objectid, "qom-type" => $qomtype);
> +    mon_cmd($vmid, "object-add", id => $objectid, "qom-type" => $qomtype);
>  
>      return 1;
>  }
> @@ -4331,7 +4331,7 @@ sub qemu_objectadd {
>  sub qemu_objectdel {
>      my($vmid, $objectid) = @_;
>  
> -    vm_mon_cmd($vmid, "object-del", id => $objectid);
> +    mon_cmd($vmid, "object-del", id => $objectid);
>  
>      return 1;
>  }
> @@ -4341,7 +4341,7 @@ sub qemu_driveadd {
>  
>      my $drive = print_drive_full($storecfg, $vmid, $device);
>      $drive =~ s/\\/\\\\/g;
> -    my $ret = vm_human_monitor_command($vmid, "drive_add auto \"$drive\"");
> +    my $ret = PVE::QemuServer::Monitor::hmp_cmd($vmid, "drive_add auto 
> \"$drive\"");
>  
>      # If the command succeeds qemu prints: "OK"
>      return 1 if $ret =~ m/OK/s;
> @@ -4352,7 +4352,7 @@ sub qemu_driveadd {
>  sub qemu_drivedel {
>      my($vmid, $deviceid) = @_;
>  
> -    my $ret = vm_human_monitor_command($vmid, "drive_del drive-$deviceid");
> +    my $ret = PVE::QemuServer::Monitor::hmp_cmd($vmid, "drive_del 
> drive-$deviceid");
>      $ret =~ s/^\s+//;
>  
>      return 1 if $ret eq "";
> @@ -4462,7 +4462,7 @@ sub qemu_add_pci_bridge {
>  sub qemu_set_link_status {
>      my ($vmid, $device, $up) = @_;
>  
> -    vm_mon_cmd($vmid, "set_link", name => $device,
> +    mon_cmd($vmid, "set_link", name => $device,
>              up => $up ? JSON::true : JSON::false);
>  }
>  
> @@ -4472,14 +4472,14 @@ sub qemu_netdevadd {
>      my $netdev = print_netdev_full($vmid, $conf, $arch, $device, $deviceid, 
> 1);
>      my %options =  split(/[=,]/, $netdev);
>  
> -    vm_mon_cmd($vmid, "netdev_add",  %options);
> +    mon_cmd($vmid, "netdev_add",  %options);
>      return 1;
>  }
>  
>  sub qemu_netdevdel {
>      my ($vmid, $deviceid) = @_;
>  
> -    vm_mon_cmd($vmid, "netdev_del", id => $deviceid);
> +    mon_cmd($vmid, "netdev_del", id => $deviceid);
>  }
>  
>  sub qemu_usb_hotplug {
> @@ -4534,7 +4534,7 @@ sub qemu_cpu_hotplug {
>               my $retry = 0;
>               my $currentrunningvcpus = undef;
>               while (1) {
> -                 $currentrunningvcpus = vm_mon_cmd($vmid, "query-cpus");
> +                 $currentrunningvcpus = mon_cmd($vmid, "query-cpus");
>                   last if scalar(@{$currentrunningvcpus}) == $i-1;
>                   raise_param_exc({ vcpus => "error unplugging cpu$i" }) if 
> $retry > 5;
>                   $retry++;
> @@ -4551,7 +4551,7 @@ sub qemu_cpu_hotplug {
>       return;
>      }
>  
> -    my $currentrunningvcpus = vm_mon_cmd($vmid, "query-cpus");
> +    my $currentrunningvcpus = mon_cmd($vmid, "query-cpus");
>      die "vcpus in running vm does not match its configuration\n"
>       if scalar(@{$currentrunningvcpus}) != $currentvcpus;
>  
> @@ -4564,7 +4564,7 @@ sub qemu_cpu_hotplug {
>           my $retry = 0;
>           my $currentrunningvcpus = undef;
>           while (1) {
> -             $currentrunningvcpus = vm_mon_cmd($vmid, "query-cpus");
> +             $currentrunningvcpus = mon_cmd($vmid, "query-cpus");
>               last if scalar(@{$currentrunningvcpus}) == $i;
>               raise_param_exc({ vcpus => "error hotplugging cpu$i" }) if 
> $retry > 10;
>               sleep 1;
> @@ -4577,7 +4577,7 @@ sub qemu_cpu_hotplug {
>      } else {
>  
>       for (my $i = $currentvcpus; $i < $vcpus; $i++) {
> -         vm_mon_cmd($vmid, "cpu-add", id => int($i));
> +         mon_cmd($vmid, "cpu-add", id => int($i));
>       }
>      }
>  }
> @@ -4591,7 +4591,7 @@ sub qemu_block_set_io_throttle {
>  
>      return if !check_running($vmid) ;
>  
> -    vm_mon_cmd($vmid, "block_set_io_throttle", device => $deviceid,
> +    mon_cmd($vmid, "block_set_io_throttle", device => $deviceid,
>       bps => int($bps),
>       bps_rd => int($bps_rd),
>       bps_wr => int($bps_wr),
> @@ -4656,7 +4656,7 @@ sub qemu_block_resize {
>  
>      return if !$running;
>  
> -    vm_mon_cmd($vmid, "block_resize", device => $deviceid, size => 
> int($size));
> +    mon_cmd($vmid, "block_resize", device => $deviceid, size => int($size));
>  
>  }
>  
> @@ -4666,7 +4666,7 @@ sub qemu_volume_snapshot {
>      my $running = check_running($vmid);
>  
>      if ($running && do_snapshots_with_qemu($storecfg, $volid)){
> -     vm_mon_cmd($vmid, 'blockdev-snapshot-internal-sync', device => 
> $deviceid, name => $snap);
> +     mon_cmd($vmid, 'blockdev-snapshot-internal-sync', device => $deviceid, 
> name => $snap);
>      } else {
>       PVE::Storage::volume_snapshot($storecfg, $volid, $snap);
>      }
> @@ -4688,7 +4688,7 @@ sub qemu_volume_snapshot_delete {
>      }
>  
>      if ($running && do_snapshots_with_qemu($storecfg, $volid)){
> -     vm_mon_cmd($vmid, 'blockdev-snapshot-delete-internal-sync', device => 
> $deviceid, name => $snap);
> +     mon_cmd($vmid, 'blockdev-snapshot-delete-internal-sync', device => 
> $deviceid, name => $snap);
>      } else {
>       PVE::Storage::volume_snapshot_delete($storecfg, $volid, $snap, 
> $running);
>      }
> @@ -4707,7 +4707,7 @@ sub set_migration_caps {
>       "compress" => 0
>      };
>  
> -    my $supported_capabilities = vm_mon_cmd_nocheck($vmid, 
> "query-migrate-capabilities");
> +    my $supported_capabilities = mon_cmd($vmid, 
> "query-migrate-capabilities");
>  
>      for my $supported_capability (@$supported_capabilities) {
>       push @$cap_ref, {
> @@ -4716,7 +4716,7 @@ sub set_migration_caps {
>       };
>      }
>  
> -    vm_mon_cmd_nocheck($vmid, "migrate-set-capabilities", capabilities => 
> $cap_ref);
> +    mon_cmd($vmid, "migrate-set-capabilities", capabilities => $cap_ref);
>  }
>  
>  my $fast_plug_option = {
> @@ -4797,7 +4797,7 @@ sub vmconfig_hotplug_pending {
>               die "skip\n" if defined($conf->{balloon}) && $conf->{balloon} 
> == 0;
>               # here we reset the ballooning value to memory
>               my $balloon = $conf->{memory} || $defaults->{memory};
> -             vm_mon_cmd($vmid, "balloon", value => $balloon*1024*1024);
> +             mon_cmd($vmid, "balloon", value => $balloon*1024*1024);
>           } elsif ($fast_plug_option->{$opt}) {
>               # do nothing
>           } elsif ($opt =~ m/^net(\d+)$/) {
> @@ -4881,7 +4881,7 @@ sub vmconfig_hotplug_pending {
>               # allow manual ballooning if shares is set to zero
>               if ((defined($conf->{shares}) && ($conf->{shares} == 0))) {
>                   my $balloon = $conf->{pending}->{balloon} || 
> $conf->{memory} || $defaults->{memory};
> -                 vm_mon_cmd($vmid, "balloon", value => $balloon*1024*1024);
> +                 mon_cmd($vmid, "balloon", value => $balloon*1024*1024);
>               }
>           } elsif ($opt =~ m/^net(\d+)$/) {
>               # some changes can be done without hotplug
> @@ -5157,14 +5157,14 @@ sub vmconfig_update_disk {
>           } else { # cdrom
>  
>               if ($drive->{file} eq 'none') {
> -                 vm_mon_cmd($vmid, "eject",force => JSON::true,device => 
> "drive-$opt");
> +                 mon_cmd($vmid, "eject",force => JSON::true,device => 
> "drive-$opt");
>                   if (drive_is_cloudinit($old_drive)) {
>                       vmconfig_register_unused_drive($storecfg, $vmid, $conf, 
> $old_drive);
>                   }
>               } else {
>                   my $path = get_iso_path($storecfg, $vmid, $drive->{file});
> -                 vm_mon_cmd($vmid, "eject", force => JSON::true,device => 
> "drive-$opt"); # force eject if locked
> -                 vm_mon_cmd($vmid, "change", device => "drive-$opt",target 
> => "$path") if $path;
> +                 mon_cmd($vmid, "eject", force => JSON::true,device => 
> "drive-$opt"); # force eject if locked
> +                 mon_cmd($vmid, "change", device => "drive-$opt",target => 
> "$path") if $path;
>               }
>  
>               return 1;
> @@ -5413,7 +5413,7 @@ sub vm_start {
>       print "migration listens on $migrate_uri\n" if $migrate_uri;
>  
>       if ($statefile && $statefile ne 'tcp' && $statefile ne 'unix')  {
> -         eval { vm_mon_cmd_nocheck($vmid, "cont"); };
> +         eval { mon_cmd($vmid, "cont"); };
>           warn $@ if $@;
>       }
>  
> @@ -5425,13 +5425,13 @@ sub vm_start {
>           my $pfamily = PVE::Tools::get_host_address_family($nodename);
>           my $storage_migrate_port = PVE::Tools::next_migrate_port($pfamily);
>  
> -         vm_mon_cmd_nocheck($vmid, "nbd-server-start", addr => { type => 
> 'inet', data => { host => "${localip}", port => "${storage_migrate_port}" } } 
> );
> +         mon_cmd($vmid, "nbd-server-start", addr => { type => 'inet', data 
> => { host => "${localip}", port => "${storage_migrate_port}" } } );
>  
>           $localip = "[$localip]" if Net::IP::ip_is_ipv6($localip);
>  
>           foreach my $opt (sort keys %$local_volumes) {
>               my $volid = $local_volumes->{$opt};
> -             vm_mon_cmd_nocheck($vmid, "nbd-server-add", device => 
> "drive-$opt", writable => JSON::true );
> +             mon_cmd($vmid, "nbd-server-add", device => "drive-$opt", 
> writable => JSON::true );
>               my $migrate_storage_uri = 
> "nbd:${localip}:${storage_migrate_port}:exportname=drive-$opt";
>               print "storage migration listens on $migrate_storage_uri 
> volume:$volid\n";
>           }
> @@ -5446,13 +5446,13 @@ sub vm_start {
>           if ($spice_port) {
>               print "spice listens on port $spice_port\n";
>               if ($spice_ticket) {
> -                 vm_mon_cmd_nocheck($vmid, "set_password", protocol => 
> 'spice', password => $spice_ticket);
> -                 vm_mon_cmd_nocheck($vmid, "expire_password", protocol => 
> 'spice', time => "+30");
> +                 mon_cmd($vmid, "set_password", protocol => 'spice', 
> password => $spice_ticket);
> +                 mon_cmd($vmid, "expire_password", protocol => 'spice', time 
> => "+30");
>               }
>           }
>  
>       } else {
> -         vm_mon_cmd_nocheck($vmid, "balloon", value => 
> $conf->{balloon}*1024*1024)
> +         mon_cmd($vmid, "balloon", value => $conf->{balloon}*1024*1024)
>               if !$statefile && $conf->{balloon};
>  
>           foreach my $opt (keys %$conf) {
> @@ -5462,7 +5462,7 @@ sub vm_start {
>           }
>       }
>  
> -     vm_mon_cmd_nocheck($vmid, 'qom-set',
> +     mon_cmd($vmid, 'qom-set',
>                   path => "machine/peripheral/balloon0",
>                   property => "guest-stats-polling-interval",
>                   value => 2) if (!defined($conf->{balloon}) || 
> $conf->{balloon});
> @@ -5479,60 +5479,6 @@ sub vm_start {
>      });
>  }
>  
> -sub vm_mon_cmd {
> -    my ($vmid, $execute, %params) = @_;
> -
> -    my $cmd = { execute => $execute, arguments => \%params };
> -    vm_qmp_command($vmid, $cmd);
> -}
> -
> -sub vm_mon_cmd_nocheck {
> -    my ($vmid, $execute, %params) = @_;
> -
> -    my $cmd = { execute => $execute, arguments => \%params };
> -    vm_qmp_command($vmid, $cmd, 1);
> -}
> -
> -sub vm_qmp_command {
> -    my ($vmid, $cmd, $nocheck) = @_;
> -
> -    my $res;
> -
> -    my $timeout;
> -    if ($cmd->{arguments}) {
> -     $timeout = delete $cmd->{arguments}->{timeout};
> -    }
> -
> -    eval {
> -     die "VM $vmid not running\n" if !check_running($vmid, $nocheck);
> -     my $sname = PVE::QemuServer::Helpers::qmp_socket($vmid);
> -     if (-e $sname) { # test if VM is reasonambe new and supports qmp/qga
> -         my $qmpclient = PVE::QMPClient->new();
> -
> -         $res = $qmpclient->cmd($vmid, $cmd, $timeout);
> -     } else {
> -         die "unable to open monitor socket\n";
> -     }
> -    };
> -    if (my $err = $@) {
> -     syslog("err", "VM $vmid qmp command failed - $err");
> -     die $err;
> -    }
> -
> -    return $res;
> -}
> -
> -sub vm_human_monitor_command {
> -    my ($vmid, $cmdline) = @_;
> -
> -    my $cmd = {
> -     execute => 'human-monitor-command',
> -     arguments => { 'command-line' => $cmdline},
> -    };
> -
> -    return vm_qmp_command($vmid, $cmd);
> -}
> -
>  sub vm_commandline {
>      my ($storecfg, $vmid, $snapname) = @_;
>  
> @@ -5563,7 +5509,7 @@ sub vm_reset {
>  
>       PVE::QemuConfig->check_lock($conf) if !$skiplock;
>  
> -     vm_mon_cmd($vmid, "system_reset");
> +     mon_cmd($vmid, "system_reset");
>      });
>  }
>  
> @@ -5646,15 +5592,12 @@ sub _do_vm_stop {
>      eval {
>       if ($shutdown) {
>           if (defined($conf) && parse_guest_agent($conf)->{enabled}) {
> -             vm_qmp_command($vmid, {
> -                     execute => "guest-shutdown",
> -                     arguments => { timeout => $timeout }
> -                 }, $nocheck);
> +             mon_cmd($vmid, "guest-shutdown", timeout => $timeout);
>           } else {
> -             vm_qmp_command($vmid, { execute => "system_powerdown" }, 
> $nocheck);
> +             mon_cmd($vmid, "system_powerdown");
>           }
>       } else {
> -         vm_qmp_command($vmid, { execute => "quit" }, $nocheck);
> +         mon_cmd($vmid, "quit");
>       }
>      };
>      my $err = $@;
> @@ -5770,7 +5713,7 @@ sub vm_suspend {
>           $path = PVE::Storage::path($storecfg, $vmstate);
>           PVE::QemuConfig->write_config($vmid, $conf);
>       } else {
> -         vm_mon_cmd($vmid, "stop");
> +         mon_cmd($vmid, "stop");
>       }
>      });
>  
> @@ -5779,9 +5722,9 @@ sub vm_suspend {
>       PVE::Storage::activate_volumes($storecfg, [$vmstate]);
>  
>       eval {
> -         vm_mon_cmd($vmid, "savevm-start", statefile => $path);
> +         mon_cmd($vmid, "savevm-start", statefile => $path);
>           for(;;) {
> -             my $state = vm_mon_cmd_nocheck($vmid, "query-savevm");
> +             my $state = mon_cmd($vmid, "query-savevm");
>               if (!$state->{status}) {
>                   die "savevm not active\n";
>               } elsif ($state->{status} eq 'active') {
> @@ -5804,7 +5747,7 @@ sub vm_suspend {
>           if ($err) {
>               # cleanup, but leave suspending lock, to indicate something 
> went wrong
>               eval {
> -                 vm_mon_cmd($vmid, "savevm-end");
> +                 mon_cmd($vmid, "savevm-end");
>                   PVE::Storage::deactivate_volumes($storecfg, [$vmstate]);
>                   PVE::Storage::vdisk_free($storecfg, $vmstate);
>                   delete $conf->@{qw(vmstate runningmachine)};
> @@ -5817,7 +5760,7 @@ sub vm_suspend {
>           die "lock changed unexpectedly\n"
>               if !PVE::QemuConfig->has_lock($conf, 'suspending');
>  
> -         vm_qmp_command($vmid, { execute => "quit" });
> +         mon_cmd($vmid, "quit");
>           $conf->{lock} = 'suspended';
>           PVE::QemuConfig->write_config($vmid, $conf);
>       });
> @@ -5828,8 +5771,7 @@ sub vm_resume {
>      my ($vmid, $skiplock, $nocheck) = @_;
>  
>      PVE::QemuConfig->lock_config($vmid, sub {
> -     my $vm_mon_cmd = $nocheck ? \&vm_mon_cmd_nocheck : \&vm_mon_cmd;
> -     my $res = $vm_mon_cmd->($vmid, 'query-status');
> +     my $res = mon_cmd($vmid, 'query-status');
>       my $resume_cmd = 'cont';
>  
>       if ($res->{status} && $res->{status} eq 'suspended') {
> @@ -5844,7 +5786,7 @@ sub vm_resume {
>               if !($skiplock || PVE::QemuConfig->has_lock($conf, 'backup'));
>       }
>  
> -     $vm_mon_cmd->($vmid, $resume_cmd);
> +     mon_cmd($vmid, $resume_cmd);
>      });
>  }
>  
> @@ -5856,7 +5798,7 @@ sub vm_sendkey {
>       my $conf = PVE::QemuConfig->load_config($vmid);
>  
>       # there is no qmp command, so we use the human monitor command
> -     my $res = vm_human_monitor_command($vmid, "sendkey $key");
> +     my $res = PVE::QemuServer::Monitor::hmp_cmd($vmid, "sendkey $key");
>       die $res if $res ne '';
>      });
>  }
> @@ -6670,7 +6612,7 @@ sub do_snapshots_with_qemu {
>  sub qga_check_running {
>      my ($vmid, $nowarn) = @_;
>  
> -    eval { vm_mon_cmd($vmid, "guest-ping", timeout => 3); };
> +    eval { mon_cmd($vmid, "guest-ping", timeout => 3); };
>      if ($@) {
>       warn "Qemu Guest Agent is not running - $@" if !$nowarn;
>       return 0;
> @@ -6842,7 +6784,7 @@ sub qemu_drive_mirror {
>      }
>  
>      # if a job already runs for this device we get an error, catch it for 
> cleanup
> -    eval { vm_mon_cmd($vmid, "drive-mirror", %$opts); };
> +    eval { mon_cmd($vmid, "drive-mirror", %$opts); };
>      if (my $err = $@) {
>       eval { PVE::QemuServer::qemu_blockjobs_cancel($vmid, $jobs) };
>       warn "$@\n" if $@;
> @@ -6861,7 +6803,7 @@ sub qemu_drive_mirror_monitor {
>       while (1) {
>           die "storage migration timed out\n" if $err_complete > 300;
>  
> -         my $stats = vm_mon_cmd($vmid, "query-block-jobs");
> +         my $stats = mon_cmd($vmid, "query-block-jobs");
>  
>           my $running_mirror_jobs = {};
>           foreach my $stat (@$stats) {
> @@ -6904,7 +6846,7 @@ sub qemu_drive_mirror_monitor {
>                   my $agent_running = $qga && qga_check_running($vmid);
>                   if ($agent_running) {
>                       print "freeze filesystem\n";
> -                     eval { PVE::QemuServer::vm_mon_cmd($vmid, 
> "guest-fsfreeze-freeze"); };
> +                     eval { mon_cmd($vmid, "guest-fsfreeze-freeze"); };
>                   } else {
>                       print "suspend vm\n";
>                       eval { PVE::QemuServer::vm_suspend($vmid, 1); };
> @@ -6915,7 +6857,7 @@ sub qemu_drive_mirror_monitor {
>  
>                   if ($agent_running) {
>                       print "unfreeze filesystem\n";
> -                     eval { PVE::QemuServer::vm_mon_cmd($vmid, 
> "guest-fsfreeze-thaw"); };
> +                     eval { mon_cmd($vmid, "guest-fsfreeze-thaw"); };
>                   } else {
>                       print "resume vm\n";
>                       eval {  PVE::QemuServer::vm_resume($vmid, 1, 1); };
> @@ -6928,7 +6870,7 @@ sub qemu_drive_mirror_monitor {
>                       # try to switch the disk if source and destination are 
> on the same guest
>                       print "$job: Completing block job...\n";
>  
> -                     eval { vm_mon_cmd($vmid, "block-job-complete", device 
> => $job) };
> +                     eval { mon_cmd($vmid, "block-job-complete", device => 
> $job) };
>                       if ($@ =~ m/cannot be completed/) {
>                           print "$job: Block job cannot be completed, try 
> again.\n";
>                           $err_complete++;
> @@ -6956,12 +6898,12 @@ sub qemu_blockjobs_cancel {
>  
>      foreach my $job (keys %$jobs) {
>       print "$job: Cancelling block job\n";
> -     eval { vm_mon_cmd($vmid, "block-job-cancel", device => $job); };
> +     eval { mon_cmd($vmid, "block-job-cancel", device => $job); };
>       $jobs->{$job}->{cancel} = 1;
>      }
>  
>      while (1) {
> -     my $stats = vm_mon_cmd($vmid, "query-block-jobs");
> +     my $stats = mon_cmd($vmid, "query-block-jobs");
>  
>       my $running_jobs = {};
>       foreach my $stat (@$stats) {
> @@ -7037,8 +6979,7 @@ sub clone_disk {
>  sub get_current_qemu_machine {
>      my ($vmid) = @_;
>  
> -    my $cmd = { execute => 'query-machines', arguments => {} };
> -    my $res = vm_qmp_command($vmid, $cmd);
> +    my $res = mon_cmd($vmid, "query-machines");
>  
>      my ($current, $default);
>      foreach my $e (@$res) {
> @@ -7052,8 +6993,7 @@ sub get_current_qemu_machine {
>  
>  sub get_running_qemu_version {
>      my ($vmid) = @_;
> -    my $cmd = { execute => 'query-version', arguments => {} };
> -    my $res = vm_qmp_command($vmid, $cmd);
> +    my $res = mon_cmd($vmid, "query-version");
>      return "$res->{qemu}->{major}.$res->{qemu}->{minor}";
>  }
>  
> @@ -7104,7 +7044,7 @@ sub version_cmp {
>  sub runs_at_least_qemu_version {
>      my ($vmid, $major, $minor, $extra) = @_;
>  
> -    my $v = vm_qmp_command($vmid, { execute => 'query-version' });
> +    my $v = mon_cmd($vmid, "query-version");
>      die "could not query currently running version for VM $vmid\n" if 
> !defined($v);
>      $v = $v->{qemu};
>  
> @@ -7164,7 +7104,7 @@ sub create_efidisk($$$$$) {
>  sub vm_iothreads_list {
>      my ($vmid) = @_;
>  
> -    my $res = vm_mon_cmd($vmid, 'query-iothreads');
> +    my $res = mon_cmd($vmid, 'query-iothreads');
>  
>      my $iothreads = {};
>      foreach my $iothread (@$res) {
> @@ -7297,7 +7237,7 @@ sub generate_smbios1_uuid {
>  sub nbd_stop {
>      my ($vmid) = @_;
>  
> -    vm_mon_cmd($vmid, 'nbd-server-stop');
> +    mon_cmd($vmid, 'nbd-server-stop');
>  }
>  
>  sub create_reboot_request {
> diff --git a/PVE/QemuServer/Agent.pm b/PVE/QemuServer/Agent.pm
> index 586ac3a..9fec4fb 100644
> --- a/PVE/QemuServer/Agent.pm
> +++ b/PVE/QemuServer/Agent.pm
> @@ -4,6 +4,7 @@ use strict;
>  use warnings;
>  
>  use PVE::QemuServer;
> +use PVE::QemuServer::Monitor;
>  use MIME::Base64 qw(decode_base64);
>  use JSON;
>  use base 'Exporter';
> @@ -59,7 +60,7 @@ sub agent_cmd {
>      my $conf = PVE::QemuConfig->load_config($vmid); # also checks if VM 
> exists
>      agent_available($vmid, $conf, $noerr);
>  
> -    my $res = PVE::QemuServer::vm_mon_cmd($vmid, "guest-$cmd", %$params);
> +    my $res = PVE::QemuServer::Monitor::mon_cmd($vmid, "guest-$cmd", 
> %$params);
>      check_agent_error($res, $errormsg, $noerr);
>  
>      return $res;
> diff --git a/PVE/QemuServer/Makefile b/PVE/QemuServer/Makefile
> index 56d1493..02b0209 100644
> --- a/PVE/QemuServer/Makefile
> +++ b/PVE/QemuServer/Makefile
> @@ -6,6 +6,7 @@ SOURCES=PCI.pm                \
>       Cloudinit.pm    \
>       Agent.pm        \
>       Helpers.pm      \
> +     Monitor.pm      \
>  
>  .PHONY: install
>  install: ${SOURCES}
> diff --git a/PVE/QemuServer/Memory.pm b/PVE/QemuServer/Memory.pm
> index f52f1d5..d500b3b 100644
> --- a/PVE/QemuServer/Memory.pm
> +++ b/PVE/QemuServer/Memory.pm
> @@ -7,6 +7,7 @@ use PVE::Tools qw(run_command lock_file lock_file_full 
> file_read_firstline dir_g
>  use PVE::Exception qw(raise raise_param_exc);
>  
>  use PVE::QemuServer;
> +use PVE::QemuServer::Monitor qw(mon_cmd);
>  
>  my $MAX_NUMA = 8;
>  my $MAX_MEM = 4194304;
> @@ -141,7 +142,7 @@ sub qemu_memory_hotplug {
>                       my $hugepages_host_topology = hugepages_host_topology();
>                       hugepages_allocate($hugepages_topology, 
> $hugepages_host_topology);
>  
> -                     eval { PVE::QemuServer::vm_mon_cmd($vmid, "object-add", 
> 'qom-type' => "memory-backend-file", id => "mem-$name", props => {
> +                     eval { mon_cmd($vmid, "object-add", 'qom-type' => 
> "memory-backend-file", id => "mem-$name", props => {
>                                            size => int($dimm_size*1024*1024), 
> 'mem-path' => $path, share => JSON::true, prealloc => JSON::true } ); };
>                       if (my $err = $@) {
>                           hugepages_reset($hugepages_host_topology);
> @@ -153,7 +154,7 @@ sub qemu_memory_hotplug {
>                   eval { hugepages_update_locked($code); };
>  
>               } else {
> -                 eval { PVE::QemuServer::vm_mon_cmd($vmid, "object-add", 
> 'qom-type' => "memory-backend-ram", id => "mem-$name", props => { size => 
> int($dimm_size*1024*1024) } ) };
> +                 eval { mon_cmd($vmid, "object-add", 'qom-type' => 
> "memory-backend-ram", id => "mem-$name", props => { size => 
> int($dimm_size*1024*1024) } ) };
>               }
>  
>               if (my $err = $@) {
> @@ -161,7 +162,7 @@ sub qemu_memory_hotplug {
>                   die $err;
>               }
>  
> -             eval { PVE::QemuServer::vm_mon_cmd($vmid, "device_add", driver 
> => "pc-dimm", id => "$name", memdev => "mem-$name", node => $numanode) };
> +             eval { mon_cmd($vmid, "device_add", driver => "pc-dimm", id => 
> "$name", memdev => "mem-$name", node => $numanode) };
>               if (my $err = $@) {
>                   eval { PVE::QemuServer::qemu_objectdel($vmid, "mem-$name"); 
> };
>                   die $err;
> @@ -201,7 +202,7 @@ sub qemu_memory_hotplug {
>  sub qemu_dimm_list {
>      my ($vmid) = @_;
>  
> -    my $dimmarray = PVE::QemuServer::vm_mon_cmd_nocheck($vmid, 
> "query-memory-devices");
> +    my $dimmarray = mon_cmd($vmid, "query-memory-devices");
>      my $dimms = {};
>  
>      foreach my $dimm (@$dimmarray) {
> diff --git a/PVE/VZDump/QemuServer.pm b/PVE/VZDump/QemuServer.pm
> index e02a069..4322cb8 100644
> --- a/PVE/VZDump/QemuServer.pm
> +++ b/PVE/VZDump/QemuServer.pm
> @@ -18,6 +18,7 @@ use PVE::Tools;
>  use PVE::VZDump;
>  
>  use PVE::QemuServer;
> +use PVE::QemuServer::Monitor qw(mon_cmd);
>  
>  use base qw (PVE::VZDump::Plugin);
>  
> @@ -417,7 +418,7 @@ sub archive {
>       }
>  
>       if ($agent_running){
> -         eval { PVE::QemuServer::vm_mon_cmd($vmid, "guest-fsfreeze-freeze"); 
> };
> +         eval { mon_cmd($vmid, "guest-fsfreeze-freeze"); };
>           if (my $err = $@) {
>               $self->logerr($err);
>           }
> @@ -427,7 +428,7 @@ sub archive {
>       my $qmperr = $@;
>  
>       if ($agent_running){
> -         eval { PVE::QemuServer::vm_mon_cmd($vmid, "guest-fsfreeze-thaw"); };
> +         eval { mon_cmd($vmid, "guest-fsfreeze-thaw"); };
>           if (my $err = $@) {
>               $self->logerr($err);
>           }
> @@ -452,7 +453,7 @@ sub archive {
>           } else {
>               $self->loginfo("resuming VM again");
>           }
> -         PVE::QemuServer::vm_mon_cmd($vmid, 'cont');
> +         mon_cmd($vmid, 'cont');
>       }
>  
>       my $status;
> @@ -465,7 +466,7 @@ sub archive {
>       my $transferred;
>  
>       while(1) {
> -         $status = PVE::QemuServer::vm_mon_cmd($vmid, 'query-backup');
> +         $status = mon_cmd($vmid, 'query-backup');
>           my $total = $status->{total} || 0;
>           $transferred = $status->{transferred} || 0;
>           my $per = $total ? int(($transferred * 100)/$total) : 0;
> @@ -524,7 +525,7 @@ sub archive {
>      if ($err) {
>       $self->logerr($err);
>       $self->loginfo("aborting backup job");
> -     eval { PVE::QemuServer::vm_mon_cmd($vmid, 'backup-cancel'); };
> +     eval { mon_cmd($vmid, 'backup-cancel'); };
>       if (my $err1 = $@) {
>           $self->logerr($err1);
>       }
> @@ -533,7 +534,7 @@ sub archive {
>      if ($stop_after_backup) {
>       # stop if not running
>       eval {
> -         my $resp = PVE::QemuServer::vm_mon_cmd($vmid, 'query-status');
> +         my $resp = mon_cmd($vmid, 'query-status');
>           my $status = $resp && $resp->{status} ?  $resp->{status} : 
> 'unknown';
>           if ($status eq 'prelaunch') {
>               $self->loginfo("stopping kvm after backup task");
> diff --git a/test/snapshot-test.pm b/test/snapshot-test.pm
> index a76b4fd..685934c 100644
> --- a/test/snapshot-test.pm
> +++ b/test/snapshot-test.pm
> @@ -312,13 +312,9 @@ sub vm_running_locally {
>  
>  # END mocked PVE::QemuServer::Helpers methods
>  
> -# BEGIN redefine PVE::QemuServer methods
> +# BEGIN mocked PVE::QemuServer::Monitor methods
>  
> -sub do_snapshots_with_qemu {
> -    return 0;
> -}
> -
> -sub vm_qmp_command {
> +sub qmp_cmd {
>      my ($vmid, $cmd, $nocheck) = @_;
>  
>      my $exec = $cmd->{execute};
> @@ -351,6 +347,14 @@ sub vm_qmp_command {
>      die "unexpected vm_qmp_command!\n";
>  }
>  
> +# END mocked PVE::QemuServer::Monitor methods
> +
> +# BEGIN redefine PVE::QemuServer methods
> +
> +sub do_snapshots_with_qemu {
> +    return 0;
> +}
> +
>  sub vm_start {
>      my ($storecfg, $vmid, $statefile, $skiplock, $migratedfrom, $paused, 
> $forcemachine) = @_;
>  
> @@ -380,6 +384,9 @@ PVE::Tools::run_command("cp -a snapshot-input 
> snapshot-working");
>  my $qemu_helpers_module = new Test::MockModule('PVE::QemuServer::Helpers');
>  $qemu_helpers_module->mock('vm_running_locally', \&vm_running_locally);
>  
> +my $qemu_monitor_module = new Test::MockModule('PVE::QemuServer::Monitor');
> +$qemu_monitor_module->mock('qmp_cmd', \&qmp_cmd);
> +
>  my $qemu_config_module = new Test::MockModule('PVE::QemuConfig');
>  $qemu_config_module->mock('config_file_lock', \&config_file_lock);
>  $qemu_config_module->mock('cfs_config_path', \&cfs_config_path);
> -- 
> 2.20.1
> 
> 
> _______________________________________________
> pve-devel mailing list
> pve-devel@pve.proxmox.com
> https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
> 
> 

_______________________________________________
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to