diff options
Diffstat (limited to 'core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuFirmware.java')
-rw-r--r-- | core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuFirmware.java | 229 |
1 files changed, 12 insertions, 217 deletions
diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuFirmware.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuFirmware.java index 6be0368e..3967a0b4 100644 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuFirmware.java +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuFirmware.java @@ -1,152 +1,13 @@ package org.openslx.runvirt.plugin.qemu.configuration; -import java.io.File; -import java.io.FileFilter; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.Reader; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.function.Predicate; - +import org.openslx.firmware.FirmwareException; +import org.openslx.firmware.QemuFirmwareUtil; import org.openslx.libvirt.domain.Domain; import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; import org.openslx.runvirt.plugin.qemu.virtualization.LibvirtHypervisorQemu; -import org.openslx.util.LevenshteinDistance; import org.openslx.virtualization.configuration.transformation.TransformationException; import org.openslx.virtualization.configuration.transformation.TransformationSpecific; -import com.google.gson.Gson; -import com.google.gson.JsonIOException; -import com.google.gson.JsonSyntaxException; -import com.google.gson.annotations.SerializedName; - -class QemuFirmware -{ - @SerializedName( "description" ) - private String description; - @SerializedName( "interface-types" ) - private ArrayList<String> interfaceTypes; - @SerializedName( "mapping" ) - private QemuFirmwareMapping mapping; - @SerializedName( "targets" ) - private ArrayList<QemuFirmwareTarget> targets; - @SerializedName( "features" ) - private ArrayList<String> features; - @SerializedName( "tags" ) - private ArrayList<String> tags; - - public String getDescription() - { - return description; - } - - public ArrayList<String> getInterfaceTypes() - { - return interfaceTypes; - } - - public QemuFirmwareMapping getMapping() - { - return mapping; - } - - public ArrayList<QemuFirmwareTarget> getTargets() - { - return targets; - } - - public ArrayList<String> getFeatures() - { - return features; - } - - public ArrayList<String> getTags() - { - return tags; - } -} - -class QemuFirmwareMapping -{ - @SerializedName( "device" ) - private String device; - @SerializedName( "executable" ) - private QemuFirmwareMappingExecutable executable; - @SerializedName( "nvram-template" ) - private QemuFirmwareMappingNvramTemplate nvramTemplate; - - public String getDevice() - { - return device; - } - - public QemuFirmwareMappingExecutable getExecutable() - { - return executable; - } - - public QemuFirmwareMappingNvramTemplate getNvramTemplate() - { - return nvramTemplate; - } -} - -class QemuFirmwareMappingExecutable -{ - @SerializedName( "filename" ) - private String fileName; - @SerializedName( "format" ) - private String format; - - public String getFileName() - { - return fileName; - } - - public String getFormat() - { - return format; - } -} - -class QemuFirmwareMappingNvramTemplate -{ - @SerializedName( "filename" ) - private String fileName; - @SerializedName( "format" ) - private String format; - - public String getFileName() - { - return fileName; - } - - public String getFormat() - { - return format; - } -} - -class QemuFirmwareTarget -{ - @SerializedName( "architecture" ) - private String architecture; - @SerializedName( "machines" ) - private ArrayList<String> machines; - - public String getArchitecture() - { - return architecture; - } - - public ArrayList<String> getMachines() - { - return machines; - } -} - /** * Specific firmware transformation for Libvirt/QEMU virtualization configurations. * @@ -187,80 +48,6 @@ public class TransformationSpecificQemuFirmware } } - private String lookupTargetOsLoader( String firmwareSpecDirectory, String sourceOsLoader, String sourceOsArch, - String sourceOsMachine ) - throws TransformationException - { - String lookupOsLoader = null; - - // parse and check firmware specification directory - final File fwSpecDirectory = new File( firmwareSpecDirectory ); - if ( !fwSpecDirectory.exists() || !fwSpecDirectory.isDirectory() ) { - throw new TransformationException( "Path to QEMU firmware specifications directory is invalid!" ); - } - - // get all firmware specification files - final FileFilter fwSpecFilesFilter = file -> !file.isDirectory() && file.getName().endsWith( ".json" ); - final File[] fwSpecFiles = fwSpecDirectory.listFiles( fwSpecFilesFilter ); - - // get paths to firmware files from firmware specification files - if ( fwSpecFiles != null ) { - final ArrayList<QemuFirmware> uefiFirmwares = new ArrayList<QemuFirmware>(); - final Gson gson = new Gson(); - for ( final File fwSpecFile : fwSpecFiles ) { - QemuFirmware firmware = null; - - try { - final Reader jsonContent = new FileReader( fwSpecFile ); - firmware = gson.fromJson( jsonContent, QemuFirmware.class ); - } catch ( FileNotFoundException | JsonSyntaxException | JsonIOException e ) { - throw new TransformationException( e.getLocalizedMessage() ); - } - - final Predicate<String> byInterfaceType = s -> s.toLowerCase().equals( "uefi" ); - if ( firmware.getInterfaceTypes().stream().filter( byInterfaceType ).findAny().isPresent() ) { - // found valid UEFI firmware - // check if architecture and machine type of the VM is supported by the firmware - final Predicate<QemuFirmwareTarget> byArchitecture = t -> sourceOsArch.equals( t.getArchitecture() ); - final Predicate<String> byMachineType = s -> sourceOsMachine.startsWith( s.replace( "*", "" ) ); - final Predicate<QemuFirmwareTarget> byMachines = t -> t.getMachines().stream().filter( byMachineType ) - .findAny().isPresent(); - - if ( firmware.getTargets().stream().filter( byArchitecture ).filter( byMachines ).findAny() - .isPresent() ) { - // found UEFI firmware supporting suitable architecture and machine type from VM - uefiFirmwares.add( firmware ); - } - } - } - - if ( uefiFirmwares.isEmpty() ) { - throw new TransformationException( "There aren't any suitable UEFI firmwares locally available!" ); - } else { - final LevenshteinDistance distance = new LevenshteinDistance( 1, 1, 1 ); - int minFileNameDistance = Integer.MAX_VALUE; - Path suitablestUefiFirmwarePath = null; - - for ( final QemuFirmware uefiFirmware : uefiFirmwares ) { - final Path uefiFirmwarePath = Paths.get( uefiFirmware.getMapping().getExecutable().getFileName() ); - final Path sourceOsLoaderPath = Paths.get( sourceOsLoader ); - final String uefiFirmwareFileName = uefiFirmwarePath.getFileName().toString().toLowerCase(); - final String sourceOsLoaderFileName = sourceOsLoaderPath.getFileName().toString().toLowerCase(); - - final int fileNameDistance = distance.calculateDistance( uefiFirmwareFileName, sourceOsLoaderFileName ); - if ( fileNameDistance < minFileNameDistance ) { - minFileNameDistance = fileNameDistance; - suitablestUefiFirmwarePath = uefiFirmwarePath; - } - } - - lookupOsLoader = suitablestUefiFirmwarePath.toString(); - } - } - - return lookupOsLoader; - } - @Override public void transform( Domain config, CommandLineArgs args ) throws TransformationException { @@ -279,8 +66,16 @@ public class TransformationSpecificQemuFirmware // check if OS loader is specified if ( sourceOsLoader != null && !sourceOsLoader.isEmpty() ) { // OS loader is specified so transform path to specified firmware path - final String targetOsLoader = this.lookupTargetOsLoader( args.getFirmware(), sourceOsLoader, sourceOsArch, - sourceOsMachine ); + // First, lookup QEMU firmware loader for target + String targetOsLoader = null; + try { + targetOsLoader = QemuFirmwareUtil.lookupTargetOsLoader( args.getFirmware(), sourceOsLoader, sourceOsArch, + sourceOsMachine ); + } catch ( FirmwareException e ) { + throw new TransformationException( e.getLocalizedMessage() ); + } + + // Second, set target QEMU firmware loader if specified if ( targetOsLoader != null && !targetOsLoader.isEmpty() ) { config.setOsLoader( targetOsLoader ); } |