diff options
Diffstat (limited to 'dozentenmodul/src/main/java/org/openslx/dozmod/util/VmWrapper.java')
-rw-r--r-- | dozentenmodul/src/main/java/org/openslx/dozmod/util/VmWrapper.java | 133 |
1 files changed, 48 insertions, 85 deletions
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/util/VmWrapper.java b/dozentenmodul/src/main/java/org/openslx/dozmod/util/VmWrapper.java index d36384bc..0cce4c45 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/util/VmWrapper.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/util/VmWrapper.java @@ -1,7 +1,6 @@ package org.openslx.dozmod.util; import java.io.File; -import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; @@ -17,6 +16,7 @@ import javax.management.ObjectName; import javax.management.ReflectionException; import org.apache.commons.io.FileUtils; +import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.IOUtils; import org.apache.log4j.Logger; import org.openslx.bwlp.thrift.iface.OperatingSystem; @@ -24,11 +24,12 @@ import org.openslx.dozmod.gui.Gui; import org.openslx.dozmod.gui.helper.MessageType; import org.openslx.dozmod.thrift.cache.MetaDataCache; import org.openslx.thrifthelper.TConst; -import org.openslx.vm.QemuMetaData; -import org.openslx.vm.VboxMetaData; -import org.openslx.vm.VmMetaData; -import org.openslx.vm.VmwareMetaData; -import org.openslx.vm.VmMetaData.UsbSpeed; +import org.openslx.virtualization.configuration.VirtualizationConfigurationVmware; +import org.openslx.virtualization.configuration.logic.ConfigurationLogicDozModServerToDozModClient; +import org.openslx.virtualization.configuration.transformation.TransformationException; +import org.openslx.virtualization.configuration.VirtualizationConfiguration; +import org.openslx.virtualization.configuration.VirtualizationConfigurationException; +import org.openslx.virtualization.configuration.data.ConfigurationDataDozModServerToDozModClient; import org.openslx.vm.disk.DiskImage; import org.openslx.vm.disk.DiskImageException; import org.openslx.vm.disk.DiskImageVmdk; @@ -38,110 +39,76 @@ public class VmWrapper { private static final Logger LOGGER = Logger.getLogger(VmWrapper.class); public static void wrapVm(File diskFile, String imageName, byte[] machineDescription, - String virtualizerId, int osId, DiskImage diskImageInfo) throws MetaDataMissingException, + String virtualizerId, int osId, DiskImage diskImageInfo) throws VirtualizationConfigurationException, IOException { - if (!diskFile.exists()) - throw new FileNotFoundException("Disk file " + diskFile.getAbsolutePath() + " does not exist"); - if (machineDescription == null || machineDescription.length < 10) { - if (!TConst.VIRT_VMWARE.equals(virtualizerId)) { - throw new MetaDataMissingException(); - } - - if (diskImageInfo instanceof DiskImageVmdk) { + // check if virtualization configuration is missing + if (machineDescription == null) { + // configuration is not available + if (TConst.VIRT_VMWARE.equals(virtualizerId) && diskImageInfo instanceof DiskImageVmdk) { + // get fallback VMX if virtualizer is VMware with VMDK disk image final DiskImageVmdk vmdkImageInfo = DiskImageVmdk.class.cast( diskImageInfo ); try { machineDescription = VmWrapper.getFallbackVmx(vmdkImageInfo); } catch (DiskImageException e) { - throw new MetaDataMissingException(); + throw new VirtualizationConfigurationException("Can not get fallback VMX configuration!"); } } else { - throw new MetaDataMissingException(); + // there is no way to reconstruct a configuration for other virtualizer + throw new VirtualizationConfigurationException("Virtualization configuration is missing!"); } } - // Handle machine description to generate configuration file - VmMetaData<?, ?, ?, ?, ?> vmMeta = VmMetaData.getInstance(MetaDataCache.getOperatingSystems(), - machineDescription, machineDescription.length); - // Append disk & NAT - if (!vmMeta.addDefaultNat() || !vmMeta.addHddTemplate(diskFile, null, null)) { - throw new MetaDataMissingException(); + // get guest operating system if possible + OperatingSystem guestOs = null; + if (osId != 0) { + guestOs = MetaDataCache.getOsById(osId); } - // The guestOS should be in the vmx, but the user could have changed it - // by editing - // the image via the GUI. Those changes are not written back to the - // stored vmx - int osMaxMemMb = 0; - if (virtualizerId != null && osId != 0) { - OperatingSystem os = MetaDataCache.getOsById(osId); - if (os != null && os.virtualizerOsId != null) { - String virtOsId = os.virtualizerOsId.get(virtualizerId); - if (virtOsId != null) { - vmMeta.setOs(virtOsId); - } - if (os.maxMemMb > 0) { - osMaxMemMb = os.maxMemMb; - } - } - } - vmMeta.addDisplayName(imageName); - int mem = getMainMemoryMb() / 2 - 512; - if (mem < 1024) { - mem = 1024; - } - if (osMaxMemMb > 0 && mem > osMaxMemMb) { - mem = osMaxMemMb; - } - vmMeta.addCpuCoreCount(1); - vmMeta.addRam((mem / 4) * 4); - vmMeta.addFloppy(0, null, true); - vmMeta.addFloppy(1, null, true); - vmMeta.addCdrom(""); // ISO-Based with no disk in drive - vmMeta.addCdrom(null); // Autodetect real drive - if (vmMeta.getMaxUsbSpeed() != UsbSpeed.USB3_0) { - vmMeta.setMaxUsbSpeed(UsbSpeed.USB2_0); - } - vmMeta.applySettingsForLocalEdit(); + // handle machine description to generate configuration file + final VirtualizationConfiguration<?, ?, ?, ?> virtualizationConfig = VirtualizationConfiguration + .getInstance(MetaDataCache.getOperatingSystems(), machineDescription, machineDescription.length); - // Output vm - String base = diskFile.getAbsolutePath(); - int dot = base.lastIndexOf('.'); - if (dot > 0) { - base = base.substring(0, dot); + // transform virtualization configuration for local editing + byte[] configuration = null; + try { + final ConfigurationLogicDozModServerToDozModClient downloadLogic = new ConfigurationLogicDozModServerToDozModClient(); + downloadLogic.apply( virtualizationConfig, new ConfigurationDataDozModServerToDozModClient( imageName, + diskFile, guestOs, virtualizerId, getMainMemoryMb() ) ); + configuration = virtualizationConfig.getConfigurationAsByteArray(); + } catch ( TransformationException e ) { + throw new VirtualizationConfigurationException( e.getLocalizedMessage() ); } - String fileType = null; - if (vmMeta instanceof VmwareMetaData) { - fileType = ".vmx"; - // Copy BIOS with both floppies enabled + // save BIOS if virtualizer is VMware + if (virtualizationConfig instanceof VirtualizationConfigurationVmware) { try { FileOutputStream output = new FileOutputStream(new File(diskFile.getAbsoluteFile().getParentFile(), "nvram")); InputStream input = ResourceLoader.getStream("/data/nvram"); IOUtils.copy(input, output); + input.close(); + output.close(); } catch (Exception e) { Gui.asyncMessageBox("Konnte das BIOS für die VM nicht kopieren", MessageType.ERROR, LOGGER, e); } - - } else if (vmMeta instanceof VboxMetaData) { - fileType = ".vbox"; - } else if (vmMeta instanceof QemuMetaData) { - fileType = ".xml"; - } - if (fileType == null) { - LOGGER.warn("file type somehow unclear; application could stop working here!"); } - File vmFile = new File(base + fileType); + // save virtualization configuration as file to disk + final String baseFileName = FilenameUtils.removeExtension( diskFile.getAbsolutePath() ); + final String fileNameExtension = virtualizationConfig.getFileNameExtension(); + final File vmFile = new File(baseFileName + "." + fileNameExtension); + + // delete original virtualization configuration file vmFile.delete(); - // actually write vmx to disk - FileUtils.writeByteArrayToFile(vmFile, vmMeta.getFilteredDefinitionArray()); + + // actually write virtualization configuration to disk + FileUtils.writeByteArrayToFile(vmFile, configuration); } private static byte[] getFallbackVmx(DiskImageVmdk diskImageInfo) throws IOException, DiskImageException { - String vmx = ResourceLoader.getTextFile("/txt/vmx_template"); - return vmx.replace("%VM_HW_VERSION%", Integer.toString(diskImageInfo.getHwVersion())).getBytes( - StandardCharsets.UTF_8); + final String vmx = ResourceLoader.getTextFile("/txt/vmx_template"); + final short hwVersion = diskImageInfo.getHwVersion().getMajor(); + return vmx.replace("%VM_HW_VERSION%", Short.toString(hwVersion)).getBytes(StandardCharsets.UTF_8); } /** @@ -165,10 +132,6 @@ public class VmWrapper { return fileName; } - public static class MetaDataMissingException extends Exception { - private static final long serialVersionUID = -7842986428831219758L; - } - private static int getMainMemoryMb() { MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer(); Object attribute; |