Index: virt-core/src/main/java/org/glassfish/virtualization/commands/RegisterStartup.java =================================================================== --- virt-core/src/main/java/org/glassfish/virtualization/commands/RegisterStartup.java (revision 51007) +++ virt-core/src/main/java/org/glassfish/virtualization/commands/RegisterStartup.java (working copy) @@ -114,10 +114,6 @@ try { VirtualMachine vm = targetGroup.vmByName(virtualMachine); if (vm!=null) { - CountDownLatch latch = vmLifecycle.getStartupLatch(vm.getName()); - if (latch!=null) { - latch.countDown(); - } try { vm.setAddress(InetAddress.getByName(address)); } catch (UnknownHostException e) { @@ -136,6 +132,10 @@ if (customizer!=null) { customizer.start(vm, false); } + CountDownLatch latch = vmLifecycle.getStartupLatch(vm.getName()); + if (latch!=null) { + latch.countDown(); + } } } catch(VirtException e) { RuntimeContext.logger.log(Level.SEVERE, e.getMessage(),e); Index: virt-core/src/main/java/org/glassfish/virtualization/commands/SupplementalStartInstance.java =================================================================== --- virt-core/src/main/java/org/glassfish/virtualization/commands/SupplementalStartInstance.java (revision 51007) +++ virt-core/src/main/java/org/glassfish/virtualization/commands/SupplementalStartInstance.java (working copy) @@ -45,11 +45,8 @@ import org.glassfish.api.admin.AdminCommandContext; import org.glassfish.api.admin.CommandLock; import org.glassfish.api.admin.Supplemental; -import org.glassfish.common.util.admin.AuthTokenManager; import org.glassfish.hk2.Factory; import org.glassfish.virtualization.config.Virtualizations; -import org.glassfish.virtualization.spi.Disk; -import org.glassfish.virtualization.spi.FileOperations; import org.glassfish.virtualization.runtime.VirtualMachineLifecycle; import org.glassfish.virtualization.spi.*; import org.glassfish.virtualization.util.RuntimeContext; @@ -58,14 +55,6 @@ import org.jvnet.hk2.annotations.Service; import org.jvnet.hk2.component.PerLookup; -import java.io.File; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.util.Properties; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; - /** * hidden command to start the virtual machine when the instance is requested to start. * @@ -89,109 +78,31 @@ @Inject(optional = true) Virtualizations virtualizations; - @Inject - Disk custDisk; + @Param(name="_vmStartup", optional=true, defaultValue = "true") + private String vmStartup; - @Inject - AuthTokenManager authTokenManager; - @Override public void execute(AdminCommandContext context) { + if (!Boolean.valueOf(vmStartup) || instanceName.indexOf("_")==-1 || groups==null) { + context.getActionReport().setActionExitCode(ActionReport.ExitCode.SUCCESS); + return; + } + if (virtualizations==null || instanceName.indexOf("_")==-1) { context.getActionReport().setActionExitCode(ActionReport.ExitCode.SUCCESS); return; } final String groupName = instanceName.substring(0, instanceName.indexOf("_")); - final String machineName = instanceName.substring(instanceName.indexOf("_")+1, instanceName.lastIndexOf("_")); final String vmName = instanceName.substring(instanceName.lastIndexOf("_")+1, instanceName.length()-"Instance".length()); ServerPool group = groups.byName(groupName); try { VirtualMachine vm = group.vmByName(vmName); - VirtualMachineInfo vmInfo = vm.getInfo(); - if (Machine.State.RESUMING.equals(vmInfo.getState()) || Machine.State.READY.equals(vmInfo.getState())) { - context.getActionReport().setActionExitCode(ActionReport.ExitCode.SUCCESS); - return; - } + vmLifecycle.get().start(vm); } catch (VirtException e) { RuntimeContext.logger.warning(e.getMessage()); } - - File machineDisks = RuntimeContext.absolutize(new File(virtualizations.getDisksLocation(), group.getName())); - machineDisks = new File(machineDisks, machineName); - File custDir = new File(machineDisks, vmName + "cust"); - File custFile = new File(custDir, "customization"); - - try { - if (custFile.exists() && group instanceof PhysicalServerPool) { - - // only if ISO customization is present (ie not for JRVE) - // this needs to be moved to virtualization specific code. - - Properties customizedProperties = new Properties(); - - // read existing properties - FileReader fileReader = null; - try { - fileReader = new FileReader(custFile); - customizedProperties.load(fileReader); - } finally { - fileReader.close(); - } - - // we create 3 tokens as the starting VM may invoke 3 commands, one to change IP address - // one to notify of startup, one for the start-local-instance - customizedProperties.put("AuthToken", authTokenManager.createToken()); - customizedProperties.put("AuthToken2", authTokenManager.createToken()); - customizedProperties.put("StartToken", authTokenManager.createToken()); - - // write them out - FileWriter fileWriter = null; - try { - fileWriter = new FileWriter(new File(custDir, "customization")); - customizedProperties.store(fileWriter, "Customization properties for virtual machine" + vmName); - } finally { - fileWriter.close(); - } - - final File custISOFile = new File(machineDisks, vmName + "cust.iso"); - custDisk.createISOFromDirectory(custDir, custISOFile); - - PhysicalServerPool physicalGroup = (PhysicalServerPool) group; - final Machine machine = physicalGroup.byName(machineName); - machine.execute(new MachineOperations() { - @Override - public Object run(FileOperations fileOperations) throws IOException { - fileOperations.delete(machine.getConfig().getDisksLocation() + "/" + vmName + "cust.iso"); - fileOperations.copy(custISOFile, new File(machine.getConfig().getDisksLocation())); - return null; - } - }); - } - - VirtualMachine vm = group.vmByName(vmName); - - CountDownLatch latch = vmLifecycle.get().inStartup(vm.getName()); - vmLifecycle.get().start(vm); - try { - latch.await(90, TimeUnit.SECONDS); - } catch (InterruptedException e) { - context.getActionReport().failure(RuntimeContext.logger, "Virtual machine " + vmName + - " took too long to register its startup"); - return; - } - - } catch(Exception e) { - e.printStackTrace(); - context.getActionReport().failure(RuntimeContext.logger, e.getMessage(), e); - try { - custDisk.umount(); - } catch(IOException exe) { - // - } - return; - } context.getActionReport().setActionExitCode(ActionReport.ExitCode.SUCCESS); //String nodeName = instanceName.substring(0, instanceName.length() - "Instance".length()); //rtContext.executeAdminCommand(context.getActionReport(), "ping-node-ssh", nodeName); Index: virt-core/src/main/java/org/glassfish/virtualization/runtime/VirtualMachineLifecycle.java =================================================================== --- virt-core/src/main/java/org/glassfish/virtualization/runtime/VirtualMachineLifecycle.java (revision 51007) +++ virt-core/src/main/java/org/glassfish/virtualization/runtime/VirtualMachineLifecycle.java (working copy) @@ -42,17 +42,33 @@ import com.sun.enterprise.config.serverbeans.Cluster; import com.sun.enterprise.config.serverbeans.Domain; +import org.glassfish.common.util.admin.AuthTokenManager; import org.glassfish.virtualization.config.VirtualMachineConfig; +import org.glassfish.virtualization.config.Virtualizations; +import org.glassfish.virtualization.spi.Disk; +import org.glassfish.virtualization.spi.FileOperations; +import org.glassfish.virtualization.spi.Machine; +import org.glassfish.virtualization.spi.MachineOperations; +import org.glassfish.virtualization.spi.PhysicalServerPool; +import org.glassfish.virtualization.spi.ServerPool; import org.glassfish.virtualization.spi.TemplateInstance; import org.glassfish.virtualization.spi.TemplateRepository; import org.glassfish.virtualization.spi.VirtException; import org.glassfish.virtualization.spi.VirtualMachine; +import org.glassfish.virtualization.spi.VirtualMachineInfo; +import org.glassfish.virtualization.util.RuntimeContext; import org.jvnet.hk2.annotations.Inject; import org.jvnet.hk2.annotations.Service; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; import java.util.HashMap; import java.util.Map; +import java.util.Properties; import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; /** * Service to register virtual machine lifecycle tokens. @@ -64,7 +80,15 @@ final TemplateRepository templateRepository; final Map inStartup = new HashMap(); final Domain domain; + @Inject(optional = true) + private Virtualizations virtualizations; + @Inject + Disk custDisk; + + @Inject + AuthTokenManager authTokenManager; + public VirtualMachineLifecycle(@Inject TemplateRepository templateRepository, @Inject Domain domain) { this.templateRepository = templateRepository; this.domain = domain; @@ -92,7 +116,79 @@ } public void start(VirtualMachine vm) throws VirtException { - vm.start(); + VirtualMachineInfo vmInfo = vm.getInfo(); + if (Machine.State.SUSPENDED.equals(vmInfo.getState()) || + Machine.State.SUSPENDING.equals(vmInfo.getState())) { + final String vmName = vm.getName(); + final Machine machine = vm.getMachine(); + ServerPool group = vm.getServerPool(); + File machineDisks = RuntimeContext.absolutize( + new File(virtualizations.getDisksLocation(), group.getName())); + machineDisks = new File(machineDisks, machine.getName()); + File custDir = new File(machineDisks, vm.getName() + "cust"); + File custFile = new File(custDir, "customization"); + try { + if (custFile.exists() && group instanceof PhysicalServerPool) { + + // only if ISO customization is present (ie not for JRVE) + // this needs to be moved to virtualization specific code. + + Properties customizedProperties = new Properties(); + + // read existing properties + FileReader fileReader = null; + try { + fileReader = new FileReader(custFile); + customizedProperties.load(fileReader); + } finally { + fileReader.close(); + } + + // we create 3 tokens as the starting VM may invoke 3 commands, one to change IP address + // one to notify of startup, one for the start-local-instance + customizedProperties.put("AuthToken", authTokenManager.createToken()); + customizedProperties.put("AuthToken2", authTokenManager.createToken()); + customizedProperties.put("StartToken", authTokenManager.createToken()); + + // write them out + FileWriter fileWriter = null; + try { + fileWriter = new FileWriter(new File(custDir, "customization")); + customizedProperties.store(fileWriter, "Customization properties for virtual machine" + vmName); + } finally { + fileWriter.close(); + } + + final File custISOFile = new File(machineDisks, vmName + "cust.iso"); + custDisk.createISOFromDirectory(custDir, custISOFile); + + PhysicalServerPool physicalGroup = (PhysicalServerPool) group; +// final Machine machine = physicalGroup.byName(machineName); + machine.execute(new MachineOperations() { + @Override + public Object run(FileOperations fileOperations) throws IOException { + fileOperations.delete(machine.getConfig().getDisksLocation() + "/" + vmName + "cust.iso"); + fileOperations.copy(custISOFile, new File(machine.getConfig().getDisksLocation())); + return null; + } + }); + } + CountDownLatch latch = inStartup(vmName); + vm.start(); + try { + latch.await(90, TimeUnit.SECONDS); + } catch (InterruptedException e) { + } + } catch (Exception e) { + e.printStackTrace(); + try { + custDisk.umount(); + } catch (IOException exe) { + // + } + return; + } + } // we do not call the customizer from here since we don't know the // virtual machine address, etc... // so we wait for the register-startup or register-virtual-machine calls Index: libvirt/src/main/java/org/glassfish/virtualization/libvirt/LibVirtLocalMachine.java =================================================================== --- libvirt/src/main/java/org/glassfish/virtualization/libvirt/LibVirtLocalMachine.java (revision 51007) +++ libvirt/src/main/java/org/glassfish/virtualization/libvirt/LibVirtLocalMachine.java (working copy) @@ -474,7 +474,7 @@ new ListenableFutureImpl(latch, vm, source); future.fireEvent(AllocationPhase.VM_START); - vmLifecycle.start(vm); + vm.start(); return future; } catch(VirtException e) {