On 23.08.19 10:55, Dominik Csapak wrote: > this creates a reboot trigger file (inspired by pve-container) > and relies on the 'qm cleanup' call by the qmeventd to detect > and restart the vm afterwards > > Signed-off-by: Dominik Csapak <d.csa...@proxmox.com> > --- > changes from rfc: > * use PVE::QemuServer:vm_stop instead of the api call, to prevent > the ha manager to change the target state > * create the trigger only during the lock in vm_stop, to be sure we are > actually shutting down > > PVE/API2/Qemu.pm | 63 +++++++++++++++++++++++++++++++++++++++++++++++ > PVE/QemuServer.pm | 4 ++- > 2 files changed, 66 insertions(+), 1 deletion(-) > > diff --git a/PVE/API2/Qemu.pm b/PVE/API2/Qemu.pm > index b30931d..5094721 100644 > --- a/PVE/API2/Qemu.pm > +++ b/PVE/API2/Qemu.pm > @@ -2339,6 +2339,69 @@ __PACKAGE__->register_method({ > } > }}); > > +__PACKAGE__->register_method({ > + name => 'vm_reboot', > + path => '{vmid}/status/reboot', > + method => 'POST', > + protected => 1, > + proxyto => 'node', > + description => "Reboot the VM by shutting it down, and starting it > again.", > + permissions => { > + check => ['perm', '/vms/{vmid}', [ 'VM.PowerMgmt' ]], > + }, > + parameters => { > + additionalProperties => 0, > + properties => { > + node => get_standard_option('pve-node'), > + vmid => get_standard_option('pve-vmid', > + { completion => > \&PVE::QemuServer::complete_vmid_running }), > + timeout => { > + description => "Wait maximal timeout seconds for the shutdown.", > + type => 'integer', > + minimum => 0, > + optional => 1, > + }, > + }, > + }, > + returns => { > + type => 'string', > + }, > + code => sub { > + my ($param) = @_; > + > + my $rpcenv = PVE::RPCEnvironment::get(); > + my $authuser = $rpcenv->get_user(); > + > + my $node = extract_param($param, 'node'); > + my $vmid = extract_param($param, 'vmid'); > + > + my $storecfg = PVE::Storage::config(); > + > + my $shutdown = 1; > + my $reboot = 1;
variable declaration vs use. locality is not too good here, IMO. $storecfg could be moved below; above the vm_stop call, the two variables which try to improve readability could be also moved there. > + > + my $qmpstatus = eval { > + PVE::QemuServer::vm_qmp_command($vmid, { execute => "query-status" > }, 0); > + }; > + my $err = $@ if $@; > + > + if (!$err && $qmpstatus->{status} eq "paused") { > + die "VM is paused - cannot shutdown\n"; > + } > + > + my $realcmd = sub { > + my $upid = shift; > + > + syslog('info', "shutdown VM $vmid: $upid\n"); s/shutdown/reboot/ > + > + PVE::QemuServer::vm_stop($storecfg, $vmid, undef, 0, > $param->{timeout}, > + $shutdown, undef, undef, undef, $reboot); > + return; > + }; > + > + return $rpcenv->fork_worker('qmshutdown', $vmid, $authuser, $realcmd); > + }}); > + > __PACKAGE__->register_method({ > name => 'vm_suspend', > path => '{vmid}/status/suspend', > diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm > index cc0c95e..ab4ee3e 100644 > --- a/PVE/QemuServer.pm > +++ b/PVE/QemuServer.pm > @@ -5739,7 +5739,7 @@ sub vm_stop_cleanup { > # We need that when migration VMs to other nodes (files already moved) > # Note: we set $keepActive in vzdump stop mode - volumes need to stay active > sub vm_stop { > - my ($storecfg, $vmid, $skiplock, $nocheck, $timeout, $shutdown, $force, > $keepActive, $migratedfrom) = @_; > + my ($storecfg, $vmid, $skiplock, $nocheck, $timeout, $shutdown, $force, > $keepActive, $migratedfrom, $reboot) = @_; I'd like to rather avoid adding such a parameter to this mess of a method signature.. Also, your call to this above has 4 undefs and a 0 which could be undef, so 5 fixed params.. Maybe move the actual anonymous sub here doing the shutdown in locked context to a "_do_vm_stop method" (with comment that it's required to call it in locked context) and add your own "vm_reboot" method with a reduced method-signature, which just calls "_do_vm_stop" and the "create_reboot_trigger" (or "create_reboot_request", if you agree with the review of 1/5) methods. would be IMO much nicer. > > $force = 1 if !defined($force) && !$shutdown; > > @@ -5756,6 +5756,8 @@ sub vm_stop { > my $pid = check_running($vmid, $nocheck); > return if !$pid; > > + create_reboot_trigger($vmid) if $reboot; maybe a comment to the create_reboot... call that it's handled by the qm eventd called post stop hooks would be great, else people reading this will question where or how it happens. > + > my $conf; > if (!$nocheck) { > $conf = PVE::QemuConfig->load_config($vmid); > _______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel