From b8158701aa7fb190c9e4209704398f9f88dc3f5e Mon Sep 17 00:00:00 2001 From: Dominik Csapak Date: Tue, 13 Feb 2018 16:47:09 +0100 Subject: [PATCH] move guest agent api call to its own file so we do not pollute the Qemu.pm too much Signed-off-by: Dominik Csapak --- PVE/API2/Makefile | 1 + PVE/API2/Qemu.pm | 70 ++++---------------------------------- PVE/API2/Qemu/Agent.pm | 76 ++++++++++++++++++++++++++++++++++++++++++ PVE/API2/Qemu/Makefile | 6 ++++ PVE/CLI/qm.pm | 3 +- 5 files changed, 91 insertions(+), 65 deletions(-) create mode 100644 PVE/API2/Qemu/Agent.pm create mode 100644 PVE/API2/Qemu/Makefile diff --git a/PVE/API2/Makefile b/PVE/API2/Makefile index b438448b..c2d01bef 100644 --- a/PVE/API2/Makefile +++ b/PVE/API2/Makefile @@ -2,3 +2,4 @@ install: install -d -m 0755 ${DESTDIR}${PERLDIR}/PVE/API2 install -D -m 0644 Qemu.pm ${DESTDIR}${PERLDIR}/PVE/API2/Qemu.pm + make -C Qemu install diff --git a/PVE/API2/Qemu.pm b/PVE/API2/Qemu.pm index 6c9ede91..5051cc9b 100644 --- a/PVE/API2/Qemu.pm +++ b/PVE/API2/Qemu.pm @@ -26,6 +26,7 @@ use PVE::INotify; use PVE::Network; use PVE::Firewall; use PVE::API2::Firewall::VM; +use PVE::API2::Qemu::Agent; BEGIN { if (!$ENV{PVE_GENERATING_DOCS}) { @@ -631,6 +632,11 @@ __PACKAGE__->register_method ({ path => '{vmid}/firewall', }); +__PACKAGE__->register_method ({ + subclass => "PVE::API2::Qemu::Agent", + path => '{vmid}/agent', +}); + __PACKAGE__->register_method({ name => 'rrd', path => '{vmid}/rrd', @@ -3042,70 +3048,6 @@ __PACKAGE__->register_method({ return $res; }}); -my $guest_agent_commands = [ - 'ping', - 'get-time', - 'info', - 'fsfreeze-status', - 'fsfreeze-freeze', - 'fsfreeze-thaw', - 'fstrim', - 'network-get-interfaces', - 'get-vcpus', - 'get-fsinfo', - 'get-memory-blocks', - 'get-memory-block-info', - 'suspend-hybrid', - 'suspend-ram', - 'suspend-disk', - 'shutdown', - ]; - -__PACKAGE__->register_method({ - name => 'agent', - path => '{vmid}/agent', - method => 'POST', - protected => 1, - proxyto => 'node', - description => "Execute Qemu Guest Agent commands.", - permissions => { - check => ['perm', '/vms/{vmid}', [ 'VM.Monitor' ]], - }, - parameters => { - additionalProperties => 0, - properties => { - node => get_standard_option('pve-node'), - vmid => get_standard_option('pve-vmid', { - completion => \&PVE::QemuServer::complete_vmid_running }), - command => { - type => 'string', - description => "The QGA command.", - enum => $guest_agent_commands, - }, - }, - }, - returns => { - type => 'object', - description => "Returns an object with a single `result` property. The type of that -property depends on the executed command.", - }, - code => sub { - my ($param) = @_; - - my $vmid = $param->{vmid}; - - my $conf = PVE::QemuConfig->load_config ($vmid); # check if VM exists - - die "No Qemu Guest Agent\n" if !defined($conf->{agent}); - die "VM $vmid is not running\n" if !PVE::QemuServer::check_running($vmid); - - my $cmd = $param->{command}; - - my $res = PVE::QemuServer::vm_mon_cmd($vmid, "guest-$cmd"); - - return { result => $res }; - }}); - __PACKAGE__->register_method({ name => 'resize_vm', path => '{vmid}/resize', diff --git a/PVE/API2/Qemu/Agent.pm b/PVE/API2/Qemu/Agent.pm new file mode 100644 index 00000000..437d3f68 --- /dev/null +++ b/PVE/API2/Qemu/Agent.pm @@ -0,0 +1,76 @@ +package PVE::API2::Qemu::Agent; + +use strict; +use warnings; + +use PVE::RESTHandler; +use PVE::JSONSchema qw(get_standard_option); +use PVE::QemuServer; + +use base qw(PVE::RESTHandler); + +my $guest_agent_commands = [ + 'ping', + 'get-time', + 'info', + 'fsfreeze-status', + 'fsfreeze-freeze', + 'fsfreeze-thaw', + 'fstrim', + 'network-get-interfaces', + 'get-vcpus', + 'get-fsinfo', + 'get-memory-blocks', + 'get-memory-block-info', + 'suspend-hybrid', + 'suspend-ram', + 'suspend-disk', + 'shutdown', + ]; + +__PACKAGE__->register_method({ + name => 'agent', + path => '', + method => 'POST', + protected => 1, + proxyto => 'node', + description => "Execute Qemu Guest Agent commands.", + permissions => { + check => ['perm', '/vms/{vmid}', [ 'VM.Monitor' ]], + }, + parameters => { + additionalProperties => 0, + properties => { + node => get_standard_option('pve-node'), + vmid => get_standard_option('pve-vmid', { + completion => \&PVE::QemuServer::complete_vmid_running }), + command => { + type => 'string', + description => "The QGA command.", + enum => $guest_agent_commands, + }, + }, + }, + returns => { + type => 'object', + description => "Returns an object with a single `result` property. The type of that +property depends on the executed command.", + }, + code => sub { + my ($param) = @_; + + my $vmid = $param->{vmid}; + + my $conf = PVE::QemuConfig->load_config ($vmid); # check if VM exists + + die "No Qemu Guest Agent\n" if !defined($conf->{agent}); + die "VM $vmid is not running\n" if !PVE::QemuServer::check_running($vmid); + + my $cmd = $param->{command}; + + my $res = PVE::QemuServer::vm_mon_cmd($vmid, "guest-$cmd"); + + return { result => $res }; + }}); + +1; diff --git a/PVE/API2/Qemu/Makefile b/PVE/API2/Qemu/Makefile new file mode 100644 index 00000000..20c2a6c6 --- /dev/null +++ b/PVE/API2/Qemu/Makefile @@ -0,0 +1,6 @@ +SOURCES=Agent.pm + +.PHONY: install +install: + install -d -m 0755 ${DESTDIR}${PERLDIR}/PVE/API2/Qemu + for i in ${SOURCES}; do install -D -m 0644 $$i ${DESTDIR}${PERLDIR}/PVE/API2/Qemu/$$i; done diff --git a/PVE/CLI/qm.pm b/PVE/CLI/qm.pm index 04beb48e..d33b9497 100755 --- a/PVE/CLI/qm.pm +++ b/PVE/CLI/qm.pm @@ -20,6 +20,7 @@ use PVE::QemuServer; use PVE::QemuServer::ImportDisk; use PVE::QemuServer::OVF; use PVE::API2::Qemu; +use PVE::API2::Qemu::Agent; use JSON; use PVE::JSONSchema qw(get_standard_option); use Term::ReadLine; @@ -786,7 +787,7 @@ our $cmddef = { monitor => [ __PACKAGE__, 'monitor', ['vmid']], - agent => [ "PVE::API2::Qemu", 'agent', ['vmid', 'command'], + agent => [ "PVE::API2::Qemu::Agent", 'agent', ['vmid', 'command'], { node => $nodename }, $print_agent_result ], mtunnel => [ __PACKAGE__, 'mtunnel', []], -- 2.39.5