diff --git a/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/util/MachineUtils.java b/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/util/MachineUtils.java index 0d1bc298ca..1ebf921860 100644 --- a/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/util/MachineUtils.java +++ b/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/util/MachineUtils.java @@ -25,6 +25,7 @@ import org.virtualbox_4_1.ISession; import org.virtualbox_4_1.LockType; import org.virtualbox_4_1.VBoxException; import org.virtualbox_4_1.VirtualBoxManager; +import org.virtualbox_4_1.jaxws.SessionState; import com.google.common.base.Function; @@ -131,4 +132,52 @@ public class MachineUtils { return null; } } + + /** + * Unlocks the machine and executes the given function using the machine matching the given id. + * Since the machine is unlocked it is possible to delete the IMachine. + *

+ * + * @param manager the VirtualBoxManager + * @param machineId the id of the machine + * @param function the function to execute + * @return the result from applying the function to the machine. + */ + public static T unlockMachineAndApply(VirtualBoxManager manager, final String machineId, + final Function function) { + try { + ISession session = manager.getSessionObject(); + IMachine immutableMachine = manager.getVBox().findMachine(machineId); + if(immutableMachine.getSessionState().equals(SessionState.LOCKED)) + session.unlockMachine(); + + return function.apply(immutableMachine); + + } catch (VBoxException e) { + throw new RuntimeException(String.format("error applying %s to %s: %s", function, machineId, + e.getMessage()), e); + } + } + + /** + * Unlocks the machine and executes the given function, if the machine is registered. + * Since the machine is unlocked it is possible to delete the machine. + *

+ * + * @param manager the VirtualBoxManager + * @param machineId the id of the machine + * @param function the function to execute + * @return the result from applying the function to the session. + */ + public static T unlockMachineAndApplyOrReturnNullIfNotRegistered(VirtualBoxManager manager, String machineId, + Function function) { + try { + return unlockMachineAndApply(manager, machineId, function); + } catch (RuntimeException e) { + VBoxException vbex = Throwables2.getFirstThrowableOfType(e, VBoxException.class); + if (vbex != null && vbex.getMessage().indexOf("not find a registered") == -1) + throw e; + return null; + } + } } diff --git a/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/CloneAndRegisterMachineFromIsoIfNotAlreadyExistsLiveTest.java b/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/CloneAndRegisterMachineFromIsoIfNotAlreadyExistsLiveTest.java index 3bec904af8..2103222493 100644 --- a/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/CloneAndRegisterMachineFromIsoIfNotAlreadyExistsLiveTest.java +++ b/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/CloneAndRegisterMachineFromIsoIfNotAlreadyExistsLiveTest.java @@ -20,9 +20,8 @@ package org.jclouds.virtualbox.functions; import static org.jclouds.virtualbox.experiment.TestUtils.computeServiceForLocalhostAndGuest; -import static org.jclouds.virtualbox.util.MachineUtils.lockMachineAndApplyOrReturnNullIfNotRegistered; +import static org.jclouds.virtualbox.util.MachineUtils.unlockMachineAndApplyOrReturnNullIfNotRegistered; import static org.testng.Assert.assertEquals; -import static org.virtualbox_4_1.LockType.Write; import org.jclouds.compute.ComputeServiceContext; import org.jclouds.domain.Credentials; @@ -49,11 +48,11 @@ public class CloneAndRegisterMachineFromIsoIfNotAlreadyExistsLiveTest extends private static final boolean IS_LINKED_CLONE = true; private String vmId = "jclouds-image-iso-1"; - private String osTypeId = "DEBIAN"; + private String osTypeId = ""; private String guestId = "guest"; private String hostId = "host"; - private String vmName = "jclouds-image-virtualbox-iso-to-machine-test"; + private String vmName = "jclouds-virtualbox-clone-test"; private String cloneName = vmName + "_clone"; private VmSpec clonedVmSpec; @@ -84,7 +83,8 @@ public class CloneAndRegisterMachineFromIsoIfNotAlreadyExistsLiveTest extends manager, workingDir, clonedVmSpec, IS_LINKED_CLONE).apply(master); assertEquals(clone.getName(), clonedVmSpec.getVmName()); for (VmSpec spec : ImmutableSet.of(clonedVmSpec, new IMachineToVmSpec().apply(master))) - lockMachineAndApplyOrReturnNullIfNotRegistered(manager, Write, spec.getVmName(), new UnregisterMachineIfExistsAndDeleteItsMedia(spec)); + unlockMachineAndApplyOrReturnNullIfNotRegistered(manager, spec.getVmName(), new UnregisterMachineIfExistsAndDeleteItsMedia(spec)); + } private IMachine getMasterNode(VirtualBoxManager manager, diff --git a/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/CreateAndRegisterMachineFromIsoIfNotAlreadyExistsLiveTest.java b/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/CreateAndRegisterMachineFromIsoIfNotAlreadyExistsLiveTest.java index e3bcadc926..66f6ac7217 100644 --- a/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/CreateAndRegisterMachineFromIsoIfNotAlreadyExistsLiveTest.java +++ b/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/CreateAndRegisterMachineFromIsoIfNotAlreadyExistsLiveTest.java @@ -19,10 +19,9 @@ package org.jclouds.virtualbox.functions; -import static org.jclouds.virtualbox.util.MachineUtils.lockMachineAndApplyOrReturnNullIfNotRegistered; +import static org.jclouds.virtualbox.util.MachineUtils.unlockMachineAndApplyOrReturnNullIfNotRegistered; import static org.testng.Assert.assertEquals; import static org.testng.Assert.fail; -import static org.virtualbox_4_1.LockType.Write; import org.jclouds.virtualbox.BaseVirtualBoxClientLiveTest; import org.jclouds.virtualbox.domain.ErrorCode; @@ -70,14 +69,12 @@ public class CreateAndRegisterMachineFromIsoIfNotAlreadyExistsLiveTest extends VmSpec launchSpecification = VmSpec.builder().id(vmName).name(vmName) .memoryMB(512).controller(ideController).cleanUpMode(mode) .osTypeId("Debian").forceOverwrite(true).build(); - lockMachineAndApplyOrReturnNullIfNotRegistered(manager, Write, launchSpecification.getVmName(), new UnregisterMachineIfExistsAndDeleteItsMedia(launchSpecification)); - + unlockMachineAndApplyOrReturnNullIfNotRegistered(manager, launchSpecification.getVmName(), new UnregisterMachineIfExistsAndDeleteItsMedia(launchSpecification)); IMachine debianNode = new CreateAndRegisterMachineFromIsoIfNotAlreadyExists( manager, workingDir).apply(launchSpecification); IMachine machine = manager.getVBox().findMachine(vmName); assertEquals(debianNode.getName(), machine.getName()); - lockMachineAndApplyOrReturnNullIfNotRegistered(manager, Write, launchSpecification.getVmName(), new UnregisterMachineIfExistsAndDeleteItsMedia(launchSpecification)); - + unlockMachineAndApplyOrReturnNullIfNotRegistered(manager, launchSpecification.getVmName(), new UnregisterMachineIfExistsAndDeleteItsMedia(launchSpecification)); } @Test @@ -86,8 +83,8 @@ public class CreateAndRegisterMachineFromIsoIfNotAlreadyExistsLiveTest extends VmSpec launchSpecification = VmSpec.builder().id(vmName).name(vmName) .memoryMB(512).controller(ideController).cleanUpMode(mode) .osTypeId("SomeWeirdUnknownOs").forceOverwrite(true).build(); - lockMachineAndApplyOrReturnNullIfNotRegistered(manager, Write, launchSpecification.getVmName(), new UnregisterMachineIfExistsAndDeleteItsMedia(launchSpecification)); - + unlockMachineAndApplyOrReturnNullIfNotRegistered(manager, launchSpecification.getVmName(), new UnregisterMachineIfExistsAndDeleteItsMedia(launchSpecification)); + //new UnregisterMachineIfExistsAndDeleteItsMedia(launchSpecification).apply(manager.getVBox().findMachine(vmName)); try { new CreateAndRegisterMachineFromIsoIfNotAlreadyExists(manager, workingDir) .apply(launchSpecification); diff --git a/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/CreateMediumIfNotAlreadyExistsLiveTest.java b/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/CreateMediumIfNotAlreadyExistsLiveTest.java index c38c5d7dc0..e9dc309698 100644 --- a/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/CreateMediumIfNotAlreadyExistsLiveTest.java +++ b/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/CreateMediumIfNotAlreadyExistsLiveTest.java @@ -30,6 +30,8 @@ import org.jclouds.virtualbox.domain.ErrorCode; import org.jclouds.virtualbox.domain.HardDisk; import org.testng.annotations.Test; import org.virtualbox_4_1.DeviceType; +import org.virtualbox_4_1.IMedium; +import org.virtualbox_4_1.IProgress; import org.virtualbox_4_1.VBoxException; /** @@ -41,9 +43,10 @@ public class CreateMediumIfNotAlreadyExistsLiveTest extends BaseVirtualBoxClient public void testCreateMedium() throws Exception { String path = System.getProperty("user.home") + "/jclouds-virtualbox-test/test-medium-1.vdi"; HardDisk hardDisk = HardDisk.builder().diskpath(path).controllerPort(0).deviceSlot(0).build(); - new CreateMediumIfNotAlreadyExists(manager, true).apply(hardDisk); + IMedium iMedium = new CreateMediumIfNotAlreadyExists(manager, true).apply(hardDisk); manager.getVBox().findMedium(path, DeviceType.HardDisk); assertFileCanBeDeleted(path); + deleteMediumAndBlockUntilComplete(iMedium); } @Test @@ -63,10 +66,12 @@ public class CreateMediumIfNotAlreadyExistsLiveTest extends BaseVirtualBoxClient public void testCreateSameMediumTwiceWhenUsingOverwrite() throws Exception { String path = System.getProperty("user.home") + "/jclouds-virtualbox-test/test-medium-3.vdi"; HardDisk hardDisk = HardDisk.builder().diskpath(path).controllerPort(0).deviceSlot(0).build(); - new CreateMediumIfNotAlreadyExists(manager, true).apply(hardDisk); - new CreateMediumIfNotAlreadyExists(manager, true).apply(hardDisk); + IMedium iMedium = new CreateMediumIfNotAlreadyExists(manager, true).apply(hardDisk); + iMedium = new CreateMediumIfNotAlreadyExists(manager, true).apply(hardDisk); manager.getVBox().findMedium(path, DeviceType.HardDisk); assertFileCanBeDeleted(path); + deleteMediumAndBlockUntilComplete(iMedium); + } private void assertFileCanBeDeleted(String path) { @@ -74,4 +79,10 @@ public class CreateMediumIfNotAlreadyExistsLiveTest extends BaseVirtualBoxClient boolean mediumDeleted = file.delete(); assertTrue(mediumDeleted); } + + void deleteMediumAndBlockUntilComplete(IMedium medium){ + final IProgress progress = medium.deleteStorage(); + progress.waitForCompletion(-1); + } + }