From: Pasquale Di Rienzo <phate867(a)gmail.com>
-Added the getNodeCpuStat binding to Libvirt class
-Added virNodeCPUStats and CPUStat classes to support this binding
-Added the method getCPUStats to Connect class
---
AUTHORS | 1 +
src/main/java/org/libvirt/CPUStat.java | 57 ++++++++++++++++++++++
src/main/java/org/libvirt/Connect.java | 53 ++++++++++++++++++++
src/main/java/org/libvirt/jna/Libvirt.java | 5 ++
src/main/java/org/libvirt/jna/virNodeCPUStats.java | 19 ++++++++
5 files changed, 135 insertions(+)
create mode 100644 src/main/java/org/libvirt/CPUStat.java
create mode 100644 src/main/java/org/libvirt/jna/virNodeCPUStats.java
diff --git a/AUTHORS b/AUTHORS
index 07809bf..77139e5 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -16,3 +16,4 @@ Andrea Sansottera <andrea.sansottera(a)gmail.com>
Stefan Majer <stefan.majer(a)gmail.com>
Wido den Hollander <wido(a)widodh.nl>
Eric Blake <eblake(a)redhat.com>
+Pasquale Di Rienzo <phate867(a)gmail.com>
diff --git a/src/main/java/org/libvirt/CPUStat.java
b/src/main/java/org/libvirt/CPUStat.java
new file mode 100644
index 0000000..527049c
--- /dev/null
+++ b/src/main/java/org/libvirt/CPUStat.java
@@ -0,0 +1,57 @@
+package org.libvirt;
+
+import java.nio.charset.Charset;
+import org.libvirt.jna.virNodeCPUStats;
+import org.libvirt.jna.virTypedParameter;
+
+/**
+ * This class holds a cpu time.
+ * The tag attribute is a string of either
"kernel","user","idle","iowait"
+ * while the value attribute is the actual time value
+ * @author Pasquale Di Rienzo
+ *
+ */
+public class CPUStat {
+ public String tag;
+ public long value;
+
+ private String createStringFromBytes(byte[] b){
+ Charset ch = Charset.forName("UTF-8");
+ int i = 0;
+ while ((i<b.length) && (b[i]!=0))
+ i++;
+
+ return new String(b,0,i,ch);
+ }
+
+ public CPUStat(virNodeCPUStats stat){
+ tag = createStringFromBytes(stat.field);
+ value = stat.value.longValue();
+ }
+
+ public CPUStat(virTypedParameter stat){
+ tag = createStringFromBytes(stat.field);
+ value = stat.value.l;
+ }
+
+ public String getTag() {
+ return tag;
+ }
+
+ public long getValue() {
+ return value;
+ }
+
+ public void setTag(String tag) {
+ this.tag = tag;
+ }
+
+ public void setValue(long val) {
+ this.value = val;
+ }
+
+ @Override
+ public String toString() {
+ return String.format("tag:%s%nval:%d%n", tag, value);
+ }
+}
diff --git a/src/main/java/org/libvirt/Connect.java
b/src/main/java/org/libvirt/Connect.java
index fedc60e..d8a4ce2 100644
--- a/src/main/java/org/libvirt/Connect.java
+++ b/src/main/java/org/libvirt/Connect.java
@@ -2,6 +2,8 @@ package org.libvirt;
import java.util.UUID;
+import org.libvirt.CPUStat;
+import org.libvirt.LibvirtException;
import org.libvirt.jna.ConnectionPointer;
import org.libvirt.jna.DevicePointer;
import org.libvirt.jna.DomainPointer;
@@ -14,6 +16,7 @@ import org.libvirt.jna.StoragePoolPointer;
import org.libvirt.jna.StorageVolPointer;
import org.libvirt.jna.StreamPointer;
import org.libvirt.jna.virConnectAuth;
+import org.libvirt.jna.virNodeCPUStats;
import org.libvirt.jna.virNodeInfo;
import static org.libvirt.Library.libvirt;
@@ -23,6 +26,7 @@ import static org.libvirt.ErrorHandler.processErrorIfZero;
import com.sun.jna.Memory;
import com.sun.jna.NativeLong;
import com.sun.jna.Pointer;
+import com.sun.jna.ptr.IntByReference;
import com.sun.jna.ptr.LongByReference;
/**
@@ -207,6 +211,55 @@ public class Connect {
}
return processError(success);
}
+
+ /**
+ * This function returns statistics about the cpu, that is the time
+ * each cpu is spending in kernel time, user time, io time and idle time.
+ * Each CPUStat object refers to a particular time.
+ *
+ * Note that not all these stats are granted to be retrieved.
+ *
+ * @param the number of the cpu you want to retrieve stats from.
+ * passing -1 will make this function retrieve a mean value
+ * from all cpus the system has.
+ *
+ * @param some flags
+ * @return a cpustat object for each cpu
+ * @throws LibvirtException
+ */
+ public CPUStat[] getCPUStats(int cpuNumber,long flags) throws LibvirtException{
+ CPUStat[] stats = null;
+
+ IntByReference nParams = new IntByReference();
+
+ //according to libvirt reference you call this function once passing
+ //null as param paramether to get the actual stats (kernel,user,io,idle) number into
the
+ //nParams reference. Generally this number would be 4, but some systems
+ //may not give all 4 times, so it is always good to call it.
+ int result = libvirt.virNodeGetCPUStats(
+ VCP, cpuNumber, null, nParams, flags);
+
+ processError(result);
+
+ if(result == 0){//dunno if this check is actually needed
+
+ //this time we create an array to fit the number of paramethers
+ virNodeCPUStats[] params = new virNodeCPUStats[nParams.getValue()];
+ //and we pass it to the function
+ result = libvirt.virNodeGetCPUStats(VCP, cpuNumber , params, nParams, flags);
+ processError(result);
+
+ //finally we parse the result in an user friendly class which does
+ //not expose libvirt's internal paramethers
+ if(result >= 0){
+ stats = new CPUStat[params.length];
+ for(int i=0;i<params.length;i++)
+ stats[i] = new CPUStat(params[i]);
+ }
+ }
+
+ return stats;
+ }
/**
* Compares the given CPU description with the host CPU
diff --git a/src/main/java/org/libvirt/jna/Libvirt.java
b/src/main/java/org/libvirt/jna/Libvirt.java
index 0e4c9fc..658299f 100644
--- a/src/main/java/org/libvirt/jna/Libvirt.java
+++ b/src/main/java/org/libvirt/jna/Libvirt.java
@@ -1,5 +1,8 @@
package org.libvirt.jna;
+import org.libvirt.jna.ConnectionPointer;
+import org.libvirt.jna.virNodeCPUStats;
+
import com.sun.jna.Callback;
import com.sun.jna.Library;
import com.sun.jna.Native;
@@ -267,6 +270,8 @@ public interface Libvirt extends Library {
int virNetworkUndefine(NetworkPointer virConnectPtr);
// Node functions
+ int virNodeGetCPUStats(ConnectionPointer virConnectPtr, int cpuNum,
+ virNodeCPUStats[] stats,IntByReference nparams, long flags);
int virNodeGetInfo(ConnectionPointer virConnectPtr, virNodeInfo virNodeInfo);
int virNodeGetCellsFreeMemory(ConnectionPointer virConnectPtr, LongByReference
freeMems, int startCell,
int maxCells);
diff --git a/src/main/java/org/libvirt/jna/virNodeCPUStats.java
b/src/main/java/org/libvirt/jna/virNodeCPUStats.java
new file mode 100644
index 0000000..a8f2dca
--- /dev/null
+++ b/src/main/java/org/libvirt/jna/virNodeCPUStats.java
@@ -0,0 +1,19 @@
+package org.libvirt.jna;
+
+import java.util.Arrays;
+import java.util.List;
+
+import com.sun.jna.NativeLong;
+import com.sun.jna.Structure;
+
+public class virNodeCPUStats extends Structure{
+ public byte[] field = new byte[80];
+ public NativeLong value ;
+
+ private static final List fields = Arrays.asList( "field",
"value");
+
+ @Override
+ protected List getFieldOrder() {
+ return fields;
+ }
+}
--
1.8.3.2