summaryrefslogblamecommitdiffstats
path: root/src/main/java/org/openslx/util/vm/VmMetaData.java
blob: dc93dc9b3cd877004ebc99b18ae3a37ef7f69ce0 (plain) (tree)
1
2
3
4
5
6
7
8
9
10

                            

                           
                           




                             
                               
                                                     
                                                 

   

                                                                              
   

                                                                                



                       

                                         
         
 
                                      



                                                  
                                                                                           
















                                                                






                                           
                                        





                                         

                                                          




                                  
                                        



                                   




                                                                                        
           

                                                            

                                                                     
         




                  
                                                         



                                     

                                                                                      
           




                                                                                    
           
                                                                    
                                                 

                                                            
                                         

                                                                                                
                                                 
                                                                    








                                                       
 
                                       
 
                                                     
 
                                                        
 
           

                                                                                       

                                                         
 
                                                       
                                                                                                          
                     


                                                                   
                 



                                                                   
                 
                                                              

                            
 
                                                           

                                                                                                        
                     


                                                                                   
                 



                                                                                    
                 
                                                                           

                            
 
                                                                                               
 
                                                                                                     
 

                                                
                                                      
 
                                                            
 
                                                
 
                                                                                  
 
                                                       
 
                                                               
 
 
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.List;
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.
 */
public abstract class VmMetaData {
	private static final Logger LOGGER = Logger.getLogger(VmMetaData.class);
	/*
	 * Helper types
	 */

	public static enum DriveBusType {
		SCSI, IDE, SATA;
	}

	public static class HardDisk {
		public final String chipsetDriver;
		public final DriveBusType bus;
		public final String diskImage;

		public HardDisk(String chipsetDriver, DriveBusType bus, String diskImage) {
			this.chipsetDriver = chipsetDriver;
			this.bus = bus;
			this.diskImage = diskImage;
		}
	}

	/*
	 * Members
	 */

	protected final List<HardDisk> hdds = new ArrayList<>();

	private final List<OperatingSystem> osList;

	private OperatingSystem os = null;

	protected String displayName = null;
	/*
	 * Guettas
	 */

	/**
	 * Get operating system of this VM.
	 */
	public OperatingSystem getOs() {
		return os;
	}

	/**
	 * Get all hard disks of this VM.
	 */
	public List<HardDisk> getHdds() {
		return Collections.unmodifiableList(hdds);
	}

	/**
	 * Get display name of VM.
	 */
	public String getDisplayName() {
		return displayName;
	}

	/**
	 * 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();

	public final ByteBuffer getFilteredDefinition() {
		return ByteBuffer.wrap(getFilteredDefinitionArray());
	}

	/*
	 * Methods
	 */

	public VmMetaData(List<OperatingSystem> osList) {
		this.osList = osList;
	}

	/**
	 * 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
	 */
	protected final void setOs(String virtId, String virtOsId) {
		OperatingSystem lazyMatch = null;
		for (OperatingSystem os : osList) {
			if (os.getVirtualizerOsId() == null)
				continue;
			for (Entry<String, String> entry : os.getVirtualizerOsId().entrySet()) {
				if (!entry.getValue().equals(virtOsId))
					continue;
				if (entry.getKey().equals(virtId)) {
					this.os = os;
					return;
				} else {
					lazyMatch = os;
				}
			}
		}
		this.os = lazyMatch;
	}

	public abstract void reWrite();

	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.
	 */
	public abstract void applySettingsForLocalEdit();

	// meta object needed when reading vm from file
	public static VmMetaData getInstance(List<OperatingSystem> osList, File file) throws IOException {
		try {
			return new VmwareMetaData(osList, file);
		} catch (UnsupportedVirtualizerFormatException e) {
			LOGGER.debug("Disk file not .vmdk");
		}
		try {
			return new VboxMetaData(osList, file);
		} catch (UnsupportedVirtualizerFormatException e) {
			LOGGER.debug("Disk file not .vdi");
		}
		LOGGER.error("Unsupported disk file format!");
		return null;
	}

	// meta object needed when reading from configarray
	public static VmMetaData getInstance(List<OperatingSystem> osList, byte[] vmContent, int length)
			throws IOException {
		try {
			return new VmwareMetaData(osList, vmContent, length);
		} catch (UnsupportedVirtualizerFormatException e) {
			LOGGER.debug("Machine description not in .vmx format.", e);
		}
		try {
			return new VboxMetaData(osList, vmContent, length);
		} catch (UnsupportedVirtualizerFormatException e) {
			LOGGER.debug("Machine description not in .vbox format.", e);
		}
		LOGGER.error("Machine description has an unknown format!");
		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);

}