All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.libvirt.Domain Maven / Gradle / Ivy

The newest version!
package org.libvirt;

import org.libvirt.jna.DomainPointer;
import org.libvirt.jna.DomainSnapshotPointer;
import org.libvirt.jna.Libvirt;
import org.libvirt.jna.virDomainBlockInfo;
import org.libvirt.jna.virDomainBlockStats;
import org.libvirt.jna.virDomainInfo;
import org.libvirt.jna.virDomainInterfaceStats;
import org.libvirt.jna.virDomainJobInfo;
import org.libvirt.jna.virDomainMemoryStats;
import org.libvirt.jna.virSchedParameter;
import org.libvirt.jna.virVcpuInfo;
import static org.libvirt.Library.libvirt;

import com.sun.jna.Native;
import com.sun.jna.NativeLong;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;

/**
 * A virtual machine defined within libvirt.
 */
public class Domain {

    public static final class BlockResizeFlags {
        /**
         * size is in bytes instead of KiB
         */
        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
                                                                               metadata */
        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
                                                                               remembering it */
        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
                                                                               system checkpoint */
        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
                                                                               quiesce all mounted
                                                                               file systems within
                                                                               the domain */
        static final int VIR_DOMAIN_SNAPSHOT_CREATE_ATOMIC      = (1 << 7); /* atomically avoid
                                                                               partial changes */
    }

    static final class MigrateFlags {
        static final int VIR_MIGRATE_LIVE              = (1 << 0); /* live migration */
        static final int VIR_MIGRATE_PEER2PEER         = (1 << 1); /* direct source -> dest host control channel */
        /* Note the less-common spelling that we're stuck with:
           VIR_MIGRATE_TUNNELLED should be VIR_MIGRATE_TUNNELED */
        static final int VIR_MIGRATE_TUNNELLED         = (1 << 2); /* tunnel migration data over libvirtd connection */
        static final int VIR_MIGRATE_PERSIST_DEST      = (1 << 3); /* persist the VM on the destination */
        static final int VIR_MIGRATE_UNDEFINE_SOURCE   = (1 << 4); /* undefine the VM on the source */
        static final int VIR_MIGRATE_PAUSED            = (1 << 5); /* pause on remote side */
        static final int VIR_MIGRATE_NON_SHARED_DISK   = (1 << 6); /* migration with non-shared storage with full disk copy */
        static final int VIR_MIGRATE_NON_SHARED_INC    = (1 << 7); /* migration with non-shared storage with incremental copy */
                                                                   /* (same base image shared between source and destination) */
        static final int VIR_MIGRATE_CHANGE_PROTECTION = (1 << 8); /* protect for changing domain configuration through the
                                                                    * whole migration process; this will be used automatically
                                                                    * when supported */
        static final int VIR_MIGRATE_UNSAFE            = (1 << 9); /* force migration even if it is considered unsafe */
    }

    static final class XMLFlags {
        /**
         * dump security sensitive information too
         */
        static final int VIR_DOMAIN_XML_SECURE = 1;
        /**
         * dump inactive domain information
         */
        static final int VIR_DOMAIN_XML_INACTIVE = 2;
        static final int VIR_DOMAIN_XML_UPDATE_CPU   = (1 << 2); /* update guest CPU requirements according to host CPU */
    }

    public static final class UndefineFlags {
        /**
         * Also remove any managed save
         */
        public static final int MANAGED_SAVE = (1 << 0);
        /**
         * If last use of domain, then also remove any snapshot metadata
         */
        public static final int SNAPSHOTS_METADATA = (1 << 1);
    }

    public static final class SnapshotListFlags {
        /**
         * Filter by snapshots with no parents, when listing a domain
         */
        public static final int ROOTS       = (1 << 0);

        /**
         * List all descendants, not just children, when listing a snapshot
         */
        public static final int DESCENDANTS = (1 << 0);

        /** For historical reasons, groups do not use contiguous bits. */

        /**
         * Filter by snapshots with no children
         */
        public static final int LEAVES      = (1 << 2);

        /**
         * Filter by snapshots that have children
         */
        public static final int NO_LEAVES   = (1 << 3);

        /**
         * Filter by snapshots which have metadata
         */
        public static final int METADATA    = (1 << 1);

        /**
         * Filter by snapshots with no metadata
         */
        public static final int NO_METADATA = (1 << 4);
    }

    /**
     * the native virDomainPtr.
     */
    DomainPointer VDP;

    /**
     * The Connect Object that represents the Hypervisor of this Domain
     */
    private Connect virConnect;

