[pve-devel] r5095 - in qemu-server/pve2: . PVE/API2
svn-commits at proxmox.com
svn-commits at proxmox.com
Tue Sep 7 12:11:20 CEST 2010
Author: dietmar
Date: 2010-09-07 10:11:20 +0000 (Tue, 07 Sep 2010)
New Revision: 5095
Added:
qemu-server/pve2/nqm
Modified:
qemu-server/pve2/ChangeLog
qemu-server/pve2/PVE/API2/QemuServer.pm
qemu-server/pve2/QemuServer.pm
Log:
* nqm: temporary file to test new API - will replace 'qm' later.
* QemuServer.pm (vmstatus): moved from PVE::Qemu.pm
Modified: qemu-server/pve2/ChangeLog
===================================================================
--- qemu-server/pve2/ChangeLog 2010-09-07 08:33:21 UTC (rev 5094)
+++ qemu-server/pve2/ChangeLog 2010-09-07 10:11:20 UTC (rev 5095)
@@ -1,3 +1,9 @@
+2010-09-07 Proxmox Support Team <support at proxmox.com>
+
+ * nqm: temporary file to test new API - will replace 'qm' later.
+
+ * QemuServer.pm (vmstatus): moved from PVE::Qemu.pm
+
2010-08-26 Proxmox Support Team <support at proxmox.com>
* PVE/*: created directory hierachy for library compoments
Modified: qemu-server/pve2/PVE/API2/QemuServer.pm
===================================================================
--- qemu-server/pve2/PVE/API2/QemuServer.pm 2010-09-07 08:33:21 UTC (rev 5094)
+++ qemu-server/pve2/PVE/API2/QemuServer.pm 2010-09-07 10:11:20 UTC (rev 5095)
@@ -4,15 +4,16 @@
use warnings;
use PVE::RESTHandler;
+use PVE::QemuServer;
# API URLs
#
-# GET /vms/
-# GET /vms/index status of all VMs (cluster wide)
+## 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} status of all Qemu VMs (per node)
+# GET /vms/qm/{node}/{vmid} get VM config
# PUT /vms/qm/{node}/{vmid} set VM config/status
# DELETE /vms/qm/{node}/{vmid} destroy VM
@@ -22,7 +23,7 @@
name => 'index',
path => '',
method => 'GET',
- description => "Virtual machine index.",
+ description => "Virtual machine index (cluster wide).",
parameters => {
additionalProperties => 0,
properties => {},
@@ -33,13 +34,44 @@
type => "object",
properties => {},
},
- links => [ { rel => 'child', href => "{id}" } ],
+ links => [ { rel => 'child', href => "{vmid}" } ],
},
code => sub {
my ($param) = @_;
- return [{ id => 100 }];
+ # fixme: not implemented
+ die "not implemented";
+ return [{ vmid => 100 }];
+
}});
+__PACKAGE__->register_method ({
+ name => 'vmlist',
+ path => '{node}',
+ method => 'GET',
+ description => "Virtual machine index.",
+ parameters => {
+ additionalProperties => 0,
+ properties => {
+ node => { type => 'string', format => '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');
+
+ }});
+
1;
Modified: qemu-server/pve2/QemuServer.pm
===================================================================
--- qemu-server/pve2/QemuServer.pm 2010-09-07 08:33:21 UTC (rev 5094)
+++ qemu-server/pve2/QemuServer.pm 2010-09-07 10:11:20 UTC (rev 5095)
@@ -18,9 +18,13 @@
use Fcntl;
use Sys::Syslog;
use PVE::Storage;
-use PVE::Tools qw(run_command lock_file);
+use PVE::Tools qw(run_command lock_file file_read_firstline);
use PVE::INotify qw(read_file);
+use PVE::ProcFSTools;
+use Time::HiRes qw (gettimeofday);
+my $clock_ticks = POSIX::sysconf(&POSIX::_SC_CLK_TCK);
+
# Note about locking: we use flock on the config file protect
# against concurent actions.
# Adiitionaly, we have a 'lock' setting in the config file. This
@@ -1167,6 +1171,107 @@
return $vzlist;
}
+
+my $last_proc_pid_stat;
+
+sub vmstatus {
+ my $res = {};
+
+ my $list = vzlist();
+ my ($uptime) = PVE::ProcFSTools::read_proc_uptime();
+
+
+ foreach my $veid (keys %$list) {
+ my $fn = config_file ($veid);
+ my $conf = read_file ($fn);
+
+ my $d = {};
+ $d->{type} = 'qemu';
+ $d->{nproc} = 0;
+ $d->{pid} = $list->{$veid}->{pid};
+ # fixme: better status?
+ $d->{status} = $list->{$veid}->{pid} ? 'running' : 'stopped';
+ $d->{ip} = '-';
+ $d->{disk} = 0;
+ $d->{cpus} = ($conf->{sockets} || 1) * ($conf->{cores} || 1);
+ $d->{name} = $conf->{name} || "VM$veid";
+
+ $d->{maxmem} = $conf->{memory} ? $conf->{memory} : 0;
+
+ $d->{maxdisk} = $conf->{disksize} ? int($conf->{disksize}*1024) : 0;
+
+ $d->{uptime} = 0;
+ $d->{pctcpu} = 0;
+ $d->{relcpu} = 0;
+ $d->{mem} = 0;
+
+ $res->{$veid} = $d;
+
+ }
+
+ my $cpuinfo = PVE::ProcFSTools::get_cpu_info();
+ my $cpucount = $cpuinfo->{cpus} || 1;
+ my $ctime = gettimeofday;
+
+ foreach my $veid (keys %$list) {
+
+ my $d = $res->{$veid};
+ my $pid = $d->{pid};
+ next if !$pid;
+
+ my $statstr = file_read_firstline("/proc/$pid/stat");
+ next if !$statstr;
+
+ my ($utime, $stime, $vsize, $rss, $starttime);
+ if ($statstr =~ m/^$pid \(.*\) \S (-?\d+) -?\d+ -?\d+ -?\d+ -?\d+ \d+ \d+ \d+ \d+ \d+ (\d+) (\d+) (-?\d+) (-?\d+) -?\d+ -?\d+ -?\d+ 0 (\d+) (\d+) (-?\d+) \d+ \d+ \d+ \d+ \d+ \d+ \d+ \d+ \d+ \d+ \d+ \d+ \d+ -?\d+ -?\d+ \d+ \d+ \d+/) {
+ ($utime, $stime, $vsize, $rss, $starttime) = ($2, $3, $7, $8 * 4096, $6);
+ } else {
+ next;
+ }
+
+ my $used = $utime + $stime;
+
+ my $vcpus = $d->{cpus} > $cpucount ? $cpucount : $d->{cpus};
+
+ $d->{uptime} = int ($uptime - ($starttime/100));
+
+ if ($vsize) {
+ $d->{mem} = int (($rss/$vsize)*$d->{maxmem});
+ }
+
+ my $old = $last_proc_pid_stat->{$pid};
+ if (!$old) {
+ $last_proc_pid_stat->{$pid} = {
+ time => $ctime,
+ used => $used,
+ pctcpu => 0,
+ relcpu => 0,
+ };
+ next;
+ }
+
+ my $dtime = ($ctime - $old->{time}) * $cpucount * $clock_ticks;
+
+ if ($dtime > 1000) {
+ my $dutime = $used - $old->{used};
+
+ $d->{pctcpu} = int((($dutime)*100)/$dtime);
+ $d->{relcpu} = int (($d->{pctcpu} * $cpucount) / $vcpus);
+ $last_proc_pid_stat->{$pid} = {
+ time => $ctime,
+ used => $used,
+ pctcpu => $d->{pctcpu},
+ relcpu => $d->{relcpu},
+ };
+ } else {
+ $d->{pctcpu} = $old->{pctcpu};
+ $d->{relcpu} = $old->{relcpu};
+ }
+ }
+
+ return $res;
+}
+
sub config_to_command {
my ($self, $vmid, $conf, $defaults, $migrate_uri) = @_;
@@ -2029,17 +2134,6 @@
# pci helpers
-sub file_read_firstline {
- my ($filename) = @_;
-
- my $fh = IO::File->new ($filename, "r");
- return undef if !$fh;
- my $res = <$fh>;
- chomp $res;
- $fh->close;
- return $res;
-}
-
sub file_write {
my ($filename, $buf) = @_;
Added: qemu-server/pve2/nqm
===================================================================
--- qemu-server/pve2/nqm (rev 0)
+++ qemu-server/pve2/nqm 2010-09-07 10:11:20 UTC (rev 5095)
@@ -0,0 +1,54 @@
+#!/usr/bin/perl -w
+
+use strict;
+use Getopt::Long;
+use Fcntl ':flock';
+use File::Path;
+
+use PVE::INotify qw(read_file);
+use PVE::RPCEnvironment;
+use PVE::QemuServer;
+use PVE::API2::QemuServer;
+
+use PVE::CLIHandler;
+
+use base qw(PVE::CLIHandler);
+
+$ENV{'PATH'} = '/sbin:/bin:/usr/sbin:/usr/bin';
+
+die "please run as root\n" if $> != 0;
+
+PVE::INotify::inotify_init();
+
+my $rpcenv = PVE::RPCEnvironment->init('cli');
+
+$rpcenv->set_language($ENV{LANG});
+
+$rpcenv->set_user('root');
+
+my $hostname = read_file('hostname');
+
+my $cmddef = {
+ list => [ "PVE::API2::QemuServer", 'vmlist', [],
+ { node => $hostname }, sub {
+ my $vmlist = shift;
+
+ exit 0 if (!scalar(@$vmlist));
+
+ printf "%10s %-20s %-10s %-10s %12s %-10s\n",
+ qw(VMID NAME STATUS MEM(MB) BOOTDISK(GB) PID);
+
+ foreach my $rec (sort { $a->{vmid} <=> $b->{vmid} } @$vmlist) {
+ printf "%10s %-20s %-10s %-10s %12.2f %-10s\n", $rec->{vmid}, $rec->{name},
+ $rec->{status}, $rec->{maxmem}, $rec->{maxdisk}||0, $rec->{pid}||0;
+ }
+
+
+ } ],
+};
+
+my $cmd = shift;
+
+PVE::CLIHandler::handle_cmd($cmddef, "qm", $cmd, \@ARGV);
+
+exit 0;
Property changes on: qemu-server/pve2/nqm
___________________________________________________________________
Added: svn:executable
+ *
More information about the pve-devel
mailing list