package org.openslx.libvirt.domain.device; import org.openslx.libvirt.xml.LibvirtXmlNode; import org.w3c.dom.Node; /** * A disk (floppy, CDROM, ...) device node in a Libvirt domain XML document. * * @author Manuel Bentele * @version 1.0 */ public class Disk extends Device { /** * Creates an empty disk device. */ public Disk() { super(); } /** * Creates a disk device representing an existing Libvirt XML disk device element. * * @param xmlNode existing Libvirt XML disk device element. */ public Disk( LibvirtXmlNode xmlNode ) { super( xmlNode ); } /** * Returns storage type of the disk device. * * @return storage type of underlying source for the disk device. */ public StorageType getStorageType() { String storageType = this.getXmlElementAttributeValue( "type" ); return StorageType.fromString( storageType ); } /** * Sets storage type for the disk device. * * @param storageType storage type of underlying source for the disk device. * * @implNote Please call {@link #setStorageSource(String)} after calling this method, otherwise * the underlying source for the disk device may be invalid. */ protected void setStorageType( StorageType storageType ) { this.setXmlElementAttributeValue( "type", storageType.toString() ); } /** * Returns underlying source of disk device. * * @return file path to underlying source of disk device. */ public String getStorageSource() { StorageType storageType = this.getStorageType(); String storageSource = null; switch ( storageType ) { case FILE: storageSource = this.getXmlElementAttributeValue( "source", "file" ); break; case BLOCK: storageSource = this.getXmlElementAttributeValue( "source", "dev" ); break; } return storageSource; } /** * Sets underlying source for disk device. * * @param source file path to underlying source for disk device. * * @implNote Please call {@link #setStorageType(StorageType)} before calling this method, * otherwise the underlying source for the disk device is not set. */ protected void setStorageSource( String source ) { StorageType storageType = this.getStorageType(); // remove all attributes from sub-element 'source' this.removeXmlElementAttributes( "source" ); // rewrite specific attribute depending on the storage type switch ( storageType ) { case FILE: this.setXmlElementAttributeValue( "source", "file", source ); break; case BLOCK: this.setXmlElementAttributeValue( "source", "dev", source ); break; } } /** * Sets storage type and underlying source for disk device. * * @param storageType storage type of underlying source for the disk device. * @param source file path to underlying source for disk device. */ public void setStorage( StorageType storageType, String source ) { this.setStorageType( storageType ); this.setStorageSource( source ); } /** * Removes underlying source of the disk device. * * @implNote Calling this method will result in an invalid Libvirt domain XML content. */ public void removeStorage() { this.removeXmlElement( "source" ); } /** * Removes boot oder entry of the disk device. */ public void removeBootOrder() { this.removeXmlElement( "boot" ); } /** * Returns read only state of disk device. * * @return read only state of disk device. */ public boolean isReadOnly() { Node readOnly = this.getXmlElement( "readonly" ); if ( readOnly == null ) { return false; } else { return true; } } /** * Sets read only state for disk device. * * @param readOnly state for disk device and its read only functionality. */ public void setReadOnly( boolean readOnly ) { if ( readOnly ) { this.setXmlElement( "readonly" ); } else { this.removeXmlElement( "readonly" ); } } /** * Returns bus type of the disk device. * * @return bus type of the disk device. */ public BusType getBusType() { String busType = this.getXmlElementAttributeValue( "target", "bus" ); return BusType.fromString( busType ); } /** * Sets bus type for the disk device. * * @param busType bus type for the disk device. */ public void setBusType( BusType busType ) { this.setXmlElementAttributeValue( "target", "bus", busType.toString() ); } /** * Returns target device of the disk device. * * @return target device of the disk device. */ public String getTargetDevice() { return this.getXmlElementAttributeValue( "target", "dev" ); } /** * Sets target device for the disk device. * * @param targetDevice target device for the disk device. */ public void setTargetDevice( String targetDevice ) { this.setXmlElementAttributeValue( "target", "dev", targetDevice ); } /** * Creates a non-existent disk device as Libvirt XML device element. * * @param disk disk device that is created. * @param xmlNode Libvirt XML node of the Libvirt XML device that is created. * @return created disk device instance. */ public static Disk createInstance( Disk disk, LibvirtXmlNode xmlNode ) { Disk addedDisk = null; if ( disk instanceof DiskCdrom ) { xmlNode.setXmlElementAttributeValue( "device", Type.CDROM.toString() ); addedDisk = DiskCdrom.createInstance( xmlNode ); } else if ( disk instanceof DiskFloppy ) { xmlNode.setXmlElementAttributeValue( "device", Type.FLOPPY.toString() ); addedDisk = DiskFloppy.createInstance( xmlNode ); } else if ( disk instanceof DiskStorage ) { xmlNode.setXmlElementAttributeValue( "device", Type.STORAGE.toString() ); addedDisk = DiskStorage.createInstance( xmlNode ); } return addedDisk; } /** * Creates a disk device representing an existing Libvirt XML disk device element. * * @param xmlNode existing Libvirt XML disk device element. * @return disk device instance. */ public static Disk newInstance( LibvirtXmlNode xmlNode ) { Disk deviceDisk = null; Type type = Type.fromString( xmlNode.getXmlElementAttributeValue( "device" ) ); if ( type == null ) { return null; } switch ( type ) { case CDROM: deviceDisk = DiskCdrom.newInstance( xmlNode ); break; case FLOPPY: deviceDisk = DiskFloppy.newInstance( xmlNode ); break; case STORAGE: deviceDisk = DiskStorage.newInstance( xmlNode ); break; } return deviceDisk; } /** * Type of disk device. * * Indicates how a disk is to be exposed to the guest OS. * * @author Manuel Bentele * @version 1.0 */ enum Type { // @formatter:off CDROM ( "cdrom" ), FLOPPY ( "floppy" ), STORAGE( "disk" ); // @formatter:on /** * Name of the disk device type. */ private String type = null; /** * Creates disk device type. * * @param type valid name of the disk device type in a Libvirt domain XML document. */ Type( String type ) { this.type = type; } @Override public String toString() { return this.type; } /** * Creates disk device type from its name with error check. * * @param type name of the disk device type in a Libvirt domain XML document. * @return valid disk device type. */ public static Type fromString( String type ) { for ( Type t : Type.values() ) { if ( t.type.equalsIgnoreCase( type ) ) { return t; } } return null; } } /** * Storage type of a disk device. * * The storage type refers to the underlying source for the disk. * * @author Manuel Bentele * @version 1.0 */ public enum StorageType { // @formatter:off FILE ( "file" ), BLOCK ( "block" ); // @formatter:on /** * Name of the disk device type. */ private String storageType = null; /** * Creates disk device storage type. * * @param storageType valid name of the disk device storage type in a Libvirt domain XML * document. */ StorageType( String storageType ) { this.storageType = storageType; } @Override public String toString() { return this.storageType; } /** * Creates disk device storage type from its name with error check. * * @param storageType name of the disk device storage type in a Libvirt domain XML document. * @return valid disk device storage type. */ public static StorageType fromString( String storageType ) { for ( StorageType t : StorageType.values() ) { if ( t.storageType.equalsIgnoreCase( storageType ) ) { return t; } } return null; } } /** * Bus type (IDE, SATA, ...) of a disk device. * * @author Manuel Bentele * @version 1.0 */ public enum BusType { // @formatter:off IDE ( "ide" ), FDC ( "fdc" ), SATA ( "sata" ), SCSI ( "scsi" ), SD ( "sd" ), USB ( "usb" ), VIRTIO( "virtio" ), XEN ( "xen" ); // @formatter:on /** * Name of the disk device bus type. */ private String busType = null; /** * Creates disk device bus type. * * @param busType valid name of the disk device bus type in a Libvirt domain XML document. */ BusType( String busType ) { this.busType = busType; } @Override public String toString() { return this.busType; } /** * Creates disk device bus type from its name with error check. * * @param busType name of the disk device bus type in a Libvirt domain XML document. * @return valid disk device bus type. */ public static BusType fromString( String busType ) { for ( BusType t : BusType.values() ) { if ( t.busType.equalsIgnoreCase( busType ) ) { return t; } } return null; } } }