diff options
author | Victor Mocanu | 2018-04-16 17:14:45 +0200 |
---|---|---|
committer | Jonathan Bauer | 2018-04-16 17:15:47 +0200 |
commit | 8a0d508f5a04f930e9945131db4f70591fd02e12 (patch) | |
tree | 81fd67311a42da83bdb58e339596cec5a80d3955 /src/main/java/org/openslx/util/vm/VmMetaData.java | |
parent | Remove unused proxy-vole classes (diff) | |
download | master-sync-shared-8a0d508f5a04f930e9945131db4f70591fd02e12.tar.gz master-sync-shared-8a0d508f5a04f930e9945131db4f70591fd02e12.tar.xz master-sync-shared-8a0d508f5a04f930e9945131db4f70591fd02e12.zip |
[vbox] add support for VirtualBox
Diffstat (limited to 'src/main/java/org/openslx/util/vm/VmMetaData.java')
-rw-r--r-- | src/main/java/org/openslx/util/vm/VmMetaData.java | 267 |
1 files changed, 245 insertions, 22 deletions
diff --git a/src/main/java/org/openslx/util/vm/VmMetaData.java b/src/main/java/org/openslx/util/vm/VmMetaData.java index 75e559a..c3bbb38 100644 --- a/src/main/java/org/openslx/util/vm/VmMetaData.java +++ b/src/main/java/org/openslx/util/vm/VmMetaData.java @@ -1,30 +1,103 @@ package org.openslx.util.vm; +import java.io.File; +import java.io.IOException; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Map.Entry; +import org.apache.log4j.Logger; import org.openslx.bwlp.thrift.iface.OperatingSystem; import org.openslx.bwlp.thrift.iface.Virtualizer; /** - * Describes a configured virtual machine. This class is parsed from a machine description, like a - * *.vmx for VMware machines. + * Describes a configured virtual machine. This class is parsed from a machine + * description, like a *.vmx for VMware machines. */ -public abstract class VmMetaData +public abstract class VmMetaData<T, U, V, W> { + private static final Logger LOGGER = Logger.getLogger( VmMetaData.class ); /* * Helper types */ + protected Map<SoundCardType, T> soundCards = new HashMap<>(); + protected Map<DDAcceleration, U> ddacc = new HashMap<>(); + protected Map<HWVersion, V> hwversion = new HashMap<>(); + protected Map<EthernetDevType, W> networkCards = new HashMap<>(); + + /** + * Virtual sound cards types + */ + public static enum SoundCardType + { + NONE( "None" ), DEFAULT( "(default)" ), SOUND_BLASTER( "Sound Blaster 16" ), ES( "ES 1371" ), HD_AUDIO( "Intel Integrated HD Audio" ), AC( "Intel ICH Audio Codec 97" ); + + public final String displayName; + + private SoundCardType( String dName ) + { + this.displayName = dName; + } + } + + /** + * 3D acceleration types + */ + public static enum DDAcceleration + { + OFF( "Off" ), ON( "On" ); + + public final String displayName; + + private DDAcceleration( String dName ) + { + this.displayName = dName; + } + } + + /** + * Virtual hardware version - currently only in use for VMPlayer + */ + public static enum HWVersion + { + NONE( "(invalid)" ), THREE( " 3 (Workstation 4/5, Player 1)" ), FOUR( " 4 (Workstation 4/5, Player 1/2, Fusion 1)" ), SIX( " 6 (Workstation 6)" ), SEVEN( + " 7 (Workstation 6.5/7, Player 3, Fusion 2/3)" ), EIGHT( " 8 (Workstation 8, Player/Fusion 4)" ), NINE( " 9 (Workstation 9, Player/Fusion 5)" ), TEN( + "10 (Workstation 10, Player/Fusion 6)" ), ELEVEN( + "11 (Workstation 11, Player/Fusion 7)" ), TWELVE( "12 (Workstation/Player 12, Fusion 8)" ), DEFAULT( "default" ); + + public final String displayName; + + private HWVersion( String dName ) + { + this.displayName = dName; + } + } + + /** + * Virtual network cards + */ + public static enum EthernetDevType + { + AUTO( "(default)" ), PCNET32( "AMD PCnet32" ), E1000( "Intel E1000 (PCI)" ), E1000E( "Intel E1000e (PCI-Express)" ), VMXNET( "VMXnet" ), VMXNET3( "VMXnet 3" ), PCNETPCI2( + "PCnet-PCI II" ), PCNETFAST3( "PCnet-FAST III" ), PRO1000MTD( "Intel PRO/1000 MT Desktop" ), PRO1000TS( + "Intel PRO/1000 T Server" ), PRO1000MTS( "Intel PRO/1000 MT Server" ), PARAVIRT( "Paravirtualized Network" ), NONE( "No Network Card" ); + + public final String displayName; + + private EthernetDevType( String dName ) + { + this.displayName = dName; + } + } public static enum DriveBusType { - SCSI, - IDE, - SATA; + SCSI, IDE, SATA; } public static class HardDisk @@ -41,6 +114,10 @@ public abstract class VmMetaData } } + public static enum EtherType + { + NAT, BRIDGED, HOST_ONLY; + } /* * Members */ @@ -54,8 +131,35 @@ public abstract class VmMetaData protected String displayName = null; /* - * Guettas + * Getters for virtual hardware */ + public List<SoundCardType> getSupportedSoundCards() + { + ArrayList<SoundCardType> availables = new ArrayList<SoundCardType>( soundCards.keySet() ); + Collections.sort( availables ); + return availables; + } + + public List<DDAcceleration> getSupportedDDAccs() + { + ArrayList<DDAcceleration> availables = new ArrayList<DDAcceleration>( ddacc.keySet() ); + Collections.sort( availables ); + return availables; + } + + public List<HWVersion> getSupportedHWVersions() + { + ArrayList<HWVersion> availables = new ArrayList<HWVersion>( hwversion.keySet() ); + Collections.sort( availables ); + return availables; + } + + public List<EthernetDevType> getSupportedEthernetDevices() + { + ArrayList<EthernetDevType> availables = new ArrayList<EthernetDevType>( networkCards.keySet() ); + Collections.sort( availables ); + return availables; + } /** * Get operating system of this VM. @@ -82,10 +186,11 @@ public abstract class VmMetaData } /** - * This method should return a minimal representation of the input meta data. The representation - * is platform dependent, and should be stripped of all non-essential configuration, such as - * CD/DVD/FLoppy drives, serial or parallel ports, shared folders, or anything else that could be - * considered sensible information (absolute paths containing the local user's name). + * This method should return a minimal representation of the input meta data. + * The representation is platform dependent, and should be stripped of all + * non-essential configuration, such as CD/DVD/FLoppy drives, serial or parallel + * ports, shared folders, or anything else that could be considered sensible + * information (absolute paths containing the local user's name). */ public abstract byte[] getFilteredDefinitionArray(); @@ -104,12 +209,14 @@ public abstract class VmMetaData } /** - * Called from subclass to set the OS. If the OS cannot be determined from the given parameters, - * it will not be set. + * Called from subclass to set the OS. If the OS cannot be determined from the + * given parameters, it will not be set. * - * @param virtId virtualizer, eg "vmware" for VMware - * @param virtOsId the os identifier used by the virtualizer, eg. windows7-64 for 64bit Windows 7 - * on VMware + * @param virtId + * virtualizer, eg "vmware" for VMware + * @param virtOsId + * the os identifier used by the virtualizer, eg. windows7-64 for + * 64bit Windows 7 on VMware */ protected final void setOs( String virtId, String virtOsId ) { @@ -131,14 +238,130 @@ public abstract class VmMetaData this.os = lazyMatch; } - public abstract Virtualizer getVirtualizer(); - - public abstract void enableUsb(boolean enabled); - /** - * Apply config options that are desired when locally editing a VM. - * for vmware, this disables automatic DPI scaling of the guest. + * Apply config options that are desired when locally editing a VM. for vmware, + * this disables automatic DPI scaling of the guest. */ public abstract void applySettingsForLocalEdit(); + /** + * Returns a VmMetaData instance of the given machine description given as file + * + * @param osList List of supported operating systems + * @param file VM's machine description file to get the metadata instance from + * @return VmMetaData object representing the relevant parts of the given machine description + * @throws IOException + */ + public static VmMetaData<?, ?, ?, ?> getInstance( List<OperatingSystem> osList, File file ) throws IOException + { + Exception errEx = null; + try { + return new VmwareMetaData( osList, file ); + } catch ( UnsupportedVirtualizerFormatException e ) { + LOGGER.debug( "Disk file not .vmdk" ); + errEx = e; + } + try { + return new VboxMetaData( osList, file ); + } catch ( UnsupportedVirtualizerFormatException e ) { + LOGGER.debug( "Disk file not .vdi" ); + errEx = e; + } + try { + return new QemuMetaData( osList, file ); + } catch ( Exception e ) { + LOGGER.debug( "Disk file not qemu supported format" ); + errEx = e; + } + if ( errEx != null ) { + LOGGER.error( "Unsupported disk file format!", errEx ); + } + return null; + } + + /** + * Returns a VmMetaData instance of the given machine description given as a byte array + * + * @param osList List of supported operating systems + * @param vmContent VM's machine description as byte array (e.g. stored in DB) + * @param length length of the byte array given as vmContent + * @return VmMetaData object representing the relevant parts of the given machine description + * @throws IOException + */ + public static VmMetaData<?, ?, ?, ?> getInstance( List<OperatingSystem> osList, byte[] vmContent, int length ) throws IOException + { + Exception errEx = null; + try { + return new VmwareMetaData( osList, vmContent, length ); + } catch ( UnsupportedVirtualizerFormatException e ) { + LOGGER.debug( "Machine description not in .vmx format." ); + errEx = e; + } + try { + return new VboxMetaData( osList, vmContent, length ); + } catch ( UnsupportedVirtualizerFormatException | NullPointerException e ) { + LOGGER.debug( "Machine description not in .vbox format." ); + errEx = e; + } + // how to do this check ?? + try { + return new QemuMetaData( osList, vmContent ); + } catch ( Exception e ) { + LOGGER.debug( "Machine description not in qemu supported format" ); + errEx = e; + } + if ( errEx != null ) { + LOGGER.error( "Machine description has an unknown format!", errEx ); + } + return null; + } + + public abstract boolean addHddTemplate( File diskImage, String hddMode, String redoDir ); + + public abstract boolean addHddTemplate( String diskImagePath, String hddMode, String redoDir ); + + public abstract boolean addDefaultNat(); + + public abstract void setOs( String vendorOsId ); + + public abstract boolean addDisplayName( String name ); + + public abstract boolean addRam( int mem ); + + public abstract void addFloppy( int index, String image, boolean readOnly ); + + public abstract boolean addCdrom( String image ); + + public abstract boolean addCpuCoreCount( int nrOfCores ); + + public abstract void setSoundCard( SoundCardType type ); + + public abstract SoundCardType getSoundCard(); + + public abstract void setDDAcceleration( DDAcceleration type ); + + public abstract DDAcceleration getDDAcceleration(); + + public abstract void setHWVersion( HWVersion type ); + + public abstract HWVersion getHWVersion(); + + public abstract void setEthernetDevType( int cardIndex, EthernetDevType type ); + + public abstract EthernetDevType getEthernetDevType( int cardIndex ); + + public abstract byte[] getDefinitionArray(); + + public abstract boolean addEthernet( EtherType type ); + + public abstract Virtualizer getVirtualizer(); + + public abstract void enableUsb( boolean enabled ); + + public abstract boolean disableSuspend(); + + /** + * Function used to register virtual devices + */ + public abstract void registerVirtualHW(); } |