package org.libvirt; import org.libvirt.jna.DevicePointer; import org.libvirt.jna.Libvirt; /** * A device which is attached to a node */ public class Device { /** * the native virDomainPtr. */ DevicePointer VDP; /** * The Connect Object that represents the Hypervisor of this Domain */ private Connect virConnect; /** * The libvirt connection from the hypervisor */ protected Libvirt libvirt; /** * Constructs a Device object from a DevicePointer, and a Connect object. * * @param virConnect * the Domain's hypervisor * @param VDP * the native virDomainPtr */ Device(Connect virConnect, DevicePointer VDP) { this.virConnect = virConnect; this.VDP = VDP; libvirt = virConnect.libvirt; } /** * Destroy the device object. The virtual device is removed from the host * operating system. This function may require privileged access. * * @throws LibvirtException * @returns 0 for success, -1 for failure. */ public int destroy() throws LibvirtException { int success = 0; if (VDP != null) { success = libvirt.virNodeDeviceDestroy(VDP); processError(); VDP = null; } return success; } /** * Dettach the node device from the node itself so that it may be assigned * to a guest domain. * * @throws LibvirtException */ public int detach() throws LibvirtException { int num = libvirt.virNodeDeviceDettach(VDP); processError(); return num; } @Override public void finalize() throws LibvirtException { free(); } /** * Frees this device object. The running instance is kept alive. The data * structure is freed and should not be used thereafter. * * @throws LibvirtException * @return number of references left (>= 0) for success, -1 for failure. */ public int free() throws LibvirtException { int success = 0; if (VDP != null) { success = libvirt.virNodeDeviceFree(VDP); processError(); VDP = null; } return success; } /** * Returns the name of the device * * @throws LibvirtException */ public String getName() throws LibvirtException { String name = libvirt.virNodeDeviceGetName(VDP); processError(); return name; } /** * Returns the number of capabilities which the instance has. * * @throws LibvirtException */ public int getNumberOfCapabilities() throws LibvirtException { int num = libvirt.virNodeDeviceNumOfCaps(VDP); processError(); return num; } /** * Returns the parent of the device * * @throws LibvirtException */ public String getParent() throws LibvirtException { String parent = libvirt.virNodeDeviceGetParent(VDP); processError(); return parent; } /** * Returns the XML description of the device * * @throws LibvirtException */ public String getXMLDescription() throws LibvirtException { String desc = libvirt.virNodeDeviceGetXMLDesc(VDP); processError(); return desc; } /** * List the capabilities of the device * * @throws LibvirtException */ public String[] listCapabilities() throws LibvirtException { int maxCaps = getNumberOfCapabilities(); String[] names = new String[maxCaps]; if (maxCaps > 0) { 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(); } /** * ReAttach a device to the node. * * @throws LibvirtException */ public int reAttach() throws LibvirtException { int num = libvirt.virNodeDeviceReAttach(VDP); processError(); return num; } /** * Reset a previously dettached node device to the node before or after * assigning it to a guest. * * @throws LibvirtException */ public int reset() throws LibvirtException { int num = libvirt.virNodeDeviceReset(VDP); processError(); return num; } }