package hudson.plugins.pxe;
import hudson.Extension;
import org.jvnet.hudson.tftpd.Data;
import org.kohsuke.loopy.iso9660.ISO9660FileSystem;
import org.kohsuke.stapler.DataBoundConstructor;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import static hudson.util.FormValidation.error;
/**
* Boots VMWare ESXi.
*
* @author Kohsuke Kawaguchi
*/
public class VMWareESXiBootConfiguration extends IsoBasedBootConfiguration {
@DataBoundConstructor
public VMWareESXiBootConfiguration(File iso) {
super(iso);
}
@Override
protected String getIdSeed() {
return "esxi";
}
@Override
public Data tftp(String fileName) throws IOException {
// TODO: closing this file system voids FileEntryData. Fix it
ISO9660FileSystem fs = new ISO9660FileSystem(iso, false);
return new FileEntryData(fs.getRootEntry().grab(fileName));
}
@Override
public String getPxeLinuxConfigFragment() throws IOException {
return String.format("LABEL %1$s\n" +
" MENU LABEL %2$s\n" +
" KERNEL mboot.c32\n" +
// the following list is taken from 4.0. Maybe we should parse isolinux.cfg?
" APPEND %3$s/vmkboot.gz --- %3$s/vmkernel.gz --- %3$s/sys.vgz --- %3$s/cim.vgz --- %3$s/ienviron.tgz --- %3$s/image.tgz --- %3$s/install.tgz\n",
getId(), getDisplayName(), getId());
}
@Extension
public static class DescriptorImpl extends IsoBasedBootConfigurationDescriptor {
public String getDisplayName() {
return "VMWare ESXi";
}
protected String getReleaseInfo(File iso) throws IOException {
ISO9660FileSystem fs=null;
try {
try {
fs = new ISO9660FileSystem(iso,false);
} catch (IOException e) {
LOGGER.log(Level.INFO,iso+" isn't an ISO file?",e);
throw error(iso+" doesn't look like an ISO file");
}
if(fs.get("/cim.vgz")==null || fs.get("/vmkboot.gz")==null)
throw error(iso+" doesn't look like an ESXi CD image");
return "VMWare ESXi";
} finally {
if(fs!=null)
fs.close();
}
}
}
private static final Logger LOGGER = Logger.getLogger(VMWareESXiBootConfiguration.class.getName());
}