summaryrefslogblamecommitdiffstats
path: root/src/main/java/org/openslx/libvirt/domain/device/Hostdev.java
blob: dc9cf5ed8af9b5a7690c75ac3cc82d68adf9036b (plain) (tree)






























                                                                                                


























                                                                                                      

















                                                                                       

                                                                           

                                                                                            
                                                                             
                                                             
                                                                                           

                                                                            
                                                                                           





















                                                                                                


                                                                           



















                                                                          


                               








































                                                                                                      
package org.openslx.libvirt.domain.device;

import org.openslx.libvirt.xml.LibvirtXmlNode;

/**
 * A hostdev device node in a Libvirt domain XML document for PCI, USB, ... passthrough.
 * 
 * @author Manuel Bentele
 * @version 1.0
 */
public class Hostdev extends Device
{
	/**
	 * Creates an empty hostdev device.
	 */
	public Hostdev()
	{
		super();
	}

	/**
	 * Creates a hostdev device representing an existing Libvirt XML hostdev device element.
	 * 
	 * @param xmlNode existing Libvirt XML hostdev device element.
	 */
	public Hostdev( LibvirtXmlNode xmlNode )
	{
		super( xmlNode );
	}

	/**
	 * Checks if hostdev device is managed.
	 * 
	 * If {@link #isManaged()} returns <code>true</code> the hostdev device is detached from the
	 * host before being passed on to the guest and reattached to the host after the guest exits.
	 * 
	 * @return state whether hostdev device is managed.
	 */
	public boolean isManaged()
	{
		return this.getXmlElementAttributeValueAsBool( "managed" );
	}

	/**
	 * Sets state whether hostdev device is managed.
	 * 
	 * If the <code>managed</code> parameter is set to <code>true</code> the hostdev device is
	 * detached from the host before being passed on to the guest and reattached to the host after
	 * the guest exits.
	 * 
	 * @param managed state whether hostdev device is managed or not.
	 */
	public void setManaged( boolean managed )
	{
		this.setXmlElementAttributeValueYesNo( "managed", managed );
	}

	/**
	 * Removes boot oder entry of the hostdev device.
	 */
	public void removeBootOrder()
	{
		this.removeXmlElement( "boot" );
	}

	/**
	 * Creates a non-existent hostdev device as Libvirt XML device element.
	 * 
	 * @param hostdev hostdev device that is created.
	 * @param xmlNode Libvirt XML node of the Libvirt XML device that is created.
	 * @return created hostdev device instance.
	 */
	public static Hostdev createInstance( Hostdev hostdev, LibvirtXmlNode xmlNode )
	{
		Hostdev addedHostdev = null;

		xmlNode.setXmlElementAttributeValue( "mode", "subsystem" );

		if ( hostdev instanceof HostdevMdev ) {
			xmlNode.setXmlElementAttributeValue( "type", Type.MDEV.toString() );
			addedHostdev = HostdevMdev.createInstance( xmlNode );
		} else if ( hostdev instanceof HostdevPci ) {
			xmlNode.setXmlElementAttributeValue( "type", Type.PCI.toString() );
			addedHostdev = HostdevPci.createInstance( xmlNode );
		} else if ( hostdev instanceof HostdevUsb ) {
			xmlNode.setXmlElementAttributeValue( "type", Type.USB.toString() );
			addedHostdev = HostdevUsb.createInstance( xmlNode );
		}

		return addedHostdev;
	}

	/**
	 * Creates a hostdev device representing an existing Libvirt XML hostdev device element.
	 * 
	 * @param xmlNode existing Libvirt XML hostdev device element.
	 * @return hostdev device instance.
	 */
	public static Hostdev newInstance( LibvirtXmlNode xmlNode )
	{
		Hostdev deviceHostdev = null;
		Type type = Type.fromString( xmlNode.getXmlElementAttributeValue( "type" ) );

		if ( type == null ) {
			return null;
		}

		switch ( type ) {
		case MDEV:
			deviceHostdev = HostdevMdev.newInstance( xmlNode );
			break;
		case PCI:
			deviceHostdev = HostdevPci.newInstance( xmlNode );
			break;
		case USB:
			deviceHostdev = HostdevUsb.newInstance( xmlNode );
			break;
		}

		return deviceHostdev;
	}

	/**
	 * Type of hostdev device subsystem passthrough.
	 * 
	 * @author Manuel Bentele
	 * @version 1.0
	 */
	enum Type
	{
		// @formatter:off
		MDEV( "mdev" ),
		PCI ( "pci" ),
		USB ( "usb" );
		// @formatter:on

		/**
		 * Name of the hostdev device type.
		 */
		private String type = null;

		/**
		 * Creates hostdev device type.
		 * 
		 * @param type valid name of the hostdev device type in a Libvirt domain XML document.
		 */
		Type( String type )
		{
			this.type = type;
		}

		@Override
		public String toString()
		{
			return this.type;
		}

		/**
		 * Creates hostdev device type from its name with error check.
		 * 
		 * @param type name of the hostdev device storage in a Libvirt domain XML document.
		 * @return valid hostdev device type.
		 */
		public static Type fromString( String type )
		{
			for ( Type t : Type.values() ) {
				if ( t.type.equalsIgnoreCase( type ) ) {
					return t;
				}
			}

			return null;
		}
	}
}