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);
+ }
+
}