    /**
     * Constructs a Domain object from a known native DomainPointer, and a
     * Connect object.
     *
     * @param virConnect
     *            the Domain's hypervisor
     * @param VDP
     *            the native virDomainPtr
     */
    Domain(Connect virConnect, DomainPointer VDP) {
        this.virConnect = virConnect;
        this.VDP = VDP;
    }

    /**
     * Requests that the current background job be aborted at the soonest
     * opportunity. This will block until the job has either completed, or
     * aborted.
     *
     * @see Libvirt
     *      Documentation
     * @return 0 in case of success and -1 in case of failure.
     * @throws LibvirtException
     */
    public int abortJob() throws LibvirtException {
        int returnValue = libvirt.virDomainAbortJob(VDP);
        processError();
        return returnValue;
    }

    /**
     * Creates a virtual device attachment to backend.
     *
     * @see Libvirt
     *      Documentation
     * @param xmlDesc
     *            XML description of one device
     * @throws LibvirtException
     */
    public void attachDevice(String xmlDesc) throws LibvirtException {
        libvirt.virDomainAttachDevice(VDP, xmlDesc);
        processError();
    }

    /**
     * Creates a virtual device attachment to backend.
     *
     * @see Libvirt
     *      Documentation
     * @param xmlDesc
     *            XML description of one device
     * @param flags
     *            the an OR'ed set of virDomainDeviceModifyFlags
     * @throws LibvirtException
     */
    public void attachDeviceFlags(String xmlDesc, int flags) throws LibvirtException {
        libvirt.virDomainAttachDeviceFlags(VDP, xmlDesc, flags);
        processError();
    }

    /**
     * This function returns block device (disk) stats for block devices
     * attached to the domain.
     *
     * @param path
     *            the path to the block device
     * @return the info, or null if an error
     * @throws LibvirtException
     */
    public DomainBlockInfo blockInfo(String path) throws LibvirtException {
        virDomainBlockInfo info = new virDomainBlockInfo();
        int success = libvirt.virDomainGetBlockInfo(VDP, path, info, 0);
        processError();
        return success == 0 ? new DomainBlockInfo(info) : null;
    }

    /**
     * Returns block device (disk) stats for block devices attached to this
     * domain. The path parameter is the name of the block device. Get this by
     * calling virDomainGetXMLDesc and finding the  attribute
     * within //domain/devices/disk. (For example, "xvda"). Domains may have
     * more than one block device. To get stats for each you should make
     * multiple calls to this function. Individual fields within the
     * DomainBlockStats object may be returned as -1, which indicates that the
     * hypervisor does not support that particular statistic.
     *
     * @param path
     *            path to the block device
     * @return the statistics in a DomainBlockStats object
     * @throws LibvirtException
     */
    public DomainBlockStats blockStats(String path) throws LibvirtException {
        virDomainBlockStats stats = new virDomainBlockStats();
        int success = libvirt.virDomainBlockStats(VDP, path, stats, stats.size());
        processError();
        return success == 0 ? new DomainBlockStats(stats) : null;
    }

    /**
     * Resize a block device of domain while the domain is running.
     *
     * @param disk
     *           path to the block image, or shorthand (like vda)
     * @param size
     *           the new size of the block devices
     * @param flags
     *           bitwise OR'ed values of {@link BlockResizeFlags}
     * @throws LibvirtException
     */
    public void blockResize(String disk, long size, int flags) throws LibvirtException {
        int returnValue = libvirt.virDomainBlockResize(VDP, disk, size, flags);
        processError();
    }


    /**
     * Dumps the core of this domain on a given file for analysis. Note that for
     * remote Xen Daemon the file path will be interpreted in the remote host.
     *
     * @param to
     *            path for the core file
     * @param flags
     *            extra flags, currently unused
     * @throws LibvirtException
     */
    public void coreDump(String to, int flags) throws LibvirtException {
        libvirt.virDomainCoreDump(VDP, to, flags);
        processError();
    }

    /**
     * It returns the length (in bytes) required to store the complete CPU map
     * between a single virtual & all physical CPUs of a domain.
     */
    public int cpuMapLength(int maxCpus) {
        return (((maxCpus) + 7) / 8);
    }

    /**
     * Launches this defined domain. If the call succeed the domain moves from
     * the defined to the running domains pools.
     *
     * @throws LibvirtException
     */
    public int create() throws LibvirtException {
        int returnValue = libvirt.virDomainCreate(VDP);
        processError();
        return returnValue;
    }

