[pve-devel] r5123 - in qemu-server/pve2: . PVE/API2
svn-commits at proxmox.com
svn-commits at proxmox.com
Mon Sep 13 12:39:03 CEST 2010
Author: dietmar
Date: 2010-09-13 10:39:03 +0000 (Mon, 13 Sep 2010)
New Revision: 5123
Added:
qemu-server/pve2/PVE/API2/QemuServerStatus.pm
Modified:
qemu-server/pve2/ChangeLog
qemu-server/pve2/PVE/API2/Makefile
qemu-server/pve2/PVE/API2/QemuServer.pm
qemu-server/pve2/QemuServer.pm
qemu-server/pve2/nqm
qemu-server/pve2/qm
Log:
Modified: qemu-server/pve2/ChangeLog
===================================================================
--- qemu-server/pve2/ChangeLog 2010-09-13 09:26:40 UTC (rev 5122)
+++ qemu-server/pve2/ChangeLog 2010-09-13 10:39:03 UTC (rev 5123)
@@ -1,5 +1,7 @@
2010-09-13 Proxmox Support Team <support at proxmox.com>
+ * PVE/API2/QemuServerStatus.pm: implement vm_command()
+
* nqm: implement monitor command
* QemuServer.pm (vm_monitor_command): remove $self - not needed at all.
Modified: qemu-server/pve2/PVE/API2/Makefile
===================================================================
--- qemu-server/pve2/PVE/API2/Makefile 2010-09-13 09:26:40 UTC (rev 5122)
+++ qemu-server/pve2/PVE/API2/Makefile 2010-09-13 10:39:03 UTC (rev 5123)
@@ -2,3 +2,4 @@
.PHONY: install
install:
install -D -m 0644 QemuServer.pm ${DESTDIR}${PERLDIR}/PVE/API2/QemuServer.pm
+ install -D -m 0644 QemuServerStatus.pm ${DESTDIR}${PERLDIR}/PVE/API2/QemuServerStatus.pm
Modified: qemu-server/pve2/PVE/API2/QemuServer.pm
===================================================================
--- qemu-server/pve2/PVE/API2/QemuServer.pm 2010-09-13 09:26:40 UTC (rev 5122)
+++ qemu-server/pve2/PVE/API2/QemuServer.pm 2010-09-13 10:39:03 UTC (rev 5123)
@@ -18,15 +18,7 @@
#
## GET /vms/
## GET /vms/index status of all VMs (cluster wide)
-# GET /vms/qm status of all Qemu VMs (cluster wide)
-# GET /vms/qm/{node}/ status of all Qemu VMs (per node)
-# POST /vms/qm/{node}/ create VM
-# GET /vms/qm/{node}/{vmid} get VM config
-# PUT /vms/qm/{node}/{vmid} set VM config/status
-# DELETE /vms/qm/{node}/{vmid} destroy VM
-##or
-
# GET /vms/config/qm/{node}/ list of all Qemu VMs (per node)
# POST /vms/config/qm/{node}/ create VM
# GET /vms/config/qm/{node}/{vmid} get VM config
@@ -38,39 +30,11 @@
# GET /vms/status/qm/{node}/{vmid} get VM status
# PUT /vms/status/qm/{node}/{vmid} set VM status
-
use base qw(PVE::RESTHandler);
__PACKAGE__->register_method ({
- name => 'index',
- path => '',
- method => 'GET',
- description => "Virtual machine index (cluster wide).",
- parameters => {
- additionalProperties => 0,
- properties => {},
- },
- returns => {
- type => 'array',
- items => {
- type => "object",
- properties => {},
- },
- links => [ { rel => 'child', href => "{vmid}" } ],
- },
- code => sub {
- my ($param) = @_;
-
- # fixme: not implemented
- die "not implemented";
-
- return [{ vmid => 100 }];
-
- }});
-
-__PACKAGE__->register_method ({
name => 'vmlist',
- path => 'config/{node}',
+ path => '{node}',
method => 'GET',
description => "Virtual machine index.",
parameters => {
@@ -98,7 +62,7 @@
__PACKAGE__->register_method ({
name => 'create_vm',
- path => 'config/{node}',
+ path => '{node}',
method => 'POST',
description => "Create new virtual machine.",
parameters => {
@@ -178,7 +142,7 @@
__PACKAGE__->register_method ({
name => 'update_vm',
- path => 'config/{node}/{vmid}',
+ path => '{node}/{vmid}',
method => 'PUT',
description => "Set virtual machine options.",
parameters => {
@@ -262,18 +226,14 @@
__PACKAGE__->register_method ({
name => 'vm_config',
- path => 'config/{node}/{vmid}',
+ path => '{node}/{vmid}',
method => 'GET',
description => "Get virtual machine configuration.",
parameters => {
additionalProperties => 0,
properties => {
- node => { type => 'string', format => 'pve-node' },
- vmid => {
- description => "The (unique) ID of the VM.",
- type => 'integer', format => 'pve-vmid',
- minimum => 1,
- },
+ node => get_standard_option('pve-node'),
+ vmid => get_standard_option('pve-vmid'),
},
},
returns => {},
Added: qemu-server/pve2/PVE/API2/QemuServerStatus.pm
===================================================================
--- qemu-server/pve2/PVE/API2/QemuServerStatus.pm (rev 0)
+++ qemu-server/pve2/PVE/API2/QemuServerStatus.pm 2010-09-13 10:39:03 UTC (rev 5123)
@@ -0,0 +1,141 @@
+package PVE::API2::QemuServerStatus;
+
+use strict;
+use warnings;
+
+use PVE::SafeSyslog;
+use PVE::Tools qw(extract_param);
+use PVE::Exception qw(raise raise_param_exc);
+use PVE::INotify qw(read_file);
+use PVE::JSONSchema qw(get_standard_option);
+use PVE::RESTHandler;
+use PVE::QemuServer;
+use PVE::RPCEnvironment;
+
+use Data::Dumper; # fixme: remove
+
+use base qw(PVE::RESTHandler);
+
+
+__PACKAGE__->register_method ({
+ name => 'vmlist',
+ path => '{node}',
+ method => 'GET',
+ description => "Virtual machine index.",
+ parameters => {
+ additionalProperties => 0,
+ properties => {
+ node => get_standard_option('pve-node'),
+ },
+ },
+ returns => {
+ type => 'array',
+ items => {
+ type => "object",
+ properties => {},
+ },
+ links => [ { rel => 'child', href => "{vmid}" } ],
+ },
+ code => sub {
+ my ($param) = @_;
+
+ my $vmstatus = PVE::QemuServer::vmstatus();
+
+ return PVE::RESTHandler::hash_to_array($vmstatus, 'vmid');
+
+ }});
+
+__PACKAGE__->register_method ({
+ name => 'vm_command',
+ path => '{node}/{vmid}',
+ method => 'POST',
+ description => "Set virtual machine status.",
+ parameters => {
+ additionalProperties => 0,
+ properties => PVE::QemuServer::json_config_properties(
+ {
+ node => get_standard_option('pve-node'),
+ vmid => get_standard_option('pve-vmid'),
+ skiplock => {
+ description => "Ignore locks - only root is allowed to use this option.",
+ type => 'boolean',
+ optional => 1,
+ },
+ command => { type => 'string' },
+ }),
+ },
+ returns => { type => 'null'},
+ code => sub {
+ my ($param) = @_;
+
+ my $rpcenv = PVE::RPCEnvironment::get();
+
+ my $user = $rpcenv->get_user();
+
+ my $node = extract_param($param, 'node');
+
+ # fixme: proxy to correct node
+ # fixme: fork worker?
+
+ my $vmid = extract_param($param, 'vmid');
+
+ my $skiplock = extract_param($param, 'skiplock');
+ raise_param_exc({ skiplock => "Only root may use this option." })
+ if $user ne 'root';
+
+ my $command = $param->{command};
+
+ my $storecfg = read_file('storagecfg');
+
+ if ($command eq 'start') {
+ my $statefile = undef; # fixme: --incoming parameter
+ PVE::QemuServer::vm_start($storecfg, $vmid, $statefile, $skiplock);
+ } elsif ($command eq 'stop') {
+ PVE::QemuServer::vm_stop($vmid, $skiplock);
+ } elsif ($command eq 'reset') {
+ PVE::QemuServer::vm_reset($vmid, $skiplock);
+ } elsif ($command eq 'shutdown') {
+ PVE::QemuServer::vm_shutdown($vmid, $skiplock);
+ } elsif ($command eq 'suspend') {
+ PVE::QemuServer::vm_suspend($vmid, $skiplock);
+ } elsif ($command eq 'resume') {
+ PVE::QemuServer::vm_resume($vmid, $skiplock);
+ } elsif ($command eq 'cad') {
+ PVE::QemuServer::vm_cad($vmid, $skiplock);
+ } else {
+ raise_param_exc({ command => "unknown command '$command'" })
+ }
+
+ print "TESTCMD $command\n";
+
+ return undef;
+ }});
+
+
+__PACKAGE__->register_method ({
+ name => 'vm_status',
+ path => '{node}/{vmid}',
+ method => 'GET',
+ description => "Get virtual machine status.",
+ parameters => {
+ additionalProperties => 0,
+ properties => {
+ node => get_standard_option('pve-node'),
+ vmid => get_standard_option('pve-vmid'),
+ },
+ },
+ returns => {},
+ code => sub {
+ my ($param) = @_;
+
+ my $conf = PVE::QemuServer::load_config ($param->{vmid});
+
+ # fixme: that should not be added to the config
+ delete $conf->{disksize};
+ delete $conf->{disktype};
+ delete $conf->{diskinfo};
+
+ return $conf;
+ }});
+
+1;
Modified: qemu-server/pve2/QemuServer.pm
===================================================================
--- qemu-server/pve2/QemuServer.pm 2010-09-13 09:26:40 UTC (rev 5122)
+++ qemu-server/pve2/QemuServer.pm 2010-09-13 10:39:03 UTC (rev 5123)
@@ -907,19 +907,19 @@
}
sub print_drive_full {
- my ($self, $vmid, $drive) = @_;
+ my ($storecfg, $vmid, $drive) = @_;
my $opts = get_qemu_drive_options ($drive);
my $path;
my $volid = $drive->{file};
if (drive_is_cdrom ($drive)) {
- $path = get_iso_path ($self->{storecfg}, $vmid, $volid);
+ $path = get_iso_path ($storecfg, $vmid, $volid);
} else {
if ($volid =~ m|^/|) {
$path = $volid;
} else {
- $path = PVE::Storage::path ($self->{storecfg}, $volid);
+ $path = PVE::Storage::path ($storecfg, $volid);
}
}
@@ -1751,7 +1751,7 @@
}
sub config_to_command {
- my ($self, $vmid, $conf, $defaults, $migrate_uri) = @_;
+ my ($storecfg, $vmid, $conf, $defaults, $migrate_uri) = @_;
my $cmd = [];
@@ -1904,7 +1904,7 @@
my $di = $conf->{diskinfo};
foreach my $ds (sort keys %$di) {
$use_virtio = 1 if $ds =~ m/^virtio/;
- my $drive = $self->print_drive_full ($vmid, $di->{$ds});
+ my $drive = print_drive_full ($storecfg, $vmid, $di->{$ds});
$drive .= ",boot=on" if $conf->{bootdisk} && ($conf->{bootdisk} eq $ds);
push @$cmd, '-drive', $drive;
}
@@ -2034,7 +2034,7 @@
}
sub activate_volumes {
- my ($self, $conf) = @_;
+ my ($storecfg, $conf) = @_;
my $di = $conf->{diskinfo};
@@ -2047,11 +2047,11 @@
};
}
- PVE::Storage::activate_volumes ($self->{storecfg}, $vollist);
+ PVE::Storage::activate_volumes ($storecfg, $vollist);
}
sub vm_start {
- my ($self, $vmid, $statefile, $skiplock) = @_;
+ my ($storecfg, $vmid, $statefile, $skiplock) = @_;
lock_config ($vmid, sub {
my $conf = load_config ($vmid);
@@ -2086,7 +2086,7 @@
my $defaults = load_defaults();
- my $cmd = $self->config_to_command ($vmid, $conf, $defaults, $migrate_uri);
+ my $cmd = config_to_command ($storecfg, $vmid, $conf, $defaults, $migrate_uri);
# host pci devices
if (my $pcidl = $conf->{hostpci}) {
my @dl = split (/,/, $pcidl);
@@ -2099,7 +2099,7 @@
}
}
- $self->activate_volumes ($conf);
+ activate_volumes ($storecfg, $conf);
eval { run_command ($cmd, timeout => $migrate_uri ? undef : 30); };
@@ -2254,19 +2254,19 @@
}
sub vm_commandline {
- my ($self, $vmid) = @_;
+ my ($storecfg, $vmid) = @_;
my $conf = load_config ($vmid);
my $defaults = load_defaults();
- my $cmd = $self->config_to_command ($vmid, $conf, $defaults);
+ my $cmd = config_to_command ($storecfg, $vmid, $conf, $defaults);
return join (' ', @$cmd);
}
sub vm_reset {
- my ($self, $vmid, $skiplock) = @_;
+ my ($vmid, $skiplock) = @_;
lock_config ($vmid, sub {
@@ -2301,7 +2301,7 @@
}
sub vm_shutdown {
- my ($self, $vmid, $skiplock) = @_;
+ my ($vmid, $skiplock) = @_;
lock_config ($vmid, sub {
@@ -2316,7 +2316,7 @@
}
sub vm_stop {
- my ($self, $vmid, $skiplock) = @_;
+ my ($vmid, $skiplock) = @_;
lock_config ($vmid, sub {
@@ -2375,7 +2375,7 @@
}
sub vm_suspend {
- my ($self, $vmid, $skiplock) = @_;
+ my ($vmid, $skiplock) = @_;
lock_config ($vmid, sub {
@@ -2390,7 +2390,7 @@
}
sub vm_resume {
- my ($self, $vmid, $skiplock) = @_;
+ my ($vmid, $skiplock) = @_;
lock_config ($vmid, sub {
@@ -2405,7 +2405,7 @@
}
sub vm_cad {
- my ($self, $vmid, $skiplock) = @_;
+ my ($vmid, $skiplock) = @_;
lock_config ($vmid, sub {
@@ -2523,7 +2523,7 @@
}
sub vm_stopall {
- my ($self, $timeout) = @_;
+ my ($timeout) = @_;
$timeout = 3*60 if !$timeout;
@@ -2542,7 +2542,7 @@
foreach my $vmid (keys %$vzlist) {
next if !$vzlist->{$vmid}->{pid};
- eval { $self->vm_shutdown ($vmid, 1); };
+ eval { vm_shutdown ($vmid, 1); };
print STDERR $@ if $@;
}
Modified: qemu-server/pve2/nqm
===================================================================
--- qemu-server/pve2/nqm 2010-09-13 09:26:40 UTC (rev 5122)
+++ qemu-server/pve2/nqm 2010-09-13 10:39:03 UTC (rev 5123)
@@ -9,6 +9,7 @@
use PVE::RPCEnvironment;
use PVE::QemuServer;
use PVE::API2::QemuServer;
+use PVE::API2::QemuServerStatus;
use PVE::JSONSchema qw(get_standard_option);
use Term::ReadLine;
@@ -45,13 +46,67 @@
code => sub {
my ($param) = @_;
- my $qm = PVE::QemuServer->new();
- print $qm->vm_commandline ($param->{vmid}) . "\n";
+ my $storecfg = read_file('storagecfg');
+ print PVE::QemuServer::vm_commandline ($storecfg, $param->{vmid}) . "\n";
return undef;
}});
__PACKAGE__->register_method ({
+ name => 'status',
+ path => 'status',
+ method => 'GET',
+ description => "Show VM status.",
+ parameters => {
+ additionalProperties => 0,
+ properties => {
+ vmid => get_standard_option('pve-vmid'),
+ },
+ },
+ returns => { type => 'null'},
+ code => sub {
+ my ($param) = @_;
+
+ my $status = 'unknown';
+
+ eval {
+ if (PVE::QemuServer::check_running($param->{vmid})) {
+ $status = 'running';
+ } else {
+ $status = 'stopped';
+ }
+ };
+
+ print "$status\n";
+
+ return undef;
+ }});
+
+__PACKAGE__->register_method ({
+ name => 'unlock',
+ path => 'unlock',
+ method => 'PUT',
+ description => "Unlock the VM.",
+ parameters => {
+ additionalProperties => 0,
+ properties => {
+ vmid => get_standard_option('pve-vmid'),
+ },
+ },
+ returns => { type => 'null'},
+ code => sub {
+ my ($param) = @_;
+
+ my $vmid = $param->{vmid};
+
+ PVE::QemuServer::lock_config ($vmid, sub {
+ PVE::QemuServer::change_config_nolock ($vmid, {}, { lock => 1 }, 1);
+ });
+
+ return undef;
+ }});
+
+__PACKAGE__->register_method ({
name => 'startall',
path => 'startall',
method => 'POST',
@@ -65,6 +120,7 @@
my ($param) = @_;
my $vzlist = PVE::QemuServer::vzlist();
+ my $storecfg = read_file('storagecfg');
foreach my $vmid (keys %$vzlist) {
next if $vzlist->{$vmid}->{pid}; # already running
@@ -73,8 +129,7 @@
my $conf = PVE::QemuServer::load_config ($vmid);
if ($conf->{onboot}) {
print STDERR "Starting Qemu VM $vmid\n";
- my $qm = PVE::QemuServer->new();
- $qm->vm_start ($vmid);
+ vm_start ($storecfg, $vmid);
}
};
print STDERR $@ if $@;
@@ -84,6 +139,33 @@
}});
__PACKAGE__->register_method ({
+ name => 'stopall',
+ path => 'stopall',
+ method => 'POST',
+ description => "Stop all virtual machines.",
+ parameters => {
+ additionalProperties => 0,
+ properties => {
+ timeout => {
+ description => "Timeout in seconds. Default is to wait 3 minutes.",
+ type => 'integer',
+ minimum => 1,
+ optional => 1,
+ }
+ },
+ },
+ returns => { type => 'null'},
+ code => sub {
+ my ($param) = @_;
+
+ my $timeout = $param->{timeout};
+
+ PVE::QemuServer::vm_stopall($timeout);
+
+ return undef;
+ }});
+
+__PACKAGE__->register_method ({
name => 'wait',
path => 'wait',
method => 'GET',
@@ -163,7 +245,13 @@
}});
# fixme: unlink
+# fixme: destroy
+# fixme: vncticket
+# fixme: cdrom
+# fixme: vncproxy, vnc
+# fixme: mtunnel
+
my $cmddef = {
list => [ "PVE::API2::QemuServer", 'vmlist', [],
{ node => $hostname }, sub {
@@ -197,11 +285,31 @@
showcmd => [ __PACKAGE__, 'showcmd', ['vmid']],
+ status => [ __PACKAGE__, 'status', ['vmid']],
+
wait => [ __PACKAGE__, 'wait', ['vmid']],
+ unlock => [ __PACKAGE__, 'unlock', ['vmid']],
+
monitor => [ __PACKAGE__, 'monitor', ['vmid']],
startall => [ __PACKAGE__, 'startall', []],
+
+ stopall => [ __PACKAGE__, 'stopall', []],
+
+
+ start => [ "PVE::API2::QemuServerStatus", 'vm_command', ['vmid'],
+ { node => $hostname, command => 'start' } ],
+ stop => [ "PVE::API2::QemuServerStatus", 'vm_command', ['vmid'],
+ { node => $hostname, command => 'stop' } ],
+ reset => [ "PVE::API2::QemuServerStatus", 'vm_command', ['vmid'],
+ { node => $hostname, command => 'reset' } ],
+ suspend => [ "PVE::API2::QemuServerStatus", 'vm_command', ['vmid'],
+ { node => $hostname, command => 'suspend' } ],
+ resume => [ "PVE::API2::QemuServerStatus", 'vm_command', ['vmid'],
+ { node => $hostname, command => 'resume' } ],
+ cad => [ "PVE::API2::QemuServerStatus", 'vm_command', ['vmid'],
+ { node => $hostname, command => 'cad' } ],
};
Modified: qemu-server/pve2/qm
===================================================================
--- qemu-server/pve2/qm 2010-09-13 09:26:40 UTC (rev 5122)
+++ qemu-server/pve2/qm 2010-09-13 10:39:03 UTC (rev 5123)
@@ -466,7 +466,7 @@
exit (-1);
}
- print $qm->vm_commandline ($vmid) . "\n";
+ print vm_commandline ($qm->{storecfg}, $vmid) . "\n";
} elsif ($cmd eq 'start') {
my $statefile;
@@ -477,7 +477,7 @@
exit (-1);
}
- $qm->vm_start ($vmid, $statefile, $skiplock);
+ PVE::QemuServer::vm_start ($qm->{storecfg}, $vmid, $statefile, $skiplock);
} elsif ($cmd eq 'startall') {
if (scalar (@ARGV) != 0) {
@@ -493,7 +493,7 @@
exit (-1);
}
- $qm->vm_reset ($vmid, $skiplock);
+ PVE::QemuServer::vm_reset ($vmid, $skiplock);
} elsif ($cmd eq 'shutdown') {
if (scalar (@ARGV) != 0) {
@@ -501,7 +501,7 @@
exit (-1);
}
- $qm->vm_shutdown ($vmid, $skiplock);
+ vm_shutdown ($vmid, $skiplock);
} elsif ($cmd eq 'wait') {
my $timeout = shift || 0;
@@ -531,7 +531,7 @@
exit (-1);
}
- $qm->vm_stopall ($timeout);
+ PVE::QemuServer::vm_stopall($timeout);
} elsif ($cmd eq 'stop') {
if (scalar (@ARGV) != 0) {
@@ -539,7 +539,7 @@
exit (-1);
}
- $qm->vm_stop ($vmid, $skiplock);
+ vm_stop ($vmid, $skiplock);
} elsif ($cmd eq 'destroy') {
if (scalar (@ARGV) != 0) {
@@ -555,7 +555,7 @@
exit (-1);
}
- $qm->vm_suspend ($vmid, $skiplock);
+ PVE::QemuServer::vm_suspend ($vmid, $skiplock);
} elsif ($cmd eq 'resume') {
if (scalar (@ARGV) != 0) {
@@ -563,7 +563,7 @@
exit (-1);
}
- $qm->vm_resume ($vmid, $skiplock);
+ PVE::QemuServer::vm_resume ($vmid, $skiplock);
} elsif ($cmd eq 'cad') {
if (scalar (@ARGV) != 0) {
@@ -571,7 +571,7 @@
exit (-1);
}
- $qm->vm_cad ($vmid, $skiplock);
+ PVE::QemuServer::vm_cad ($vmid, $skiplock);
} elsif ($cmd eq 'vncticket') {
if (scalar (@ARGV) != 0) {
More information about the pve-devel
mailing list