From: pasquale <pasquale@pasquale-VPCEB1A4E> -Added the following bindings: --virDomainGetCpuStats --virNodeGetCpuStats --virDomainShutdownFlags --virDomainDestroyFlags -Added following classes --org/libvirt/CPUStatistic giving cpu stats in user friendly form --org/libvirt/jna/VirUnion binding --org/libvirt/jna/virDomainCPUStats type --org/libvirt/jna/virNodeCPUStats type --org/libvirt/jna/virTypedParameter biding --- src/main/java/org/libvirt/CPUStatistic.java | 61 +++ src/main/java/org/libvirt/Connect.java | 137 +++++- src/main/java/org/libvirt/Device.java | 57 ++- src/main/java/org/libvirt/Domain.java | 501 +++++++++++++++------ .../java/org/libvirt/DomainInterfaceStats.java | 2 +- src/main/java/org/libvirt/DomainSnapshot.java | 31 +- src/main/java/org/libvirt/Error.java | 409 ++++++----------- src/main/java/org/libvirt/ErrorHandler.java | 54 +-- src/main/java/org/libvirt/Interface.java | 65 +-- src/main/java/org/libvirt/Library.java | 4 +- src/main/java/org/libvirt/Network.java | 61 ++- src/main/java/org/libvirt/NetworkFilter.java | 43 +- src/main/java/org/libvirt/Secret.java | 67 ++- src/main/java/org/libvirt/StoragePool.java | 106 +++-- src/main/java/org/libvirt/StorageVol.java | 68 +-- src/main/java/org/libvirt/Stream.java | 71 ++- src/main/java/org/libvirt/jna/Libvirt.java | 42 +- src/main/java/org/libvirt/jna/VirUnion.java | 14 + src/main/java/org/libvirt/jna/virConnectAuth.java | 4 +- .../java/org/libvirt/jna/virConnectCredential.java | 4 +- .../java/org/libvirt/jna/virDomainBlockInfo.java | 4 +- .../java/org/libvirt/jna/virDomainBlockStats.java | 4 +- .../java/org/libvirt/jna/virDomainCPUStats.java | 21 + src/main/java/org/libvirt/jna/virDomainInfo.java | 4 +- .../org/libvirt/jna/virDomainInterfaceStats.java | 4 +- .../java/org/libvirt/jna/virDomainJobInfo.java | 4 +- .../java/org/libvirt/jna/virDomainMemoryStats.java | 4 +- src/main/java/org/libvirt/jna/virError.java | 4 +- src/main/java/org/libvirt/jna/virNodeCPUStats.java | 19 + src/main/java/org/libvirt/jna/virNodeInfo.java | 4 +- .../java/org/libvirt/jna/virSchedParameter.java | 4 +- .../java/org/libvirt/jna/virStoragePoolInfo.java | 4 +- .../java/org/libvirt/jna/virStorageVolInfo.java | 4 +- .../java/org/libvirt/jna/virTypedParameter.java | 22 + src/main/java/org/libvirt/jna/virVcpuInfo.java | 4 +- 35 files changed, 1194 insertions(+), 717 deletions(-) create mode 100644 src/main/java/org/libvirt/CPUStatistic.java create mode 100644 src/main/java/org/libvirt/jna/VirUnion.java create mode 100644 src/main/java/org/libvirt/jna/virDomainCPUStats.java create mode 100644 src/main/java/org/libvirt/jna/virNodeCPUStats.java create mode 100644 src/main/java/org/libvirt/jna/virTypedParameter.java diff --git a/src/main/java/org/libvirt/CPUStatistic.java b/src/main/java/org/libvirt/CPUStatistic.java new file mode 100644 index 0000000..4cd6f09 --- /dev/null +++ b/src/main/java/org/libvirt/CPUStatistic.java @@ -0,0 +1,61 @@ +package org.libvirt; + +import java.nio.charset.Charset; +import org.libvirt.jna.virNodeCPUStats; +import org.libvirt.jna.virTypedParameter; + +public class CPUStatistic { + public String tag; + public long val; + + //valid for host cpu stats + public static final int KERNEL_H = 0; + public static final int USER_H = 1; + public static final int IDLE_H = 2; + public static final int IOWAIT_H = 3; + + //valid for guest cpu stats + public static final int CPU_D = 0; + public static final int USER_D = 1; + public static final int SYSTEM_D = 2; + + 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 CPUStatistic(virNodeCPUStats stat){ + tag = createStringFromBytes(stat.tag); + val = stat.val; + } + + public CPUStatistic(virTypedParameter stat){ + tag = createStringFromBytes(stat.field); + val = stat.value.l; + } + + public String getTag() { + return tag; + } + + public long getValue() { + return val; + } + + public void setTag(String tag) { + this.tag = tag; + } + + public void setValue(long val) { + this.val = val; + } + + @Override + public String toString() { + return String.format("tag:%s%nval:%d%n", tag, val); + } +} diff --git a/src/main/java/org/libvirt/Connect.java b/src/main/java/org/libvirt/Connect.java index fedc60e..07285f9 100644 --- a/src/main/java/org/libvirt/Connect.java +++ b/src/main/java/org/libvirt/Connect.java @@ -14,15 +14,15 @@ 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; -import static org.libvirt.ErrorHandler.processError; -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; /** @@ -31,7 +31,7 @@ import com.sun.jna.ptr.LongByReference; * * @author stoty */ -public class Connect { +public class Connect implements AutoCloseable{ /** * Get the version of a connection. @@ -82,6 +82,7 @@ public class Connect { */ public static void setErrorCallback(Libvirt.VirErrorCallback callback) throws LibvirtException { Libvirt.INSTANCE.virSetErrorFunc(null, callback); + ErrorHandler.processError(Libvirt.INSTANCE); } /** @@ -121,6 +122,7 @@ public class Connect { VCP = libvirt.virConnectOpen(uri); // Check for an error processError(VCP); + ErrorHandler.processError(Libvirt.INSTANCE); } /** @@ -141,6 +143,7 @@ public class Connect { } // Check for an error processError(VCP); + ErrorHandler.processError(Libvirt.INSTANCE); } /** @@ -173,6 +176,7 @@ public class Connect { VCP = libvirt.virConnectOpenAuth(uri, vAuth, flags); // Check for an error processError(VCP); + ErrorHandler.processError(Libvirt.INSTANCE); } /** @@ -195,7 +199,7 @@ public class Connect { * @throws LibvirtException * @return number of remaining references (>= 0) */ - public int close() throws LibvirtException { + public void close() throws LibvirtException { int success = 0; if (VCP != null) { success = libvirt.virConnectClose(VCP); @@ -205,7 +209,8 @@ public class Connect { // it's called with a null virConnectPointer VCP = null; } - return processError(success); + + processError(success); } /** @@ -219,7 +224,8 @@ public class Connect { * @throws LibvirtException */ public CPUCompareResult compareCPU(String xmlDesc) throws LibvirtException { - int rawResult = processError(libvirt.virConnectCompareCPU(VCP, xmlDesc, 0)); + int rawResult = libvirt.virConnectCompareCPU(VCP, xmlDesc, 0); + processError(); return CPUCompareResult.get(rawResult); } @@ -306,11 +312,13 @@ public class Connect { * Documentation</a> * @param callbackID * the callback to deregister - * @return <em>ignore</em> (always 0) + * @return 0 on success, -1 on failure * @throws LibvirtException */ public int domainEventDeregisterAny(int callbackID) throws LibvirtException { - return processError(libvirt.virConnectDomainEventDeregisterAny(VCP, callbackID)); + int returnValue = libvirt.virConnectDomainEventDeregisterAny(VCP, callbackID); + processError(); + return returnValue; } /** @@ -475,6 +483,41 @@ public class Connect { Library.free(ptr); } } + + /** + * This functions gives a % of the load on the host cpu system. + * In the case of a multicore processor it gives a load average. + * In order to do so it makes two sequential measurements, according + * to the interval parameter. + * + * + * @param interval the interval,in ms, between the two measurations. + * @return + * @throws LibvirtException + */ + public float getCPUOverallUsage(long interval) throws LibvirtException{ + float result = 0; + CPUStatistic[] st1 = getCPUStats(-1, 0); + try { + Thread.sleep(interval); + CPUStatistic[] st2 = getCPUStats(-1, 0); + + for(int i=0;i<st2.length;i++) + st2[i].val -= st1[i].val; + + long sum = 0; + for(int i=0;i<st2.length;i++) + sum +=st2[i].val; + + result = 100.0f - (st2[CPUStatistic.IDLE_H].val*100.0f/sum); + + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + return result; + } /** * NUMA Support @@ -492,7 +535,10 @@ public class Connect { * Returns the free memory for the connection */ public long getFreeMemory() throws LibvirtException { - return processErrorIfZero(libvirt.virNodeGetFreeMemory(VCP)); + long returnValue = 0; + returnValue = libvirt.virNodeGetFreeMemory(VCP); + if (returnValue == 0) processError(); + return returnValue; } /** @@ -632,11 +678,13 @@ public class Connect { * @see <a * href="http://www.libvirt.org/html/libvirt-libvirt.html#virConnectIsEncrypted">Libvirt * Documentation</a> - * @return 1 if encrypted, 0 if not encrypted + * @return 1 if encrypted, 0 if not encrypted, -1 on error * @throws LibvirtException */ public int isEncrypted() throws LibvirtException { - return processError(libvirt.virConnectIsEncrypted(VCP)); + int returnValue = libvirt.virConnectIsEncrypted(VCP); + processError(); + return returnValue; } /** @@ -645,11 +693,13 @@ public class Connect { * @see <a * href="http://www.libvirt.org/html/libvirt-libvirt.html#virConnectIsSecure">Libvirt * Documentation</a> - * @return 1 if secure, 0 if not secure + * @return 1 if secure, 0 if not secure, -1 on error * @throws LibvirtException */ public int isSecure() throws LibvirtException { - return processError(libvirt.virConnectIsSecure(VCP)); + int returnValue = libvirt.virConnectIsSecure(VCP); + processError(); + return returnValue; } /** @@ -1019,6 +1069,7 @@ public class Connect { processError(libvirt.virNodeGetInfo(VCP, vInfo)); return new NodeInfo(vInfo); } + /** * Provides the number of inactive domains. @@ -1130,6 +1181,65 @@ public class Connect { } /** + * call the error handling logic. Should be called after every libvirt call + * + * @throws LibvirtException + */ + protected void processError() throws LibvirtException { + ErrorHandler.processError(libvirt); + } + + public CPUStatistic[] getCPUStats(int number,long flags) throws LibvirtException{ + CPUStatistic[] stats = null; + + IntByReference nParams = new IntByReference(); + + int result = libvirt.virNodeGetCPUStats( + VCP, number, null, nParams, flags); + processError(); + + if(result == 0){ + virNodeCPUStats[] params = new virNodeCPUStats[nParams.getValue()]; + result = libvirt.virNodeGetCPUStats(VCP, number , params, nParams, flags); + processError(); + + if(result >= 0){ + stats = new CPUStatistic[params.length]; + for(int i=0;i<params.length;i++) + stats[i] = new CPUStatistic(params[i]); + } + } + + return stats; + } + + /** + * Calls {@link #processError()} when the given libvirt return code + * indicates an error. + * + * @param ret libvirt return code, indicating error if negative. + * @return {@code ret} + * @throws LibvirtException + */ + protected final int processError(int ret) throws LibvirtException { + if (ret < 0) processError(); + return ret; + } + + /** + * Calls {@link #processError()} if {@code arg} is null. + * + * @param arg An arbitrary object returned by libvirt. + * @return {@code arg} + * @throws LibvirtException + */ + protected final <T> T processError(T arg) throws LibvirtException { + if (arg == null) processError(); + return arg; + } + + + /** * Restores a domain saved to disk by Domain.save(). * * @param from @@ -1200,6 +1310,7 @@ public class Connect { public void setConnectionErrorCallback(Libvirt.VirErrorCallback callback) throws LibvirtException { libvirt.virConnSetErrorFunc(VCP, null, callback); + processError(); } /** diff --git a/src/main/java/org/libvirt/Device.java b/src/main/java/org/libvirt/Device.java index a3b20b8..fe49ce9 100644 --- a/src/main/java/org/libvirt/Device.java +++ b/src/main/java/org/libvirt/Device.java @@ -2,11 +2,6 @@ package org.libvirt; import org.libvirt.jna.DevicePointer; import static org.libvirt.Library.libvirt; -import static org.libvirt.ErrorHandler.processError; - -import com.sun.jna.Pointer; - -import com.sun.jna.Pointer; /** * A device which is attached to a node @@ -46,7 +41,8 @@ public class Device { public int destroy() throws LibvirtException { int success = 0; if (VDP != null) { - success = processError(libvirt.virNodeDeviceDestroy(VDP)); + success = libvirt.virNodeDeviceDestroy(VDP); + processError(); VDP = null; } @@ -60,7 +56,9 @@ public class Device { * @throws LibvirtException */ public int detach() throws LibvirtException { - return processError(libvirt.virNodeDeviceDettach(VDP)); + int num = libvirt.virNodeDeviceDettach(VDP); + processError(); + return num; } @Override @@ -78,7 +76,8 @@ public class Device { public int free() throws LibvirtException { int success = 0; if (VDP != null) { - success = processError(libvirt.virNodeDeviceFree(VDP)); + success = libvirt.virNodeDeviceFree(VDP); + processError(); VDP = null; } @@ -91,7 +90,9 @@ public class Device { * @throws LibvirtException */ public String getName() throws LibvirtException { - return processError(libvirt.virNodeDeviceGetName(VDP)); + String name = libvirt.virNodeDeviceGetName(VDP); + processError(); + return name; } /** @@ -100,7 +101,9 @@ public class Device { * @throws LibvirtException */ public int getNumberOfCapabilities() throws LibvirtException { - return processError(libvirt.virNodeDeviceNumOfCaps(VDP)); + int num = libvirt.virNodeDeviceNumOfCaps(VDP); + processError(); + return num; } /** @@ -109,7 +112,9 @@ public class Device { * @throws LibvirtException */ public String getParent() throws LibvirtException { - return processError(libvirt.virNodeDeviceGetParent(VDP)); + String parent = libvirt.virNodeDeviceGetParent(VDP); + processError(); + return parent; } /** @@ -118,7 +123,9 @@ public class Device { * @throws LibvirtException */ public String getXMLDescription() throws LibvirtException { - return processError(libvirt.virNodeDeviceGetXMLDesc(VDP)); + String desc = libvirt.virNodeDeviceGetXMLDesc(VDP); + processError(); + return desc; } /** @@ -128,15 +135,21 @@ public class Device { */ public String[] listCapabilities() throws LibvirtException { int maxCaps = getNumberOfCapabilities(); + String[] names = new String[maxCaps]; if (maxCaps > 0) { - Pointer[] ptrs = new Pointer[maxCaps]; - int got = processError(libvirt.virNodeDeviceListCaps(VDP, ptrs, maxCaps)); - - return Library.toStringArray(ptrs, got); - } else { - return Library.NO_STRINGS; + libvirt.virNodeDeviceListCaps(VDP, names, maxCaps); + processError(); } + return names; + } + + /** + * Error handling logic to throw errors. Must be called after every libvirt + * call. + */ + protected void processError() throws LibvirtException { + virConnect.processError(); } /** @@ -145,7 +158,9 @@ public class Device { * @throws LibvirtException */ public int reAttach() throws LibvirtException { - return processError(libvirt.virNodeDeviceReAttach(VDP)); + int num = libvirt.virNodeDeviceReAttach(VDP); + processError(); + return num; } /** @@ -155,6 +170,8 @@ public class Device { * @throws LibvirtException */ public int reset() throws LibvirtException { - return processError(libvirt.virNodeDeviceReset(VDP)); + int num = libvirt.virNodeDeviceReset(VDP); + processError(); + return num; } } diff --git a/src/main/java/org/libvirt/Domain.java b/src/main/java/org/libvirt/Domain.java index a217733..b515b4b 100644 --- a/src/main/java/org/libvirt/Domain.java +++ b/src/main/java/org/libvirt/Domain.java @@ -3,7 +3,6 @@ package org.libvirt; import org.libvirt.jna.DomainPointer; import org.libvirt.jna.DomainSnapshotPointer; import org.libvirt.jna.Libvirt; -import org.libvirt.jna.SizeT; import org.libvirt.jna.virDomainBlockInfo; import org.libvirt.jna.virDomainBlockStats; import org.libvirt.jna.virDomainInfo; @@ -11,10 +10,10 @@ import org.libvirt.jna.virDomainInterfaceStats; import org.libvirt.jna.virDomainJobInfo; import org.libvirt.jna.virDomainMemoryStats; import org.libvirt.jna.virSchedParameter; +import org.libvirt.jna.virTypedParameter; import org.libvirt.jna.virVcpuInfo; + import static org.libvirt.Library.libvirt; -import static org.libvirt.ErrorHandler.processError; -import static org.libvirt.ErrorHandler.processErrorIfZero; import com.sun.jna.Native; import com.sun.jna.NativeLong; @@ -33,25 +32,25 @@ public class Domain { public static final int BYTES = 1; } - static final class CreateFlags { - static final int VIR_DOMAIN_NONE = 0; - static final int VIR_DOMAIN_SNAPSHOT_CREATE_REDEFINE = (1 << 0); /* Restore or alter + public static final class CreateFlags { + public static final int VIR_DOMAIN_NONE = 0; + public static final int VIR_DOMAIN_SNAPSHOT_CREATE_REDEFINE = (1 << 0); /* Restore or alter metadata */ - static final int VIR_DOMAIN_SNAPSHOT_CREATE_CURRENT = (1 << 1); /* With redefine, make + public static final int VIR_DOMAIN_SNAPSHOT_CREATE_CURRENT = (1 << 1); /* With redefine, make snapshot current */ - static final int VIR_DOMAIN_SNAPSHOT_CREATE_NO_METADATA = (1 << 2); /* Make snapshot without + public static final int VIR_DOMAIN_SNAPSHOT_CREATE_NO_METADATA = (1 << 2); /* Make snapshot without remembering it */ - static final int VIR_DOMAIN_SNAPSHOT_CREATE_HALT = (1 << 3); /* Stop running guest + public static final int VIR_DOMAIN_SNAPSHOT_CREATE_HALT = (1 << 3); /* Stop running guest after snapshot */ - static final int VIR_DOMAIN_SNAPSHOT_CREATE_DISK_ONLY = (1 << 4); /* disk snapshot, not + public static final int VIR_DOMAIN_SNAPSHOT_CREATE_DISK_ONLY = (1 << 4); /* disk snapshot, not system checkpoint */ - static final int VIR_DOMAIN_SNAPSHOT_CREATE_REUSE_EXT = (1 << 5); /* reuse any existing + public static final int VIR_DOMAIN_SNAPSHOT_CREATE_REUSE_EXT = (1 << 5); /* reuse any existing external files */ - static final int VIR_DOMAIN_SNAPSHOT_CREATE_QUIESCE = (1 << 6); /* use guest agent to + public static final int VIR_DOMAIN_SNAPSHOT_CREATE_QUIESCE = (1 << 6); /* use guest agent to quiesce all mounted file systems within the domain */ - static final int VIR_DOMAIN_SNAPSHOT_CREATE_ATOMIC = (1 << 7); /* atomically avoid + public static final int VIR_DOMAIN_SNAPSHOT_CREATE_ATOMIC = (1 << 7); /* atomically avoid partial changes */ } @@ -72,6 +71,19 @@ public class Domain { * when supported */ static final int VIR_MIGRATE_UNSAFE = (1 << 9); /* force migration even if it is considered unsafe */ } + + public static final class ShutdownFlags{ + static final long SHUTDOWN_DEFAULT = 0; //hypervisor choice + static final long SHUTDOWN_ACPI_POWER_BTN = 1; //send acpi api event + static final long SHUTDOWN_GUEST_AGENT = 2; //use guest agent + static final long SHUTDOWN_INITCTL = 4; //use init ctl + static final long DOMAIN_SHUTDOWN_SIGNAL = 8; //send a signal + } + + public static final class DestroyFlags{ + public static final long DESTROY_DEFAULT = 0; //Default behavior - could lead to data loss!! + public static final long DESTROY_GRACEFUL = 1; //only SIGTERM, no SIGKILL + } static final class XMLFlags { /** @@ -162,11 +174,13 @@ public class Domain { * @see <a * href="http://www.libvirt.org/html/libvirt-libvirt.html#virDomainAbortJob">Libvirt * Documentation</a> - * @return <em>ignore</em> (always 0) + * @return 0 in case of success and -1 in case of failure. * @throws LibvirtException */ public int abortJob() throws LibvirtException { - return processError(libvirt.virDomainAbortJob(VDP)); + int returnValue = libvirt.virDomainAbortJob(VDP); + processError(); + return returnValue; } /** @@ -180,7 +194,8 @@ public class Domain { * @throws LibvirtException */ public void attachDevice(String xmlDesc) throws LibvirtException { - processError(libvirt.virDomainAttachDevice(VDP, xmlDesc)); + libvirt.virDomainAttachDevice(VDP, xmlDesc); + processError(); } /** @@ -196,7 +211,8 @@ public class Domain { * @throws LibvirtException */ public void attachDeviceFlags(String xmlDesc, int flags) throws LibvirtException { - processError(libvirt.virDomainAttachDeviceFlags(VDP, xmlDesc, flags)); + libvirt.virDomainAttachDeviceFlags(VDP, xmlDesc, flags); + processError(); } /** @@ -205,13 +221,14 @@ public class Domain { * * @param path * the path to the block device - * @return the info + * @return the info, or null if an error * @throws LibvirtException */ public DomainBlockInfo blockInfo(String path) throws LibvirtException { virDomainBlockInfo info = new virDomainBlockInfo(); - processError(libvirt.virDomainGetBlockInfo(VDP, path, info, 0)); - return new DomainBlockInfo(info); + int success = libvirt.virDomainGetBlockInfo(VDP, path, info, 0); + processError(); + return success == 0 ? new DomainBlockInfo(info) : null; } /** @@ -231,8 +248,9 @@ public class Domain { */ public DomainBlockStats blockStats(String path) throws LibvirtException { virDomainBlockStats stats = new virDomainBlockStats(); - processError(libvirt.virDomainBlockStats(VDP, path, stats, new SizeT(stats.size()))); - return new DomainBlockStats(stats); + int success = libvirt.virDomainBlockStats(VDP, path, stats, stats.size()); + processError(); + return success == 0 ? new DomainBlockStats(stats) : null; } /** @@ -247,7 +265,8 @@ public class Domain { * @throws LibvirtException */ public void blockResize(String disk, long size, int flags) throws LibvirtException { - processError(libvirt.virDomainBlockResize(VDP, disk, size, flags)); + int returnValue = libvirt.virDomainBlockResize(VDP, disk, size, flags); + processError(); } @@ -262,7 +281,8 @@ public class Domain { * @throws LibvirtException */ public void coreDump(String to, int flags) throws LibvirtException { - processError(libvirt.virDomainCoreDump(VDP, to, flags)); + libvirt.virDomainCoreDump(VDP, to, flags); + processError(); } /** @@ -277,11 +297,12 @@ public class Domain { * Launches this defined domain. If the call succeed the domain moves from * the defined to the running domains pools. * - * @return <em>ignore</em> (always 0) * @throws LibvirtException */ public int create() throws LibvirtException { - return processError(libvirt.virDomainCreate(VDP)); + int returnValue = libvirt.virDomainCreate(VDP); + processError(); + return returnValue; } /** @@ -289,11 +310,12 @@ public class Domain { * If the call succeed the domain moves from * the defined to the running domains pools. * - * @return <em>ignore</em> (always 0) * @throws LibvirtException */ public int create(int flags) throws LibvirtException { - return processError(libvirt.virDomainCreateWithFlags(VDP, flags)); + int returnValue = libvirt.virDomainCreateWithFlags(VDP, flags); + processError(); + return returnValue; } /** @@ -305,7 +327,13 @@ public class Domain { * @throws LibvirtException */ public void destroy() throws LibvirtException { - processError(libvirt.virDomainDestroy(VDP)); + libvirt.virDomainDestroy(VDP); + processError(); + } + + public void destroyWithFlags(long flags) throws LibvirtException{ + libvirt.virDomainDestroyFlags(VDP, flags); + processError(); } /** @@ -319,7 +347,8 @@ public class Domain { * @throws LibvirtException */ public void detachDevice(String xmlDesc) throws LibvirtException { - processError(libvirt.virDomainDetachDevice(VDP, xmlDesc)); + libvirt.virDomainDetachDevice(VDP, xmlDesc); + processError(); } /** @@ -333,12 +362,13 @@ public class Domain { * @throws LibvirtException */ public void detachDeviceFlags(String xmlDesc, int flags) throws LibvirtException { - processError(libvirt.virDomainDetachDeviceFlags(VDP, xmlDesc, flags)); + libvirt.virDomainDetachDeviceFlags(VDP, xmlDesc, flags); + processError(); } @Override protected void finalize() throws LibvirtException { - free(); + close(); } /** @@ -346,12 +376,13 @@ public class Domain { * structure is freed and should not be used thereafter. * * @throws LibvirtException - * @return number of references left (>= 0) + * @return number of references left (>= 0) for success, -1 for failure. */ - public int free() throws LibvirtException { + public int close() throws LibvirtException { int success = 0; if (VDP != null) { - success = processError(libvirt.virDomainFree(VDP)); + success = libvirt.virDomainFree(VDP); + processError(); VDP = null; } @@ -359,7 +390,7 @@ public class Domain { } /** - * Provides a boolean value indicating whether the domain is configured to + * Provides a boolean value indicating whether the network is configured to * be automatically started when the host machine boots. * * @return the result @@ -367,7 +398,8 @@ public class Domain { */ public boolean getAutostart() throws LibvirtException { IntByReference autoStart = new IntByReference(); - processError(libvirt.virDomainGetAutostart(VDP, autoStart)); + libvirt.virDomainGetAutostart(VDP, autoStart); + processError(); return autoStart.getValue() != 0 ? true : false; } @@ -379,6 +411,47 @@ public class Domain { public Connect getConnect() { return virConnect; } + + /** + * This functions gives a % of the load on the host cpu system. + * In the case of a multicore processor it gives a load average. + * In order to do so it makes two sequential measurements, according + * to the interval parameter. + * + * + * @param interval the interval,in ms, between the two measurations. + * @return + * @throws LibvirtException + */ + public float getCPUOverallUsage(long interval) throws LibvirtException{ + float result = 0; + CPUStatistic[] h1 = getConnect().getCPUStats(-1, 0); + CPUStatistic[] d1 = getCPUStats(-1, 0); + try { + Thread.sleep(interval); + CPUStatistic[] h2 = getConnect().getCPUStats(-1, 0); + CPUStatistic[] d2 = getCPUStats(-1, 0); + + for(int i=0;i<h2.length;i++) + h2[i].val -= h1[i].val; + + for(int i=0;i<d2.length;i++) + d2[i].val -= d1[i].val; + + long sum = 0; + for(int i=0;i<h2.length;i++) + sum +=h2[i].val; + + + result = d2[CPUStatistic.CPU_D].val*100.0f/sum; + + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + return result; + } /** * Gets the hypervisor ID number for the domain @@ -387,7 +460,9 @@ public class Domain { * @throws LibvirtException */ public int getID() throws LibvirtException { - return processError(libvirt.virDomainGetID(VDP)); + int returnValue = libvirt.virDomainGetID(VDP); + processError(); + return returnValue; } /** @@ -403,9 +478,14 @@ public class Domain { * @throws LibvirtException */ public DomainInfo getInfo() throws LibvirtException { + DomainInfo returnValue = null; virDomainInfo vInfo = new virDomainInfo(); - processError(libvirt.virDomainGetInfo(VDP, vInfo)); - return new DomainInfo(vInfo); + int success = libvirt.virDomainGetInfo(VDP, vInfo); + processError(); + if (success == 0) { + returnValue = new DomainInfo(vInfo); + } + return returnValue; } /** @@ -419,9 +499,14 @@ public class Domain { * @throws LibvirtException */ public DomainJobInfo getJobInfo() throws LibvirtException { + DomainJobInfo returnValue = null; virDomainJobInfo vInfo = new virDomainJobInfo(); - processError(libvirt.virDomainGetJobInfo(VDP, vInfo)); - return new DomainJobInfo(vInfo); + int success = libvirt.virDomainGetJobInfo(VDP, vInfo); + processError(); + if (success == 0) { + returnValue = new DomainJobInfo(vInfo); + } + return returnValue; } /** @@ -431,9 +516,9 @@ public class Domain { * @throws LibvirtException */ public long getMaxMemory() throws LibvirtException { - // the memory size in kibibytes (blocks of 1024 bytes), or 0 in case of error. NativeLong returnValue = libvirt.virDomainGetMaxMemory(VDP); - return processErrorIfZero(returnValue.longValue()); + processError(); + return returnValue.longValue(); } /** @@ -446,17 +531,21 @@ public class Domain { * @throws LibvirtException */ public int getMaxVcpus() throws LibvirtException { - return processError(libvirt.virDomainGetMaxVcpus(VDP)); + int returnValue = libvirt.virDomainGetMaxVcpus(VDP); + processError(); + return returnValue; } /** * Gets the public name for this domain * - * @return the name, null if there is no name - * @throws LibvirtException <em>never</em> + * @return the name + * @throws LibvirtException */ public String getName() throws LibvirtException { - return libvirt.virDomainGetName(VDP); + String returnValue = libvirt.virDomainGetName(VDP); + processError(); + return returnValue; } /** @@ -466,7 +555,8 @@ public class Domain { * @throws LibvirtException */ public String getOSType() throws LibvirtException { - Pointer ptr = processError(libvirt.virDomainGetOSType(VDP)); + Pointer ptr = libvirt.virDomainGetOSType(VDP); + processError(); try { return Library.getString(ptr); } finally { @@ -482,25 +572,22 @@ public class Domain { */ public SchedParameter[] getSchedulerParameters() throws LibvirtException { IntByReference nParams = new IntByReference(); - Library.free(processError(libvirt.virDomainGetSchedulerType(VDP, nParams))); - - int n = nParams.getValue(); - - if (n > 0) { - virSchedParameter[] nativeParams = new virSchedParameter[n]; - - processError(libvirt.virDomainGetSchedulerParameters(VDP, nativeParams, nParams)); - n = nParams.getValue(); - - SchedParameter[] returnValue = new SchedParameter[n]; - - for (int x = 0; x < n; x++) { + SchedParameter[] returnValue = new SchedParameter[0]; + Pointer pScheduler = libvirt.virDomainGetSchedulerType(VDP, nParams); + processError(); + if (pScheduler != null) { + String scheduler = Library.getString(pScheduler); + Library.free(pScheduler); + virSchedParameter[] nativeParams = new virSchedParameter[nParams.getValue()]; + returnValue = new SchedParameter[nParams.getValue()]; + libvirt.virDomainGetSchedulerParameters(VDP, nativeParams, nParams); + processError(); + for (int x = 0; x < nParams.getValue(); x++) { returnValue[x] = SchedParameter.create(nativeParams[x]); } - return returnValue; - } else { - return new SchedParameter[] {}; } + + return returnValue; } // getSchedulerType @@ -513,13 +600,14 @@ public class Domain { * @return the type of the scheduler * @throws LibvirtException */ - public String getSchedulerType() throws LibvirtException { - Pointer pScheduler = processError(libvirt.virDomainGetSchedulerType(VDP, null)); - try { - return Library.getString(pScheduler); - } finally { - Library.free(pScheduler); - } + public String[] getSchedulerType() throws LibvirtException { + IntByReference nParams = new IntByReference(); + Pointer pScheduler = libvirt.virDomainGetSchedulerType(VDP, nParams); + processError(); + String[] array = new String[1]; + array[0] = Library.getString(pScheduler); + Library.free(pScheduler); + return array; } /** @@ -531,8 +619,13 @@ public class Domain { */ public int[] getUUID() throws LibvirtException { byte[] bytes = new byte[Libvirt.VIR_UUID_BUFLEN]; - processError(libvirt.virDomainGetUUID(VDP, bytes)); - return Connect.convertUUIDBytes(bytes); + int success = libvirt.virDomainGetUUID(VDP, bytes); + processError(); + int[] returnValue = new int[0]; + if (success == 0) { + returnValue = Connect.convertUUIDBytes(bytes); + } + return returnValue; } /** @@ -544,8 +637,13 @@ public class Domain { */ public String getUUIDString() throws LibvirtException { byte[] bytes = new byte[Libvirt.VIR_UUID_STRING_BUFLEN]; - processError(libvirt.virDomainGetUUIDString(VDP, bytes)); - return Native.toString(bytes); + int success = libvirt.virDomainGetUUIDString(VDP, bytes); + processError(); + String returnValue = null; + if (success == 0) { + returnValue = Native.toString(bytes); + } + return returnValue; } /** @@ -565,7 +663,8 @@ public class Domain { virVcpuInfo[] infos = new virVcpuInfo[cpuCount]; returnValue = new int[cpuCount * maplength]; byte[] cpumaps = new byte[cpuCount * maplength]; - processError(libvirt.virDomainGetVcpus(VDP, infos, cpuCount, cpumaps, maplength)); + libvirt.virDomainGetVcpus(VDP, infos, cpuCount, cpumaps, maplength); + processError(); for (int x = 0; x < cpuCount * maplength; x++) { returnValue[x] = cpumaps[x]; } @@ -583,12 +682,37 @@ public class Domain { int cpuCount = getMaxVcpus(); VcpuInfo[] returnValue = new VcpuInfo[cpuCount]; virVcpuInfo[] infos = new virVcpuInfo[cpuCount]; - processError(libvirt.virDomainGetVcpus(VDP, infos, cpuCount, null, 0)); + libvirt.virDomainGetVcpus(VDP, infos, cpuCount, null, 0); + processError(); for (int x = 0; x < cpuCount; x++) { returnValue[x] = new VcpuInfo(infos[x]); } return returnValue; } + + public CPUStatistic[] getCPUStats(int number, long flags) throws LibvirtException{ + + CPUStatistic[] stats = null; + + int result = libvirt.virDomainGetCPUStats(VDP, + null, 0, -1, 1, 0); + processError(); + + if(result >0){ + + virTypedParameter[] params = new virTypedParameter[result]; + result = libvirt.virDomainGetCPUStats(VDP, params, result, + number, 1, flags); + processError(); + if(result > 0){ + stats = new CPUStatistic[params.length]; + for(int i=0;i<params.length;i++) + stats[i] = new CPUStatistic(params[i]); + } + } + + return stats; + } /** * Provides an XML description of the domain. The description may be reused @@ -602,7 +726,8 @@ public class Domain { * Description format </a> */ public String getXMLDesc(int flags) throws LibvirtException { - Pointer ptr = processError(libvirt.virDomainGetXMLDesc(VDP, flags)); + Pointer ptr = libvirt.virDomainGetXMLDesc(VDP, flags); + processError(); try { return Library.getString(ptr); } finally { @@ -615,11 +740,13 @@ public class Domain { * * @see <a href="http://www.libvirt.org/html/libvirt-libvirt.html#virDomainHasCurrentSnapshot>Libvi * r t Documentation</a> - * @return 1 if running, 0 if inactive + * @return 1 if running, 0 if inactive, -1 on error * @throws LibvirtException */ public int hasCurrentSnapshot() throws LibvirtException { - return processError(libvirt.virDomainHasCurrentSnapshot(VDP, 0)); + int returnValue = libvirt.virDomainHasCurrentSnapshot(VDP, 0); + processError(); + return returnValue; } /** @@ -632,7 +759,9 @@ public class Domain { * @throws LibvirtException */ public int hasManagedSaveImage() throws LibvirtException { - return processError(libvirt.virDomainHasManagedSaveImage(VDP, 0)); + int returnValue = libvirt.virDomainHasManagedSaveImage(VDP, 0); + processError(); + return returnValue; } /** @@ -650,7 +779,8 @@ public class Domain { */ public DomainInterfaceStats interfaceStats(String path) throws LibvirtException { virDomainInterfaceStats stats = new virDomainInterfaceStats(); - processError(libvirt.virDomainInterfaceStats(VDP, path, stats, new SizeT(stats.size()))); + libvirt.virDomainInterfaceStats(VDP, path, stats, stats.size()); + processError(); return new DomainInterfaceStats(stats); } @@ -660,11 +790,13 @@ public class Domain { * @see <a * href="http://www.libvirt.org/html/libvirt-libvirt.html#virDomainIsActive">Libvirt * Documentation</a> - * @return 1 if running, 0 if inactive + * @return 1 if running, 0 if inactive, -1 on error * @throws LibvirtException */ public int isActive() throws LibvirtException { - return processError(libvirt.virDomainIsActive(VDP)); + int returnValue = libvirt.virDomainIsActive(VDP); + processError(); + return returnValue; } /** @@ -674,11 +806,13 @@ public class Domain { * @see <a * href="http://www.libvirt.org/html/libvirt-libvirt.html#virDomainIsPersistent">Libvirt * Documentation</a> - * @return 1 if persistent, 0 if transient + * @return 1 if persistent, 0 if transient, -1 on error * @throws LibvirtException */ public int isPersistent() throws LibvirtException { - return processError(libvirt.virDomainIsPersistent(VDP)); + int returnValue = libvirt.virDomainIsPersistent(VDP); + processError(); + return returnValue; } /** @@ -687,11 +821,13 @@ public class Domain { * @see <a * href="http://www.libvirt.org/html/libvirt-libvirt.html#virDomainManagedSave">Libvirt * Documentation</a> - * @return always 0 + * @return 0 in case of success or -1 in case of failure * @throws LibvirtException */ public int managedSave() throws LibvirtException { - return processError(libvirt.virDomainManagedSave(VDP, 0)); + int returnValue = libvirt.virDomainManagedSave(VDP, 0); + processError(); + return returnValue; } /** @@ -700,11 +836,13 @@ public class Domain { * @see <a * href="http://www.libvirt.org/html/libvirt-libvirt.html#virDomainManagedSaveRemove">Libvirt * Documentation</a> - * @return always 0 + * @return 0 in case of success, and -1 in case of error * @throws LibvirtException */ public int managedSaveRemove() throws LibvirtException { - return processError(libvirt.virDomainManagedSaveRemove(VDP, 0)); + int returnValue = libvirt.virDomainManagedSaveRemove(VDP, 0); + processError(); + return returnValue; } /** @@ -712,19 +850,37 @@ public class Domain { * * @param number * the number of stats to retrieve - * @return the collection of stats + * @return the collection of stats, or null if an error occurs. * @throws LibvirtException */ public MemoryStatistic[] memoryStats(int number) throws LibvirtException { virDomainMemoryStats[] stats = new virDomainMemoryStats[number]; MemoryStatistic[] returnStats = null; - int result = processError(libvirt.virDomainMemoryStats(VDP, stats, number, 0)); - returnStats = new MemoryStatistic[result]; - for (int x = 0; x < result; x++) { - returnStats[x] = new MemoryStatistic(stats[x]); + int result = libvirt.virDomainMemoryStats(VDP, stats, number, 0); + processError(); + if (result >= 0) { + returnStats = new MemoryStatistic[result]; + for (int x = 0; x < result; x++) { + returnStats[x] = new MemoryStatistic(stats[x]); + } } return returnStats; } + + //TODO + /*public CPUStatistic[] cpuStats(int number) throws LibvirtException{ + virDomainCPUStats[] stats = new virDomainCPUStats[number]; + CPUStatistic[] returnStats = null; + int result = libvirt.virDomainGetVcpus(VDP, stats, number,null, 0); + processError(); + if (result >= 0) { + returnStats = new CPUStatistic[result]; + for (int x = 0; x < result; x++) { + returnStats[x] = new CPUStatistic(stats[x]); + } + } + return returnStats; + }*/ /** * Migrate this domain object from its current host to the destination host @@ -795,8 +951,8 @@ public class Domain { * @throws LibvirtException if the migration fails */ public Domain migrate(Connect dconn, long flags, String dxml, String dname, String uri, long bandwidth) throws LibvirtException { - DomainPointer newPtr = - processError(libvirt.virDomainMigrate2(VDP, dconn.VCP, dxml, new NativeLong(flags), dname, uri, new NativeLong(bandwidth))); + DomainPointer newPtr = libvirt.virDomainMigrate2(VDP, dconn.VCP, dxml, new NativeLong(flags), dname, uri, new NativeLong(bandwidth)); + processError(); return new Domain(dconn, newPtr); } @@ -839,13 +995,14 @@ public class Domain { * (optional) dest hostname/URI as seen from the source host * @param bandwidth * optional) specify migration bandwidth limit in Mbps - * @return the new domain object if the migration was successful. Note that - * the new domain object exists in the scope of the destination - * connection (dconn). + * @return the new domain object if the migration was successful, or NULL in + * case of error. Note that the new domain object exists in the + * scope of the destination connection (dconn). * @throws LibvirtException */ public Domain migrate(Connect dconn, long flags, String dname, String uri, long bandwidth) throws LibvirtException { - DomainPointer newPtr = processError(libvirt.virDomainMigrate(VDP, dconn.VCP, new NativeLong(flags), dname, uri, new NativeLong(bandwidth))); + DomainPointer newPtr = libvirt.virDomainMigrate(VDP, dconn.VCP, new NativeLong(flags), dname, uri, new NativeLong(bandwidth)); + processError(); return new Domain(dconn, newPtr); } @@ -858,11 +1015,13 @@ public class Domain { * Documentation</a> * @param downtime * the time to be down - * @return always 0 + * @return 0 in case of success, -1 otherwise. * @throws LibvirtException */ public int migrateSetMaxDowntime(long downtime) throws LibvirtException { - return processError(libvirt.virDomainMigrateSetMaxDowntime(VDP, downtime, 0)); + int returnValue = libvirt.virDomainMigrateSetMaxDowntime(VDP, downtime, 0); + processError(); + return returnValue; } /** @@ -896,9 +1055,9 @@ public class Domain { * @throws LibvirtException */ public int migrateToURI(String dconnuri, String miguri, String dxml, long flags, String dname, long bandwidth) throws LibvirtException { - return processError(libvirt.virDomainMigrateToURI2(VDP, dconnuri, miguri, - dxml, new NativeLong(flags), - dname, new NativeLong(bandwidth))); + int returnValue = libvirt.virDomainMigrateToURI2(VDP, dconnuri, miguri, dxml, new NativeLong(flags), dname, new NativeLong(bandwidth)); + processError(); + return returnValue; } /** @@ -921,7 +1080,9 @@ public class Domain { * @throws LibvirtException */ public int migrateToURI(String uri, long flags, String dname, long bandwidth) throws LibvirtException { - return processError(libvirt.virDomainMigrateToURI(VDP, uri, new NativeLong(flags), dname, new NativeLong(bandwidth))); + int returnValue = libvirt.virDomainMigrateToURI(VDP, uri, new NativeLong(flags), dname, new NativeLong(bandwidth)); + processError(); + return returnValue; } /** @@ -943,7 +1104,16 @@ public class Domain { for (int x = 0; x < cpumap.length; x++) { packedMap[x] = (byte) cpumap[x]; } - processError(libvirt.virDomainPinVcpu(VDP, vcpu, packedMap, cpumap.length)); + libvirt.virDomainPinVcpu(VDP, vcpu, packedMap, cpumap.length); + processError(); + } + + /** + * Error handling logic to throw errors. Must be called after every libvirt + * call. + */ + protected void processError() throws LibvirtException { + virConnect.processError(); } /** @@ -956,7 +1126,8 @@ public class Domain { * @throws LibvirtException */ public void reboot(int flags) throws LibvirtException { - processError(libvirt.virDomainReboot(VDP, flags)); + libvirt.virDomainReboot(VDP, flags); + processError(); } /** @@ -967,7 +1138,8 @@ public class Domain { * @throws LibvirtException */ public void resume() throws LibvirtException { - processError(libvirt.virDomainResume(VDP)); + libvirt.virDomainResume(VDP); + processError(); } /** @@ -978,11 +1150,13 @@ public class Domain { * >Libvirt Documentation</> * @param snapshot * the snapshot to revert to - * @return 0 if the creation is successful + * @return 0 if the creation is successful, -1 on error. * @throws LibvirtException */ public int revertToSnapshot(DomainSnapshot snapshot) throws LibvirtException { - return processError(libvirt.virDomainRevertToSnapshot(snapshot.VDSP, 0)); + int returnCode = libvirt.virDomainRevertToSnapshot(snapshot.VDSP, 0); + processError(); + return returnCode; } /** @@ -996,7 +1170,8 @@ public class Domain { * @throws LibvirtException */ public void save(String to) throws LibvirtException { - processError(libvirt.virDomainSave(VDP, to)); + libvirt.virDomainSave(VDP, to); + processError(); } /** @@ -1008,7 +1183,8 @@ public class Domain { */ public void setAutostart(boolean autostart) throws LibvirtException { int autoValue = autostart ? 1 : 0; - processError(libvirt.virDomainSetAutostart(VDP, autoValue)); + libvirt.virDomainSetAutostart(VDP, autoValue); + processError(); } /** @@ -1020,7 +1196,8 @@ public class Domain { * @throws LibvirtException */ public void setMaxMemory(long memory) throws LibvirtException { - processError(libvirt.virDomainSetMaxMemory(VDP, new NativeLong(memory))); + libvirt.virDomainSetMaxMemory(VDP, new NativeLong(memory)); + processError(); } /** @@ -1033,7 +1210,8 @@ public class Domain { * @throws LibvirtException */ public void setMemory(long memory) throws LibvirtException { - processError(libvirt.virDomainSetMemory(VDP, new NativeLong(memory))); + libvirt.virDomainSetMemory(VDP, new NativeLong(memory)); + processError(); } /** @@ -1048,7 +1226,8 @@ public class Domain { for (int x = 0; x < params.length; x++) { input[x] = SchedParameter.toNative(params[x]); } - processError(libvirt.virDomainSetSchedulerParameters(VDP, input, params.length)); + libvirt.virDomainSetSchedulerParameters(VDP, input, params.length); + processError(); } /** @@ -1062,7 +1241,8 @@ public class Domain { * @throws LibvirtException */ public void setVcpus(int nvcpus) throws LibvirtException { - processError(libvirt.virDomainSetVcpus(VDP, nvcpus)); + libvirt.virDomainSetVcpus(VDP, nvcpus); + processError(); } /** @@ -1074,7 +1254,19 @@ public class Domain { * @throws LibvirtException */ public void shutdown() throws LibvirtException { - processError(libvirt.virDomainShutdown(VDP)); + libvirt.virDomainShutdown(VDP); + processError(); + } + + /** + * Shuts down this domain with selected shutdown flag. + * Please use Domain static flags under the inner class SHUTDOWNFlags + * @param flag + * @throws LibvirtException + */ + public void shutdown(long flag) throws LibvirtException{ + libvirt.virDomainShutdownFlags(VDP, flag); + processError(); } /** @@ -1088,12 +1280,17 @@ public class Domain { * string containing an XML description of the domain * @param flags * flags for creating the snapshot, see the virDomainSnapshotCreateFlags for the flag options - * @return the snapshot + * @return the snapshot, or null on Error * @throws LibvirtException */ public DomainSnapshot snapshotCreateXML(String xmlDesc, int flags) throws LibvirtException { - DomainSnapshotPointer ptr = processError(libvirt.virDomainSnapshotCreateXML(VDP, xmlDesc, flags)); - return new DomainSnapshot(virConnect, ptr); + DomainSnapshotPointer ptr = libvirt.virDomainSnapshotCreateXML(VDP, xmlDesc, flags); + processError(); + DomainSnapshot returnValue = null; + if (ptr != null) { + returnValue = new DomainSnapshot(virConnect, ptr); + } + return returnValue; } /** @@ -1103,7 +1300,7 @@ public class Domain { * This is just a convenience method, it has the same effect * as calling {@code snapshotCreateXML(xmlDesc, 0);}. * - * @see #snapshotCreateXML(String, int) + * @see #snapshotCreateXML(int) * @see <a * href="http://www.libvirt.org/html/libvirt-libvirt.html#virDomainSnapshotCreateXML">Libvirt * Documentation</a> @@ -1122,12 +1319,17 @@ public class Domain { * @see <a * href="http://www.libvirt.org/html/libvirt-libvirt.html#virDomainSnapshotCurrent">Libvirt * Documentation</a> - * @return the snapshot + * @return the snapshot, or null on Error * @throws LibvirtException */ public DomainSnapshot snapshotCurrent() throws LibvirtException { - DomainSnapshotPointer ptr = processError(libvirt.virDomainSnapshotCurrent(VDP, 0)); - return new DomainSnapshot(virConnect, ptr); + DomainSnapshotPointer ptr = libvirt.virDomainSnapshotCurrent(VDP, 0); + processError(); + DomainSnapshot returnValue = null; + if (ptr != null) { + returnValue = new DomainSnapshot(virConnect, ptr); + } + return returnValue; } /** @@ -1140,15 +1342,16 @@ public class Domain { * @throws LibvirtException */ public String[] snapshotListNames(int flags) throws LibvirtException { + String[] returnValue = null; int num = snapshotNum(); - if (num > 0) { - Pointer[] ptrs = new Pointer[num]; - int got = processError(libvirt.virDomainSnapshotListNames(VDP, ptrs, num, flags)); - - return Library.toStringArray(ptrs, got); - } else { - return Library.NO_STRINGS; + if (num >= 0) { + returnValue = new String[num]; + if (num > 0) { + libvirt.virDomainSnapshotListNames(VDP, returnValue, num, flags); + processError(); + } } + return returnValue; } /** @@ -1176,12 +1379,17 @@ public class Domain { * Documentation</a> * @param name * the name - * @return The located snapshot + * @return The located snapshot, or null if an error * @throws LibvirtException */ public DomainSnapshot snapshotLookupByName(String name) throws LibvirtException { - DomainSnapshotPointer ptr = processError(libvirt.virDomainSnapshotLookupByName(VDP, name, 0)); - return new DomainSnapshot(virConnect, ptr); + DomainSnapshotPointer ptr = libvirt.virDomainSnapshotLookupByName(VDP, name, 0); + processError(); + DomainSnapshot returnValue = null; + if (ptr != null) { + returnValue = new DomainSnapshot(virConnect, ptr); + } + return returnValue; } /** @@ -1192,7 +1400,9 @@ public class Domain { * Documentation</a> */ public int snapshotNum() throws LibvirtException { - return processError(libvirt.virDomainSnapshotNum(VDP, 0)); + int returnValue = libvirt.virDomainSnapshotNum(VDP, 0); + processError(); + return returnValue; } /** @@ -1204,7 +1414,8 @@ public class Domain { * @throws LibvirtException */ public void suspend() throws LibvirtException { - processError(libvirt.virDomainSuspend(VDP)); + libvirt.virDomainSuspend(VDP); + processError(); } /** @@ -1213,7 +1424,8 @@ public class Domain { * @throws LibvirtException */ public void undefine() throws LibvirtException { - processError(libvirt.virDomainUndefine(VDP)); + libvirt.virDomainUndefine(VDP); + processError(); } /** @@ -1225,7 +1437,8 @@ public class Domain { * @throws LibvirtException */ public void undefine(int flags) throws LibvirtException { - processError(libvirt.virDomainUndefineFlags(VDP, flags)); + libvirt.virDomainUndefineFlags(VDP, flags); + processError(); } /** @@ -1236,11 +1449,13 @@ public class Domain { * the xml to update with * @param flags * controls the update - * @return always 0 + * @return 0 in case of success, -1 in case of failure. * @throws LibvirtException */ public int updateDeviceFlags(String xml, int flags) throws LibvirtException { - return processError(libvirt.virDomainUpdateDeviceFlags(VDP, xml, flags)); + int returnValue = libvirt.virDomainUpdateDeviceFlags(VDP, xml, flags); + processError(); + return returnValue; } } diff --git a/src/main/java/org/libvirt/DomainInterfaceStats.java b/src/main/java/org/libvirt/DomainInterfaceStats.java index eab5c44..0e948d5 100644 --- a/src/main/java/org/libvirt/DomainInterfaceStats.java +++ b/src/main/java/org/libvirt/DomainInterfaceStats.java @@ -3,7 +3,7 @@ package org.libvirt; import org.libvirt.jna.virDomainInterfaceStats; /** - * The Domain.interfaceStats method returns the network counters in this object. + * The Domain.interfaceStats method returns th network counters in this object * * @author stoty * diff --git a/src/main/java/org/libvirt/DomainSnapshot.java b/src/main/java/org/libvirt/DomainSnapshot.java index 3013117..b58fd20 100644 --- a/src/main/java/org/libvirt/DomainSnapshot.java +++ b/src/main/java/org/libvirt/DomainSnapshot.java @@ -2,9 +2,6 @@ package org.libvirt; import org.libvirt.jna.DomainSnapshotPointer; import static org.libvirt.Library.libvirt; -import static org.libvirt.ErrorHandler.processError; - -import com.sun.jna.Pointer; public class DomainSnapshot { @@ -30,14 +27,15 @@ public class DomainSnapshot { * href="http://www.libvirt.org/html/libvirt-libvirt.html#virDomainSnapshotDelete">Libvirt * Documentation</a> * @param flags - * controls the deletion - * @return <em>ignore</em> (always 0) + * controls teh deletion + * @return 0 if the selected snapshot(s) were successfully deleted, -1 on error. * @throws LibvirtException */ public int delete(int flags) throws LibvirtException { int success = 0; if (VDSP != null) { - success = processError(libvirt.virDomainSnapshotDelete(VDSP, flags)); + success = libvirt.virDomainSnapshotDelete(VDSP, flags); + processError(); VDSP = null; } @@ -54,12 +52,13 @@ public class DomainSnapshot { * exist. * * @throws LibvirtException - * @return 0 on success + * @return 0 on success, or -1 on error. */ public int free() throws LibvirtException { int success = 0; if (VDSP != null) { - success = processError(libvirt.virDomainSnapshotFree(VDSP)); + success = libvirt.virDomainSnapshotFree(VDSP); + processError(); VDSP = null; } @@ -73,12 +72,16 @@ public class DomainSnapshot { * @return the XML document */ public String getXMLDesc() throws LibvirtException { - Pointer p = processError(libvirt.virDomainSnapshotGetXMLDesc(VDSP, 0)); + String returnValue = libvirt.virDomainSnapshotGetXMLDesc(VDSP, 0); + processError(); + return returnValue; + } - try { - return Library.getString(p); - } finally { - Library.free(p); - } + /** + * Error handling logic to throw errors. Must be called after every libvirt + * call. + */ + protected void processError() throws LibvirtException { + virConnect.processError(); } } diff --git a/src/main/java/org/libvirt/Error.java b/src/main/java/org/libvirt/Error.java index 15dd870..114e758 100644 --- a/src/main/java/org/libvirt/Error.java +++ b/src/main/java/org/libvirt/Error.java @@ -28,104 +28,54 @@ public class Error implements Serializable { } public static enum ErrorDomain { - VIR_FROM_NONE, - /** Error at Xen hypervisor layer */ - VIR_FROM_XEN, - /** Error at connection with xend daemon */ - VIR_FROM_XEND, - /** Error at connection with xen store */ - VIR_FROM_XENSTORE, - /** Error in the S-Expression code */ - VIR_FROM_SEXPR, - /** Error in the XML code */ - VIR_FROM_XML, - /** Error when operating on a domain */ - VIR_FROM_DOM, - /** Error in the XML-RPC code */ - VIR_FROM_RPC, - /** Error in the proxy code */ - VIR_FROM_PROXY, - /** Error in the configuration file handling */ - VIR_FROM_CONF, - /** Error at the QEMU daemon */ - VIR_FROM_QEMU, - /** Error when operating on a network */ - VIR_FROM_NET, - /** Error from test driver */ - VIR_FROM_TEST, - /** Error from remote driver */ - VIR_FROM_REMOTE, - /** Error from OpenVZ driver */ - VIR_FROM_OPENVZ, - /** Error at Xen XM layer */ - VIR_FROM_XENXM, - /** Error in the Linux Stats code */ - VIR_FROM_STATS_LINUX, - /** Error from Linux Container driver */ - VIR_FROM_LXC, - /** Error from storage driver */ - VIR_FROM_STORAGE, - /** Error from network config */ - VIR_FROM_NETWORK, - /** Error from domain config */ - VIR_FROM_DOMAIN, - /** Error at the UML driver */ - VIR_FROM_UML, - /** Error from node device monitor */ - VIR_FROM_NODEDEV, - /** Error from xen inotify layer */ - VIR_FROM_XEN_INOTIFY, - /** Error from security framework */ - VIR_FROM_SECURITY, - /** Error from VirtualBox driver */ - VIR_FROM_VBOX, - /** Error when operating on an interface */ - VIR_FROM_INTERFACE, - /** Error from OpenNebula driver */ - VIR_FROM_ONE, - /** Error from ESX driver */ - VIR_FROM_ESX, - /** Error from IBM power hypervisor */ - VIR_FROM_PHYP, - /** Error from secret storage */ - VIR_FROM_SECRET, - /** Error from CPU driver */ - VIR_FROM_CPU, - /** Error from XenAPI */ - VIR_FROM_XENAPI, - /** Error from network filter driver */ - VIR_FROM_NWFILTER, - /** Error from Synchronous hooks */ - VIR_FROM_HOOK, - /** Error from domain snapshot */ - VIR_FROM_DOMAIN_SNAPSHOT, - /** Error from auditing subsystem */ - VIR_FROM_AUDIT, - /** Error from sysinfo/SMBIOS */ - VIR_FROM_SYSINFO, - /** Error from I/O streams */ - VIR_FROM_STREAMS, - /** Error from VMware driver */ - VIR_FROM_VMWARE, - /** Error from event loop impl */ - VIR_FROM_EVENT, - /** Error from libxenlight driver */ - VIR_FROM_LIBXL, - /** Error from lock manager */ - VIR_FROM_LOCKING, - /** Error from Hyper-V driver */ - VIR_FROM_HYPERV, - /** Error from capabilities */ - VIR_FROM_CAPABILITIES, - /** Error from URI handling */ - VIR_FROM_URI, - /** Error from auth handling */ - VIR_FROM_AUTH, - /** Error from DBus */ - VIR_FROM_DBUS, - - /** unknown error domain */ - VIR_FROM_UNKNOWN; // must be the last entry! + VIR_FROM_NONE, VIR_FROM_XEN, /* Error at Xen hypervisor layer */ + VIR_FROM_XEND, /* Error at connection with xend daemon */ + VIR_FROM_XENSTORE, /* Error at connection with xen store */ + VIR_FROM_SEXPR, /* Error in the S-Expression code */ + VIR_FROM_XML, /* Error in the XML code */ + VIR_FROM_DOM, /* Error when operating on a domain */ + VIR_FROM_RPC, /* Error in the XML-RPC code */ + VIR_FROM_PROXY, /* Error in the proxy code */ + VIR_FROM_CONF, /* Error in the configuration file handling */ + VIR_FROM_QEMU, /* Error at the QEMU daemon */ + VIR_FROM_NET, /* Error when operating on a network */ + VIR_FROM_TEST, /* Error from test driver */ + VIR_FROM_REMOTE, /* Error from remote driver */ + VIR_FROM_OPENVZ, /* Error from OpenVZ driver */ + VIR_FROM_XENXM, /* Error at Xen XM layer */ + VIR_FROM_STATS_LINUX, /* Error in the Linux Stats code */ + VIR_FROM_LXC, /* Error from Linux Container driver */ + VIR_FROM_STORAGE, /* Error from storage driver */ + VIR_FROM_NETWORK, /* Error from network config */ + VIR_FROM_DOMAIN, /* Error from domain config */ + VIR_FROM_UML, /* Error at the UML driver */ + VIR_FROM_NODEDEV, /* Error from node device monitor */ + VIR_FROM_XEN_INOTIFY, /* Error from xen inotify layer */ + VIR_FROM_SECURITY, /* Error from security framework */ + VIR_FROM_VBOX, /* Error from VirtualBox driver */ + VIR_FROM_INTERFACE, /* Error when operating on an interface */ + VIR_FROM_ONE, /* Error from OpenNebula driver */ + VIR_FROM_ESX, /* Error from ESX driver */ + VIR_FROM_PHYP, /* Error from IBM power hypervisor */ + VIR_FROM_SECRET, /* Error from secret storage */ + VIR_FROM_CPU, /* Error from CPU driver */ + VIR_FROM_XENAPI, /* Error from XenAPI */ + VIR_FROM_NWFILTER, /* Error from network filter driver */ + VIR_FROM_HOOK, /* Error from Synchronous hooks */ + VIR_FROM_DOMAIN_SNAPSHOT, /* Error from domain snapshot */ + VIR_FROM_AUDIT, /* Error from auditing subsystem */ + VIR_FROM_SYSINFO, /* Error from sysinfo/SMBIOS */ + VIR_FROM_STREAMS, /* Error from I/O streams */ + VIR_FROM_VMWARE, /* Error from VMware driver */ + VIR_FROM_EVENT, /* Error from event loop impl */ + VIR_FROM_LIBXL, /* Error from libxenlight driver */ + VIR_FROM_LOCKING, /* Error from lock manager */ + VIR_FROM_HYPERV, /* Error from Hyper-V driver */ + VIR_FROM_CAPABILITIES, /* Error from capabilities */ + VIR_FROM_URI, /* Error from URI handling */ + VIR_FROM_AUTH, /* Error from auth handling */ + VIR_FROM_DBUS, /* Error from DBus */ + VIR_FROM_UNKNOWN; /* unknown error domain (must be the last entry!) */ protected static final ErrorDomain wrap(int value) { return safeElementAt(value, values()); @@ -151,170 +101,93 @@ public class Error implements Serializable { } public static enum ErrorNumber { - VIR_ERR_OK, - /** internal error */ - VIR_ERR_INTERNAL_ERROR, - /** memory allocation failure */ - VIR_ERR_NO_MEMORY, - /** no support for this function */ - VIR_ERR_NO_SUPPORT, - /** could not resolve hostname */ - VIR_ERR_UNKNOWN_HOST, - /** can't connect to hypervisor */ - VIR_ERR_NO_CONNECT, - /** invalid connection object */ - VIR_ERR_INVALID_CONN, - /** invalid domain object */ - VIR_ERR_INVALID_DOMAIN, - /** invalid function argument */ - VIR_ERR_INVALID_ARG, - /** a command to hypervisor failed */ - VIR_ERR_OPERATION_FAILED, - /** a HTTP GET command to failed */ - VIR_ERR_GET_FAILED, - /** a HTTP POST command to failed */ - VIR_ERR_POST_FAILED, - /** unexpected HTTP error code */ - VIR_ERR_HTTP_ERROR, - /** failure to serialize an S-Expr */ - VIR_ERR_SEXPR_SERIAL, - /** could not open Xen hypervisor control */ - VIR_ERR_NO_XEN, - /** failure doing an hypervisor call */ - VIR_ERR_XEN_CALL, - /** unknown OS type */ - VIR_ERR_OS_TYPE, - /** missing kernel information */ - VIR_ERR_NO_KERNEL, - /** missing root device information */ - VIR_ERR_NO_ROOT, - /** missing source device information */ - VIR_ERR_NO_SOURCE, - /** missing target device information */ - VIR_ERR_NO_TARGET, - /** missing domain name information */ - VIR_ERR_NO_NAME, - /** missing domain OS information */ - VIR_ERR_NO_OS, - /** missing domain devices information */ - VIR_ERR_NO_DEVICE, - /** could not open Xen Store control */ - VIR_ERR_NO_XENSTORE, - /** too many drivers registered */ - VIR_ERR_DRIVER_FULL, - /** not supported by the drivers (DEPRECATED) */ - VIR_ERR_CALL_FAILED, - /** an XML description is not well formed or broken */ - VIR_ERR_XML_ERROR, - /** the domain already exist */ - VIR_ERR_DOM_EXIST, - /** operation forbidden on read-only connections */ - VIR_ERR_OPERATION_DENIED, - /** failed to open a conf file */ - VIR_ERR_OPEN_FAILED, - /** failed to read a conf file */ - VIR_ERR_READ_FAILED, - /** failed to parse a conf file */ - VIR_ERR_PARSE_FAILED, - /** failed to parse the syntax of a conf file */ - VIR_ERR_CONF_SYNTAX, - /** failed to write a conf file */ - VIR_ERR_WRITE_FAILED, - /** detail of an XML error */ - VIR_ERR_XML_DETAIL, - /** invalid network object */ - VIR_ERR_INVALID_NETWORK, - /** the network already exist */ - VIR_ERR_NETWORK_EXIST, - /** general system call failure */ - VIR_ERR_SYSTEM_ERROR, - /** some sort of RPC error */ - VIR_ERR_RPC, - /** error from a GNUTLS call */ - VIR_ERR_GNUTLS_ERROR, - /** failed to start network */ - VIR_WAR_NO_NETWORK, - /** domain not found or unexpectedly disappeared */ - VIR_ERR_NO_DOMAIN, - /** network not found */ - VIR_ERR_NO_NETWORK, - /** invalid MAC address */ - VIR_ERR_INVALID_MAC, - /** authentication failed */ - VIR_ERR_AUTH_FAILED, - /** invalid storage pool object */ - VIR_ERR_INVALID_STORAGE_POOL, - /** invalid storage vol object */ - VIR_ERR_INVALID_STORAGE_VOL, - /** failed to start storage */ - VIR_WAR_NO_STORAGE, - /** storage pool not found */ - VIR_ERR_NO_STORAGE_POOL, - /** storage pool not found */ - VIR_ERR_NO_STORAGE_VOL, - /** failed to start node driver */ - VIR_WAR_NO_NODE, - /** invalid node device object */ - VIR_ERR_INVALID_NODE_DEVICE, - /** node device not found */ - VIR_ERR_NO_NODE_DEVICE, - /** security model not found */ - VIR_ERR_NO_SECURITY_MODEL, - /** operation is not applicable at this time */ - VIR_ERR_OPERATION_INVALID, - /** failed to start interface driver */ - VIR_WAR_NO_INTERFACE, - /** interface driver not running */ - VIR_ERR_NO_INTERFACE, - /** invalid interface object */ - VIR_ERR_INVALID_INTERFACE, - /** more than one matching interface found */ - VIR_ERR_MULTIPLE_INTERFACES, - /** failed to start secret storage */ - VIR_WAR_NO_SECRET, - /** invalid secret */ - VIR_ERR_INVALID_SECRET, - /** secret not found */ - VIR_ERR_NO_SECRET, - /** unsupported configuration construct */ - VIR_ERR_CONFIG_UNSUPPORTED, - /** timeout occurred during operation */ - VIR_ERR_OPERATION_TIMEOUT, - /** a migration worked, but making the VM persist on the dest - * host failed */ - VIR_ERR_MIGRATE_PERSIST_FAILED, - /** a synchronous hook script failed */ - VIR_ERR_HOOK_SCRIPT_FAILED, - /** invalid domain snapshot */ - VIR_ERR_INVALID_DOMAIN_SNAPSHOT, - /** domain snapshot not found */ - VIR_ERR_NO_DOMAIN_SNAPSHOT, - /** stream pointer not valid */ - VIR_ERR_INVALID_STREAM, - /** valid API use but unsupported by the given driver */ - VIR_ERR_ARGUMENT_UNSUPPORTED, - /** storage pool probe failed */ - VIR_ERR_STORAGE_PROBE_FAILED, - /** storage pool already built */ - VIR_ERR_STORAGE_POOL_BUILT, - /** force was not requested for a risky domain snapshot - revert */ - VIR_ERR_SNAPSHOT_REVERT_RISKY, - /** operation on a domain was canceled/aborted by user */ - VIR_ERR_OPERATION_ABORTED, - /** authentication cancelled */ - VIR_ERR_AUTH_CANCELLED, - /** The metadata is not present */ - VIR_ERR_NO_DOMAIN_METADATA, - /** Migration is not safe */ - VIR_ERR_MIGRATE_UNSAFE, - /** integer overflow */ - VIR_ERR_OVERFLOW, - /** action prevented by block copy job */ - VIR_ERR_BLOCK_COPY_ACTIVE, - - /** unknown error */ - VIR_ERR_UNKNOWN; // must be the last entry! + VIR_ERR_OK, VIR_ERR_INTERNAL_ERROR, /* internal error */ + VIR_ERR_NO_MEMORY, /* memory allocation failure */ + VIR_ERR_NO_SUPPORT, /* no support for this function */ + VIR_ERR_UNKNOWN_HOST, /* could not resolve hostname */ + VIR_ERR_NO_CONNECT, /* can't connect to hypervisor */ + VIR_ERR_INVALID_CONN, /* invalid connection object */ + VIR_ERR_INVALID_DOMAIN, /* invalid domain object */ + VIR_ERR_INVALID_ARG, /* invalid function argument */ + VIR_ERR_OPERATION_FAILED, /* a command to hypervisor failed */ + VIR_ERR_GET_FAILED, /* a HTTP GET command to failed */ + VIR_ERR_POST_FAILED, /* a HTTP POST command to failed */ + VIR_ERR_HTTP_ERROR, /* unexpected HTTP error code */ + VIR_ERR_SEXPR_SERIAL, /* failure to serialize an S-Expr */ + VIR_ERR_NO_XEN, /* could not open Xen hypervisor control */ + VIR_ERR_XEN_CALL, /* failure doing an hypervisor call */ + VIR_ERR_OS_TYPE, /* unknown OS type */ + VIR_ERR_NO_KERNEL, /* missing kernel information */ + VIR_ERR_NO_ROOT, /* missing root device information */ + VIR_ERR_NO_SOURCE, /* missing source device information */ + VIR_ERR_NO_TARGET, /* missing target device information */ + VIR_ERR_NO_NAME, /* missing domain name information */ + VIR_ERR_NO_OS, /* missing domain OS information */ + VIR_ERR_NO_DEVICE, /* missing domain devices information */ + VIR_ERR_NO_XENSTORE, /* could not open Xen Store control */ + VIR_ERR_DRIVER_FULL, /* too many drivers registered */ + VIR_ERR_CALL_FAILED, /* not supported by the drivers (DEPRECATED) */ + VIR_ERR_XML_ERROR, /* an XML description is not well formed or broken */ + VIR_ERR_DOM_EXIST, /* the domain already exist */ + VIR_ERR_OPERATION_DENIED, /* + * operation forbidden on read-only + * connections + */ + VIR_ERR_OPEN_FAILED, /* failed to open a conf file */ + VIR_ERR_READ_FAILED, /* failed to read a conf file */ + VIR_ERR_PARSE_FAILED, /* failed to parse a conf file */ + VIR_ERR_CONF_SYNTAX, /* failed to parse the syntax of a conf file */ + VIR_ERR_WRITE_FAILED, /* failed to write a conf file */ + VIR_ERR_XML_DETAIL, /* detail of an XML error */ + VIR_ERR_INVALID_NETWORK, /* invalid network object */ + VIR_ERR_NETWORK_EXIST, /* the network already exist */ + VIR_ERR_SYSTEM_ERROR, /* general system call failure */ + VIR_ERR_RPC, /* some sort of RPC error */ + VIR_ERR_GNUTLS_ERROR, /* error from a GNUTLS call */ + VIR_WAR_NO_NETWORK, /* failed to start network */ + VIR_ERR_NO_DOMAIN, /* domain not found or unexpectedly disappeared */ + VIR_ERR_NO_NETWORK, /* network not found */ + VIR_ERR_INVALID_MAC, /* invalid MAC address */ + VIR_ERR_AUTH_FAILED, /* authentication failed */ + VIR_ERR_INVALID_STORAGE_POOL, /* invalid storage pool object */ + VIR_ERR_INVALID_STORAGE_VOL, /* invalid storage vol object */ + VIR_WAR_NO_STORAGE, /* failed to start storage */ + VIR_ERR_NO_STORAGE_POOL, /* storage pool not found */ + VIR_ERR_NO_STORAGE_VOL, /* storage pool not found */ + VIR_WAR_NO_NODE, /* failed to start node driver */ + VIR_ERR_INVALID_NODE_DEVICE, /* invalid node device object */ + VIR_ERR_NO_NODE_DEVICE, /* node device not found */ + VIR_ERR_NO_SECURITY_MODEL, /* security model not found */ + VIR_ERR_OPERATION_INVALID, /* operation is not applicable at this time */ + VIR_WAR_NO_INTERFACE, /* failed to start interface driver */ + VIR_ERR_NO_INTERFACE, /* interface driver not running */ + VIR_ERR_INVALID_INTERFACE, /* invalid interface object */ + VIR_ERR_MULTIPLE_INTERFACES, /* more than one matching interface found */ + VIR_WAR_NO_SECRET, /* failed to start secret storage */ + VIR_ERR_INVALID_SECRET, /* invalid secret */ + VIR_ERR_NO_SECRET, /* secret not found */ + VIR_ERR_CONFIG_UNSUPPORTED, /* unsupported configuration construct */ + VIR_ERR_OPERATION_TIMEOUT, /* timeout occurred during operation */ + VIR_ERR_MIGRATE_PERSIST_FAILED, /* a migration worked, but making the + VM persist on the dest host failed */ + VIR_ERR_HOOK_SCRIPT_FAILED, /* a synchronous hook script failed */ + VIR_ERR_INVALID_DOMAIN_SNAPSHOT, /* invalid domain snapshot */ + VIR_ERR_NO_DOMAIN_SNAPSHOT, /* domain snapshot not found */ + VIR_ERR_INVALID_STREAM, /* stream pointer not valid */ + VIR_ERR_ARGUMENT_UNSUPPORTED, /* valid API use but unsupported by + the given driver */ + VIR_ERR_STORAGE_PROBE_FAILED, /* storage pool probe failed */ + VIR_ERR_STORAGE_POOL_BUILT, /* storage pool already built */ + VIR_ERR_SNAPSHOT_REVERT_RISKY, /* force was not requested for a + risky domain snapshot revert */ + VIR_ERR_OPERATION_ABORTED, /* operation on a domain was + canceled/aborted by user */ + VIR_ERR_AUTH_CANCELLED, /* authentication cancelled */ + VIR_ERR_NO_DOMAIN_METADATA, /* The metadata is not present */ + VIR_ERR_MIGRATE_UNSAFE, /* Migration is not safe */ + VIR_ERR_OVERFLOW, /* integer overflow */ + VIR_ERR_BLOCK_COPY_ACTIVE, /* action prevented by block copy job */ + VIR_ERR_UNKNOWN; /* unknown error (must be the last entry!) */ protected static final ErrorNumber wrap(int value) { return safeElementAt(value, values()); @@ -340,9 +213,9 @@ public class Error implements Serializable { private NetworkPointer VNP; /* Deprecated */ public Error(virError vError) { - code = ErrorNumber.wrap(vError.code); - domain = ErrorDomain.wrap(vError.domain); - level = ErrorLevel.wrap(vError.level); + code = code.wrap(vError.code); + domain = domain.wrap(vError.domain); + level = level.wrap(vError.level); message = vError.message; str1 = vError.str1; str2 = vError.str2; @@ -355,9 +228,9 @@ public class Error implements Serializable { } /** - * Gets the error code + * Gets he error code * - * @return a VirErrorNumber + * @return a VirErroNumber */ public ErrorNumber getCode() { return code; @@ -421,7 +294,7 @@ public class Error implements Serializable { } /** - * Returns a human-readable informative error message + * Returns human-readable informative error messag * * @return error message */ diff --git a/src/main/java/org/libvirt/ErrorHandler.java b/src/main/java/org/libvirt/ErrorHandler.java index c2e7337..434c85d 100644 --- a/src/main/java/org/libvirt/ErrorHandler.java +++ b/src/main/java/org/libvirt/ErrorHandler.java @@ -3,11 +3,6 @@ package org.libvirt; import org.libvirt.jna.Libvirt; import org.libvirt.jna.virError; -import static org.libvirt.Library.libvirt; - -import com.sun.jna.Pointer; -import com.sun.jna.PointerType; - /** * Utility class which processes the last error from the libvirt library. It * turns errors into Libvirt Exceptions. @@ -16,7 +11,14 @@ import com.sun.jna.PointerType; */ public class ErrorHandler { - private static final void processError() throws LibvirtException { + /** + * Look for the latest error from libvirt not tied to a connection + * + * @param libvirt + * the active connection + * @throws LibvirtException + */ + public static void processError(Libvirt libvirt) throws LibvirtException { virError vError = libvirt.virGetLastError(); if (vError != null) { Error error = new Error(vError); @@ -28,44 +30,4 @@ public class ErrorHandler { } } } - - /** - * Calls {@link #processError()} when the given libvirt return code - * indicates an error. - * - * @param ret libvirt return code, indicating error if -1. - * @return {@code ret} - * @throws LibvirtException - */ - static final int processError(int ret) throws LibvirtException { - if (ret == -1) processError(); - return ret; - } - - /** - * Calls {@link #processError()} if {@code arg} is null. - * - * @param arg An arbitrary object returned by libvirt. - * @return {@code arg} - * @throws LibvirtException - */ - static final <T extends PointerType> T processError(T arg) throws LibvirtException { - if (arg == null) processError(); - return arg; - } - - static final Pointer processError(Pointer arg) throws LibvirtException { - if (arg == null) processError(); - return arg; - } - - static final String processError(String str) throws LibvirtException { - if (str == null) processError(); - return str; - } - - static final long processErrorIfZero(long ret) throws LibvirtException { - if (ret == 0) processError(); - return ret; - } } diff --git a/src/main/java/org/libvirt/Interface.java b/src/main/java/org/libvirt/Interface.java index e0ddc3f..7782fb9 100644 --- a/src/main/java/org/libvirt/Interface.java +++ b/src/main/java/org/libvirt/Interface.java @@ -2,7 +2,6 @@ package org.libvirt; import org.libvirt.jna.InterfacePointer; import static org.libvirt.Library.libvirt; -import static org.libvirt.ErrorHandler.processError; import com.sun.jna.Pointer; @@ -41,37 +40,27 @@ public class Interface { } /** - * Activate an interface (i.e. call "ifup"). - * <p> - * If there was an open network config transaction at the time - * this interface was defined (that is, if - * virInterfaceChangeBegin() had been called), the interface will - * be brought back down (and then undefined) if - * virInterfaceChangeRollback() is called. + * Create and start a defined network. If the call succeed the network moves + * from the defined to the running networks pools. * * @throws LibvirtException */ public int create() throws LibvirtException { - return processError(libvirt.virInterfaceCreate(VIP)); + int returnValue = libvirt.virInterfaceCreate(VIP); + processError(); + return returnValue; } /** - * Deactivate an interface (i.e. call "ifdown"). - * <p> - * This does not remove the interface from the config, and does - * not free the associated virInterfacePtr object. - * <p> - * If there is an open network config transaction at the time this - * interface is destroyed (that is, if virInterfaceChangeBegin() - * had been called), and if the interface is later undefined and - * then virInterfaceChangeRollback() is called, the restoral of - * the interface definition will also bring the interface back - * up. + * Destroy the network object. The running instance is shutdown if not down + * already and all resources used by it are given back to the hypervisor. * * @throws LibvirtException */ public int destroy() throws LibvirtException { - return processError(libvirt.virInterfaceDestroy(VIP)); + int returnValue = libvirt.virInterfaceDestroy(VIP); + processError(); + return returnValue; } @Override @@ -84,12 +73,13 @@ public class Interface { * structure is freed and should not be used thereafter. * * @throws LibvirtException - * @return number of references left (>= 0) + * @return number of references left (>= 0) for success, -1 for failure. */ public int free() throws LibvirtException { int success = 0; if (VIP != null) { - success = processError(libvirt.virInterfaceFree(VIP)); + success = libvirt.virInterfaceFree(VIP); + processError(); VIP = null; } @@ -102,7 +92,9 @@ public class Interface { * @throws LibvirtException */ public String getMACString() throws LibvirtException { - return processError(libvirt.virInterfaceGetMACString(VIP)); + String name = libvirt.virInterfaceGetMACString(VIP); + processError(); + return name; } /** @@ -111,7 +103,9 @@ public class Interface { * @throws LibvirtException */ public String getName() throws LibvirtException { - return processError(libvirt.virInterfaceGetName(VIP)); + String name = libvirt.virInterfaceGetName(VIP); + processError(); + return name; } /** @@ -120,7 +114,8 @@ public class Interface { * @throws LibvirtException */ public String getXMLDescription(int flags) throws LibvirtException { - Pointer xml = processError(libvirt.virInterfaceGetXMLDesc(VIP, flags)); + Pointer xml = libvirt.virInterfaceGetXMLDesc(VIP, flags); + processError(); try { return Library.getString(xml); } finally { @@ -134,11 +129,21 @@ public class Interface { * @see <a * href="http://www.libvirt.org/html/libvirt-libvirt.html#virInterfaceIsActive">Libvirt * Documentation</a> - * @return 1 if running, 0 if inactive + * @return 1 if running, 0 if inactive, -1 on error * @throws LibvirtException */ public int isActive() throws LibvirtException { - return processError(libvirt.virInterfaceIsActive(VIP)); + int returnValue = libvirt.virInterfaceIsActive(VIP); + processError(); + return returnValue; + } + + /** + * Error handling logic to throw errors. Must be called after every libvirt + * call. + */ + protected void processError() throws LibvirtException { + virConnect.processError(); } /** @@ -148,6 +153,8 @@ public class Interface { * @throws LibvirtException */ public int undefine() throws LibvirtException { - return processError(libvirt.virInterfaceUndefine(VIP)); + int returnValue = libvirt.virInterfaceUndefine(VIP); + processError(); + return returnValue; } } diff --git a/src/main/java/org/libvirt/Library.java b/src/main/java/org/libvirt/Library.java index 6f12c37..0136095 100644 --- a/src/main/java/org/libvirt/Library.java +++ b/src/main/java/org/libvirt/Library.java @@ -1,7 +1,6 @@ package org.libvirt; import org.libvirt.jna.Libvirt; -import static org.libvirt.ErrorHandler.processError; import com.sun.jna.Native; import com.sun.jna.Pointer; @@ -24,9 +23,10 @@ final class Library { // Load the native part static { + Libvirt.INSTANCE.virInitialize(); libvirt = Libvirt.INSTANCE; try { - processError(libvirt.virInitialize()); + ErrorHandler.processError(Libvirt.INSTANCE); } catch (Exception e) { e.printStackTrace(); } diff --git a/src/main/java/org/libvirt/Network.java b/src/main/java/org/libvirt/Network.java index 2a77028..2244c5d 100644 --- a/src/main/java/org/libvirt/Network.java +++ b/src/main/java/org/libvirt/Network.java @@ -3,7 +3,6 @@ package org.libvirt; import org.libvirt.jna.Libvirt; import org.libvirt.jna.NetworkPointer; import static org.libvirt.Library.libvirt; -import static org.libvirt.ErrorHandler.processError; import com.sun.jna.Native; import com.sun.jna.Pointer; @@ -44,7 +43,8 @@ public class Network { * @throws LibvirtException */ public void create() throws LibvirtException { - processError(libvirt.virNetworkCreate(VNP)); + libvirt.virNetworkCreate(VNP); + processError(); } /** @@ -56,7 +56,8 @@ public class Network { * @throws LibvirtException */ public void destroy() throws LibvirtException { - processError(libvirt.virNetworkDestroy(VNP)); + libvirt.virNetworkDestroy(VNP); + processError(); } @Override @@ -70,12 +71,13 @@ public class Network { * return an error. * * @throws LibvirtException - * @return number of references left (>= 0) + * @return number of references left (>= 0) for success, -1 for failure. */ public int free() throws LibvirtException { int success = 0; if (VNP != null) { - success = processError(libvirt.virNetworkFree(VNP)); + success = libvirt.virNetworkFree(VNP); + processError(); VNP = null; } @@ -91,7 +93,8 @@ public class Network { */ public boolean getAutostart() throws LibvirtException { IntByReference autoStart = new IntByReference(); - processError(libvirt.virNetworkGetAutostart(VNP, autoStart)); + libvirt.virNetworkGetAutostart(VNP, autoStart); + processError(); return (autoStart.getValue() != 0) ? true : false; } @@ -103,7 +106,8 @@ public class Network { * @throws LibvirtException */ public String getBridgeName() throws LibvirtException { - final Pointer ptr = processError(libvirt.virNetworkGetBridgeName(VNP)); + final Pointer ptr = libvirt.virNetworkGetBridgeName(VNP); + processError(); try { return Library.getString(ptr); } finally { @@ -127,7 +131,9 @@ public class Network { * @throws LibvirtException */ public String getName() throws LibvirtException { - return processError(libvirt.virNetworkGetName(VNP)); + String returnValue = libvirt.virNetworkGetName(VNP); + processError(); + return returnValue; } /** @@ -139,8 +145,13 @@ public class Network { */ public int[] getUUID() throws LibvirtException { byte[] bytes = new byte[Libvirt.VIR_UUID_BUFLEN]; - processError(libvirt.virNetworkGetUUID(VNP, bytes)); - return Connect.convertUUIDBytes(bytes); + int success = libvirt.virNetworkGetUUID(VNP, bytes); + processError(); + int[] returnValue = new int[0]; + if (success == 0) { + returnValue = Connect.convertUUIDBytes(bytes); + } + return returnValue; } /** @@ -152,8 +163,13 @@ public class Network { */ public String getUUIDString() throws LibvirtException { byte[] bytes = new byte[Libvirt.VIR_UUID_STRING_BUFLEN]; - processError(libvirt.virNetworkGetUUIDString(VNP, bytes)); - return Native.toString(bytes); + int success = libvirt.virNetworkGetUUIDString(VNP, bytes); + processError(); + String returnValue = null; + if (success == 0) { + returnValue = Native.toString(bytes); + } + return returnValue; } /** @@ -167,7 +183,8 @@ public class Network { * @throws LibvirtException */ public String getXMLDesc(int flags) throws LibvirtException { - Pointer ptr = processError(libvirt.virNetworkGetXMLDesc(VNP, flags)); + Pointer ptr = libvirt.virNetworkGetXMLDesc(VNP, flags); + processError(); try { return Library.getString(ptr); } finally { @@ -185,7 +202,9 @@ public class Network { * @throws LibvirtException */ public int isActive() throws LibvirtException { - return processError(libvirt.virNetworkIsActive(VNP)); + int returnValue = libvirt.virNetworkIsActive(VNP); + processError(); + return returnValue; } /** @@ -199,7 +218,13 @@ public class Network { * @throws LibvirtException */ public int isPersistent() throws LibvirtException { - return processError(libvirt.virNetworkIsPersistent(VNP)); + int returnValue = libvirt.virNetworkIsPersistent(VNP); + processError(); + return returnValue; + } + + protected void processError() throws LibvirtException { + virConnect.processError(); } /** @@ -212,7 +237,8 @@ public class Network { */ public void setAutostart(boolean autostart) throws LibvirtException { int autoValue = autostart ? 1 : 0; - processError(libvirt.virNetworkSetAutostart(VNP, autoValue)); + libvirt.virNetworkSetAutostart(VNP, autoValue); + processError(); } /** @@ -221,7 +247,8 @@ public class Network { * @throws LibvirtException */ public void undefine() throws LibvirtException { - processError(libvirt.virNetworkUndefine(VNP)); + libvirt.virNetworkUndefine(VNP); + processError(); } } diff --git a/src/main/java/org/libvirt/NetworkFilter.java b/src/main/java/org/libvirt/NetworkFilter.java index 4f4bc6c..ba4d2ea 100644 --- a/src/main/java/org/libvirt/NetworkFilter.java +++ b/src/main/java/org/libvirt/NetworkFilter.java @@ -3,7 +3,6 @@ package org.libvirt; import org.libvirt.jna.Libvirt; import org.libvirt.jna.NetworkFilterPointer; import static org.libvirt.Library.libvirt; -import static org.libvirt.ErrorHandler.processError; import com.sun.jna.Native; @@ -33,12 +32,13 @@ public class NetworkFilter { * exist. * * @throws LibvirtException - * @return <em>ignore</em> (always 0) + * @return 0 on success, or -1 on error. */ public int free() throws LibvirtException { int success = 0; if (NFP != null) { - success = processError(libvirt.virNWFilterFree(NFP)); + success = libvirt.virNWFilterFree(NFP); + processError(); NFP = null; } @@ -52,7 +52,9 @@ public class NetworkFilter { * @throws LibvirtException */ public String getName() throws LibvirtException { - return processError(libvirt.virNWFilterGetName(NFP)); + String returnValue = libvirt.virNWFilterGetName(NFP); + processError(); + return returnValue; } /** @@ -64,8 +66,13 @@ public class NetworkFilter { */ public int[] getUUID() throws LibvirtException { byte[] bytes = new byte[Libvirt.VIR_UUID_BUFLEN]; - processError(libvirt.virNWFilterGetUUID(NFP, bytes)); - return Connect.convertUUIDBytes(bytes); + int success = libvirt.virNWFilterGetUUID(NFP, bytes); + processError(); + int[] returnValue = new int[0]; + if (success == 0) { + returnValue = Connect.convertUUIDBytes(bytes); + } + return returnValue; } /** @@ -77,8 +84,13 @@ public class NetworkFilter { */ public String getUUIDString() throws LibvirtException { byte[] bytes = new byte[Libvirt.VIR_UUID_STRING_BUFLEN]; - processError(libvirt.virNWFilterGetUUIDString(NFP, bytes)); - return Native.toString(bytes); + int success = libvirt.virNWFilterGetUUIDString(NFP, bytes); + processError(); + String returnValue = null; + if (success == 0) { + returnValue = Native.toString(bytes); + } + return returnValue; } /** @@ -90,7 +102,17 @@ public class NetworkFilter { * @return the XML document */ public String getXMLDesc() throws LibvirtException { - return processError(libvirt.virNWFilterGetXMLDesc(NFP, 0)); + String returnValue = libvirt.virNWFilterGetXMLDesc(NFP, 0); + processError(); + return returnValue; + } + + /** + * Error handling logic to throw errors. Must be called after every libvirt + * call. + */ + protected void processError() throws LibvirtException { + virConnect.processError(); } /** @@ -99,6 +121,7 @@ public class NetworkFilter { * @throws LibvirtException */ public void undefine() throws LibvirtException { - processError(libvirt.virNWFilterUndefine(NFP)); + libvirt.virNWFilterUndefine(NFP); + processError(); } } diff --git a/src/main/java/org/libvirt/Secret.java b/src/main/java/org/libvirt/Secret.java index 868fcc8..5332e02 100644 --- a/src/main/java/org/libvirt/Secret.java +++ b/src/main/java/org/libvirt/Secret.java @@ -2,12 +2,11 @@ package org.libvirt; import org.libvirt.jna.Libvirt; import org.libvirt.jna.SecretPointer; -import org.libvirt.jna.SizeT; -import org.libvirt.jna.SizeTByReference; import static org.libvirt.Library.libvirt; -import static org.libvirt.ErrorHandler.processError; import com.sun.jna.Native; +import com.sun.jna.NativeLong; +import com.sun.jna.ptr.LongByReference; import com.sun.jna.Pointer; import java.nio.ByteBuffer; @@ -40,12 +39,13 @@ public class Secret { * Release the secret handle. The underlying secret continues to exist. * * @throws LibvirtException - * @return <em>ignore</em> (always 0) + * @return 0 on success, or -1 on error. */ public int free() throws LibvirtException { int success = 0; if (VSP != null) { - success = processError(libvirt.virSecretFree(VSP)); + success = libvirt.virSecretFree(VSP); + processError(); VSP = null; } @@ -61,7 +61,9 @@ public class Secret { * @throws LibvirtException */ public String getUsageID() throws LibvirtException { - return processError(libvirt.virSecretGetUsageID(VSP)); + String returnValue = libvirt.virSecretGetUsageID(VSP); + processError(); + return returnValue; } /** @@ -73,8 +75,13 @@ public class Secret { */ public int[] getUUID() throws LibvirtException { byte[] bytes = new byte[Libvirt.VIR_UUID_BUFLEN]; - processError(libvirt.virSecretGetUUID(VSP, bytes)); - return Connect.convertUUIDBytes(bytes); + int success = libvirt.virSecretGetUUID(VSP, bytes); + processError(); + int[] returnValue = new int[0]; + if (success == 0) { + returnValue = Connect.convertUUIDBytes(bytes); + } + return returnValue; } /** @@ -86,8 +93,13 @@ public class Secret { */ public String getUUIDString() throws LibvirtException { byte[] bytes = new byte[Libvirt.VIR_UUID_STRING_BUFLEN]; - processError(libvirt.virSecretGetUUIDString(VSP, bytes)); - return Native.toString(bytes); + int success = libvirt.virSecretGetUUIDString(VSP, bytes); + processError(); + String returnValue = null; + if (success == 0) { + returnValue = Native.toString(bytes); + } + return returnValue; } /** @@ -108,8 +120,9 @@ public class Secret { * @return the value of the secret, or null on failure. */ public byte[] getByteValue() throws LibvirtException { - SizeTByReference value_size = new SizeTByReference(); - Pointer value = processError(libvirt.virSecretGetValue(VSP, value_size, 0)); + LongByReference value_size = new LongByReference(); + Pointer value = libvirt.virSecretGetValue(VSP, value_size, 0); + processError(); ByteBuffer bb = value.getByteBuffer(0, value_size.getValue()); byte[] returnValue = new byte[bb.remaining()]; bb.get(returnValue); @@ -122,33 +135,49 @@ public class Secret { * @return the XML document */ public String getXMLDesc() throws LibvirtException { - return processError(libvirt.virSecretGetXMLDesc(VSP, 0)); + String returnValue = libvirt.virSecretGetXMLDesc(VSP, 0); + processError(); + return returnValue; + } + + /** + * Error handling logic to throw errors. Must be called after every libvirt + * call. + */ + protected void processError() throws LibvirtException { + virConnect.processError(); } /** * Sets the value of the secret * - * @return <em>ignore</em> (always 0) + * @return 0 on success, -1 on failure. */ public int setValue(String value) throws LibvirtException { - return processError(libvirt.virSecretSetValue(VSP, value, new SizeT(value.length()), 0)); + int returnValue = libvirt.virSecretSetValue(VSP, value, new NativeLong(value.length()), 0); + processError(); + return returnValue; } /** * Sets the value of the secret * - * @return <em>ignore</em> (always 0) + * @return 0 on success, -1 on failure. */ public int setValue(byte[] value) throws LibvirtException { - return processError(libvirt.virSecretSetValue(VSP, value, new SizeT(value.length), 0)); + int returnValue = libvirt.virSecretSetValue(VSP, value, new NativeLong(value.length), 0); + processError(); + return returnValue; } /** * Undefines, but does not free, the Secret. * - * @return <em>ignore</em> (always 0) + * @return 0 on success, -1 on failure. */ public int undefine() throws LibvirtException { - return processError(libvirt.virSecretUndefine(VSP)); + int returnValue = libvirt.virSecretUndefine(VSP); + processError(); + return returnValue; } } diff --git a/src/main/java/org/libvirt/StoragePool.java b/src/main/java/org/libvirt/StoragePool.java index 14ecab8..2d59f68 100644 --- a/src/main/java/org/libvirt/StoragePool.java +++ b/src/main/java/org/libvirt/StoragePool.java @@ -5,10 +5,8 @@ import org.libvirt.jna.StoragePoolPointer; import org.libvirt.jna.StorageVolPointer; import org.libvirt.jna.virStoragePoolInfo; import static org.libvirt.Library.libvirt; -import static org.libvirt.ErrorHandler.processError; import com.sun.jna.Native; -import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; /** @@ -74,7 +72,8 @@ public class StoragePool { * future flags, use 0 for now */ public void build(int flags) throws LibvirtException { - processError(libvirt.virStoragePoolBuild(VSPP, flags)); + libvirt.virStoragePoolBuild(VSPP, flags); + processError(); } /** @@ -84,7 +83,8 @@ public class StoragePool { * future flags, use 0 for now */ public void create(int flags) throws LibvirtException { - processError(libvirt.virStoragePoolCreate(VSPP, flags)); + libvirt.virStoragePoolCreate(VSPP, flags); + processError(); } /** @@ -95,7 +95,8 @@ public class StoragePool { * flags for obliteration process */ public void delete(int flags) throws LibvirtException { - processError(libvirt.virStoragePoolDelete(VSPP, flags)); + libvirt.virStoragePoolDelete(VSPP, flags); + processError(); } /** @@ -105,7 +106,8 @@ public class StoragePool { * This does not free the associated virStoragePoolPtr object. */ public void destroy() throws LibvirtException { - processError(libvirt.virStoragePoolDestroy(VSPP)); + libvirt.virStoragePoolDestroy(VSPP); + processError(); } @Override @@ -118,12 +120,13 @@ public class StoragePool { * not change the state of the pool on the host. * * @throws LibvirtException - * @return number of references left (>= 0) + * @return number of references left (>= 0) for success, -1 for failure. */ public int free() throws LibvirtException { int success = 0; if (VSPP != null) { - success = processError(libvirt.virStoragePoolFree(VSPP)); + success = libvirt.virStoragePoolFree(VSPP); + processError(); VSPP = null; } return success; @@ -138,7 +141,8 @@ public class StoragePool { */ public boolean getAutostart() throws LibvirtException { IntByReference autoStart = new IntByReference(); - processError(libvirt.virStoragePoolGetAutostart(VSPP, autoStart)); + libvirt.virStoragePoolGetAutostart(VSPP, autoStart); + processError(); return autoStart.getValue() != 0 ? true : false; } @@ -160,7 +164,8 @@ public class StoragePool { */ public StoragePoolInfo getInfo() throws LibvirtException { virStoragePoolInfo vInfo = new virStoragePoolInfo(); - processError(libvirt.virStoragePoolGetInfo(VSPP, vInfo)); + libvirt.virStoragePoolGetInfo(VSPP, vInfo); + processError(); return new StoragePoolInfo(vInfo); } @@ -171,7 +176,9 @@ public class StoragePool { * @throws LibvirtException */ public String getName() throws LibvirtException { - return processError(libvirt.virStoragePoolGetName(VSPP)); + String returnValue = libvirt.virStoragePoolGetName(VSPP); + processError(); + return returnValue; } /** @@ -182,8 +189,13 @@ public class StoragePool { */ public int[] getUUID() throws LibvirtException { byte[] bytes = new byte[Libvirt.VIR_UUID_BUFLEN]; - processError(libvirt.virStoragePoolGetUUID(VSPP, bytes)); - return Connect.convertUUIDBytes(bytes); + int success = libvirt.virStoragePoolGetUUID(VSPP, bytes); + processError(); + int[] returnValue = new int[0]; + if (success == 0) { + returnValue = Connect.convertUUIDBytes(bytes); + } + return returnValue; } /** @@ -194,8 +206,13 @@ public class StoragePool { */ public String getUUIDString() throws LibvirtException { byte[] bytes = new byte[Libvirt.VIR_UUID_STRING_BUFLEN]; - processError(libvirt.virStoragePoolGetUUIDString(VSPP, bytes)); - return Native.toString(bytes); + int success = libvirt.virStoragePoolGetUUIDString(VSPP, bytes); + processError(); + String returnValue = null; + if (success == 0) { + returnValue = Native.toString(bytes); + } + return returnValue; } /** @@ -207,7 +224,9 @@ public class StoragePool { * @return a XML document -java @throws LibvirtException */ public String getXMLDesc(int flags) throws LibvirtException { - return processError(libvirt.virStoragePoolGetXMLDesc(VSPP, flags)); + String returnValue = libvirt.virStoragePoolGetXMLDesc(VSPP, flags); + processError(); + return returnValue; } /** @@ -216,11 +235,13 @@ public class StoragePool { * @see <a * href="http://www.libvirt.org/html/libvirt-libvirt.html#virStoragePoolIsActive">Libvirt * Documentation</a> - * @return 1 if running, 0 if inactive + * @return 1 if running, 0 if inactive, -1 on error * @throws LibvirtException */ public int isActive() throws LibvirtException { - return processError(libvirt.virStoragePoolIsActive(VSPP)); + int returnValue = libvirt.virStoragePoolIsActive(VSPP); + processError(); + return returnValue; } /** @@ -230,11 +251,13 @@ public class StoragePool { * @see <a * href="http://www.libvirt.org/html/libvirt-libvirt.html#virStoragePoolIsPersistent">Libvirt * Documentation</a> - * @return 1 if persistent, 0 if transient + * @return 1 if persistent, 0 if transient, -1 on error * @throws LibvirtException */ public int isPersistent() throws LibvirtException { - return processError(libvirt.virStoragePoolIsPersistent(VSPP)); + int returnValue = libvirt.virStoragePoolIsPersistent(VSPP); + processError(); + return returnValue; } /** @@ -246,15 +269,10 @@ public class StoragePool { */ public String[] listVolumes() throws LibvirtException { int num = numOfVolumes(); - if (num > 0) { - Pointer[] ptrs = new Pointer[num]; - - int got = processError(libvirt.virStoragePoolListVolumes(VSPP, ptrs, num)); - - return Library.toStringArray(ptrs, got); - } else { - return Library.NO_STRINGS; - } + String[] returnValue = new String[num]; + libvirt.virStoragePoolListVolumes(VSPP, returnValue, num); + processError(); + return returnValue; } /** @@ -264,7 +282,13 @@ public class StoragePool { * @throws LibvirtException */ public int numOfVolumes() throws LibvirtException { - return processError(libvirt.virStoragePoolNumOfVolumes(VSPP)); + int returnValue = libvirt.virStoragePoolNumOfVolumes(VSPP); + processError(); + return returnValue; + } + + protected void processError() throws LibvirtException { + virConnect.processError(); } /** @@ -277,7 +301,8 @@ public class StoragePool { * @throws LibvirtException */ public void refresh(int flags) throws LibvirtException { - processError(libvirt.virStoragePoolRefresh(VSPP, flags)); + libvirt.virStoragePoolRefresh(VSPP, flags); + processError(); } /** @@ -303,7 +328,8 @@ public class StoragePool { * @throws LibvirtException */ public StorageVol storageVolCreateXML(String xmlDesc, int flags) throws LibvirtException { - StorageVolPointer sPtr = processError(libvirt.virStorageVolCreateXML(VSPP, xmlDesc, flags)); + StorageVolPointer sPtr = libvirt.virStorageVolCreateXML(VSPP, xmlDesc, flags); + processError(); return new StorageVol(virConnect, sPtr); } @@ -312,12 +338,13 @@ public class StoragePool { * as input. Information for the new volume (name, perms) are passed via a * typical volume XML description. * - * @return The storage volume + * @return The storage volume, or {@code null} on error. * @throws LibvirtException */ public StorageVol storageVolCreateXMLFrom(String xmlDesc, StorageVol cloneVolume, int flags) throws LibvirtException { - StorageVolPointer sPtr = processError(libvirt.virStorageVolCreateXMLFrom(VSPP, xmlDesc, cloneVolume.VSVP, flags)); + StorageVolPointer sPtr = libvirt.virStorageVolCreateXMLFrom(VSPP, xmlDesc, cloneVolume.VSVP, flags); + processError(); return new StorageVol(virConnect, sPtr); } @@ -327,13 +354,13 @@ public class StoragePool { * * @param name * name of storage volume - * @return a StorageVol object, or {@code null} if not found. + * @return The StorageVol object found * @throws LibvirtException */ public StorageVol storageVolLookupByName(String name) throws LibvirtException { - StorageVolPointer sPtr = processError(libvirt.virStorageVolLookupByName(VSPP, name)); - - return (sPtr == null) ? null : new StorageVol(virConnect, sPtr); + StorageVolPointer sPtr = libvirt.virStorageVolLookupByName(VSPP, name); + processError(); + return new StorageVol(virConnect, sPtr); } /** @@ -342,7 +369,8 @@ public class StoragePool { * @throws LibvirtException */ public void undefine() throws LibvirtException { - processError(libvirt.virStoragePoolUndefine(VSPP)); + libvirt.virStoragePoolUndefine(VSPP); + processError(); } } diff --git a/src/main/java/org/libvirt/StorageVol.java b/src/main/java/org/libvirt/StorageVol.java index 47b79f6..561cb4d 100644 --- a/src/main/java/org/libvirt/StorageVol.java +++ b/src/main/java/org/libvirt/StorageVol.java @@ -4,9 +4,6 @@ import org.libvirt.jna.StoragePoolPointer; import org.libvirt.jna.StorageVolPointer; import org.libvirt.jna.virStorageVolInfo; import static org.libvirt.Library.libvirt; -import static org.libvirt.ErrorHandler.processError; - -import com.sun.jna.Pointer; /** * An acutal storage bucket. @@ -85,7 +82,8 @@ public class StorageVol { * @throws LibvirtException */ public void delete(int flags) throws LibvirtException { - processError(libvirt.virStorageVolDelete(VSVP, flags)); + libvirt.virStorageVolDelete(VSVP, flags); + processError(); } @Override @@ -98,12 +96,13 @@ public class StorageVol { * to exist * * @throws LibvirtException - * @return number of references left (>= 0) + * @return number of references left (>= 0) for success, -1 for failure. */ public int free() throws LibvirtException { int success = 0; if (VSVP != null) { - success = processError(libvirt.virStorageVolFree(VSVP)); + libvirt.virStorageVolFree(VSVP); + processError(); VSVP = null; } return success; @@ -128,7 +127,8 @@ public class StorageVol { */ public StorageVolInfo getInfo() throws LibvirtException { virStorageVolInfo vInfo = new virStorageVolInfo(); - processError(libvirt.virStorageVolGetInfo(VSVP, vInfo)); + libvirt.virStorageVolGetInfo(VSVP, vInfo); + processError(); return new StorageVolInfo(vInfo); } @@ -140,7 +140,9 @@ public class StorageVol { * @throws LibvirtException */ public String getKey() throws LibvirtException { - return processError(libvirt.virStorageVolGetKey(VSVP)); + String returnValue = libvirt.virStorageVolGetKey(VSVP); + processError(); + return returnValue; } /** @@ -150,7 +152,9 @@ public class StorageVol { * @throws LibvirtException */ public String getName() throws LibvirtException { - return processError(libvirt.virStorageVolGetName(VSVP)); + String returnValue = libvirt.virStorageVolGetName(VSVP); + processError(); + return returnValue; } /** @@ -163,13 +167,9 @@ public class StorageVol { * @throws LibvirtException */ public String getPath() throws LibvirtException { - Pointer p = processError(libvirt.virStorageVolGetPath(VSVP)); - - try { - return Library.getString(p); - } finally { - Library.free(p); - } + String returnValue = libvirt.virStorageVolGetPath(VSVP); + processError(); + return returnValue; } /** @@ -181,35 +181,43 @@ public class StorageVol { * @throws LibvirtException */ public String getXMLDesc(int flags) throws LibvirtException { - Pointer p = processError(libvirt.virStorageVolGetXMLDesc(VSVP, flags)); + String returnValue = libvirt.virStorageVolGetXMLDesc(VSVP, flags); + processError(); + return returnValue; + } - try { - return Library.getString(p); - } finally { - Library.free(p); - } + /** + * Error handling logic which should be called after every libvirt call + * + * @throws LibvirtException + */ + protected void processError() throws LibvirtException { + virConnect.processError(); } /** * Fetch a storage pool which contains this volume * - * @return StoragePool object, or {@code null} if not found. + * @return StoragePool object, * @throws LibvirtException */ public StoragePool storagePoolLookupByVolume() throws LibvirtException { - StoragePoolPointer ptr = processError(libvirt.virStoragePoolLookupByVolume(VSVP)); - return (ptr == null) ? null : new StoragePool(virConnect, ptr); + StoragePoolPointer ptr = libvirt.virStoragePoolLookupByVolume(VSVP); + processError(); + return new StoragePool(virConnect, ptr); } /** * Ensure data previously on a volume is not accessible to future reads * * @see <a href="http://www.libvirt.org/html/libvirt-libvirt.html#virStorageVolWipe">Libvirt Documentation</a> - * @return <em>ignore</em> (always 0) + * @return 0 on success, or -1 on error * @throws LibvirtException */ public int wipe() throws LibvirtException { - return processError(libvirt.virStorageVolWipe(VSVP, 0)); + int returnValue = libvirt.virStorageVolWipe(VSVP, 0); + processError(); + return returnValue; } /** @@ -220,10 +228,12 @@ public class StorageVol { * new capacity for volume * @param flags * flags for resizing, see libvirt API for exact flags - * @return <em>ignore</em> (always 0) + * @return 0 on success, or -1 on error * @throws LibvirtException */ public int resize(long capacity, int flags) throws LibvirtException { - return processError(libvirt.virStorageVolResize(VSVP, capacity, flags)); + int returnValue = libvirt.virStorageVolResize(VSVP, capacity, flags); + processError(); + return returnValue; } } diff --git a/src/main/java/org/libvirt/Stream.java b/src/main/java/org/libvirt/Stream.java index c36ed70..84e300c 100644 --- a/src/main/java/org/libvirt/Stream.java +++ b/src/main/java/org/libvirt/Stream.java @@ -1,10 +1,10 @@ package org.libvirt; import org.libvirt.jna.Libvirt; -import org.libvirt.jna.SizeT; import org.libvirt.jna.StreamPointer; import static org.libvirt.Library.libvirt; -import static org.libvirt.ErrorHandler.processError; + +import com.sun.jna.NativeLong; public class Stream { @@ -28,11 +28,11 @@ public class Stream { /** * Request that the in progress data transfer be cancelled abnormally before * the end of the stream has been reached - * - * @return <em>ignore</em> (always 0) */ public int abort() throws LibvirtException { - return processError(libvirt.virStreamAbort(VSP)); + int returnValue = libvirt.virStreamAbort(VSP); + processError(); + return returnValue; } /** @@ -46,11 +46,13 @@ public class Stream { * the events to monitor * @param cb * the callback method - * @return <em>ignore</em> (always 0) + * @return 0 for success, -1 for failure * @throws LibvirtException */ public int addCallback(int events, Libvirt.VirStreamEventCallback cb) throws LibvirtException { - return processError(libvirt.virStreamEventAddCallback(VSP, events, cb, null, null)); + int returnValue = libvirt.virStreamEventAddCallback(VSP, events, cb, null, null); + processError(); + return returnValue; } @Override @@ -62,24 +64,27 @@ public class Stream { * Indicate that there is no further data is to be transmitted on the * stream. * - * @return <em>ignore</em> (always 0) + * @return 0 if success, -1 if failure * @throws LibvirtException */ public int finish() throws LibvirtException { - return processError(libvirt.virStreamFinish(VSP)); + int returnValue = libvirt.virStreamFinish(VSP); + processError(); + return returnValue; } /** * Decrement the reference count on a stream, releasing the stream object if * the reference count has hit zero. * - * @return <em>ignore</em> (always 0) * @throws LibvirtException + * @return 0 on success, or -1 on error. */ public int free() throws LibvirtException { int success = 0; if (VSP != null) { - processError(libvirt.virStreamFree(VSP)); + success = libvirt.virStreamFree(VSP); + processError(); VSP = null; } @@ -87,15 +92,25 @@ public class Stream { } /** - * Receives data from the stream into the buffer provided. + * Error handling logic to throw errors. Must be called after every libvirt + * call. + */ + protected void processError() throws LibvirtException { + virConnect.processError(); + } + + /** + * Receieves data from teh stream into the buffer provided. * * @param data - * buffer to put the data into + * the put the sata into * @return the number of bytes read, -1 on error, -2 if the buffer is empty * @throws LibvirtException */ public int receive(byte[] data) throws LibvirtException { - return processError(libvirt.virStreamRecv(VSP, data, new SizeT(data.length))); + int returnValue = libvirt.virStreamRecv(VSP, data, new NativeLong(data.length)); + processError(); + return returnValue; } /** @@ -104,22 +119,26 @@ public class Stream { * @see <a href="http://www.libvirt.org/html/libvirt-libvirt.html#virStreamRecvAll">virStreamRecvAll</a> * @param handler * the callback handler - * @return <em>ignore</em> (always 0) + * @return 0 if successfule, -1 otherwise * @throws LibvirtException */ public int receiveAll(Libvirt.VirStreamSinkFunc handler) throws LibvirtException { - return processError(libvirt.virStreamRecvAll(VSP, handler, null)); + int returnValue = libvirt.virStreamRecvAll(VSP, handler, null); + processError(); + return returnValue; } /** * Remove an event callback from the stream * * @see <a href="http://www.libvirt.org/html/libvirt-libvirt.html#virStreamEventRemoveCallback">Libvirt Docs</a> - * @return <em>ignore</em> (always 0) + * @return 0 for success, -1 for failure * @throws LibvirtException */ public int removeCallback() throws LibvirtException { - return processError(libvirt.virStreamEventRemoveCallback(VSP)); + int returnValue = libvirt.virStreamEventRemoveCallback(VSP); + processError(); + return returnValue; } /** @@ -132,7 +151,9 @@ public class Stream { * @throws LibvirtException */ public int send(String data) throws LibvirtException { - return processError(libvirt.virStreamSend(VSP, data, new SizeT(data.length()))); + int returnValue = libvirt.virStreamSend(VSP, data, new NativeLong(data.length())); + processError(); + return returnValue; } /** @@ -143,11 +164,13 @@ public class Stream { * Documentation</a> * @param handler * the callback handler - * @return <em>ignore</em> (always 0) + * @return 0 if successfule, -1 otherwise * @throws LibvirtException */ public int sendAll(Libvirt.VirStreamSourceFunc handler) throws LibvirtException { - return processError(libvirt.virStreamSendAll(VSP, handler, null)); + int returnValue = libvirt.virStreamSendAll(VSP, handler, null); + processError(); + return returnValue; } /** @@ -156,10 +179,12 @@ public class Stream { * @see <a href="http://www.libvirt.org/html/libvirt-libvirt.html#virStreamEventUpdateCallback">Libvirt Docs</a> * @param events * the events to monitor - * @return <em>ignore</em> (always 0) + * @return 0 for success, -1 for failure * @throws LibvirtException */ public int updateCallback(int events) throws LibvirtException { - return processError(libvirt.virStreamEventUpdateCallback(VSP, events)); + int returnValue = libvirt.virStreamEventUpdateCallback(VSP, events); + processError(); + return returnValue; } } diff --git a/src/main/java/org/libvirt/jna/Libvirt.java b/src/main/java/org/libvirt/jna/Libvirt.java index 0e4c9fc..230d63c 100644 --- a/src/main/java/org/libvirt/jna/Libvirt.java +++ b/src/main/java/org/libvirt/jna/Libvirt.java @@ -4,7 +4,6 @@ import com.sun.jna.Callback; import com.sun.jna.Library; import com.sun.jna.Native; import com.sun.jna.NativeLong; -import com.sun.jna.Platform; import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; import com.sun.jna.ptr.LongByReference; @@ -97,13 +96,14 @@ public interface Libvirt extends Library { void eventCallback(ConnectionPointer virConnectPtr, DomainPointer virDomainPointer, Pointer opaque) ; } - Libvirt INSTANCE = (Libvirt) Native.loadLibrary(Platform.isWindows() ? "virt-0" : "virt", Libvirt.class); + Libvirt INSTANCE = (Libvirt) Native.loadLibrary("virt", Libvirt.class); // Constants we need public static int VIR_UUID_BUFLEN = 16; public static int VIR_UUID_STRING_BUFLEN = (36 + 1); public static int VIR_DOMAIN_SCHED_FIELD_LENGTH = 80; + public static int VIR_NODE_CPU_STATS_FIELD_LENGTH = 256; // Connection Functions String virConnectBaselineCPU(ConnectionPointer virConnectPtr, String[] xmlCPUs, int ncpus, int flags); @@ -180,20 +180,26 @@ public interface Libvirt extends Library { int virDomainAbortJob(DomainPointer virDomainPtr); int virDomainAttachDevice(DomainPointer virDomainPtr, String deviceXML); int virDomainAttachDeviceFlags(DomainPointer virDomainPtr, String deviceXML, int flags); - int virDomainBlockStats(DomainPointer virDomainPtr, String path, virDomainBlockStats stats, SizeT size); + int virDomainBlockStats(DomainPointer virDomainPtr, String path, virDomainBlockStats stats, int size); int virDomainBlockResize(DomainPointer virDomainPtr, String disk, long size, int flags); int virDomainCoreDump(DomainPointer virDomainPtr, String to, int flags); + int virDomainGetVcpus(DomainPointer virDomainPtr, virDomainCPUStats[] stats, int nr_stats,char[] map, int flags); int virDomainCreate(DomainPointer virDomainPtr); int virDomainCreateWithFlags(DomainPointer virDomainPtr, int flags); DomainPointer virDomainCreateLinux(ConnectionPointer virConnectPtr, String xmlDesc, int flags); DomainPointer virDomainCreateXML(ConnectionPointer virConnectPtr, String xmlDesc, int flags); DomainPointer virDomainDefineXML(ConnectionPointer virConnectPtr, String xmlDesc); int virDomainDestroy(DomainPointer virDomainPtr); + int virDomainDestroyFlags(DomainPointer virDomainPtr,long flags); int virDomainDetachDevice(DomainPointer virDomainPtr, String deviceXML); int virDomainDetachDeviceFlags(DomainPointer virDomainPtr, String deviceXML, int flags); int virDomainFree(DomainPointer virDomainPtr); int virDomainGetAutostart(DomainPointer virDomainPtr, IntByReference value); int virDomainGetBlockInfo(DomainPointer virDomainPtr, String path, virDomainBlockInfo info, int flags); + + int virDomainGetCPUStats(DomainPointer virDomainPtr,virTypedParameter[] params, + long nparams,int start_cpu,long ncpus,long flags); + int virDomainGetID(DomainPointer virDomainPtr); int virDomainGetInfo(DomainPointer virDomainPtr, virDomainInfo vInfo); int virDomainGetJobInfo(DomainPointer virDomainPtr, virDomainJobInfo vInfo); @@ -210,7 +216,7 @@ public interface Libvirt extends Library { Pointer virDomainGetXMLDesc(DomainPointer virDomainPtr, int flags); int virDomainHasCurrentSnapshot(DomainPointer virDomainPtr, int flags); int virDomainHasManagedSaveImage(DomainPointer virDomainPtr, int flags); - int virDomainInterfaceStats(DomainPointer virDomainPtr, String path, virDomainInterfaceStats stats, SizeT size); + int virDomainInterfaceStats(DomainPointer virDomainPtr, String path, virDomainInterfaceStats stats, int size); int virDomainIsActive(DomainPointer virDomainPtr); int virDomainIsPersistent(DomainPointer virDomainPtr); DomainPointer virDomainLookupByID(ConnectionPointer virConnectPtr, int id); @@ -241,6 +247,7 @@ public interface Libvirt extends Library { int virDomainSetSchedulerParameters(DomainPointer virDomainPtr, virSchedParameter[] params, int nparams); int virDomainSetVcpus(DomainPointer virDomainPtr, int nvcpus); int virDomainShutdown(DomainPointer virDomainPtr); + int virDomainShutdownFlags(DomainPointer virDomainPtr,long flags); int virDomainSuspend(DomainPointer virDomainPtr); int virDomainUpdateDeviceFlags(DomainPointer virDomainPtr, String xml, int flags); int virDomainUndefine(DomainPointer virDomainPtr); @@ -271,7 +278,10 @@ public interface Libvirt extends Library { int virNodeGetCellsFreeMemory(ConnectionPointer virConnectPtr, LongByReference freeMems, int startCell, int maxCells); long virNodeGetFreeMemory(ConnectionPointer virConnectPtr); - + + int virNodeGetCPUStats(ConnectionPointer virConnectPtr, int cpuNum, + virNodeCPUStats[] stats,IntByReference nparams, long flags); + // Node/Device functions int virNodeNumOfDevices(ConnectionPointer virConnectPtr, String capabilityName, int flags); int virNodeListDevices(ConnectionPointer virConnectPtr, String capabilityName, Pointer[] names, int maxnames, @@ -280,7 +290,7 @@ public interface Libvirt extends Library { String virNodeDeviceGetName(DevicePointer virDevicePointer); String virNodeDeviceGetParent(DevicePointer virDevicePointer); int virNodeDeviceNumOfCaps(DevicePointer virDevicePointer); - int virNodeDeviceListCaps(DevicePointer virDevicePointer, Pointer[] names, int maxNames); + int virNodeDeviceListCaps(DevicePointer virDevicePointer, String[] names, int maxNames); String virNodeDeviceGetXMLDesc(DevicePointer virDevicePointer); int virNodeDeviceFree(DevicePointer virDevicePointer); int virNodeDeviceDettach(DevicePointer virDevicePointer); @@ -303,7 +313,7 @@ public interface Libvirt extends Library { int virStoragePoolGetUUID(StoragePoolPointer storagePoolPtr, byte[] uuidString); int virStoragePoolGetUUIDString(StoragePoolPointer storagePoolPtr, byte[] uuidString); String virStoragePoolGetXMLDesc(StoragePoolPointer storagePoolPtr, int flags); - int virStoragePoolListVolumes(StoragePoolPointer storagePoolPtr, Pointer[] names, int maxnames); + int virStoragePoolListVolumes(StoragePoolPointer storagePoolPtr, String[] names, int maxnames); int virStoragePoolIsActive(StoragePoolPointer storagePoolPtr); int virStoragePoolIsPersistent(StoragePoolPointer storagePoolPtr); StoragePoolPointer virStoragePoolLookupByName(ConnectionPointer virConnectPtr, String name); @@ -324,8 +334,8 @@ public interface Libvirt extends Library { int virStorageVolGetInfo(StorageVolPointer storageVolPtr, virStorageVolInfo info); String virStorageVolGetKey(StorageVolPointer storageVolPtr); String virStorageVolGetName(StorageVolPointer storageVolPtr); - Pointer virStorageVolGetPath(StorageVolPointer storageVolPtr); - Pointer virStorageVolGetXMLDesc(StorageVolPointer storageVolPtr, int flags); + String virStorageVolGetPath(StorageVolPointer storageVolPtr); + String virStorageVolGetXMLDesc(StorageVolPointer storageVolPtr, int flags); StorageVolPointer virStorageVolLookupByKey(ConnectionPointer virConnectPtr, String name); StorageVolPointer virStorageVolLookupByName(StoragePoolPointer storagePoolPtr, String name); StorageVolPointer virStorageVolLookupByPath(ConnectionPointer virConnectPtr, String path); @@ -351,13 +361,13 @@ public interface Libvirt extends Library { int virSecretGetUUID(SecretPointer virSecretPtr, byte[] uuidString); int virSecretGetUUIDString(SecretPointer virSecretPtr, byte[] uuidString); String virSecretGetUsageID(SecretPointer virSecretPtr); - Pointer virSecretGetValue(SecretPointer virSecretPtr, SizeTByReference value_size, int flags); + Pointer virSecretGetValue(SecretPointer virSecretPtr, LongByReference value_size, int flags); String virSecretGetXMLDesc(SecretPointer virSecretPtr, int flags); SecretPointer virSecretLookupByUsage(ConnectionPointer virConnectPtr, int usageType, String usageID); SecretPointer virSecretLookupByUUID(ConnectionPointer virConnectPtr, byte[] uuidBytes); SecretPointer virSecretLookupByUUIDString(ConnectionPointer virConnectPtr, String uuidstr); - int virSecretSetValue(SecretPointer virSecretPtr, String value, SizeT value_size, int flags); - int virSecretSetValue(SecretPointer virSecretPtr, byte[] value, SizeT value_size, int flags); + int virSecretSetValue(SecretPointer virSecretPtr, String value, NativeLong value_size, int flags); + int virSecretSetValue(SecretPointer virSecretPtr, byte[] value, NativeLong value_size, int flags); int virSecretUndefine(SecretPointer virSecretPtr); //Stream Methods @@ -369,18 +379,18 @@ public interface Libvirt extends Library { int virStreamFinish(StreamPointer virStreamPtr) ; int virStreamFree(StreamPointer virStreamPtr) ; StreamPointer virStreamNew(ConnectionPointer virConnectPtr, int flags) ; - int virStreamSend(StreamPointer virStreamPtr, String data, SizeT size); + int virStreamSend(StreamPointer virStreamPtr, String data, NativeLong size); int virStreamSendAll(StreamPointer virStreamPtr, Libvirt.VirStreamSourceFunc handler, Pointer opaque); - int virStreamRecv(StreamPointer virStreamPtr, byte[] data, SizeT length); + int virStreamRecv(StreamPointer virStreamPtr, byte[] data, NativeLong length); int virStreamRecvAll(StreamPointer virStreamPtr, Libvirt.VirStreamSinkFunc handler, Pointer opaque); //DomainSnapshot Methods DomainSnapshotPointer virDomainSnapshotCreateXML(DomainPointer virDomainPtr, String xmlDesc, int flags); DomainSnapshotPointer virDomainSnapshotCurrent(DomainPointer virDomainPtr, int flags); int virDomainSnapshotDelete(DomainSnapshotPointer virDomainSnapshotPtr, int flags); - Pointer virDomainSnapshotGetXMLDesc(DomainSnapshotPointer virDomainSnapshotPtr, int flags); + String virDomainSnapshotGetXMLDesc(DomainSnapshotPointer virDomainSnapshotPtr, int flags); int virDomainSnapshotFree(DomainSnapshotPointer virDomainSnapshotPtr); - int virDomainSnapshotListNames(DomainPointer virDomainPtr, Pointer[] names, int nameslen, int flags); + int virDomainSnapshotListNames(DomainPointer virDomainPtr, String[] names, int nameslen, int flags); DomainSnapshotPointer virDomainSnapshotLookupByName(DomainPointer virDomainPtr, String name, int flags); int virDomainSnapshotNum(DomainPointer virDomainPtr, int flags); diff --git a/src/main/java/org/libvirt/jna/VirUnion.java b/src/main/java/org/libvirt/jna/VirUnion.java new file mode 100644 index 0000000..ba089e0 --- /dev/null +++ b/src/main/java/org/libvirt/jna/VirUnion.java @@ -0,0 +1,14 @@ +package org.libvirt.jna; + +import com.sun.jna.Union; +import com.sun.jna.ptr.ByteByReference; + +public class VirUnion extends Union{ + public int i; + public long ui; + public long l; + public long ul; + public double d; + public char b; + public ByteByReference s = new ByteByReference(); +} diff --git a/src/main/java/org/libvirt/jna/virConnectAuth.java b/src/main/java/org/libvirt/jna/virConnectAuth.java index 0451348..ece61f6 100644 --- a/src/main/java/org/libvirt/jna/virConnectAuth.java +++ b/src/main/java/org/libvirt/jna/virConnectAuth.java @@ -15,11 +15,11 @@ public class virConnectAuth extends Structure { public Libvirt.VirConnectAuthCallback cb; public Pointer cbdata; - private static final List<String> fields = Arrays.asList( + private static final List fields = Arrays.asList( "credtype", "ncredtype", "cb", "cbdata"); @Override - protected List<String> getFieldOrder() { + protected List getFieldOrder() { return fields; } } diff --git a/src/main/java/org/libvirt/jna/virConnectCredential.java b/src/main/java/org/libvirt/jna/virConnectCredential.java index 316b1f4..6dd4a75 100644 --- a/src/main/java/org/libvirt/jna/virConnectCredential.java +++ b/src/main/java/org/libvirt/jna/virConnectCredential.java @@ -17,12 +17,12 @@ public class virConnectCredential extends Structure implements Structure.ByRefer public String result; public int resultlen; - private static final List<String> fields = Arrays.asList( + private static final List fields = Arrays.asList( "type", "prompt", "challenge", "defresult", "result", "resultlen"); @Override - protected List<String> getFieldOrder() { + protected List getFieldOrder() { return fields; } } diff --git a/src/main/java/org/libvirt/jna/virDomainBlockInfo.java b/src/main/java/org/libvirt/jna/virDomainBlockInfo.java index 5a88ba3..fb1b845 100644 --- a/src/main/java/org/libvirt/jna/virDomainBlockInfo.java +++ b/src/main/java/org/libvirt/jna/virDomainBlockInfo.java @@ -10,11 +10,11 @@ public class virDomainBlockInfo extends Structure { public long allocation; public long physical; - private static final List<String> fields = Arrays.asList( + private static final List fields = Arrays.asList( "capacity", "allocation", "physical"); @Override - protected List<String> getFieldOrder() { + protected List getFieldOrder() { return fields; } } diff --git a/src/main/java/org/libvirt/jna/virDomainBlockStats.java b/src/main/java/org/libvirt/jna/virDomainBlockStats.java index e48629a..a7331f6 100644 --- a/src/main/java/org/libvirt/jna/virDomainBlockStats.java +++ b/src/main/java/org/libvirt/jna/virDomainBlockStats.java @@ -20,11 +20,11 @@ public class virDomainBlockStats extends Structure { public long errs; // this is a long long in the code, so a long mapping is // correct - private static final List<String> fields = Arrays.asList( + private static final List fields = Arrays.asList( "rd_req", "rd_bytes", "wr_req", "wr_bytes", "errs"); @Override - protected List<String> getFieldOrder() { + protected List getFieldOrder() { return fields; } } diff --git a/src/main/java/org/libvirt/jna/virDomainCPUStats.java b/src/main/java/org/libvirt/jna/virDomainCPUStats.java new file mode 100644 index 0000000..04d5377 --- /dev/null +++ b/src/main/java/org/libvirt/jna/virDomainCPUStats.java @@ -0,0 +1,21 @@ +package org.libvirt.jna; + +import java.util.Arrays; +import java.util.List; + +import com.sun.jna.Structure; + +public class virDomainCPUStats extends Structure{ + public long number ; + public long state ; + public long cpuTime; + public long cpu; + + private static final List fields = Arrays.asList( "number", "state", + "cpuTime","cpu"); + + @Override + protected List getFieldOrder() { + return fields; + } +} diff --git a/src/main/java/org/libvirt/jna/virDomainInfo.java b/src/main/java/org/libvirt/jna/virDomainInfo.java index ff20d16..0b667f6 100644 --- a/src/main/java/org/libvirt/jna/virDomainInfo.java +++ b/src/main/java/org/libvirt/jna/virDomainInfo.java @@ -16,11 +16,11 @@ public class virDomainInfo extends Structure { public short nrVirtCpu; public long cpuTime; - private static final List<String> fields = Arrays.asList( + private static final List fields = Arrays.asList( "state", "maxMem", "memory", "nrVirtCpu", "cpuTime"); @Override - protected List<String> getFieldOrder() { + protected List getFieldOrder() { return fields; } } diff --git a/src/main/java/org/libvirt/jna/virDomainInterfaceStats.java b/src/main/java/org/libvirt/jna/virDomainInterfaceStats.java index 9b98aa8..eea6a49 100644 --- a/src/main/java/org/libvirt/jna/virDomainInterfaceStats.java +++ b/src/main/java/org/libvirt/jna/virDomainInterfaceStats.java @@ -26,12 +26,12 @@ public class virDomainInterfaceStats extends Structure { public long tx_drop; // this is a long long in the code, so a long mapping // is correct - private static final List<String> fields = Arrays.asList( + private static final List fields = Arrays.asList( "rx_bytes", "rx_packets", "rx_errs", "rx_drop", "tx_bytes", "tx_packets", "tx_errs", "tx_drop"); @Override - protected List<String> getFieldOrder() { + protected List getFieldOrder() { return fields; } } diff --git a/src/main/java/org/libvirt/jna/virDomainJobInfo.java b/src/main/java/org/libvirt/jna/virDomainJobInfo.java index 1bab587..0398901 100644 --- a/src/main/java/org/libvirt/jna/virDomainJobInfo.java +++ b/src/main/java/org/libvirt/jna/virDomainJobInfo.java @@ -19,13 +19,13 @@ public class virDomainJobInfo extends Structure { public long fileProcessed; public long fileRemaining; - private static final List<String> fields = Arrays.asList( + private static final List fields = Arrays.asList( "type", "timeElapsed", "timeRemaining", "dataTotal", "dataProcessed", "dataRemaining", "memTotal", "memProcessed", "memRemaining", "fileTotal", "fileProcessed", "fileRemaining"); @Override - protected List<String> getFieldOrder() { + protected List getFieldOrder() { return fields; } } diff --git a/src/main/java/org/libvirt/jna/virDomainMemoryStats.java b/src/main/java/org/libvirt/jna/virDomainMemoryStats.java index dfbd3f9..b14fb95 100644 --- a/src/main/java/org/libvirt/jna/virDomainMemoryStats.java +++ b/src/main/java/org/libvirt/jna/virDomainMemoryStats.java @@ -9,10 +9,10 @@ public class virDomainMemoryStats extends Structure { public int tag ; public long val ; - private static final List<String> fields = Arrays.asList( "tag", "val"); + private static final List fields = Arrays.asList( "tag", "val"); @Override - protected List<String> getFieldOrder() { + protected List getFieldOrder() { return fields; } } diff --git a/src/main/java/org/libvirt/jna/virError.java b/src/main/java/org/libvirt/jna/virError.java index e58f5f3..36b9f69 100644 --- a/src/main/java/org/libvirt/jna/virError.java +++ b/src/main/java/org/libvirt/jna/virError.java @@ -22,12 +22,12 @@ public class virError extends Structure { public int int2; public NetworkPointer net; - private static final List<String> fields = Arrays.asList( + private static final List fields = Arrays.asList( "code", "domain", "message", "level", "conn", "dom", "str1", "str2", "str3", "int1", "int2", "net"); @Override - protected List<String> getFieldOrder() { + protected List getFieldOrder() { return fields; } } 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..89c1a24 --- /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[] tag = new byte[80]; + public long val ; + + private static final List fields = Arrays.asList( "tag", "val"); + + @Override + protected List getFieldOrder() { + return fields; + } +} diff --git a/src/main/java/org/libvirt/jna/virNodeInfo.java b/src/main/java/org/libvirt/jna/virNodeInfo.java index 7a7716e..9ff1251 100644 --- a/src/main/java/org/libvirt/jna/virNodeInfo.java +++ b/src/main/java/org/libvirt/jna/virNodeInfo.java @@ -25,12 +25,12 @@ public class virNodeInfo extends Structure { public int cores; public int threads; - private static final List<String> fields = Arrays.asList( + private static final List fields = Arrays.asList( "model", "memory", "cpus", "mhz", "nodes", "sockets", "cores", "threads"); @Override - protected List<String> getFieldOrder() { + protected List getFieldOrder() { return fields; } } diff --git a/src/main/java/org/libvirt/jna/virSchedParameter.java b/src/main/java/org/libvirt/jna/virSchedParameter.java index f3787a9..f579ef0 100644 --- a/src/main/java/org/libvirt/jna/virSchedParameter.java +++ b/src/main/java/org/libvirt/jna/virSchedParameter.java @@ -13,11 +13,11 @@ public class virSchedParameter extends Structure { public int type; public virSchedParameterValue value; - private static final List<String> fields = Arrays.asList( + private static final List fields = Arrays.asList( "field", "type", "value"); @Override - protected List<String> getFieldOrder() { + protected List getFieldOrder() { return fields; } } diff --git a/src/main/java/org/libvirt/jna/virStoragePoolInfo.java b/src/main/java/org/libvirt/jna/virStoragePoolInfo.java index 7077175..fe20f0f 100644 --- a/src/main/java/org/libvirt/jna/virStoragePoolInfo.java +++ b/src/main/java/org/libvirt/jna/virStoragePoolInfo.java @@ -17,11 +17,11 @@ public class virStoragePoolInfo extends Structure { public long available; // this is a long long in the code, so a long mapping // is correct - private static final List<String> fields = Arrays.asList( + private static final List fields = Arrays.asList( "state", "capacity", "allocation", "available"); @Override - protected List<String> getFieldOrder() { + protected List getFieldOrder() { return fields; } } diff --git a/src/main/java/org/libvirt/jna/virStorageVolInfo.java b/src/main/java/org/libvirt/jna/virStorageVolInfo.java index 8bf2d5c..93132ea 100644 --- a/src/main/java/org/libvirt/jna/virStorageVolInfo.java +++ b/src/main/java/org/libvirt/jna/virStorageVolInfo.java @@ -15,11 +15,11 @@ public class virStorageVolInfo extends Structure { public long allocation; // this is a long long in the code, so a long // mapping is correct - private static final List<String> fields = Arrays.asList( + private static final List fields = Arrays.asList( "type", "capacity", "allocation"); @Override - protected List<String> getFieldOrder() { + protected List getFieldOrder() { return fields; } } diff --git a/src/main/java/org/libvirt/jna/virTypedParameter.java b/src/main/java/org/libvirt/jna/virTypedParameter.java new file mode 100644 index 0000000..4fe48f6 --- /dev/null +++ b/src/main/java/org/libvirt/jna/virTypedParameter.java @@ -0,0 +1,22 @@ +package org.libvirt.jna; + +import java.util.Arrays; +import java.util.List; + +import com.sun.jna.Structure; + +public class virTypedParameter extends Structure{ + + public byte[] field = new byte[80]; + public int type; + public VirUnion value; + + private static final List fields = Arrays.asList( "field", "type", + "value"); + @Override + protected List getFieldOrder() { + // TODO Auto-generated method stub + return fields; + } + +} diff --git a/src/main/java/org/libvirt/jna/virVcpuInfo.java b/src/main/java/org/libvirt/jna/virVcpuInfo.java index bc1a539..96eca2f 100644 --- a/src/main/java/org/libvirt/jna/virVcpuInfo.java +++ b/src/main/java/org/libvirt/jna/virVcpuInfo.java @@ -15,11 +15,11 @@ public class virVcpuInfo extends Structure { // is correct public int cpu; - private static final List<String> fields = Arrays.asList( + private static final List fields = Arrays.asList( "number", "state", "cpuTime", "cpu"); @Override - protected List<String> getFieldOrder() { + protected List getFieldOrder() { return fields; } } -- 1.8.3.2 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list