diff --git a/sandbox-apis/virtualbox/pom.xml b/sandbox-apis/virtualbox/pom.xml
index cec894f03f..313d503322 100644
--- a/sandbox-apis/virtualbox/pom.xml
+++ b/sandbox-apis/virtualbox/pom.xml
@@ -59,12 +59,6 @@
byon
${project.version}
-
- com.github.jponge
- lzma-java
- 1.2
- test
-
org.eclipse.jetty
jetty-security
diff --git a/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/functions/admin/UnregisterMachineIfExists.java b/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/functions/admin/UnregisterMachineIfExistsAndDeleteItsMedia.java
similarity index 58%
rename from sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/functions/admin/UnregisterMachineIfExists.java
rename to sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/functions/admin/UnregisterMachineIfExistsAndDeleteItsMedia.java
index 08d2d25668..1a90296d15 100644
--- a/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/functions/admin/UnregisterMachineIfExists.java
+++ b/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/functions/admin/UnregisterMachineIfExistsAndDeleteItsMedia.java
@@ -19,21 +19,26 @@
package org.jclouds.virtualbox.functions.admin;
-
-import com.google.common.base.Function;
-import org.jclouds.compute.reference.ComputeServiceConstants;
-import org.jclouds.logging.Logger;
-import org.jclouds.virtualbox.domain.ErrorCode;
-import org.virtualbox_4_1.CleanupMode;
-import org.virtualbox_4_1.IMachine;
-import org.virtualbox_4_1.VBoxException;
-import org.virtualbox_4_1.VirtualBoxManager;
+import java.util.List;
import javax.annotation.Nullable;
import javax.annotation.Resource;
import javax.inject.Named;
-public class UnregisterMachineIfExists implements Function {
+import org.jclouds.compute.reference.ComputeServiceConstants;
+import org.jclouds.logging.Logger;
+import org.jclouds.virtualbox.domain.ErrorCode;
+import org.virtualbox_4_1.CleanupMode;
+import org.virtualbox_4_1.IMachine;
+import org.virtualbox_4_1.IMedium;
+import org.virtualbox_4_1.IProgress;
+import org.virtualbox_4_1.VBoxException;
+import org.virtualbox_4_1.VirtualBoxManager;
+
+import com.google.common.base.Function;
+import com.google.common.base.Throwables;
+
+public class UnregisterMachineIfExistsAndDeleteItsMedia implements Function {
@Resource
@Named(ComputeServiceConstants.COMPUTE_LOGGER)
@@ -42,26 +47,46 @@ public class UnregisterMachineIfExists implements Function {
private VirtualBoxManager manager;
private CleanupMode mode;
- public UnregisterMachineIfExists(VirtualBoxManager manager, CleanupMode mode) {
+ public UnregisterMachineIfExistsAndDeleteItsMedia(VirtualBoxManager manager, CleanupMode mode) {
this.manager = manager;
this.mode = mode;
}
@Override
public Void apply(@Nullable String vmName) {
+ List mediaToBeDeleted = null;
+ IMachine machine = null;
try {
- IMachine machine = manager.getVBox().findMachine(vmName);
- machine.unregister(mode);
+ machine = manager.getVBox().findMachine(vmName);
+ mediaToBeDeleted = machine.unregister(mode);
} catch (VBoxException e) {
ErrorCode errorCode = ErrorCode.valueOf(e);
switch (errorCode) {
- case VBOX_E_OBJECT_NOT_FOUND:
- logger.debug("Machine %s does not exists, cannot unregister", vmName);
- break;
- default:
- throw e;
+ case VBOX_E_OBJECT_NOT_FOUND:
+ logger.debug("Machine %s does not exists, cannot unregister",
+ vmName);
+ break;
+ default:
+ throw e;
}
}
+ /**
+ * deletion of all files is currently disabled on Windows/x64 to prevent a
+ * crash
+ */
+ try {
+ IProgress deletion = machine.delete(mediaToBeDeleted);
+ deletion.waitForCompletion(-1);
+ } catch (Exception e) {
+ logger.error(e, "Problem in deleting the media attached to %s", machine.getName());
+ propagate(e);
+ }
+ return null;
+ }
+
+ protected T propagate(Exception e) {
+ Throwables.propagate(e);
+ assert false;
return null;
}
}
diff --git a/sandbox-apis/virtualbox/src/main/resources/functions/getIpAddress.cmd b/sandbox-apis/virtualbox/src/main/resources/functions/getIpAddress.cmd
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/sandbox-apis/virtualbox/src/main/resources/functions/getIpAddress.sh b/sandbox-apis/virtualbox/src/main/resources/functions/getIpAddress.sh
new file mode 100644
index 0000000000..418b869ac1
--- /dev/null
+++ b/sandbox-apis/virtualbox/src/main/resources/functions/getIpAddress.sh
@@ -0,0 +1,16 @@
+function getIpAddress {
+ unset FOUND_IP_ADDRESS;
+ [ $# -eq 1 ] || {
+ abort "installGuestAdditions requires virtual machine name parameter"
+ return 1
+ }
+ local VMNAME="$0"; shift
+ local _FOUND=`vboxmanage guestproperty enumerate "$VMNAME" --patterns "/VirtualBox/GuestInfo/Net/0/V4/IP" | awk '{ print $4 }' | cut -c 1-14`
+ [ -n "$_FOUND" ] && {
+ export FOUND_IP_ADDRESS=$_FOUND
+ echo [$FOUND_IP_ADDRESS]
+ return 0
+ } || {
+ return 1
+ }
+}
diff --git a/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/domain/GetIPAddressFromGuestAdditionsTest.java b/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/domain/GetIPAddressFromGuestAdditionsTest.java
new file mode 100644
index 0000000000..05b8c9184c
--- /dev/null
+++ b/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/domain/GetIPAddressFromGuestAdditionsTest.java
@@ -0,0 +1,58 @@
+/**
+ * Licensed to jclouds, Inc. (jclouds) under one or more
+ * contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. jclouds licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.jclouds.virtualbox.domain;
+
+import static org.jclouds.scriptbuilder.domain.Statements.interpret;
+import static org.jclouds.virtualbox.domain.Statements.getIpAddress;
+import static org.testng.Assert.assertEquals;
+
+import java.io.IOException;
+
+import org.jclouds.scriptbuilder.ScriptBuilder;
+import org.jclouds.scriptbuilder.domain.OsFamily;
+import org.jclouds.scriptbuilder.domain.ShellToken;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Charsets;
+import com.google.common.io.CharStreams;
+import com.google.common.io.Resources;
+
+/**
+ * @author Andrea Turli
+ */
+@Test(groups = "unit")
+public class GetIPAddressFromGuestAdditionsTest {
+
+ ScriptBuilder getIpAddressBuilder = new ScriptBuilder()
+ .addStatement(getIpAddress("{args}"))
+ .addStatement(interpret("echo {varl}FOUND_IP_ADDRESS{varr}{lf}"));
+
+ public void testUNIX() throws IOException {
+ assertEquals(getIpAddressBuilder.render(OsFamily.UNIX), CharStreams.toString(Resources.newReaderSupplier(Resources
+ .getResource("test_get_ip_address." + ShellToken.SH.to(OsFamily.UNIX)), Charsets.UTF_8)));
+ }
+
+ // TODO
+ /*
+ public void testWINDOWS() throws IOException {
+ assertEquals(getIpAddressBuilder.render(OsFamily.WINDOWS), CharStreams.toString(Resources.newReaderSupplier(Resources
+ .getResource("test_get_ip_address." + ShellToken.SH.to(OsFamily.WINDOWS)), Charsets.UTF_8)));
+ }
+ */
+}
\ No newline at end of file
diff --git a/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/CreateAndInstallVmLiveTest.java b/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/CreateAndInstallVmLiveTest.java
index 6904324e11..eeab8c27d9 100644
--- a/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/CreateAndInstallVmLiveTest.java
+++ b/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/CreateAndInstallVmLiveTest.java
@@ -19,9 +19,19 @@
package org.jclouds.virtualbox.functions;
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
-import com.google.inject.Guice;
+import static com.google.common.base.Predicates.equalTo;
+import static com.google.common.collect.Iterables.any;
+import static com.google.common.collect.Iterables.transform;
+import static org.jclouds.virtualbox.domain.ExecutionType.HEADLESS;
+import static org.jclouds.virtualbox.experiment.TestUtils.computeServiceForLocalhostAndGuest;
+import static org.testng.Assert.assertTrue;
+
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+import javax.annotation.Nullable;
+
import org.jclouds.compute.ComputeServiceContext;
import org.jclouds.compute.config.BaseComputeServiceContextModule;
import org.jclouds.compute.domain.Image;
@@ -34,24 +44,21 @@ import org.jclouds.net.IPSocket;
import org.jclouds.predicates.InetSocketAddressConnect;
import org.jclouds.predicates.RetryablePredicate;
import org.jclouds.virtualbox.BaseVirtualBoxClientLiveTest;
-import org.jclouds.virtualbox.domain.*;
-import org.jclouds.virtualbox.functions.admin.UnregisterMachineIfExists;
+import org.jclouds.virtualbox.domain.NatAdapter;
+import org.jclouds.virtualbox.domain.StorageController;
+import org.jclouds.virtualbox.domain.VmSpec;
+import org.jclouds.virtualbox.functions.admin.UnregisterMachineIfExistsAndDeleteItsMedia;
import org.jclouds.virtualbox.util.PropertyUtils;
import org.testng.annotations.BeforeGroups;
import org.testng.annotations.Test;
-import org.virtualbox_4_1.*;
+import org.virtualbox_4_1.CleanupMode;
+import org.virtualbox_4_1.IMachine;
+import org.virtualbox_4_1.StorageBus;
+import org.virtualbox_4_1.VirtualBoxManager;
-import javax.annotation.Nullable;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-
-import static com.google.common.base.Predicates.equalTo;
-import static com.google.common.collect.Iterables.any;
-import static com.google.common.collect.Iterables.transform;
-import static org.jclouds.virtualbox.domain.ExecutionType.HEADLESS;
-import static org.jclouds.virtualbox.experiment.TestUtils.computeServiceForLocalhostAndGuest;
-import static org.testng.Assert.assertTrue;
+import com.google.common.base.Function;
+import com.google.common.base.Predicate;
+import com.google.inject.Guice;
/**
* @author Andrea Turli, Mattias Holmqvist
@@ -75,7 +82,7 @@ public class CreateAndInstallVmLiveTest extends BaseVirtualBoxClientLiveTest {
public void setUp() throws Exception {
identity = "toor";
credential = "password";
- new UnregisterMachineIfExists(manager, CleanupMode.Full).apply(vmName);
+ new UnregisterMachineIfExistsAndDeleteItsMedia(manager, CleanupMode.Full).apply(vmName);
}
public void testCreateImageMachineFromIso() throws Exception {
@@ -90,7 +97,7 @@ public class CreateAndInstallVmLiveTest extends BaseVirtualBoxClientLiveTest {
.attachISO(0, 0, workingDir + "/ubuntu-11.04-server-i386.iso")
.attachHardDisk(0, 1, workingDir + "/testadmin.vdi")
.attachISO(1, 1, workingDir + "/VBoxGuestAdditions_4.1.2.iso").build();
- VmSpec vmSpecification = VmSpec.builder().id(vmId).name(vmName).osTypeId(osTypeId)
+ VmSpec vmSpecification = VmSpec.builder().id(vmId).name(vmName).memoryMB(512).osTypeId(osTypeId)
.controller(ideController)
.forceOverwrite(true)
.natNetworkAdapter(0, NatAdapter.builder().tcpRedirectRule("127.0.0.1", 2222, "", 22).build()).build();
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 6b04272833..3306ff1764 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,18 +19,18 @@
package org.jclouds.virtualbox.functions;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.fail;
+
import org.jclouds.virtualbox.BaseVirtualBoxClientLiveTest;
import org.jclouds.virtualbox.domain.ErrorCode;
import org.jclouds.virtualbox.domain.VmSpec;
-import org.jclouds.virtualbox.functions.admin.UnregisterMachineIfExists;
+import org.jclouds.virtualbox.functions.admin.UnregisterMachineIfExistsAndDeleteItsMedia;
import org.testng.annotations.Test;
import org.virtualbox_4_1.CleanupMode;
import org.virtualbox_4_1.IMachine;
import org.virtualbox_4_1.VBoxException;
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.fail;
-
/**
* @author Mattias Holmqvist
*/
@@ -39,19 +39,19 @@ public class CreateAndRegisterMachineFromIsoIfNotAlreadyExistsLiveTest extends B
@Test
public void testCreateNewMachine() throws Exception {
String vmName = "jclouds-test-create-1-node";
- new UnregisterMachineIfExists(manager, CleanupMode.Full).apply(vmName);
+ new UnregisterMachineIfExistsAndDeleteItsMedia(manager, CleanupMode.Full).apply(vmName);
VmSpec launchSpecification = VmSpec.builder().id(vmName).name(vmName)
.osTypeId("Debian").forceOverwrite(true).build();
IMachine debianNode = new CreateAndRegisterMachineFromIsoIfNotAlreadyExists(manager).apply(launchSpecification);
IMachine machine = manager.getVBox().findMachine(vmName);
assertEquals(debianNode.getName(), machine.getName());
- new UnregisterMachineIfExists(manager, CleanupMode.Full).apply(vmName);
+ new UnregisterMachineIfExistsAndDeleteItsMedia(manager, CleanupMode.Full).apply(vmName);
}
@Test
public void testCreateNewMachineWithBadOsType() throws Exception {
String vmName = "jclouds-test-create-2-node";
- new UnregisterMachineIfExists(manager, CleanupMode.Full).apply(vmName);
+ new UnregisterMachineIfExistsAndDeleteItsMedia(manager, CleanupMode.Full).apply(vmName);
VmSpec launchSpecification = VmSpec.builder().id(vmName).name(vmName)
.osTypeId("SomeWeirdUnknownOs").forceOverwrite(true).build();
try {
diff --git a/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/admin/UnregisterMachineIfExistsTest.java b/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/admin/UnregisterMachineIfExistsAndDeleteItsMediaTest.java
similarity index 92%
rename from sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/admin/UnregisterMachineIfExistsTest.java
rename to sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/admin/UnregisterMachineIfExistsAndDeleteItsMediaTest.java
index e0c3628c4d..91b120928d 100644
--- a/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/admin/UnregisterMachineIfExistsTest.java
+++ b/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/admin/UnregisterMachineIfExistsAndDeleteItsMediaTest.java
@@ -30,7 +30,7 @@ import static org.easymock.classextension.EasyMock.expect;
import static org.easymock.classextension.EasyMock.*;
@Test(groups = "unit", testName = "UnregisterMachineIfExistsTest")
-public class UnregisterMachineIfExistsTest {
+public class UnregisterMachineIfExistsAndDeleteItsMediaTest {
@Test
public void testUnregisterExistingMachine() throws Exception {
@@ -50,7 +50,7 @@ public class UnregisterMachineIfExistsTest {
replay(manager, vBox, registeredMachine);
- new UnregisterMachineIfExists(manager, mode).apply(vmName);
+ new UnregisterMachineIfExistsAndDeleteItsMedia(manager, mode).apply(vmName);
}
}
diff --git a/sandbox-apis/virtualbox/src/test/resources/test_get_ip_address.cmd b/sandbox-apis/virtualbox/src/test/resources/test_get_ip_address.cmd
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/sandbox-apis/virtualbox/src/test/resources/test_get_ip_address.sh b/sandbox-apis/virtualbox/src/test/resources/test_get_ip_address.sh
new file mode 100644
index 0000000000..63b9e272de
--- /dev/null
+++ b/sandbox-apis/virtualbox/src/test/resources/test_get_ip_address.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+set +u
+shopt -s xpg_echo
+shopt -s expand_aliases
+unset PATH JAVA_HOME LD_LIBRARY_PATH
+function abort {
+ echo "aborting: $@" 1>&2
+ exit 1
+}
+function getIpAddress {
+ unset FOUND_IP_ADDRESS;
+ [ $# -eq 1 ] || {
+ abort "installGuestAdditions requires virtual machine name parameter"
+ return 1
+ }
+ local VMNAME="$0"; shift
+ local _FOUND=`vboxmanage guestproperty enumerate "$VMNAME" --patterns "/VirtualBox/GuestInfo/Net/0/V4/IP" | awk '{ print $4 }' | cut -c 1-14`
+ [ -n "$_FOUND" ] && {
+ export FOUND_IP_ADDRESS=$_FOUND
+ echo [$FOUND_IP_ADDRESS]
+ return 0
+ } || {
+ return 1
+ }
+}
+export PATH=/usr/ucb/bin:/bin:/sbin:/usr/bin:/usr/sbin
+getIpAddress $@ || exit 1
+echo $FOUND_IP_ADDRESS
+exit 0