    /**
     * Launches this defined domain with the provide flags.
     * If the call succeed the domain moves from
     * the defined to the running domains pools.
     *
     * @throws LibvirtException
     */
    public int create(int flags) throws LibvirtException {
        int returnValue = libvirt.virDomainCreateWithFlags(VDP, flags);
        processError();
        return returnValue;
    }

    /**
     * Destroys this domain object. The running instance is shutdown if not down
     * already and all resources used by it are given back to the hypervisor.
     * The data structure is freed and should not be used thereafter if the call
     * does not return an error. This function may requires priviledged access
     *
     * @throws LibvirtException
     */
    public void destroy() throws LibvirtException {
        libvirt.virDomainDestroy(VDP);
        processError();
    }

    /**
     * Destroys a virtual device attachment to backend.
     *
     * @see Libvirt
     *      Documentation
     * @param xmlDesc
     *            XML description of one device
     * @throws LibvirtException
     */
    public void detachDevice(String xmlDesc) throws LibvirtException {
        libvirt.virDomainDetachDevice(VDP, xmlDesc);
        processError();
    }

    /**
     * Destroys a virtual device attachment to backend.
     *
     * @see Libvirt
     *      Documentation
     * @param xmlDesc
     *            XML description of one device
     * @throws LibvirtException
     */
    public void detachDeviceFlags(String xmlDesc, int flags) throws LibvirtException {
        libvirt.virDomainDetachDeviceFlags(VDP, xmlDesc, flags);
        processError();
    }

    @Override
    protected void finalize() throws LibvirtException {
        free();
    }

    /**
     * Frees this domain 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.virDomainFree(VDP);
            processError();
            VDP = null;
        }

        return success;
    }

    /**
     * Provides a boolean value indicating whether the network is configured to
     * be automatically started when the host machine boots.
     *
     * @return the result
     * @throws LibvirtException
     */
    public boolean getAutostart() throws LibvirtException {
        IntByReference autoStart = new IntByReference();
        libvirt.virDomainGetAutostart(VDP, autoStart);
        processError();
        return autoStart.getValue() != 0 ? true : false;
    }

    /**
     * Provides the connection object associated with a domain.
     *
     * @return the Connect object
     */
    public Connect getConnect() {
        return virConnect;
    }

    /**
     * Gets the hypervisor ID number for the domain
     *
     * @return the hypervisor ID
     * @throws LibvirtException
     */
    public int getID() throws LibvirtException {
        int returnValue = libvirt.virDomainGetID(VDP);
        processError();
        return returnValue;
    }

    /**
     * Extract information about a domain. Note that if the connection used to
     * get the domain is limited only a partial set of the information can be
     * extracted.
     *
     * @see Libvirt
     *      Documentation
     *
     * @return a DomainInfo object describing this domain
     * @throws LibvirtException
     */
    public DomainInfo getInfo() throws LibvirtException {
        DomainInfo returnValue = null;
        virDomainInfo vInfo = new virDomainInfo();
        int success = libvirt.virDomainGetInfo(VDP, vInfo);
        processError();
        if (success == 0) {
            returnValue = new DomainInfo(vInfo);
        }
        return returnValue;
    }

    /**
     * Extract information about progress of a background job on a domain. Will
     * return an error if the domain is not active.
     *
     * @see Libvirt
     *      Documentation
     * @return a DomainJobInfo object describing this domain
     * @throws LibvirtException
     */
    public DomainJobInfo getJobInfo() throws LibvirtException {
        DomainJobInfo returnValue = null;
        virDomainJobInfo vInfo = new virDomainJobInfo();
        int success = libvirt.virDomainGetJobInfo(VDP, vInfo);
        processError();
        if (success == 0) {
            returnValue = new DomainJobInfo(vInfo);
        }
        return returnValue;
    }

    /**
     * Retrieve the maximum amount of physical memory allocated to a domain.
     *
     * @return the memory in kilobytes
     * @throws LibvirtException
     */
    public long getMaxMemory() throws LibvirtException {
        NativeLong returnValue = libvirt.virDomainGetMaxMemory(VDP);
        processError();
        return returnValue.longValue();
    }

    /**
     * Provides the maximum number of virtual CPUs supported for the guest VM.
     * If the guest is inactive, this is basically the same as
     * virConnectGetMaxVcpus. If the guest is running this will reflect the
     * maximum number of virtual CPUs the guest was booted with.
     *
     * @return the number of VCPUs
     * @throws LibvirtException
     */
    public int getMaxVcpus() throws LibvirtException {
        int returnValue = libvirt.virDomainGetMaxVcpus(VDP);
        processError();
        return returnValue;
    }

