summaryrefslogtreecommitdiffstats
path: root/dozentenmodul/src/main/java/org/openslx/dozmod/util/VmWrapper.java
diff options
context:
space:
mode:
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.java122
1 files changed, 42 insertions, 80 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 ee5e259e..f8721e98 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,13 +24,15 @@ 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.virtualization.configuration.VirtualizationConfigurationQemu;
-import org.openslx.virtualization.configuration.VirtualizationConfigurationVirtualBox;
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.VirtualizationConfiguration.UsbSpeed;
+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.DiskImageUtils;
import org.openslx.vm.disk.DiskImageVmdk;
public class VmWrapper {
@@ -38,110 +40,74 @@ 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
- VirtualizationConfiguration<?, ?, ?, ?, ?> virtualizationConfig = VirtualizationConfiguration
- .getInstance(MetaDataCache.getOperatingSystems(), machineDescription, machineDescription.length);
- // Append disk & NAT
- if (!virtualizationConfig.addDefaultNat() || !virtualizationConfig.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 virtualization configuration, but the user could have changed it
- // by editing
- // the image via the GUI. Those changes are not written back to the
- // stored virtualization configuration
- 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) {
- virtualizationConfig.setOs(virtOsId);
- }
- if (os.maxMemMb > 0) {
- osMaxMemMb = os.maxMemMb;
- }
- }
- }
- virtualizationConfig.addDisplayName(imageName);
- int mem = getMainMemoryMb() / 2 - 512;
- if (mem < 1024) {
- mem = 1024;
- }
- if (osMaxMemMb > 0 && mem > osMaxMemMb) {
- mem = osMaxMemMb;
- }
- virtualizationConfig.addCpuCoreCount(1);
- virtualizationConfig.addRam((mem / 4) * 4);
- virtualizationConfig.addFloppy(0, null, true);
- virtualizationConfig.addFloppy(1, null, true);
- virtualizationConfig.addCdrom(""); // ISO-Based with no disk in drive
- virtualizationConfig.addCdrom(null); // Autodetect real drive
- if (virtualizationConfig.getMaxUsbSpeed() != UsbSpeed.USB3_0) {
- virtualizationConfig.setMaxUsbSpeed(UsbSpeed.USB2_0);
- }
- virtualizationConfig.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
+ final ConfigurationLogicDozModServerToDozModClient downloadLogic = new ConfigurationLogicDozModServerToDozModClient();
+ try {
+ downloadLogic.apply( virtualizationConfig, new ConfigurationDataDozModServerToDozModClient( imageName,
+ diskFile, guestOs, virtualizerId, getMainMemoryMb() ) );
+ } catch ( TransformationException e ) {
+ throw new VirtualizationConfigurationException( e.getLocalizedMessage() );
}
- String fileType = null;
+ // save BIOS if virtualizer is VMware
if (virtualizationConfig instanceof VirtualizationConfigurationVmware) {
- fileType = ".vmx";
- // Copy BIOS with both floppies enabled
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 (virtualizationConfig instanceof VirtualizationConfigurationVirtualBox) {
- fileType = ".vbox";
- } else if (virtualizationConfig instanceof VirtualizationConfigurationQemu) {
- 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 virtualization configuration to disk
FileUtils.writeByteArrayToFile(vmFile, virtualizationConfig.getFilteredDefinitionArray());
}
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 = DiskImageUtils.versionToMajor(diskImageInfo.getHwVersion());
+ return vmx.replace("%VM_HW_VERSION%", Short.toString(hwVersion)).getBytes(StandardCharsets.UTF_8);
}
/**
@@ -165,10 +131,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;