    /**
     * Gets the public name for this domain
     *
     * @return the name
     * @throws LibvirtException
     */
    public String getName() throws LibvirtException {
        String returnValue = libvirt.virDomainGetName(VDP);
        processError();
        return returnValue;
    }

    /**
     * Gets the type of domain operation system.
     *
     * @return the type
     * @throws LibvirtException
     */
    public String getOSType() throws LibvirtException {
        Pointer ptr = libvirt.virDomainGetOSType(VDP);
        processError();
        try {
            return Library.getString(ptr);
        } finally {
            Library.free(ptr);
        }
    }

    /**
     * Gets the scheduler parameters.
     *
     * @return an array of SchedParameter objects
     * @throws LibvirtException
     */
    public SchedParameter[] getSchedulerParameters() throws LibvirtException {
        IntByReference nParams = new IntByReference();
        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;
    }

    // getSchedulerType
    // We don't expose the nparams return value, it's only needed for the
    // SchedulerParameters allocations,
    // but we handle that in getSchedulerParameters internally.
    /**
     * Gets the scheduler type.
     *
     * @return the type of the scheduler
     * @throws LibvirtException
     */
    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;
    }

    /**
     * Get the UUID for this domain.
     *
     * @return the UUID as an unpacked int array
     * @throws LibvirtException
     * @see rfc4122
     */
    public int[] getUUID() throws LibvirtException {
        byte[] bytes = new byte[Libvirt.VIR_UUID_BUFLEN];
        int success = libvirt.virDomainGetUUID(VDP, bytes);
        processError();
        int[] returnValue = new int[0];
        if (success == 0) {
            returnValue = Connect.convertUUIDBytes(bytes);
        }
        return returnValue;
    }

    /**
     * Gets the UUID for this domain as string.
     *
     * @return the UUID in canonical String format
     * @throws LibvirtException
     * @see rfc4122
     */
    public String getUUIDString() throws LibvirtException {
        byte[] bytes = new byte[Libvirt.VIR_UUID_STRING_BUFLEN];
        int success = libvirt.virDomainGetUUIDString(VDP, bytes);
        processError();
        String returnValue = null;
        if (success == 0) {
            returnValue = Native.toString(bytes);
        }
        return returnValue;
    }

    /**
     * Returns the cpumaps for this domain Only the lower 8 bits of each int in
     * the array contain information.
     *
     * @return a bitmap of real CPUs for all vcpus of this domain
     * @throws LibvirtException
     */
    public int[] getVcpusCpuMaps() throws LibvirtException {
        int[] returnValue = new int[0];
        int cpuCount = getMaxVcpus();

        if (cpuCount > 0) {
            NodeInfo nodeInfo = virConnect.nodeInfo();
            int maplength = cpuMapLength(nodeInfo.maxCpus());
            virVcpuInfo[] infos = new virVcpuInfo[cpuCount];
            returnValue = new int[cpuCount * maplength];
            byte[] cpumaps = new byte[cpuCount * maplength];
            libvirt.virDomainGetVcpus(VDP, infos, cpuCount, cpumaps, maplength);
            processError();
            for (int x = 0; x < cpuCount * maplength; x++) {
                returnValue[x] = cpumaps[x];
            }
        }
        return returnValue;
    }

    /**
     * Extracts information about virtual CPUs of this domain
     *
     * @return an array of VcpuInfo object describing the VCPUs
     * @throws LibvirtException
     */
    public VcpuInfo[] getVcpusInfo() throws LibvirtException {
        int cpuCount = getMaxVcpus();
        VcpuInfo[] returnValue = new VcpuInfo[cpuCount];
        virVcpuInfo[] infos = new virVcpuInfo[cpuCount];
        libvirt.virDomainGetVcpus(VDP, infos, cpuCount, null, 0);
        processError();
        for (int x = 0; x < cpuCount; x++) {
            returnValue[x] = new VcpuInfo(infos[x]);
        }
        return returnValue;
    }

    /**
     * Provides an XML description of the domain. The description may be reused
     * later to relaunch the domain with createLinux().
     *
     * @param flags
     *            not used
     * @return the XML description String
     * @throws LibvirtException
     * @see The XML
     *      Description format 
     */
    public String getXMLDesc(int flags) throws LibvirtException {
        Pointer ptr = libvirt.virDomainGetXMLDesc(VDP, flags);
        processError();
        try {
            return Library.getString(ptr);
        } finally {
            Library.free(ptr);
        }
    }

    /**
     * Determine if the domain has a snapshot
     *
     * @see Libvi
     *      r t Documentation
     * @return 0 if no image is present, 1 if an image is present, and -1 in
     *         case of error
     * @throws LibvirtException
     */
    public int hasManagedSaveImage() throws LibvirtException {
        int returnValue = libvirt.virDomainHasManagedSaveImage(VDP, 0);
        processError();
        return returnValue;
    }

    /**
     * Returns network interface stats for interfaces attached to this domain.
     * The path parameter is the name of the network interface. Domains may have
     * more than network interface. To get stats for each you should make
     * multiple calls to this function. Individual fields within the
     * DomainInterfaceStats object may be returned as -1, which indicates that
     * the hypervisor does not support that particular statistic.
     *
     * @param path
     *            path to the interface
     * @return the statistics in a DomainInterfaceStats object
     * @throws LibvirtException
     */
    public DomainInterfaceStats interfaceStats(String path) throws LibvirtException {
        virDomainInterfaceStats stats = new virDomainInterfaceStats();
        libvirt.virDomainInterfaceStats(VDP, path, stats, stats.size());
        processError();
        return new DomainInterfaceStats(stats);
    }

    /**
     * Determine if the domain is currently running
     *
     * @see Libvirt
     *      Documentation
     * @return 1 if running, 0 if inactive, -1 on error
     * @throws LibvirtException
     */
    public int isActive() throws LibvirtException {
        int returnValue = libvirt.virDomainIsActive(VDP);
        processError();
        return returnValue;
    }

    /**
     * Determine if the domain has a persistent configuration which means it
     * will still exist after shutting down
     *
     * @see Libvirt
     *      Documentation
     * @return 1 if persistent, 0 if transient, -1 on error
     * @throws LibvirtException
     */
    public int isPersistent() throws LibvirtException {
        int returnValue = libvirt.virDomainIsPersistent(VDP);
        processError();
        return returnValue;
    }

    /**
     * suspend a domain and save its memory contents to a file on disk.
     *
     * @see Libvirt
     *      Documentation
     * @return 0 in case of success or -1 in case of failure
     * @throws LibvirtException
     */
    public int managedSave() throws LibvirtException {
        int returnValue = libvirt.virDomainManagedSave(VDP, 0);
        processError();
        return returnValue;
    }

    /**
     * Remove any managed save images from the domain
     *
     * @see Libvirt
     *      Documentation
     * @return 0 in case of success, and -1 in case of error
     * @throws LibvirtException
     */
    public int managedSaveRemove() throws LibvirtException {
        int returnValue = libvirt.virDomainManagedSaveRemove(VDP, 0);
        processError();
        return returnValue;
    }

    /**
     * This function provides memory statistics for the domain.
     *
     * @param number
     *            the number of stats to retrieve
     * @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 = 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;
    }

    /**
     * Migrate this domain object from its current host to the destination host
     * given by dconn (a connection to the destination host).
     * 

* Flags may be bitwise OR'ed values of * {@link org.libvirt.Domain.MigrateFlags MigrateFlags}. *

* If a hypervisor supports renaming domains during migration, then you may * set the dname parameter to the new name (otherwise it keeps the same name). *

* If this is not supported by the hypervisor, dname must be {@code null} or * else you will get an exception. *

* Since typically the two hypervisors connect directly to each other in order * to perform the migration, you may need to specify a path from the source * to the destination. This is the purpose of the uri parameter. *

* If uri is {@code null}, then libvirt will try to find the best method. *

* Uri may specify the hostname or IP address of the destination host as seen * from the source, or uri may be a URI giving transport, hostname, user, * port, etc. in the usual form. *

* Uri should only be specified if you want to migrate over a specific interface * on the remote host. *

* For Qemu/KVM, the URI should be of the form {@code "tcp://hostname[:port]"}. *

* This does not require TCP auth to be setup between the connections, since * migrate uses a straight TCP connection (unless using the PEER2PEER flag, * in which case URI should be a full fledged libvirt URI). *

* Refer also to driver documentation for the particular URIs supported. *

* The maximum bandwidth (in Mbps) that will be used to do * migration can be specified with the bandwidth parameter. If * set to 0, libvirt will choose a suitable default. *

* Some hypervisors do not support this feature and will return an * error if bandwidth is not 0. To see which features are * supported by the current hypervisor, see * Connect.getCapabilities, /capabilities/host/migration_features. *

* There are many limitations on migration imposed by the underlying technology * for example it may not be possible to migrate between different processors * even with the same architecture, or between different types of hypervisor. *

* If the hypervisor supports it, dxml can be used to alter * host-specific portions of the domain XML that will be used on * the destination. * * @param dconn * destination host (a Connect object) * @param dxml * (optional) XML config for launching guest on target * @param flags * flags * @param dname * (optional) rename domain to this at destination * @param uri * (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). * @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 = libvirt.virDomainMigrate2(VDP, dconn.VCP, dxml, new NativeLong(flags), dname, uri, new NativeLong(bandwidth)); processError(); return new Domain(dconn, newPtr); } /** * Migrate this domain object from its current host to the destination host * given by dconn (a connection to the destination host). Flags may be one * of more of the following: Domain.VIR_MIGRATE_LIVE Attempt a live * migration. If a hypervisor supports renaming domains during migration, * then you may set the dname parameter to the new name (otherwise it keeps * the same name). If this is not supported by the hypervisor, dname must be * NULL or else you will get an error. Since typically the two hypervisors * connect directly to each other in order to perform the migration, you may * need to specify a path from the source to the destination. This is the * purpose of the uri parameter.If uri is NULL, then libvirt will try to * find the best method. Uri may specify the hostname or IP address of the * destination host as seen from the source, or uri may be a URI giving * transport, hostname, user, port, etc. in the usual form. Uri should only * be specified if you want to migrate over a specific interface on the * remote host. For Qemu/KVM, the uri should be of the form * "tcp://hostname[:port]". This does not require TCP auth to be setup * between the connections, since migrate uses a straight TCP connection * (unless using the PEER2PEER flag, in which case URI should be a full * fledged libvirt URI). Refer also to driver documentation for the * particular URIs supported. If set to 0, libvirt will choose a suitable * default. Some hypervisors do not support this feature and will return an * error if bandwidth is not 0. To see which features are supported by the * current hypervisor, see Connect.getCapabilities, * /capabilities/host/migration_features. There are many limitations on * migration imposed by the underlying technology - for example it may not * be possible to migrate between different processors even with the same * architecture, or between different types of hypervisor. * * @param dconn * destination host (a Connect object) * @param flags * flags * @param dname * (optional) rename domain to this at destination * @param uri * (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, 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 = libvirt.virDomainMigrate(VDP, dconn.VCP, new NativeLong(flags), dname, uri, new NativeLong(bandwidth)); processError(); return new Domain(dconn, newPtr); } /** * Sets maximum tolerable time for which the domain is allowed to be paused * at the end of live migration. * * @see LIbvirt * Documentation * @param downtime * the time to be down * @return 0 in case of success, -1 otherwise. * @throws LibvirtException */ public int migrateSetMaxDowntime(long downtime) throws LibvirtException { int returnValue = libvirt.virDomainMigrateSetMaxDowntime(VDP, downtime, 0); processError(); return returnValue; } /** * Migrate the domain object from its current host to the destination * denoted by a given URI. *

* The destination is given either in dconnuri (if the * {@link MigrateFlags#VIR_MIGRATE_PEER2PEER PEER2PEER} * is flag set), or in miguri (if neither the * {@link MigrateFlags#VIR_MIGRATE_PEER2PEER PEER2PEER} nor the * {@link MigrateFlags#VIR_MIGRATE_TUNNELLED TUNNELLED} migration * flag is set in flags). * * @see * virDomainMigrateToURI * * @param dconnuri * (optional) URI for target libvirtd if @flags includes VIR_MIGRATE_PEER2PEER * @param miguri * (optional) URI for invoking the migration, not if @flags includs VIR_MIGRATE_TUNNELLED * @param dxml * (optional) XML config for launching guest on target * @param flags * Controls the migrate * @param dname * The name at the destnation * @param bandwidth * Specify the migration bandwidth * @return 0 if successful * @throws LibvirtException */ public int migrateToURI(String dconnuri, String miguri, String dxml, long flags, String dname, long bandwidth) throws LibvirtException { int returnValue = libvirt.virDomainMigrateToURI2(VDP, dconnuri, miguri, dxml, new NativeLong(flags), dname, new NativeLong(bandwidth)); processError(); return returnValue; } /** * Migrate the domain object from its current host to the destination host * given by duri. * * @see * virDomainMigrateToURI * * @param uri * The destination URI * @param flags * Controls the migrate * @param dname * The name at the destnation * @param bandwidth * Specify the migration bandwidth * @return 0 if successful, -1 if not * @throws LibvirtException */ public int migrateToURI(String uri, long flags, String dname, long bandwidth) throws LibvirtException { int returnValue = libvirt.virDomainMigrateToURI(VDP, uri, new NativeLong(flags), dname, new NativeLong(bandwidth)); processError(); return returnValue; } /** * Dynamically changes the real CPUs which can be allocated to a virtual * CPU. This function requires priviledged access to the hypervisor. * * @param vcpu * virtual cpu number * @param cpumap * bit map of real CPUs represented by the the lower 8 bits of * each int in the array. Each bit set to 1 means that * corresponding CPU is usable. Bytes are stored in little-endian * order: CPU0-7, 8-15... In each byte, lowest CPU number is * least significant bit. * @throws LibvirtException */ public void pinVcpu(int vcpu, int[] cpumap) throws LibvirtException { byte[] packedMap = new byte[cpumap.length]; for (int x = 0; x < cpumap.length; x++) { packedMap[x] = (byte) cpumap[x]; } 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(); } /** * Reboot this domain, the domain object is still usable there after but the * domain OS is being stopped for a restart. Note that the guest OS may * ignore the request. * * @param flags * extra flags for the reboot operation, not used yet * @throws LibvirtException */ public void reboot(int flags) throws LibvirtException { libvirt.virDomainReboot(VDP, flags); processError(); } /** * Resume this suspended domain, the process is restarted from the state * where it was frozen by calling virSuspendDomain(). This function may * requires privileged access * * @throws LibvirtException */ public void resume() throws LibvirtException { libvirt.virDomainResume(VDP); processError(); } /** * Revert the domain to a given snapshot. * * @see Libvirt Documentation * @param snapshot * the snapshot to revert to * @return 0 if the creation is successful, -1 on error. * @throws LibvirtException */ public int revertToSnapshot(DomainSnapshot snapshot) throws LibvirtException { int returnCode = libvirt.virDomainRevertToSnapshot(snapshot.VDSP, 0); processError(); return returnCode; } /** * Suspends this domain and saves its memory contents to a file on disk. * After the call, if successful, the domain is not listed as running * anymore (this may be a problem). Use Connect.virDomainRestore() to * restore a domain after saving. * * @param to * path for the output file * @throws LibvirtException */ public void save(String to) throws LibvirtException { libvirt.virDomainSave(VDP, to); processError(); } /** * Configures the network to be automatically started when the host machine * boots. * * @param autostart * @throws LibvirtException */ public void setAutostart(boolean autostart) throws LibvirtException { int autoValue = autostart ? 1 : 0; libvirt.virDomainSetAutostart(VDP, autoValue); processError(); } /** * * Dynamically change the maximum amount of physical memory allocated to a * domain. This function requires priviledged access to the hypervisor. * * @param memory * the amount memory in kilobytes * @throws LibvirtException */ public void setMaxMemory(long memory) throws LibvirtException { libvirt.virDomainSetMaxMemory(VDP, new NativeLong(memory)); processError(); } /** * Dynamically changes the target amount of physical memory allocated to * this domain. This function may requires priviledged access to the * hypervisor. * * @param memory * in kilobytes * @throws LibvirtException */ public void setMemory(long memory) throws LibvirtException { libvirt.virDomainSetMemory(VDP, new NativeLong(memory)); processError(); } /** * Changes the scheduler parameters * * @param params * an array of SchedParameter objects to be changed * @throws LibvirtException */ public void setSchedulerParameters(SchedParameter[] params) throws LibvirtException { virSchedParameter[] input = new virSchedParameter[params.length]; for (int x = 0; x < params.length; x++) { input[x] = SchedParameter.toNative(params[x]); } libvirt.virDomainSetSchedulerParameters(VDP, input, params.length); processError(); } /** * Dynamically changes the number of virtual CPUs used by this domain. Note * that this call may fail if the underlying virtualization hypervisor does * not support it or if growing the number is arbitrary limited. This * function requires priviledged access to the hypervisor. * * @param nvcpus * the new number of virtual CPUs for this domain * @throws LibvirtException */ public void setVcpus(int nvcpus) throws LibvirtException { libvirt.virDomainSetVcpus(VDP, nvcpus); processError(); } /** * Shuts down this domain, the domain object is still usable there after but * the domain OS is being stopped. Note that the guest OS may ignore the * request. TODO: should we add an option for reboot, knowing it may not be * doable in the general case ? * * @throws LibvirtException */ public void shutdown() throws LibvirtException { libvirt.virDomainShutdown(VDP); processError(); } /** * Creates a new snapshot of a domain based on the snapshot xml contained in * xmlDesc. * * @see Libvirt * Documentation * @param xmlDesc * 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, or null on Error * @throws LibvirtException */ public DomainSnapshot snapshotCreateXML(String xmlDesc, int flags) throws LibvirtException { DomainSnapshotPointer ptr = libvirt.virDomainSnapshotCreateXML(VDP, xmlDesc, flags); processError(); DomainSnapshot returnValue = null; if (ptr != null) { returnValue = new DomainSnapshot(virConnect, ptr); } return returnValue; } /** * Creates a new snapshot of a domain based on the snapshot xml contained in * xmlDesc. *

* This is just a convenience method, it has the same effect * as calling {@code snapshotCreateXML(xmlDesc, 0);}. * * @see #snapshotCreateXML(int) * @see Libvirt * Documentation * @param xmlDesc * string containing an XML description of the domain * @return the snapshot, or null on Error * @throws LibvirtException */ public DomainSnapshot snapshotCreateXML(String xmlDesc) throws LibvirtException { return snapshotCreateXML(xmlDesc, 0); } /** * Get the current snapshot for a domain, if any. * * @see Libvirt * Documentation * @return the snapshot, or null on Error * @throws LibvirtException */ public DomainSnapshot snapshotCurrent() throws LibvirtException { DomainSnapshotPointer ptr = libvirt.virDomainSnapshotCurrent(VDP, 0); processError(); DomainSnapshot returnValue = null; if (ptr != null) { returnValue = new DomainSnapshot(virConnect, ptr); } return returnValue; } /** * Collect the list of domain snapshots for the given domain. With the option to pass flags * * @see Libvirt * Documentation * @return The list of names, or null if an error * @throws LibvirtException */ public String[] snapshotListNames(int flags) throws LibvirtException { String[] returnValue = null; int num = snapshotNum(); if (num >= 0) { returnValue = new String[num]; if (num > 0) { libvirt.virDomainSnapshotListNames(VDP, returnValue, num, flags); processError(); } } return returnValue; } /** * Collect the list of domain snapshots for the given domain. *

* This is just a convenience method, it has the same effect * as calling {@code snapshotListNames(0);}. * * @see #snapshotListNames(int) * @see * virDomainSnapshotListNames * @return The list of names, or null if an error * @throws LibvirtException */ public String[] snapshotListNames() throws LibvirtException { return snapshotListNames(0); } /** * Retrieve a snapshot by name * * @see Libvirt * Documentation * @param name * the name * @return The located snapshot, or null if an error * @throws LibvirtException */ public DomainSnapshot snapshotLookupByName(String name) throws LibvirtException { DomainSnapshotPointer ptr = libvirt.virDomainSnapshotLookupByName(VDP, name, 0); processError(); DomainSnapshot returnValue = null; if (ptr != null) { returnValue = new DomainSnapshot(virConnect, ptr); } return returnValue; } /** * Provides the number of domain snapshots for this domain.. * * @see Libvirt * Documentation */ public int snapshotNum() throws LibvirtException { int returnValue = libvirt.virDomainSnapshotNum(VDP, 0); processError(); return returnValue; } /** * Suspends this active domain, the process is frozen without further access * to CPU resources and I/O but the memory used by the domain at the * hypervisor level will stay allocated. Use Domain.resume() to reactivate * the domain. This function requires priviledged access. * * @throws LibvirtException */ public void suspend() throws LibvirtException { libvirt.virDomainSuspend(VDP); processError(); } /** * undefines this domain but does not stop it if it is running * * @throws LibvirtException */ public void undefine() throws LibvirtException { libvirt.virDomainUndefine(VDP); processError(); } /** * Undefines this domain but does not stop if it it is running. With option for passing flags * * @see Libvirt Documentation * @param flags * flags for undefining the domain. See virDomainUndefineFlagsValues for more information * @throws LibvirtException */ public void undefine(int flags) throws LibvirtException { libvirt.virDomainUndefineFlags(VDP, flags); processError(); } /** * Change a virtual device on a domain * * @see Libvirt Documentation * @param xml * the xml to update with * @param flags * controls the update * @return 0 in case of success, -1 in case of failure. * @throws LibvirtException */ public int updateDeviceFlags(String xml, int flags) throws LibvirtException { int returnValue = libvirt.virDomainUpdateDeviceFlags(VDP, xml, flags); processError(); return returnValue; } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy