diff --git a/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/domain/DeviceDetails.java b/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/domain/DeviceDetails.java
new file mode 100644
index 0000000000..7f765c985f
--- /dev/null
+++ b/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/domain/DeviceDetails.java
@@ -0,0 +1,59 @@
+/**
+ * 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 org.virtualbox_4_1.DeviceType;
+
+/**
+ * Represents a specification for a device attachment.
+ *
+ *
+ * From the VirtualBox SDK:
+ *
+ * port:
+ * For an IDE controller, 0 specifies the primary controller and 1 specifies the secondary controller.
+ * For a SCSI controller, this must range from 0 to 15; for a SATA controller, from 0 to 29; for an SAS controller,
+ * from 0 to 7
+ */
+public class DeviceDetails {
+
+ private final int port;
+ private final int deviceSlot;
+ private final DeviceType deviceType;
+
+ public DeviceDetails(int port, int deviceSlot, DeviceType deviceType) {
+ this.port = port;
+ this.deviceSlot = deviceSlot;
+ this.deviceType = deviceType;
+ }
+
+ public int getPort() {
+ return port;
+ }
+
+ public int getDeviceSlot() {
+ return deviceSlot;
+ }
+
+ public DeviceType getDeviceType() {
+ return deviceType;
+ }
+
+}
diff --git a/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/domain/HardDisk.java b/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/domain/HardDisk.java
new file mode 100644
index 0000000000..c8810b73f3
--- /dev/null
+++ b/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/domain/HardDisk.java
@@ -0,0 +1,79 @@
+/**
+ * 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;
+
+/**
+ * A representation of a hard disk in a VirtualBox VM.
+ *
+ * diskPath is an absolute path to the file that is the location of the storage for the hard disk.
+ * diskFormat is any of the formats supported by ISystemProperties.getMediumFormats() in the VirtualBox API.
+ * This call is platform-dependent so the supported formats differ from host to host. The default format used is VDI.
+ * deviceDetails contains information about how the HardDisk is attached to the StorageController.
+ *
+ */
+public class HardDisk {
+
+ public static final String DEFAULT_DISK_FORMAT = "vdi";
+
+ private final String diskFormat;
+ private final String diskPath;
+ private final DeviceDetails deviceDetails;
+
+ public HardDisk(DeviceDetails deviceDetails, String diskPath, String diskFormat) {
+ this.diskPath = diskPath;
+ this.diskFormat = diskFormat;
+ this.deviceDetails = deviceDetails;
+ }
+
+ public String getDiskPath() {
+ return diskPath;
+ }
+
+ public String getDiskFormat() {
+ return diskFormat;
+ }
+
+ public DeviceDetails getDeviceDetails() {
+ return deviceDetails;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ HardDisk hardDisk = (HardDisk) o;
+
+ if (deviceDetails != null ? !deviceDetails.equals(hardDisk.deviceDetails) : hardDisk.deviceDetails != null)
+ return false;
+ if (diskFormat != null ? !diskFormat.equals(hardDisk.diskFormat) : hardDisk.diskFormat != null) return false;
+ if (diskPath != null ? !diskPath.equals(hardDisk.diskPath) : hardDisk.diskPath != null) return false;
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = diskFormat != null ? diskFormat.hashCode() : 0;
+ result = 31 * result + (diskPath != null ? diskPath.hashCode() : 0);
+ result = 31 * result + (deviceDetails != null ? deviceDetails.hashCode() : 0);
+ return result;
+ }
+}
diff --git a/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/domain/IsoImage.java b/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/domain/IsoImage.java
new file mode 100644
index 0000000000..42db77412e
--- /dev/null
+++ b/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/domain/IsoImage.java
@@ -0,0 +1,72 @@
+/**
+ * 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;
+
+/**
+ * Represents an optical medium (DVD) in a VirtualBox VM.
+ *
+ * sourcePath is the location of the .iso file to load the medium from.
+ * deviceDetails contains information about how the Dvd is attached to the StorageController.
+ */
+public class IsoImage {
+ private DeviceDetails deviceDetails;
+ private String sourcePath;
+
+ public IsoImage(DeviceDetails deviceDetails, String sourcePath) {
+ this.deviceDetails = deviceDetails;
+ this.sourcePath = sourcePath;
+ }
+
+ public DeviceDetails getDeviceDetails() {
+ return deviceDetails;
+ }
+
+ public String getSourcePath() {
+ return sourcePath;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ IsoImage dvd = (IsoImage) o;
+
+ if (deviceDetails != null ? !deviceDetails.equals(dvd.deviceDetails) : dvd.deviceDetails != null) return false;
+ if (sourcePath != null ? !sourcePath.equals(dvd.sourcePath) : dvd.sourcePath != null) return false;
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = deviceDetails != null ? deviceDetails.hashCode() : 0;
+ result = 31 * result + (sourcePath != null ? sourcePath.hashCode() : 0);
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return "Dvd{" +
+ "deviceDetails=" + deviceDetails +
+ ", sourcePath='" + sourcePath + '\'' +
+ '}';
+ }
+}
diff --git a/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/domain/NatAdapter.java b/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/domain/NatAdapter.java
new file mode 100644
index 0000000000..1b24ed0f46
--- /dev/null
+++ b/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/domain/NatAdapter.java
@@ -0,0 +1,93 @@
+/**
+ * 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 org.virtualbox_4_1.NATProtocol;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Represents a NAT network adapter in VirtualBox.
+ *
+ * redirectRules are the redirect rules that are applied to the network adapter.
+ */
+public class NatAdapter {
+
+ private final Set redirectRules = new HashSet();
+
+ public NatAdapter(Set redirectRules) {
+ this.redirectRules.addAll(redirectRules);
+ }
+
+ public static Builder builder() {
+ return new Builder();
+ }
+
+ public static class Builder {
+
+ private Set redirectRules = new HashSet();
+ private long adapterSlot;
+
+ public Builder tcpRedirectRule(String host, int hostPort, String guest, int guestPort) {
+ redirectRules.add(new RedirectRule(NATProtocol.TCP, host, hostPort, guest, guestPort));
+ return this;
+ }
+
+ public Builder udpRedirectRule(String host, int hostPort, String guest, int guestPort) {
+ redirectRules.add(new RedirectRule(NATProtocol.UDP, host, hostPort, guest, guestPort));
+ return this;
+ }
+
+ public NatAdapter build() {
+ return new NatAdapter(redirectRules);
+ }
+
+ }
+
+ public Set getRedirectRules() {
+ return Collections.unmodifiableSet(redirectRules);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ NatAdapter that = (NatAdapter) o;
+
+ if (redirectRules != null ? !redirectRules.equals(that.redirectRules) : that.redirectRules != null) return false;
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ return redirectRules != null ? redirectRules.hashCode() : 0;
+ }
+
+ @Override
+ public String toString() {
+ return "NatAdapter{" +
+ "redirectRules=" + redirectRules +
+ '}';
+ }
+}
diff --git a/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/domain/StorageController.java b/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/domain/StorageController.java
new file mode 100644
index 0000000000..aa15c85cae
--- /dev/null
+++ b/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/domain/StorageController.java
@@ -0,0 +1,147 @@
+/*
+ * 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 org.virtualbox_4_1.DeviceType;
+import org.virtualbox_4_1.StorageBus;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.jclouds.virtualbox.domain.HardDisk.DEFAULT_DISK_FORMAT;
+
+/**
+ * Represents a storage controller in a VirtualBox VM.
+ *
+ * name is the unique name of the controller.
+ * bus is the type of connection bus for the controller
+ * hardDisks contains the hard disks that are attached (or should be attached) to this controller
+ * isoImages contains the ISOs that are attached (or should be attached) to this controller
+ *
+ * @see StorageBus
+ */
+public class StorageController {
+ private final String name;
+ private final StorageBus bus;
+ private Set hardDisks;
+ private Set isoImages;
+
+ public StorageController(String name, StorageBus bus, Set hardDisks, Set isoImages) {
+ this.name = name;
+ this.bus = bus;
+ this.hardDisks = hardDisks;
+ this.isoImages = isoImages;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public StorageBus getBus() {
+ return bus;
+ }
+
+ public Set getHardDisks() {
+ return hardDisks;
+ }
+
+ public Set getIsoImages() {
+ return isoImages;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ StorageController that = (StorageController) o;
+
+ if (bus != that.bus) return false;
+ if (isoImages != null ? !isoImages.equals(that.isoImages) : that.isoImages != null) return false;
+ if (hardDisks != null ? !hardDisks.equals(that.hardDisks) : that.hardDisks != null) return false;
+ if (name != null ? !name.equals(that.name) : that.name != null) return false;
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = name != null ? name.hashCode() : 0;
+ result = 31 * result + (bus != null ? bus.hashCode() : 0);
+ result = 31 * result + (hardDisks != null ? hardDisks.hashCode() : 0);
+ result = 31 * result + (isoImages != null ? isoImages.hashCode() : 0);
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return "StorageController{" +
+ "name='" + name + '\'' +
+ ", bus=" + bus +
+ ", hardDisks=" + hardDisks +
+ ", isoImages=" + isoImages +
+ '}';
+ }
+
+ public static Builder builder() {
+ return new Builder();
+ }
+
+ public static class Builder {
+
+ private String name;
+ private StorageBus bus;
+ private Set hardDisks = new HashSet();
+ private Set dvds = new HashSet();
+
+ public Builder name(String name) {
+ this.name = name;
+ return this;
+ }
+
+ public Builder bus(StorageBus bus) {
+ this.bus = bus;
+ return this;
+ }
+
+ public Builder attachISO(int controllerPort, int deviceSlot, String sourcePath) {
+ dvds.add(new IsoImage(new DeviceDetails(controllerPort, deviceSlot, DeviceType.DVD), sourcePath));
+ return this;
+ }
+
+ public Builder attachHardDisk(int controllerPort, int deviceSlot, String diskPath) {
+ hardDisks.add(new HardDisk(new DeviceDetails(controllerPort, deviceSlot, DeviceType.HardDisk), diskPath, DEFAULT_DISK_FORMAT));
+ return this;
+ }
+
+ public Builder attachHardDisk(int controllerPort, int deviceSlot, String diskPath, String diskFormat) {
+ hardDisks.add(new HardDisk(new DeviceDetails(controllerPort, deviceSlot, DeviceType.HardDisk), diskPath, diskFormat));
+ return this;
+ }
+
+ public StorageController build() {
+ checkNotNull(name);
+ checkNotNull(bus);
+ return new StorageController(name, bus, hardDisks, dvds);
+ }
+
+ }
+}
diff --git a/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/domain/VmSpecification.java b/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/domain/VmSpecification.java
new file mode 100644
index 0000000000..560231cabc
--- /dev/null
+++ b/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/domain/VmSpecification.java
@@ -0,0 +1,162 @@
+/*
+ * 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 java.util.*;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * A description of a Virtual Machine in VirtualBox.
+ */
+public class VmSpecification {
+
+ private final String vmName;
+ private final String osTypeId;
+ private final String vmId;
+ private final boolean forceOverwrite;
+ private final Map natNetworkAdapters;
+ private final Set controllers;
+
+ public VmSpecification(String vmId, String vmName, String osTypeId, boolean forceOverwrite, Set controllers, Map natNetworkAdapters) {
+ this.vmId = vmId;
+ this.vmName = vmName;
+ this.osTypeId = osTypeId;
+ this.controllers = controllers;
+ this.forceOverwrite = forceOverwrite;
+ this.natNetworkAdapters = natNetworkAdapters;
+ }
+
+ public static Builder builder() {
+ return new Builder();
+ }
+
+ public static class Builder {
+
+ private Set controllers = new HashSet();
+ private String name;
+ private String id;
+ private String osTypeId = "";
+ private boolean forceOverwrite;
+ private Map natNetworkAdapters = new HashMap();
+
+ public Builder controller(StorageController controller) {
+ controllers.add(controller);
+ return this;
+ }
+
+ public Builder name(String name) {
+ this.name = name;
+ return this;
+ }
+
+ public Builder id(String id) {
+ this.id = id;
+ return this;
+ }
+
+ public Builder osTypeId(String osTypeId) {
+ this.osTypeId = osTypeId;
+ return this;
+ }
+
+ public Builder forceOverwrite(boolean forceOverwrite) {
+ this.forceOverwrite = forceOverwrite;
+ return this;
+ }
+
+ public Builder natNetworkAdapter(int slot, NatAdapter adapter) {
+ this.natNetworkAdapters.put((long) slot, adapter);
+ return this;
+ }
+
+
+ public VmSpecification build() {
+ checkNotNull(name, "name");
+ checkNotNull(id, "id");
+ return new VmSpecification(id, name, osTypeId, forceOverwrite, controllers, natNetworkAdapters);
+ }
+ }
+
+ public String getVmName() {
+ return vmName;
+ }
+
+ public String getOsTypeId() {
+ return osTypeId;
+ }
+
+ public String getVmId() {
+ return vmId;
+ }
+
+ public boolean isForceOverwrite() {
+ return forceOverwrite;
+ }
+
+ public Set getControllers() {
+ return Collections.unmodifiableSet(controllers);
+ }
+
+ public Map getNatNetworkAdapters() {
+ return Collections.unmodifiableMap(natNetworkAdapters);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ VmSpecification that = (VmSpecification) o;
+
+ if (forceOverwrite != that.forceOverwrite) return false;
+ if (controllers != null ? !controllers.equals(that.controllers) : that.controllers != null) return false;
+ if (natNetworkAdapters != null ? !natNetworkAdapters.equals(that.natNetworkAdapters) : that.natNetworkAdapters != null)
+ return false;
+ if (osTypeId != null ? !osTypeId.equals(that.osTypeId) : that.osTypeId != null) return false;
+ if (vmId != null ? !vmId.equals(that.vmId) : that.vmId != null) return false;
+ if (vmName != null ? !vmName.equals(that.vmName) : that.vmName != null) return false;
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = vmName != null ? vmName.hashCode() : 0;
+ result = 31 * result + (osTypeId != null ? osTypeId.hashCode() : 0);
+ result = 31 * result + (vmId != null ? vmId.hashCode() : 0);
+ result = 31 * result + (forceOverwrite ? 1 : 0);
+ result = 31 * result + (natNetworkAdapters != null ? natNetworkAdapters.hashCode() : 0);
+ result = 31 * result + (controllers != null ? controllers.hashCode() : 0);
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return "VmSpecification{" +
+ "vmName='" + vmName + '\'' +
+ ", osTypeId='" + osTypeId + '\'' +
+ ", vmId='" + vmId + '\'' +
+ ", forceOverwrite=" + forceOverwrite +
+ ", natNetworkAdapters=" + natNetworkAdapters +
+ ", controllers=" + controllers +
+ '}';
+ }
+}
diff --git a/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/functions/AddIDEControllerIfNotExists.java b/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/functions/AddIDEControllerIfNotExists.java
index c797ab3d15..21a61549d1 100644
--- a/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/functions/AddIDEControllerIfNotExists.java
+++ b/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/functions/AddIDEControllerIfNotExists.java
@@ -21,6 +21,7 @@ package org.jclouds.virtualbox.functions;
import static com.google.common.base.Preconditions.checkNotNull;
+import org.jclouds.virtualbox.domain.StorageController;
import org.virtualbox_4_1.IMachine;
import org.virtualbox_4_1.StorageBus;
import org.virtualbox_4_1.VBoxException;
@@ -33,16 +34,16 @@ import com.google.common.base.Function;
*
*/
public class AddIDEControllerIfNotExists implements Function {
- private final String controllerName;
+ private final StorageController storageController;
- public AddIDEControllerIfNotExists(String controllerName) {
- this.controllerName = checkNotNull(controllerName, "controllerName");
+ public AddIDEControllerIfNotExists(StorageController storageController) {
+ this.storageController = checkNotNull(storageController, "storageController");
}
@Override
public Void apply(IMachine machine) {
try {
- machine.addStorageController(controllerName, StorageBus.IDE);
+ machine.addStorageController(storageController.getName(), storageController.getBus());
machine.saveSettings();
} catch (VBoxException e) {
if (!e.getMessage().contains("already exists"))
@@ -53,6 +54,6 @@ public class AddIDEControllerIfNotExists implements Function {
@Override
public String toString() {
- return String.format("addStorageController(%s, IDE)", controllerName);
+ return String.format("addStorageController(%s)", storageController);
}
}
\ No newline at end of file
diff --git a/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/functions/AttachDistroMediumToMachine.java b/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/functions/AttachDistroMediumToMachine.java
deleted file mode 100644
index 435e2e248a..0000000000
--- a/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/functions/AttachDistroMediumToMachine.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/**
- * 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.functions;
-
-import javax.annotation.Nullable;
-
-import org.virtualbox_4_1.DeviceType;
-import org.virtualbox_4_1.IMachine;
-import org.virtualbox_4_1.IMedium;
-import org.virtualbox_4_1.VBoxException;
-
-import com.google.common.base.Function;
-
-/**
- * @author Mattias Holmqvist
- */
-public class AttachDistroMediumToMachine implements Function {
-
- private final String controllerIDE;
- private final IMedium distroMedium;
-
- public AttachDistroMediumToMachine(String controllerIDE, IMedium distroMedium) {
- this.controllerIDE = controllerIDE;
- this.distroMedium = distroMedium;
- }
-
- @Override
- public Void apply(@Nullable IMachine machine) {
- try {
- int controllerPort = 0;
- int device = 0;
- machine.attachDevice(controllerIDE, controllerPort, device, DeviceType.DVD, distroMedium);
- machine.saveSettings();
- } catch (VBoxException e) {
- if (!alreadyAttached(e))
- throw e;
- }
- return null;
- }
-
- private boolean alreadyAttached(VBoxException e) {
- return e.getMessage().contains("is already attached to port");
- }
-
-}
\ No newline at end of file
diff --git a/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/functions/AttachMediumToMachineIfNotAlreadyAttached.java b/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/functions/AttachMediumToMachineIfNotAlreadyAttached.java
index 84f900f484..da90d1cc5d 100644
--- a/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/functions/AttachMediumToMachineIfNotAlreadyAttached.java
+++ b/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/functions/AttachMediumToMachineIfNotAlreadyAttached.java
@@ -21,7 +21,7 @@ package org.jclouds.virtualbox.functions;
import javax.annotation.Nullable;
-import org.virtualbox_4_1.DeviceType;
+import org.jclouds.virtualbox.domain.DeviceDetails;
import org.virtualbox_4_1.IMachine;
import org.virtualbox_4_1.IMedium;
import org.virtualbox_4_1.VBoxException;
@@ -33,25 +33,20 @@ import com.google.common.base.Function;
*/
public class AttachMediumToMachineIfNotAlreadyAttached implements Function {
- private String controllerIDE;
- private IMedium medium;
- private int controllerPort;
- private int device;
- private DeviceType deviceType;
+ private final DeviceDetails device;
+ private final IMedium medium;
+ private final String controllerName;
- public AttachMediumToMachineIfNotAlreadyAttached(String controllerIDE, IMedium medium, int controllerPort,
- int device, DeviceType deviceType) {
- this.controllerIDE = controllerIDE;
- this.medium = medium;
- this.controllerPort = controllerPort;
+ public AttachMediumToMachineIfNotAlreadyAttached(DeviceDetails device, IMedium medium, String controllerName) {
this.device = device;
- this.deviceType = deviceType;
+ this.medium = medium;
+ this.controllerName = controllerName;
}
@Override
public Void apply(@Nullable IMachine machine) {
try {
- machine.attachDevice(controllerIDE, controllerPort, device, deviceType, medium);
+ machine.attachDevice(controllerName, device.getPort(), device.getDeviceSlot(), device.getDeviceType(), medium);
machine.saveSettings();
} catch (VBoxException e) {
if (!alreadyAttached(e))
diff --git a/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/functions/AttachNATRedirectRuleToMachine.java b/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/functions/AttachNATAdapterToMachine.java
similarity index 67%
rename from sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/functions/AttachNATRedirectRuleToMachine.java
rename to sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/functions/AttachNATAdapterToMachine.java
index 578fe38034..5bd188fbcf 100644
--- a/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/functions/AttachNATRedirectRuleToMachine.java
+++ b/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/functions/AttachNATAdapterToMachine.java
@@ -19,11 +19,11 @@
package org.jclouds.virtualbox.functions;
-import static org.virtualbox_4_1.NATProtocol.TCP;
import static org.virtualbox_4_1.NetworkAttachmentType.NAT;
import javax.annotation.Nullable;
+import org.jclouds.virtualbox.domain.NatAdapter;
import org.jclouds.virtualbox.domain.RedirectRule;
import org.virtualbox_4_1.IMachine;
import org.virtualbox_4_1.INetworkAdapter;
@@ -33,26 +33,28 @@ import com.google.common.base.Function;
/**
* @author Mattias Holmqvist
*/
-public class AttachNATRedirectRuleToMachine implements Function {
+public class AttachNATAdapterToMachine implements Function {
- private long adapterIndex;
- private RedirectRule redirectRule;
+ private long adapterSlot;
+ private NatAdapter natAdapter;
- public AttachNATRedirectRuleToMachine(long adapterSlot, RedirectRule redirectRule) {
- this.adapterIndex = adapterSlot;
- this.redirectRule = redirectRule;
+ public AttachNATAdapterToMachine(long adapterSlot, NatAdapter natAdapter) {
+ this.adapterSlot = adapterSlot;
+ this.natAdapter = natAdapter;
}
@Override
public Void apply(@Nullable IMachine machine) {
- INetworkAdapter networkAdapter = machine.getNetworkAdapter(adapterIndex);
+ INetworkAdapter networkAdapter = machine.getNetworkAdapter(adapterSlot);
networkAdapter.setAttachmentType(NAT);
- networkAdapter.getNatDriver().addRedirect("guestssh",
- redirectRule.getProtocol(),
- redirectRule.getHost(),
- redirectRule.getHostPort(),
- redirectRule.getGuest(),
- redirectRule.getGuestPort());
+ for (RedirectRule rule : natAdapter.getRedirectRules()) {
+ networkAdapter.getNatDriver().addRedirect("guestssh",
+ rule.getProtocol(),
+ rule.getHost(),
+ rule.getHostPort(),
+ rule.getGuest(),
+ rule.getGuestPort());
+ }
networkAdapter.setEnabled(true);
machine.saveSettings();
return null;
diff --git a/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/functions/CreateAndRegisterMachineFromIsoIfNotAlreadyExists.java b/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/functions/CreateAndRegisterMachineFromIsoIfNotAlreadyExists.java
index e7681147b1..ae54d1d03c 100644
--- a/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/functions/CreateAndRegisterMachineFromIsoIfNotAlreadyExists.java
+++ b/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/functions/CreateAndRegisterMachineFromIsoIfNotAlreadyExists.java
@@ -20,6 +20,7 @@
package org.jclouds.virtualbox.functions;
import com.google.common.base.Function;
+import org.jclouds.virtualbox.domain.VmSpecification;
import org.virtualbox_4_1.IMachine;
import org.virtualbox_4_1.IVirtualBox;
import org.virtualbox_4_1.VBoxException;
@@ -30,31 +31,24 @@ import javax.annotation.Nullable;
/**
* @author Mattias Holmqvist
*/
-public class CreateAndRegisterMachineFromIsoIfNotAlreadyExists implements Function {
+public class CreateAndRegisterMachineFromIsoIfNotAlreadyExists implements Function {
- private String osTypeId;
- private String vmId;
- private boolean forceOverwrite;
private VirtualBoxManager manager;
- public CreateAndRegisterMachineFromIsoIfNotAlreadyExists(String osTypeId, String vmId,
- boolean forceOverwrite, VirtualBoxManager manager) {
- this.osTypeId = osTypeId;
- this.vmId = vmId;
- this.forceOverwrite = forceOverwrite;
+ public CreateAndRegisterMachineFromIsoIfNotAlreadyExists(VirtualBoxManager manager) {
this.manager = manager;
}
@Override
- public IMachine apply(@Nullable String vmName) {
-
+ public IMachine apply(@Nullable VmSpecification launchSpecification) {
final IVirtualBox vBox = manager.getVBox();
+ String vmName = launchSpecification.getVmName();
try {
vBox.findMachine(vmName);
throw new IllegalStateException("Machine " + vmName + " is already registered.");
} catch (VBoxException e) {
if (machineNotFoundException(e))
- return createMachine(vBox, vmName);
+ return createMachine(vBox, launchSpecification);
else
throw e;
}
@@ -64,10 +58,11 @@ public class CreateAndRegisterMachineFromIsoIfNotAlreadyExists implements Functi
return e.getMessage().contains("VirtualBox error: Could not find a registered machine named ");
}
- private IMachine createMachine(IVirtualBox vBox, String vmName) {
+ private IMachine createMachine(IVirtualBox vBox, VmSpecification launchSpecification) {
// TODO: add support for settingsfile
String settingsFile1 = null;
- IMachine newMachine = vBox.createMachine(settingsFile1, vmName, osTypeId, vmId, forceOverwrite);
+ IMachine newMachine = vBox.createMachine(settingsFile1, launchSpecification.getVmName(),
+ launchSpecification.getOsTypeId(), launchSpecification.getVmId(), launchSpecification.isForceOverwrite());
manager.getVBox().registerMachine(newMachine);
return newMachine;
}
diff --git a/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/functions/CreateMediumIfNotAlreadyExists.java b/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/functions/CreateMediumIfNotAlreadyExists.java
index bd33e1512c..c8a45ca606 100644
--- a/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/functions/CreateMediumIfNotAlreadyExists.java
+++ b/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/functions/CreateMediumIfNotAlreadyExists.java
@@ -19,55 +19,49 @@
package org.jclouds.virtualbox.functions;
-import javax.annotation.Nullable;
-
-import org.virtualbox_4_1.DeviceType;
-import org.virtualbox_4_1.IMedium;
-import org.virtualbox_4_1.IProgress;
-import org.virtualbox_4_1.IVirtualBox;
-import org.virtualbox_4_1.VBoxException;
-import org.virtualbox_4_1.VirtualBoxManager;
-
import com.google.common.base.Function;
+import org.jclouds.virtualbox.domain.HardDisk;
+import org.virtualbox_4_1.*;
+
+import javax.annotation.Nullable;
/**
* @author Mattias Holmqvist
*/
-public class CreateMediumIfNotAlreadyExists implements Function {
+public class CreateMediumIfNotAlreadyExists implements Function {
private final VirtualBoxManager manager;
- private final String diskFormat;
private boolean overwriteIfExists;
- public CreateMediumIfNotAlreadyExists(VirtualBoxManager manager, String diskFormat, boolean overwriteIfExists) {
+ public CreateMediumIfNotAlreadyExists(VirtualBoxManager manager, boolean overwriteIfExists) {
this.manager = manager;
- this.diskFormat = diskFormat;
this.overwriteIfExists = overwriteIfExists;
}
@Override
- public IMedium apply(@Nullable String path) {
+ public IMedium apply(@Nullable HardDisk hardDisk) {
IVirtualBox vBox = manager.getVBox();
try {
- final IMedium medium = vBox.findMedium(path, DeviceType.HardDisk);
+ String diskPath = hardDisk.getDiskPath();
+ final IMedium medium = vBox.findMedium(diskPath, DeviceType.HardDisk);
if (overwriteIfExists) {
final IProgress progress = medium.deleteStorage();
progress.waitForCompletion(-1);
- return createNewMedium(vBox, path);
+ return createNewMedium(vBox, hardDisk);
} else {
- throw new IllegalStateException("Medium for path " + path + " already exists.");
+ throw new IllegalStateException("Medium for path " + diskPath + " already exists.");
}
} catch (VBoxException e) {
if (notFoundException(e))
- return createNewMedium(vBox, path);
+ return createNewMedium(vBox, hardDisk);
throw e;
}
}
- private IMedium createNewMedium(IVirtualBox vBox, String path) {
- IMedium hardDisk = vBox.createHardDisk(diskFormat, path);
- createBaseStorage(hardDisk);
- return hardDisk;
+ private IMedium createNewMedium(IVirtualBox vBox, HardDisk hardDisk) {
+ IMedium medium = vBox.createHardDisk(hardDisk.getDiskFormat(), hardDisk.getDiskPath());
+ createBaseStorage(medium);
+ return medium;
}
private boolean notFoundException(VBoxException e) {
@@ -78,7 +72,7 @@ public class CreateMediumIfNotAlreadyExists implements Function
try {
long size = 4L * 1024L * 1024L * 1024L - 4L;
IProgress storageCreation = hardDisk.createBaseStorage(size,
- (long) org.virtualbox_4_1.jaxws.MediumVariant.STANDARD.ordinal());
+ (long) org.virtualbox_4_1.jaxws.MediumVariant.STANDARD.ordinal());
storageCreation.waitForCompletion(-1);
} catch (VBoxException e) {
if (fileNotFoundException(e)) {
@@ -100,7 +94,7 @@ public class CreateMediumIfNotAlreadyExists implements Function
private boolean storageAlreadyExists(VBoxException e) {
return e.getMessage().contains("VirtualBox error: Storage for the medium ")
- && e.getMessage().contains("is already created");
+ && e.getMessage().contains("is already created");
}
}
diff --git a/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/functions/IsoToIMachine.java b/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/functions/IsoToIMachine.java
index 91fec429ef..2ebd485ed0 100644
--- a/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/functions/IsoToIMachine.java
+++ b/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/functions/IsoToIMachine.java
@@ -30,27 +30,23 @@ import org.jclouds.javax.annotation.Nullable;
import org.jclouds.logging.Logger;
import org.jclouds.net.IPSocket;
import org.jclouds.ssh.SshException;
-import org.jclouds.virtualbox.domain.ExecutionType;
-import org.jclouds.virtualbox.domain.RedirectRule;
+import org.jclouds.virtualbox.domain.*;
import org.jclouds.virtualbox.settings.KeyboardScancodes;
import org.virtualbox_4_1.*;
import javax.annotation.Resource;
import javax.inject.Named;
import java.io.File;
+import java.util.Map;
+import java.util.Set;
import static com.google.common.base.Preconditions.checkNotNull;
import static org.jclouds.compute.options.RunScriptOptions.Builder.runAsRoot;
import static org.jclouds.compute.options.RunScriptOptions.Builder.wrapInInitScript;
-import static org.jclouds.virtualbox.util.MachineUtils.*;
import static org.jclouds.virtualbox.config.VirtualBoxConstants.VIRTUALBOX_INSTALLATION_KEY_SEQUENCE;
-import static org.jclouds.virtualbox.config.VirtualBoxConstants.VIRTUALBOX_WORKINGDIR;
-import static org.virtualbox_4_1.AccessMode.ReadOnly;
-import static org.virtualbox_4_1.DeviceType.DVD;
-import static org.virtualbox_4_1.DeviceType.HardDisk;
+import static org.jclouds.virtualbox.util.MachineUtils.*;
import static org.virtualbox_4_1.LockType.Shared;
import static org.virtualbox_4_1.LockType.Write;
-import static org.virtualbox_4_1.NATProtocol.TCP;
public class IsoToIMachine implements Function {
@@ -58,40 +54,30 @@ public class IsoToIMachine implements Function {
@Named(ComputeServiceConstants.COMPUTE_LOGGER)
protected Logger logger = Logger.NULL;
- private VirtualBoxManager manager;
- private String adminDisk;
- private String diskFormat;
- private String vmName;
- private String osTypeId;
- private String vmId;
- private String controllerIDE;
- private boolean forceOverwrite;
- private ComputeServiceContext context;
- private String hostId;
+ private final VirtualBoxManager manager;
private String guestId;
- private Predicate socketTester;
- private String webServerHost;
- private int webServerPort;
+ private final VmSpecification vmSpecification;
+ private final ComputeServiceContext context;
+ private final String hostId;
+ private final Predicate socketTester;
+ private final String webServerHost;
+ private final int webServerPort;
+ private final ExecutionType executionType;
@Inject
- public IsoToIMachine(VirtualBoxManager manager, String adminDisk, String diskFormat,
- String vmName, String osTypeId, String vmId, boolean forceOverwrite, String controllerIDE,
- ComputeServiceContext context, String hostId, String guestId, Predicate socketTester,
- String webServerHost, int webServerPort) {
+ public IsoToIMachine(VirtualBoxManager manager, String guestId,
+ VmSpecification vmSpecification, ComputeServiceContext context,
+ String hostId, Predicate socketTester,
+ String webServerHost, int webServerPort, ExecutionType executionType) {
this.manager = manager;
- this.adminDisk = adminDisk;
- this.diskFormat = diskFormat;
- this.vmName = vmName;
- this.osTypeId = osTypeId;
- this.vmId = vmId;
- this.controllerIDE = controllerIDE;
- this.forceOverwrite = forceOverwrite;
+ this.guestId = guestId;
+ this.vmSpecification = vmSpecification;
this.context = context;
this.hostId = hostId;
- this.guestId = guestId;
this.socketTester = socketTester;
this.webServerHost = webServerHost;
this.webServerPort = webServerPort;
+ this.executionType = executionType;
}
@Override
@@ -99,51 +85,37 @@ public class IsoToIMachine implements Function {
ensureWebServerIsRunning();
- final IMachine vm = new CreateAndRegisterMachineFromIsoIfNotAlreadyExists(osTypeId, vmId, forceOverwrite,
- manager).apply(vmName);
+ final IMachine vm = new CreateAndRegisterMachineFromIsoIfNotAlreadyExists(manager).apply(vmSpecification);
- final String defaultWorkingDir = System.getProperty("user.home") + "/jclouds-virtualbox-test";
- final String workingDir = System.getProperty(VIRTUALBOX_WORKINGDIR, defaultWorkingDir);
+ String vmName = vmSpecification.getVmName();
// Change RAM
ensureMachineHasMemory(vmName, 1024l);
- // IDE Controller
- ensureMachineHasIDEControllerNamed(vmName, controllerIDE);
-
- // Distribution medium
- ensureMachineHasAttachedDistroMedium(isoName, workingDir, controllerIDE);
-
- // DISK
- final String adminDiskPath = workingDir + "/" + adminDisk;
- if (new File(adminDiskPath).exists()) {
- boolean deleted = new File(adminDiskPath).delete();
- if (!deleted) {
- logger.error(String.format("File %s could not be deleted.", adminDiskPath));
- }
+ Set controllers = vmSpecification.getControllers();
+ if (controllers.isEmpty()) {
+ throw new IllegalStateException(missingIDEControllersMessage());
}
+ StorageController controller = controllers.iterator().next();
+ ensureMachineHasIDEControllerNamed(vmName, controller);
+ setupHardDisksForController(vmName, controller);
+ setupDvdsForController(vmName, controller);
+ missingIDEControllersMessage();
- // Create hard disk
- final IMedium hardDisk = new CreateMediumIfNotAlreadyExists(manager, diskFormat, true).apply(adminDiskPath);
-
- // Attach hard disk to machine
- ensureMachineHasHardDiskAttached(vmName, hardDisk);
// NAT
- ensureNATNetworkingIsAppliedToMachine(vmName);
-
- final String guestAdditionsDvd = workingDir + "/VBoxGuestAdditions_4.1.2.iso";
- final IMedium guestAdditionsDvdMedium = manager.getVBox().openMedium(guestAdditionsDvd, DeviceType.DVD,
- AccessMode.ReadOnly, forceOverwrite);
-
- // Guest additions
- ensureGuestAdditionsMediumIsAttached(vmName, guestAdditionsDvdMedium);
+ Map natNetworkAdapters = vmSpecification.getNatNetworkAdapters();
+ for (Map.Entry natAdapterAndSlot : natNetworkAdapters.entrySet()) {
+ long slotId = natAdapterAndSlot.getKey();
+ NatAdapter natAdapter = natAdapterAndSlot.getValue();
+ ensureNATNetworkingIsAppliedToMachine(vmName, slotId, natAdapter);
+ }
// Launch machine and wait for it to come online
ensureMachineIsLaunched(vmName);
- final String installKeySequence = System.getProperty(VIRTUALBOX_INSTALLATION_KEY_SEQUENCE, defaultInstallSequence());
- sendKeyboardSequence(installKeySequence);
+ final String installKeySequence = System.getProperty(VIRTUALBOX_INSTALLATION_KEY_SEQUENCE, defaultInstallSequence(vmName));
+ sendKeyboardSequence(installKeySequence, vmName);
boolean sshDeamonIsRunning = false;
while (!sshDeamonIsRunning) {
@@ -171,6 +143,35 @@ public class IsoToIMachine implements Function {
return vm;
}
+ private void setupDvdsForController(String vmName, StorageController controller) {
+ Set dvds = controller.getIsoImages();
+ for (IsoImage dvd : dvds) {
+ String dvdSource = dvd.getSourcePath();
+ final IMedium dvdMedium = manager.getVBox().openMedium(dvdSource, DeviceType.DVD,
+ AccessMode.ReadOnly, vmSpecification.isForceOverwrite());
+ ensureMachineDevicesAttached(vmName, dvdMedium, dvd.getDeviceDetails(), controller.getName());
+ }
+ }
+
+ private void setupHardDisksForController(String vmName, StorageController controller) {
+ Set hardDisks = controller.getHardDisks();
+ for (HardDisk hardDisk : hardDisks) {
+ String sourcePath = hardDisk.getDiskPath();
+ if (new File(sourcePath).exists()) {
+ boolean deleted = new File(sourcePath).delete();
+ if (!deleted) {
+ logger.error(String.format("File %s could not be deleted.", sourcePath));
+ }
+ }
+ IMedium medium = new CreateMediumIfNotAlreadyExists(manager, true).apply(hardDisk);
+ ensureMachineDevicesAttached(vmName, medium, hardDisk.getDeviceDetails(), controller.getName());
+ }
+ }
+
+ private String missingIDEControllersMessage() {
+ return String.format("First controller is not an IDE controller. Please verify that the VM spec is a correct master node: %s", vmSpecification);
+ }
+
private void ensureWebServerIsRunning() {
final IPSocket webServerSocket = new IPSocket(webServerHost, webServerPort);
if (!socketTester.apply(webServerSocket)) {
@@ -179,52 +180,27 @@ public class IsoToIMachine implements Function {
}
private void ensureMachineIsLaunched(String vmName) {
- applyForMachine(manager, vmName, new LaunchMachineIfNotAlreadyRunning(manager, ExecutionType.HEADLESS, ""));
+ applyForMachine(manager, vmName, new LaunchMachineIfNotAlreadyRunning(manager, executionType, ""));
}
- private void ensureGuestAdditionsMediumIsAttached(String vmName, final IMedium guestAdditionsDvdMedium) {
- lockMachineAndApply(manager, Write, vmName, new AttachMediumToMachineIfNotAlreadyAttached(controllerIDE,
- guestAdditionsDvdMedium, 1, 1, DeviceType.DVD));
- }
-
- private void ensureMachineHasHardDiskAttached(String vmName, IMedium hardDisk) {
- lockMachineAndApply(manager, Write, vmName, new AttachMediumToMachineIfNotAlreadyAttached(controllerIDE,
- hardDisk, 0, 1, HardDisk));
+ private void ensureMachineDevicesAttached(String vmName, IMedium medium, DeviceDetails deviceDetails, String controllerName) {
+ lockMachineAndApply(manager, Write, vmName, new AttachMediumToMachineIfNotAlreadyAttached(deviceDetails, medium, controllerName));
}
private void ensureMachineHasMemory(String vmName, final long memorySize) {
lockMachineAndApply(manager, Write, vmName, new ApplyMemoryToMachine(memorySize));
}
- private void ensureNATNetworkingIsAppliedToMachine(String vmName) {
- lockMachineAndApply(manager, Write, vmName, new AttachNATRedirectRuleToMachine(0l, new RedirectRule(TCP, "127.0.0.1", 2222, "", 22)));
+ private void ensureNATNetworkingIsAppliedToMachine(String vmName, long slotId, NatAdapter natAdapter) {
+ lockMachineAndApply(manager, Write, vmName, new AttachNATAdapterToMachine(slotId, natAdapter));
}
- private void ensureMachineHasAttachedDistroMedium(String isoName, String workingDir, String controllerIDE) {
- final String pathToIsoFile = checkFileExists(workingDir + "/" + isoName);
- final IMedium distroMedium = manager.getVBox().openMedium(pathToIsoFile, DVD, ReadOnly, forceOverwrite);
- lockMachineAndApply(
- manager,
- Write,
- vmName,
- new AttachDistroMediumToMachine(checkNotNull(controllerIDE, "controllerIDE"), checkNotNull(distroMedium,
- "distroMedium")));
- }
-
- public static String checkFileExists(String filePath) {
- if (new File(filePath).exists()) {
- return filePath;
- }
- throw new IllegalStateException("File " + filePath + " does not exist.");
- }
-
- public void ensureMachineHasIDEControllerNamed(String vmName, String controllerIDE) {
+ public void ensureMachineHasIDEControllerNamed(String vmName, StorageController storageController) {
lockMachineAndApply(manager, Write, checkNotNull(vmName, "vmName"),
- new AddIDEControllerIfNotExists(checkNotNull(controllerIDE, "controllerIDE")));
+ new AddIDEControllerIfNotExists(checkNotNull(storageController, "storageController")));
}
-
- private String defaultInstallSequence() {
+ private String defaultInstallSequence(String vmName) {
return " "
+ "/install/vmlinuz noapic preseed/url=http://10.0.2.2:" + webServerPort + "/src/test/resources/preseed.cfg "
+ "debian-installer=en_US auto locale=en_US kbd-chooser/method=us " + "hostname=" + vmName + " "
@@ -233,7 +209,7 @@ public class IsoToIMachine implements Function {
+ "initrd=/install/initrd.gz -- ";
}
- private void sendKeyboardSequence(String keyboardSequence) {
+ private void sendKeyboardSequence(String keyboardSequence, String vmName) {
String[] splitSequence = keyboardSequence.split(" ");
StringBuilder sb = new StringBuilder();
for (String line : splitSequence) {
diff --git a/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/util/PropertyUtils.java b/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/util/PropertyUtils.java
new file mode 100644
index 0000000000..fe34719e72
--- /dev/null
+++ b/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/util/PropertyUtils.java
@@ -0,0 +1,31 @@
+/*
+ * 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.util;
+
+import static org.jclouds.virtualbox.config.VirtualBoxConstants.VIRTUALBOX_WORKINGDIR;
+
+public class PropertyUtils {
+
+ public static String getWorkingDirFromProperty() {
+ final String defaultWorkingDir = System.getProperty("user.home") + "/jclouds-virtualbox-test";
+ return System.getProperty(VIRTUALBOX_WORKINGDIR, defaultWorkingDir);
+ }
+
+}
diff --git a/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/AddIDEControllerIfNotExistsTest.java b/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/AddIDEControllerIfNotExistsTest.java
index 14a7380392..6d57f0c1b3 100644
--- a/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/AddIDEControllerIfNotExistsTest.java
+++ b/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/AddIDEControllerIfNotExistsTest.java
@@ -19,22 +19,18 @@
package org.jclouds.virtualbox.functions;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.classextension.EasyMock.createMock;
-import static org.easymock.classextension.EasyMock.createNiceMock;
-import static org.easymock.classextension.EasyMock.replay;
-import static org.easymock.classextension.EasyMock.verify;
-
+import org.jclouds.virtualbox.domain.StorageController;
import org.testng.annotations.Test;
import org.virtualbox_4_1.IMachine;
import org.virtualbox_4_1.IStorageController;
import org.virtualbox_4_1.StorageBus;
import org.virtualbox_4_1.VBoxException;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.classextension.EasyMock.*;
+
/**
- *
* @author Adrian Cole
- *
*/
@Test(groups = "unit", testName = "AddIDEControllerIfNotExistsTest")
public class AddIDEControllerIfNotExistsTest {
@@ -44,14 +40,15 @@ public class AddIDEControllerIfNotExistsTest {
IMachine vm = createMock(IMachine.class);
String controllerName = "IDE Controller";
+ StorageController storageController = StorageController.builder().bus(StorageBus.IDE).name(controllerName).build();
expect(vm.addStorageController(controllerName, StorageBus.IDE)).andReturn(
- createNiceMock(IStorageController.class));
+ createNiceMock(IStorageController.class));
vm.saveSettings();
replay(vm);
- new AddIDEControllerIfNotExists(controllerName).apply(vm);
+ new AddIDEControllerIfNotExists(storageController).apply(vm);
verify(vm);
}
@@ -61,14 +58,15 @@ public class AddIDEControllerIfNotExistsTest {
IMachine vm = createMock(IMachine.class);
String controllerName = "IDE Controller";
+ StorageController storageController = StorageController.builder().bus(StorageBus.IDE).name(controllerName).build();
expect(vm.addStorageController(controllerName, StorageBus.IDE)).andThrow(
- new VBoxException(createNiceMock(Throwable.class),
- "VirtualBox error: Storage controller named 'IDE Controller' already exists (0x80BB000C)"));
+ new VBoxException(createNiceMock(Throwable.class),
+ "VirtualBox error: Storage controller named 'IDE Controller' already exists (0x80BB000C)"));
replay(vm);
- new AddIDEControllerIfNotExists(controllerName).apply(vm);
+ new AddIDEControllerIfNotExists(storageController).apply(vm);
verify(vm);
}
@@ -78,13 +76,14 @@ public class AddIDEControllerIfNotExistsTest {
IMachine vm = createMock(IMachine.class);
String controllerName = "IDE Controller";
+ StorageController storageController = StorageController.builder().bus(StorageBus.IDE).name(controllerName).build();
expect(vm.addStorageController(controllerName, StorageBus.IDE)).andThrow(
- new VBoxException(createNiceMock(Throwable.class), "VirtualBox error: General Error"));
+ new VBoxException(createNiceMock(Throwable.class), "VirtualBox error: General Error"));
replay(vm);
- new AddIDEControllerIfNotExists(controllerName).apply(vm);
+ new AddIDEControllerIfNotExists(storageController).apply(vm);
verify(vm);
}
diff --git a/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/AttachDistroMediumToMachineLiveTest.java b/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/AttachDistroMediumToMachineLiveTest.java
deleted file mode 100644
index 814b0cd268..0000000000
--- a/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/AttachDistroMediumToMachineLiveTest.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * 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.functions;
-
-import org.jclouds.virtualbox.BaseVirtualBoxClientLiveTest;
-import org.jclouds.virtualbox.functions.admin.UnregisterMachineIfExists;
-import org.jclouds.virtualbox.util.MachineUtils;
-import org.testng.annotations.Test;
-import org.virtualbox_4_1.CleanupMode;
-import org.virtualbox_4_1.IMedium;
-import org.virtualbox_4_1.LockType;
-
-import java.io.File;
-
-import static org.jclouds.virtualbox.util.MachineUtils.lockMachineAndApply;
-import static org.testng.Assert.assertTrue;
-
-/**
- * @author Mattias Holmqvist
- */
-public class AttachDistroMediumToMachineLiveTest extends BaseVirtualBoxClientLiveTest {
-
- @Test
- public void testAttachMediumToMachine() throws Exception {
- String nodeName = "test-attach-medium-node-1";
- String controllerName = "My Controller";
- new UnregisterMachineIfExists(manager, CleanupMode.Full).apply(nodeName);
- String path = System.getProperty("user.home") + "/jclouds-virtualbox-test/test-attach-medium-1.vdi";
- new CreateAndRegisterMachineFromIsoIfNotAlreadyExists("Debian", nodeName, true, manager)
- .apply(nodeName);
- lockMachineAndApply(manager, LockType.Write, nodeName,
- new AddIDEControllerIfNotExists(controllerName));
- IMedium medium = new CreateMediumIfNotAlreadyExists(manager, "vdi", true).apply(path);
- lockMachineAndApply(manager, LockType.Write, nodeName,
- new AttachDistroMediumToMachine(controllerName, medium));
- new UnregisterMachineIfExists(manager, CleanupMode.Full).apply(nodeName);
- medium.close();
- assertFileCanBeDeleted(path);
- }
-
- @Test
- public void testAttachMediumToMachineTwice() throws Exception {
- String nodeName = "test-attach-medium-node-2";
- String controllerName = "My Controller";
- new UnregisterMachineIfExists(manager, CleanupMode.Full).apply(nodeName);
- String path = System.getProperty("user.home") + "/jclouds-virtualbox-test/test-attach-medium-2.vdi";
- new CreateAndRegisterMachineFromIsoIfNotAlreadyExists("Debian", nodeName, true, manager)
- .apply(nodeName);
- lockMachineAndApply(manager, LockType.Write, nodeName, new AddIDEControllerIfNotExists(controllerName));
- IMedium medium = new CreateMediumIfNotAlreadyExists(manager, "vdi", true).apply(path);
- lockMachineAndApply(manager, LockType.Write, nodeName, new AttachDistroMediumToMachine(controllerName, medium));
- lockMachineAndApply(manager, LockType.Write, nodeName, new AttachDistroMediumToMachine(controllerName, medium));
- new UnregisterMachineIfExists(manager, CleanupMode.Full).apply(nodeName);
- medium.close();
- assertFileCanBeDeleted(path);
- }
-
- private void assertFileCanBeDeleted(String path) {
- File file = new File(path);
- boolean mediumDeleted = file.delete();
- assertTrue(mediumDeleted);
- }
-}
diff --git a/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/AttachDistroMediumToMachineTest.java b/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/AttachDistroMediumToMachineTest.java
deleted file mode 100644
index e4cd4af4e4..0000000000
--- a/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/AttachDistroMediumToMachineTest.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/**
- * 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.functions;
-
-import static org.easymock.EasyMock.expectLastCall;
-import static org.easymock.classextension.EasyMock.createMock;
-import static org.easymock.classextension.EasyMock.createNiceMock;
-import static org.easymock.classextension.EasyMock.replay;
-import static org.easymock.classextension.EasyMock.verify;
-
-import org.testng.annotations.Test;
-import org.virtualbox_4_1.DeviceType;
-import org.virtualbox_4_1.IMachine;
-import org.virtualbox_4_1.IMedium;
-import org.virtualbox_4_1.VBoxException;
-
-/**
- * @author Mattias Holmqvist
- */
-@Test(groups = "unit", testName = "AttachDistroMediumToMachineTest")
-public class AttachDistroMediumToMachineTest {
-
- @Test
- public void testAttachDistroMedium() throws Exception {
-
- String controllerIDE = "IDE Controller";
- IMedium distroMedium = createNiceMock(IMedium.class);
-
- IMachine machine = createMock(IMachine.class);
-
- machine.saveSettings();
- machine.attachDevice(controllerIDE, 0, 0, DeviceType.DVD, distroMedium);
-
- replay(machine, distroMedium);
-
- new AttachDistroMediumToMachine(controllerIDE, distroMedium).apply(machine);
-
- verify(machine);
-
- }
-
- @Test
- public void testAcceptAlreadyAttachedDistroMedium() throws Exception {
-
- String controllerIDE = "IDE Controller";
- IMedium distroMedium = createNiceMock(IMedium.class);
-
- IMachine machine = createNiceMock(IMachine.class);
-
- final StringBuilder errorBuilder = new StringBuilder();
- errorBuilder.append("VirtualBox error: ");
- errorBuilder.append("Medium '/Users/johndoe/jclouds-virtualbox-test/ubuntu-11.04-server-i386.iso' ");
- errorBuilder.append("is already attached to port 0, device 0 of controller 'IDE Controller' ");
- errorBuilder.append("of this virtual machine (0x80BB000C)");
- String isoAlreadyAttachedException = errorBuilder.toString();
-
- VBoxException isoAttachedException = new VBoxException(createNiceMock(Throwable.class),
- isoAlreadyAttachedException);
- machine.attachDevice(controllerIDE, 0, 0, DeviceType.DVD, distroMedium);
- expectLastCall().andThrow(isoAttachedException);
-
- replay(machine, distroMedium);
-
- new AttachDistroMediumToMachine(controllerIDE, distroMedium).apply(machine);
-
- verify(machine);
-
- }
-
- @Test(expectedExceptions = VBoxException.class)
- public void testFailOnOtherVBoxErrors() throws Exception {
-
- String controllerIDE = "IDE Controller";
- IMedium distroMedium = createNiceMock(IMedium.class);
-
- IMachine machine = createNiceMock(IMachine.class);
-
- final StringBuilder errorBuilder = new StringBuilder();
- errorBuilder.append("VirtualBox error: ");
- errorBuilder.append("Some other VBox error");
- String isoAlreadyAttachedException = errorBuilder.toString();
-
- VBoxException isoAttachedException = new VBoxException(createNiceMock(Throwable.class),
- isoAlreadyAttachedException);
- machine.attachDevice(controllerIDE, 0, 0, DeviceType.DVD, distroMedium);
- expectLastCall().andThrow(isoAttachedException);
-
- replay(machine, distroMedium);
-
- new AttachDistroMediumToMachine(controllerIDE, distroMedium).apply(machine);
-
- }
-
-}
diff --git a/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/AttachMediumToMachineIfNotAlreadyAttachedTest.java b/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/AttachMediumToMachineIfNotAlreadyAttachedTest.java
index b4889b01b3..250c83b2cb 100644
--- a/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/AttachMediumToMachineIfNotAlreadyAttachedTest.java
+++ b/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/AttachMediumToMachineIfNotAlreadyAttachedTest.java
@@ -19,6 +19,14 @@
package org.jclouds.virtualbox.functions;
+import com.google.common.collect.Iterables;
+import org.jclouds.virtualbox.domain.DeviceDetails;
+import org.jclouds.virtualbox.domain.HardDisk;
+import org.jclouds.virtualbox.domain.StorageController;
+import org.testng.annotations.Test;
+import org.virtualbox_4_1.*;
+
+import static com.google.common.collect.Iterables.getOnlyElement;
import static org.easymock.EasyMock.anyLong;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.expectLastCall;
@@ -28,14 +36,6 @@ import static org.easymock.classextension.EasyMock.replay;
import static org.easymock.classextension.EasyMock.verify;
import static org.virtualbox_4_1.DeviceType.HardDisk;
-import org.testng.annotations.Test;
-import org.virtualbox_4_1.IMachine;
-import org.virtualbox_4_1.IMedium;
-import org.virtualbox_4_1.IProgress;
-import org.virtualbox_4_1.IVirtualBox;
-import org.virtualbox_4_1.VBoxException;
-import org.virtualbox_4_1.VirtualBoxManager;
-
/**
* @author Mattias Holmqvist
*/
@@ -45,8 +45,8 @@ public class AttachMediumToMachineIfNotAlreadyAttachedTest {
@Test
public void testAttachHardDiskIfNotAttached() throws Exception {
- String controllerIDE = "IDE Controller";
- String adminDiskPath = "/Users/johndoe/jclouds-virtualbox-images/admin.vdi";
+ String controllerName = "IDE Controller";
+ String diskPath = "/Users/johndoe/jclouds-virtualbox-images/admin.vdi";
String diskFormat = "vdi";
int controllerPort = 0;
int device = 1;
@@ -58,15 +58,22 @@ public class AttachMediumToMachineIfNotAlreadyAttachedTest {
IProgress progress = createNiceMock(IProgress.class);
expect(manager.getVBox()).andReturn(vBox).anyTimes();
- expect(vBox.createHardDisk(diskFormat, adminDiskPath)).andReturn(hardDisk);
+ expect(vBox.createHardDisk(diskFormat, diskPath)).andReturn(hardDisk);
expect(hardDisk.createBaseStorage(anyLong(), anyLong())).andReturn(progress);
- machine.attachDevice(controllerIDE, controllerPort, device, HardDisk, hardDisk);
+ machine.attachDevice(controllerName, controllerPort, device, HardDisk, hardDisk);
machine.saveSettings();
replay(manager, machine, vBox, hardDisk);
- new AttachMediumToMachineIfNotAlreadyAttached(controllerIDE, hardDisk, controllerPort, device, HardDisk)
- .apply(machine);
+ StorageController controller = StorageController.builder()
+ .name(controllerName)
+ .bus(StorageBus.IDE)
+ .attachHardDisk(controllerPort, device, diskPath)
+ .build();
+
+
+ DeviceDetails deviceDetails = getOnlyElement(controller.getHardDisks()).getDeviceDetails();
+ new AttachMediumToMachineIfNotAlreadyAttached(deviceDetails, hardDisk, controllerName).apply(machine);
verify(machine);
@@ -75,9 +82,9 @@ public class AttachMediumToMachineIfNotAlreadyAttachedTest {
@Test
public void testDoNothingIfAlreadyAttachedAttachHardDisk() throws Exception {
- String controllerIDE = "IDE Controller";
+ String controllerName = "IDE Controller";
int controllerPort = 0;
- int device = 1;
+ int deviceSlot = 1;
VirtualBoxManager manager = createNiceMock(VirtualBoxManager.class);
IMachine machine = createMock(IMachine.class);
@@ -92,14 +99,20 @@ public class AttachMediumToMachineIfNotAlreadyAttachedTest {
String isoAlreadyAttachedException = errorBuilder.toString();
VBoxException isoAttachedException = new VBoxException(createNiceMock(Throwable.class),
- isoAlreadyAttachedException);
- machine.attachDevice(controllerIDE, controllerPort, device, HardDisk, hardDisk);
+ isoAlreadyAttachedException);
+ machine.attachDevice(controllerName, controllerPort, deviceSlot, HardDisk, hardDisk);
expectLastCall().andThrow(isoAttachedException);
replay(manager, machine, vBox, hardDisk);
- new AttachMediumToMachineIfNotAlreadyAttached(controllerIDE, hardDisk, controllerPort, device, HardDisk)
- .apply(machine);
+ StorageController controller = StorageController.builder()
+ .name(controllerName)
+ .bus(StorageBus.IDE)
+ .attachHardDisk(controllerPort, deviceSlot, "/Users/mattias/jclouds-virtualbox-test/testadmin.vdi")
+ .build();
+
+ DeviceDetails deviceDetails = getOnlyElement(controller.getHardDisks()).getDeviceDetails();
+ new AttachMediumToMachineIfNotAlreadyAttached(deviceDetails, hardDisk, controllerName).apply(machine);
verify(machine);
@@ -108,9 +121,9 @@ public class AttachMediumToMachineIfNotAlreadyAttachedTest {
@Test(expectedExceptions = VBoxException.class)
public void testFailOnOtherVBoxError() throws Exception {
- String controllerIDE = "IDE Controller";
+ String controllerName = "IDE Controller";
int controllerPort = 0;
- int device = 1;
+ int deviceSlot = 1;
VirtualBoxManager manager = createNiceMock(VirtualBoxManager.class);
IMachine machine = createMock(IMachine.class);
@@ -123,14 +136,21 @@ public class AttachMediumToMachineIfNotAlreadyAttachedTest {
String isoAlreadyAttachedException = errorBuilder.toString();
VBoxException isoAttachedException = new VBoxException(createNiceMock(Throwable.class),
- isoAlreadyAttachedException);
- machine.attachDevice(controllerIDE, controllerPort, device, HardDisk, hardDisk);
+ isoAlreadyAttachedException);
+ machine.attachDevice(controllerName, controllerPort, deviceSlot, HardDisk, hardDisk);
expectLastCall().andThrow(isoAttachedException);
replay(manager, machine, vBox, hardDisk);
- new AttachMediumToMachineIfNotAlreadyAttached(controllerIDE, hardDisk, controllerPort, device, HardDisk)
- .apply(machine);
+
+ StorageController controller = StorageController.builder()
+ .name(controllerName)
+ .bus(StorageBus.IDE)
+ .attachHardDisk(controllerPort, deviceSlot, "/Users/mattias/jclouds-virtualbox-test/testadmin.vdi")
+ .build();
+
+ DeviceDetails deviceDetails = getOnlyElement(controller.getHardDisks()).getDeviceDetails();
+ new AttachMediumToMachineIfNotAlreadyAttached(deviceDetails, hardDisk, controllerName).apply(machine);
}
diff --git a/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/AttachNATRedirectRuleToMachineTest.java b/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/AttachNATAdapterToMachineTest.java
similarity index 74%
rename from sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/AttachNATRedirectRuleToMachineTest.java
rename to sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/AttachNATAdapterToMachineTest.java
index ce571877f2..39375e0ac5 100644
--- a/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/AttachNATRedirectRuleToMachineTest.java
+++ b/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/AttachNATAdapterToMachineTest.java
@@ -19,35 +19,32 @@
package org.jclouds.virtualbox.functions;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.classextension.EasyMock.createMock;
-import static org.easymock.classextension.EasyMock.createNiceMock;
-import static org.easymock.classextension.EasyMock.replay;
-import static org.easymock.classextension.EasyMock.verify;
-import static org.virtualbox_4_1.NATProtocol.TCP;
-import static org.virtualbox_4_1.NetworkAttachmentType.NAT;
-
-import org.jclouds.virtualbox.domain.RedirectRule;
+import org.jclouds.virtualbox.domain.NatAdapter;
import org.testng.annotations.Test;
import org.virtualbox_4_1.IMachine;
import org.virtualbox_4_1.INATEngine;
import org.virtualbox_4_1.INetworkAdapter;
import org.virtualbox_4_1.VBoxException;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.classextension.EasyMock.*;
+import static org.virtualbox_4_1.NATProtocol.TCP;
+import static org.virtualbox_4_1.NetworkAttachmentType.NAT;
+
/**
* @author Mattias Holmqvist
*/
-@Test(groups = "unit", testName = "AttachNATRedirectRuleToMachineTest")
-public class AttachNATRedirectRuleToMachineTest {
+@Test(groups = "unit", testName = "AttachNATAdapterToMachineTest")
+public class AttachNATAdapterToMachineTest {
@Test
public void testApplyNetworkingToNonExistingAdapter() throws Exception {
- Long adapterId = 0l;
+ Long slotId = 0l;
IMachine machine = createMock(IMachine.class);
INetworkAdapter networkAdapter = createMock(INetworkAdapter.class);
INATEngine natEngine = createMock(INATEngine.class);
- expect(machine.getNetworkAdapter(adapterId)).andReturn(networkAdapter);
+ expect(machine.getNetworkAdapter(slotId)).andReturn(networkAdapter);
networkAdapter.setAttachmentType(NAT);
expect(networkAdapter.getNatDriver()).andReturn(natEngine);
natEngine.addRedirect("guestssh", TCP, "127.0.0.1", 2222, "", 22);
@@ -55,15 +52,15 @@ public class AttachNATRedirectRuleToMachineTest {
machine.saveSettings();
replay(machine, networkAdapter, natEngine);
-
- new AttachNATRedirectRuleToMachine(adapterId, new RedirectRule(TCP, "127.0.0.1", 2222, "", 22)).apply(machine);
+ NatAdapter natAdapter = NatAdapter.builder().tcpRedirectRule("127.0.0.1", 2222, "", 22).build();
+ new AttachNATAdapterToMachine(slotId, natAdapter).apply(machine);
verify(machine, networkAdapter, natEngine);
}
@Test(expectedExceptions = VBoxException.class)
public void testRethrowInvalidAdapterSlotException() throws Exception {
- Long adapterId = 30l;
+ Long slotId = 30l;
IMachine machine = createMock(IMachine.class);
INetworkAdapter networkAdapter = createMock(INetworkAdapter.class);
INATEngine natEngine = createMock(INATEngine.class);
@@ -72,11 +69,12 @@ public class AttachNATRedirectRuleToMachineTest {
+ "(must be slot < RT_ELEMENTS(mNetworkAdapters)) (0x80070057)";
VBoxException invalidSlotException = new VBoxException(createNiceMock(Throwable.class), error);
- expect(machine.getNetworkAdapter(adapterId)).andThrow(invalidSlotException);
+ expect(machine.getNetworkAdapter(slotId)).andThrow(invalidSlotException);
replay(machine, networkAdapter, natEngine);
- new AttachNATRedirectRuleToMachine(adapterId, new RedirectRule(TCP, "127.0.0.1", 2222, "", 22)).apply(machine);
+ NatAdapter natAdapter = NatAdapter.builder().tcpRedirectRule("127.0.0.1", 2222, "", 22).build();
+ new AttachNATAdapterToMachine(slotId, natAdapter).apply(machine);
verify(machine, networkAdapter, natEngine);
}
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 6927b32c5d..3c42b6e28c 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
@@ -19,24 +19,26 @@
package org.jclouds.virtualbox.functions;
-import static org.jclouds.virtualbox.experiment.TestUtils.computeServiceForLocalhostAndGuest;
-import static org.testng.Assert.assertEquals;
-import static org.virtualbox_4_1.NetworkAttachmentType.Bridged;
-
-import java.util.concurrent.TimeUnit;
-
+import com.google.common.base.Predicate;
import org.jclouds.compute.ComputeServiceContext;
import org.jclouds.domain.Credentials;
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.HardDisk;
+import org.jclouds.virtualbox.domain.StorageController;
+import org.jclouds.virtualbox.domain.VmSpecification;
+import org.jclouds.virtualbox.util.PropertyUtils;
import org.testng.annotations.Test;
-import org.virtualbox_4_1.IMachine;
-import org.virtualbox_4_1.ISession;
-import org.virtualbox_4_1.VirtualBoxManager;
+import org.virtualbox_4_1.*;
-import com.google.common.base.Predicate;
+import java.util.concurrent.TimeUnit;
+
+import static org.jclouds.virtualbox.domain.ExecutionType.HEADLESS;
+import static org.jclouds.virtualbox.experiment.TestUtils.computeServiceForLocalhostAndGuest;
+import static org.testng.Assert.assertEquals;
+import static org.virtualbox_4_1.NetworkAttachmentType.Bridged;
/**
* @author Andrea Turli
@@ -49,8 +51,6 @@ public class CloneAndRegisterMachineFromIsoIfNotAlreadyExistsLiveTest extends Ba
private String vmId = "jclouds-image-iso-1";
private String osTypeId = "";
private String controllerIDE = "IDE Controller";
- private String diskFormat = "";
- private String adminDisk = "testadmin.vdi";
private String guestId = "guest";
private String hostId = "host";
private String snapshotName = "snap";
@@ -84,10 +84,17 @@ public class CloneAndRegisterMachineFromIsoIfNotAlreadyExistsLiveTest extends Ba
private IMachine getMasterNode(VirtualBoxManager manager, ComputeServiceContext localHostContext) {
try {
Predicate socketTester = new RetryablePredicate(new InetSocketAddressConnect(), 10, 1, TimeUnit.SECONDS);
- return new IsoToIMachine(manager, adminDisk, diskFormat,
- vmName, osTypeId, vmId, forceOverwrite,
- controllerIDE, localHostContext, hostId, guestId, socketTester,
- "127.0.0.1", 8080).apply(isoName);
+ String workingDir = PropertyUtils.getWorkingDirFromProperty();
+ StorageController ideController = StorageController.builder().name(controllerIDE).bus(StorageBus.IDE)
+ .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();
+ VmSpecification vmSpecification = VmSpecification.builder().id(vmId).name(vmName).osTypeId(osTypeId)
+ .controller(ideController)
+ .forceOverwrite(true).build();
+ return new IsoToIMachine(manager, guestId,
+ vmSpecification, localHostContext, hostId, socketTester,
+ "127.0.0.1", 8080, HEADLESS).apply(isoName);
} catch (IllegalStateException e) {
// already created
return manager.getVBox().findMachine(vmName);
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 29e0fa2333..6192d2a533 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
@@ -21,6 +21,7 @@ package org.jclouds.virtualbox.functions;
import org.jclouds.virtualbox.BaseVirtualBoxClientLiveTest;
import org.jclouds.virtualbox.domain.ErrorCode;
+import org.jclouds.virtualbox.domain.VmSpecification;
import org.jclouds.virtualbox.functions.admin.UnregisterMachineIfExists;
import org.testng.annotations.Test;
import org.virtualbox_4_1.CleanupMode;
@@ -37,20 +38,24 @@ public class CreateAndRegisterMachineFromIsoIfNotAlreadyExistsLiveTest extends B
@Test
public void testCreateNewMachine() throws Exception {
- new UnregisterMachineIfExists(manager, CleanupMode.Full).apply("jclouds-test-create-1-node");
- IMachine debianNode = new CreateAndRegisterMachineFromIsoIfNotAlreadyExists("Debian", "jclouds-test-create-1", true, manager)
- .apply("jclouds-test-create-1-node");
- IMachine machine = manager.getVBox().findMachine("jclouds-test-create-1-node");
+ String vmName = "jclouds-test-create-1-node";
+ new UnregisterMachineIfExists(manager, CleanupMode.Full).apply(vmName);
+ VmSpecification launchSpecification = VmSpecification.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("jclouds-test-create-1-node");
+ new UnregisterMachineIfExists(manager, CleanupMode.Full).apply(vmName);
}
@Test
public void testCreateNewMachineWithBadOsType() throws Exception {
- new UnregisterMachineIfExists(manager, CleanupMode.Full).apply("jclouds-test-create-2-node");
+ String vmName = "jclouds-test-create-2-node";
+ new UnregisterMachineIfExists(manager, CleanupMode.Full).apply(vmName);
+ VmSpecification launchSpecification = VmSpecification.builder().id(vmName).name(vmName)
+ .osTypeId("SomeWeirdUnknownOs").forceOverwrite(true).build();
try {
- new CreateAndRegisterMachineFromIsoIfNotAlreadyExists("SomeWeirdUnknownOs", "jclouds-test-create-2", true, manager)
- .apply("jclouds-test-create-2-node");
+ new CreateAndRegisterMachineFromIsoIfNotAlreadyExists(manager).apply(launchSpecification);
fail();
} catch (VBoxException e) {
ErrorCode errorCode = ErrorCode.valueOf(e);
diff --git a/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/CreateAndRegisterMachineFromIsoIfNotAlreadyExistsTest.java b/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/CreateAndRegisterMachineFromIsoIfNotAlreadyExistsTest.java
index 8545038705..8d4b68b2e9 100644
--- a/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/CreateAndRegisterMachineFromIsoIfNotAlreadyExistsTest.java
+++ b/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/CreateAndRegisterMachineFromIsoIfNotAlreadyExistsTest.java
@@ -29,6 +29,7 @@ import static org.easymock.classextension.EasyMock.replay;
import static org.easymock.classextension.EasyMock.verify;
import org.easymock.EasyMock;
+import org.jclouds.virtualbox.domain.VmSpecification;
import org.testng.annotations.Test;
import org.virtualbox_4_1.IMachine;
import org.virtualbox_4_1.IVirtualBox;
@@ -48,6 +49,8 @@ public class CreateAndRegisterMachineFromIsoIfNotAlreadyExistsTest {
IVirtualBox vBox = createMock(IVirtualBox.class);
String vmName = "jclouds-image-my-ubuntu-image";
+ VmSpecification launchSpecification = VmSpecification.builder().id(vmName).name(vmName).osTypeId("").build();
+
IMachine createdMachine = createMock(IMachine.class);
expect(manager.getVBox()).andReturn(vBox).anyTimes();
@@ -62,13 +65,13 @@ public class CreateAndRegisterMachineFromIsoIfNotAlreadyExistsTest {
expectLastCall().andThrow(vBoxException);
expect(vBox.createMachine(anyString(), eq(vmName), anyString(), anyString(), anyBoolean())).andReturn(
- createdMachine).anyTimes();
+ createdMachine).anyTimes();
vBox.registerMachine(createdMachine);
replay(manager, vBox);
- new CreateAndRegisterMachineFromIsoIfNotAlreadyExists("", "", false, manager).apply(vmName);
+ new CreateAndRegisterMachineFromIsoIfNotAlreadyExists(manager).apply(launchSpecification);
verify(manager, vBox);
}
@@ -87,7 +90,8 @@ public class CreateAndRegisterMachineFromIsoIfNotAlreadyExistsTest {
replay(manager, vBox);
- new CreateAndRegisterMachineFromIsoIfNotAlreadyExists("", "", false, manager).apply(vmName);
+ VmSpecification launchSpecification = VmSpecification.builder().id("").name(vmName).osTypeId("").build();
+ new CreateAndRegisterMachineFromIsoIfNotAlreadyExists(manager).apply(launchSpecification);
}
@Test(expectedExceptions = VBoxException.class)
@@ -107,11 +111,12 @@ public class CreateAndRegisterMachineFromIsoIfNotAlreadyExistsTest {
replay(manager, vBox);
- new CreateAndRegisterMachineFromIsoIfNotAlreadyExists("", "", false, manager).apply(vmName);
+ VmSpecification launchSpecification = VmSpecification.builder().id("").name(vmName).osTypeId("").build();
+ new CreateAndRegisterMachineFromIsoIfNotAlreadyExists(manager).apply(launchSpecification);
}
private String anyString() {
- return EasyMock. anyObject();
+ return EasyMock.anyObject();
}
}
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 ae8c1e725b..ebe48653bd 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
@@ -20,7 +20,9 @@
package org.jclouds.virtualbox.functions;
import org.jclouds.virtualbox.BaseVirtualBoxClientLiveTest;
+import org.jclouds.virtualbox.domain.DeviceDetails;
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.VBoxException;
@@ -39,7 +41,8 @@ public class CreateMediumIfNotAlreadyExistsLiveTest extends BaseVirtualBoxClient
@Test
public void testCreateMedium() throws Exception {
String path = System.getProperty("user.home") + "/jclouds-virtualbox-test/test-medium-1.vdi";
- new CreateMediumIfNotAlreadyExists(manager, "vdi", true).apply(path);
+ HardDisk hardDisk = new HardDisk(new DeviceDetails(0, 0, DeviceType.HardDisk), path, "vdi");
+ new CreateMediumIfNotAlreadyExists(manager, true).apply(hardDisk);
manager.getVBox().findMedium(path, DeviceType.HardDisk);
assertFileCanBeDeleted(path);
}
@@ -47,8 +50,9 @@ public class CreateMediumIfNotAlreadyExistsLiveTest extends BaseVirtualBoxClient
@Test
public void testCreateMediumFailWhenUsingNonFullyQualifiedPath() throws Exception {
String path = "test-medium-2.vdi";
+ HardDisk hardDisk = new HardDisk(new DeviceDetails(0, 0, DeviceType.HardDisk), path, "vdi");
try {
- new CreateMediumIfNotAlreadyExists(manager, "vdi", true).apply(path);
+ new CreateMediumIfNotAlreadyExists(manager, true).apply(hardDisk);
fail();
} catch (VBoxException e) {
ErrorCode errorCode = ErrorCode.valueOf(e);
@@ -59,8 +63,9 @@ public class CreateMediumIfNotAlreadyExistsLiveTest extends BaseVirtualBoxClient
@Test
public void testCreateSameMediumTwiceWhenUsingOverwrite() throws Exception {
String path = System.getProperty("user.home") + "/jclouds-virtualbox-test/test-medium-3.vdi";
- new CreateMediumIfNotAlreadyExists(manager, "vdi", true).apply(path);
- new CreateMediumIfNotAlreadyExists(manager, "vdi", true).apply(path);
+ HardDisk hardDisk = new HardDisk(new DeviceDetails(0, 0, DeviceType.HardDisk), path, "vdi");
+ new CreateMediumIfNotAlreadyExists(manager, true).apply(hardDisk);
+ new CreateMediumIfNotAlreadyExists(manager, true).apply(hardDisk);
manager.getVBox().findMedium(path, DeviceType.HardDisk);
assertFileCanBeDeleted(path);
}
diff --git a/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/CreateMediumIfNotAlreadyExistsTest.java b/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/CreateMediumIfNotAlreadyExistsTest.java
index 5d6ff30f33..363e165f42 100644
--- a/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/CreateMediumIfNotAlreadyExistsTest.java
+++ b/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/CreateMediumIfNotAlreadyExistsTest.java
@@ -19,7 +19,9 @@
package org.jclouds.virtualbox.functions;
+import static com.google.common.collect.Iterables.getOnlyElement;
import static org.easymock.EasyMock.anyLong;
+import static org.easymock.EasyMock.eq;
import static org.easymock.EasyMock.expect;
import static org.easymock.classextension.EasyMock.createMock;
import static org.easymock.classextension.EasyMock.createNiceMock;
@@ -27,6 +29,9 @@ import static org.easymock.classextension.EasyMock.replay;
import static org.easymock.classextension.EasyMock.verify;
import static org.testng.Assert.assertNotSame;
+import org.jclouds.virtualbox.domain.DeviceDetails;
+import org.jclouds.virtualbox.domain.HardDisk;
+import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.virtualbox_4_1.DeviceType;
import org.virtualbox_4_1.IMachine;
@@ -41,15 +46,24 @@ import org.virtualbox_4_1.VirtualBoxManager;
*/
public class CreateMediumIfNotAlreadyExistsTest {
+ private String adminDiskPath;
+ private String diskFormat;
+
+ @BeforeMethod
+ public void setUp() throws Exception {
+ adminDiskPath = "/Users/johndoe/jclouds-virtualbox-images/admin.vdi";
+ diskFormat = "vdi";
+ }
+
@Test
public void testCreateMediumWhenDiskDoesNotExists() throws Exception {
- String adminDiskPath = "/Users/johndoe/jclouds-virtualbox-images/admin.vdi";
- String diskFormat = "vdi";
+
+ HardDisk hardDisk = createTestHardDisk();
VirtualBoxManager manager = createNiceMock(VirtualBoxManager.class);
IMachine machine = createMock(IMachine.class);
IVirtualBox vBox = createMock(IVirtualBox.class);
- IMedium hardDisk = createMock(IMedium.class);
+ IMedium medium = createMock(IMedium.class);
IProgress progress = createNiceMock(IProgress.class);
StringBuilder errorBuilder = new StringBuilder();
@@ -61,13 +75,13 @@ public class CreateMediumIfNotAlreadyExistsTest {
expect(manager.getVBox()).andReturn(vBox).anyTimes();
VBoxException notFoundException = new VBoxException(createNiceMock(Throwable.class), errorMessage);
- expect(vBox.findMedium(adminDiskPath, DeviceType.HardDisk)).andThrow(notFoundException);
- expect(vBox.createHardDisk(diskFormat, adminDiskPath)).andReturn(hardDisk);
- expect(hardDisk.createBaseStorage(anyLong(), anyLong())).andReturn(progress);
+ expect(vBox.findMedium(eq(adminDiskPath), eq(DeviceType.HardDisk))).andThrow(notFoundException);
+ expect(vBox.createHardDisk(diskFormat, adminDiskPath)).andReturn(medium);
+ expect(medium.createBaseStorage(anyLong(), anyLong())).andReturn(progress);
- replay(manager, machine, vBox, hardDisk);
+ replay(manager, machine, vBox, medium);
- new CreateMediumIfNotAlreadyExists(manager, diskFormat, true).apply(adminDiskPath);
+ new CreateMediumIfNotAlreadyExists(manager, true).apply(hardDisk);
verify(machine, vBox);
@@ -75,61 +89,58 @@ public class CreateMediumIfNotAlreadyExistsTest {
@Test
public void testDeleteAndCreateNewStorageWhenMediumExistsAndUsingOverwrite() throws Exception {
- String adminDiskPath = "/Users/johndoe/jclouds-virtualbox-images/admin.vdi";
- String diskFormat = "vdi";
+ HardDisk hardDisk = createTestHardDisk();
VirtualBoxManager manager = createNiceMock(VirtualBoxManager.class);
IMachine machine = createMock(IMachine.class);
IVirtualBox vBox = createMock(IVirtualBox.class);
- IMedium hardDisk = createMock(IMedium.class);
+ IMedium medium = createMock(IMedium.class);
IMedium newHardDisk = createMock(IMedium.class);
IProgress progress = createNiceMock(IProgress.class);
expect(manager.getVBox()).andReturn(vBox).anyTimes();
- expect(vBox.findMedium(adminDiskPath, DeviceType.HardDisk)).andReturn(hardDisk);
+ expect(vBox.findMedium(adminDiskPath, DeviceType.HardDisk)).andReturn(medium);
- expect(hardDisk.deleteStorage()).andReturn(progress);
+ expect(medium.deleteStorage()).andReturn(progress);
expect(vBox.createHardDisk(diskFormat, adminDiskPath)).andReturn(newHardDisk);
expect(newHardDisk.createBaseStorage(anyLong(), anyLong())).andReturn(progress);
- replay(manager, machine, vBox, hardDisk, newHardDisk, progress);
+ replay(manager, machine, vBox, medium, newHardDisk, progress);
- IMedium newDisk = new CreateMediumIfNotAlreadyExists(manager, diskFormat, true).apply(adminDiskPath);
+ IMedium newDisk = new CreateMediumIfNotAlreadyExists(manager, true).apply(hardDisk);
- verify(machine, vBox, hardDisk);
- assertNotSame(newDisk, hardDisk);
+ verify(machine, vBox, medium);
+ assertNotSame(newDisk, medium);
}
@Test(expectedExceptions = IllegalStateException.class)
public void testFailWhenMediumExistsAndNotUsingOverwrite() throws Exception {
- String adminDiskPath = "/Users/johndoe/jclouds-virtualbox-images/admin.vdi";
- String diskFormat = "vdi";
+ HardDisk hardDisk = createTestHardDisk();
VirtualBoxManager manager = createNiceMock(VirtualBoxManager.class);
IMachine machine = createMock(IMachine.class);
IVirtualBox vBox = createMock(IVirtualBox.class);
- IMedium hardDisk = createMock(IMedium.class);
+ IMedium medium = createMock(IMedium.class);
IMedium newHardDisk = createMock(IMedium.class);
IProgress progress = createNiceMock(IProgress.class);
expect(manager.getVBox()).andReturn(vBox).anyTimes();
- expect(vBox.findMedium(adminDiskPath, DeviceType.HardDisk)).andReturn(hardDisk);
+ expect(vBox.findMedium(adminDiskPath, DeviceType.HardDisk)).andReturn(medium);
- replay(manager, machine, vBox, hardDisk, newHardDisk, progress);
+ replay(manager, machine, vBox, medium, newHardDisk, progress);
- new CreateMediumIfNotAlreadyExists(manager, diskFormat, false).apply(adminDiskPath);
+ new CreateMediumIfNotAlreadyExists(manager, false).apply(hardDisk);
}
@Test(expectedExceptions = VBoxException.class)
public void testFailOnOtherVBoxException() throws Exception {
- String adminDiskPath = "/Users/johndoe/jclouds-virtualbox-images/admin.vdi";
- String diskFormat = "vdi";
+ HardDisk hardDisk = createTestHardDisk();
VirtualBoxManager manager = createNiceMock(VirtualBoxManager.class);
IMachine machine = createMock(IMachine.class);
IVirtualBox vBox = createMock(IVirtualBox.class);
- IMedium hardDisk = createMock(IMedium.class);
+ IMedium medium = createMock(IMedium.class);
IProgress progress = createNiceMock(IProgress.class);
String errorMessage = "VirtualBox error: Some other VBox error";
@@ -138,12 +149,16 @@ public class CreateMediumIfNotAlreadyExistsTest {
VBoxException notFoundException = new VBoxException(createNiceMock(Throwable.class), errorMessage);
expect(vBox.findMedium(adminDiskPath, DeviceType.HardDisk)).andThrow(notFoundException);
- expect(vBox.createHardDisk(diskFormat, adminDiskPath)).andReturn(hardDisk);
- expect(hardDisk.createBaseStorage(anyLong(), anyLong())).andReturn(progress);
+ expect(vBox.createHardDisk(diskFormat, adminDiskPath)).andReturn(medium);
+ expect(medium.createBaseStorage(anyLong(), anyLong())).andReturn(progress);
- replay(manager, machine, vBox, hardDisk);
+ replay(manager, machine, vBox, medium);
- new CreateMediumIfNotAlreadyExists(manager, diskFormat, true).apply(adminDiskPath);
+ new CreateMediumIfNotAlreadyExists(manager, true).apply(hardDisk);
+ }
+
+ private HardDisk createTestHardDisk() {
+ return new HardDisk(new DeviceDetails(0, 0, DeviceType.HardDisk), adminDiskPath, diskFormat);
}
}
diff --git a/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/IsoToIMachineLiveTest.java b/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/IsoToIMachineLiveTest.java
index d0459ed21f..ad91b2fbe6 100644
--- a/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/IsoToIMachineLiveTest.java
+++ b/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/IsoToIMachineLiveTest.java
@@ -19,18 +19,9 @@
package org.jclouds.virtualbox.functions;
-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.experiment.TestUtils.computeServiceForLocalhostAndGuest;
-import static org.testng.Assert.assertTrue;
-
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-
import com.google.common.base.Function;
import com.google.common.base.Predicate;
+import com.google.inject.Guice;
import org.jclouds.compute.ComputeServiceContext;
import org.jclouds.compute.config.BaseComputeServiceContextModule;
import org.jclouds.compute.domain.Image;
@@ -43,16 +34,25 @@ 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.util.PropertyUtils;
import org.testng.annotations.BeforeGroups;
import org.testng.annotations.Test;
-import org.virtualbox_4_1.CleanupMode;
-import org.virtualbox_4_1.IMachine;
-import org.virtualbox_4_1.VirtualBoxManager;
-
-import com.google.inject.Guice;
+import org.virtualbox_4_1.*;
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.GUI;
+import static org.jclouds.virtualbox.domain.ExecutionType.HEADLESS;
+import static org.jclouds.virtualbox.experiment.TestUtils.computeServiceForLocalhostAndGuest;
+import static org.testng.Assert.assertTrue;
/**
* @author Andrea Turli, Mattias Holmqvist
@@ -62,20 +62,17 @@ public class IsoToIMachineLiveTest extends BaseVirtualBoxClientLiveTest {
Map> map = new BaseComputeServiceContextModule() {
}.provideOsVersionMap(new ComputeServiceConstants.ReferenceData(), Guice.createInjector(new GsonModule())
- .getInstance(Json.class));
+ .getInstance(Json.class));
- private boolean forceOverwrite = true;
private String vmId = "jclouds-image-iso-1";
private String osTypeId = "";
- private String controllerIDE = "IDE Controller";
- private String diskFormat = "";
- private String adminDisk = "testadmin.vdi";
+ private String ideControllerName = "IDE Controller";
private String guestId = "guest";
private String hostId = "host";
private String vmName = "jclouds-image-virtualbox-iso-to-machine-test";
- @BeforeGroups(groups = { "live" })
+ @BeforeGroups(groups = {"live"})
public void setUp() throws Exception {
identity = "toor";
credential = "password";
@@ -86,11 +83,21 @@ public class IsoToIMachineLiveTest extends BaseVirtualBoxClientLiveTest {
VirtualBoxManager manager = (VirtualBoxManager) context.getProviderSpecificContext().getApi();
ComputeServiceContext localHostContext = computeServiceForLocalhostAndGuest(hostId, "localhost", guestId,
- "localhost", new Credentials("toor", "password"));
+ "localhost", new Credentials("toor", "password"));
Predicate socketTester = new RetryablePredicate(new InetSocketAddressConnect(), 10, 1, TimeUnit.SECONDS);
- IMachine imageMachine = new IsoToIMachine(manager, adminDisk, diskFormat, vmName, osTypeId, vmId,
- forceOverwrite, controllerIDE, localHostContext, hostId, guestId, socketTester, "127.0.0.1", 8080)
- .apply("ubuntu-11.04-server-i386.iso");
+
+ String workingDir = PropertyUtils.getWorkingDirFromProperty();
+ StorageController ideController = StorageController.builder().name(ideControllerName).bus(StorageBus.IDE)
+ .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();
+ VmSpecification vmSpecification = VmSpecification.builder().id(vmId).name(vmName).osTypeId(osTypeId)
+ .controller(ideController)
+ .forceOverwrite(true)
+ .natNetworkAdapter(0, NatAdapter.builder().tcpRedirectRule("127.0.0.1", 2222, "", 22).build()).build();
+ IMachine imageMachine = new IsoToIMachine(manager, guestId, vmSpecification, localHostContext, hostId,
+ socketTester, "127.0.0.1", 8080, HEADLESS)
+ .apply("ubuntu-11.04-server-i386.iso");
IMachineToImage iMachineToImage = new IMachineToImage(manager, map);
Image newImage = iMachineToImage.apply(imageMachine);
diff --git a/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/predicates/SshAvailableLiveTest.java b/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/predicates/SshAvailableLiveTest.java
index 123f9c01e0..ecaf439550 100644
--- a/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/predicates/SshAvailableLiveTest.java
+++ b/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/predicates/SshAvailableLiveTest.java
@@ -1,13 +1,7 @@
package org.jclouds.virtualbox.predicates;
-import static org.jclouds.virtualbox.experiment.TestUtils.computeServiceForLocalhostAndGuest;
-import static org.jclouds.virtualbox.util.MachineUtils.applyForMachine;
-import static org.jclouds.virtualbox.util.MachineUtils.lockSessionOnMachineAndApply;
-import static org.virtualbox_4_1.LockType.Shared;
-import static org.testng.Assert.assertTrue;
-
-import java.util.concurrent.TimeUnit;
-
+import com.google.common.base.Function;
+import com.google.common.base.Predicate;
import org.jclouds.compute.ComputeServiceContext;
import org.jclouds.domain.Credentials;
import org.jclouds.net.IPSocket;
@@ -15,47 +9,44 @@ import org.jclouds.predicates.InetSocketAddressConnect;
import org.jclouds.predicates.RetryablePredicate;
import org.jclouds.virtualbox.BaseVirtualBoxClientLiveTest;
import org.jclouds.virtualbox.domain.ExecutionType;
+import org.jclouds.virtualbox.domain.StorageController;
+import org.jclouds.virtualbox.domain.VmSpecification;
import org.jclouds.virtualbox.functions.IsoToIMachine;
import org.jclouds.virtualbox.functions.LaunchMachineIfNotAlreadyRunning;
+import org.jclouds.virtualbox.util.PropertyUtils;
import org.testng.annotations.Test;
-import org.virtualbox_4_1.IMachine;
-import org.virtualbox_4_1.IProgress;
-import org.virtualbox_4_1.ISession;
-import org.virtualbox_4_1.VirtualBoxManager;
+import org.virtualbox_4_1.*;
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
+import java.util.concurrent.TimeUnit;
-@Test(groups = "live", singleThreaded = true, testName = "IsoToIMachineLiveTest")
+import static org.jclouds.virtualbox.domain.ExecutionType.HEADLESS;
+import static org.jclouds.virtualbox.experiment.TestUtils.computeServiceForLocalhostAndGuest;
+import static org.jclouds.virtualbox.util.MachineUtils.applyForMachine;
+import static org.jclouds.virtualbox.util.MachineUtils.lockSessionOnMachineAndApply;
+import static org.testng.Assert.assertTrue;
+import static org.virtualbox_4_1.LockType.Shared;
+
+@Test(groups = "live", singleThreaded = true, testName = "SshAvailableLiveTest")
public class SshAvailableLiveTest extends BaseVirtualBoxClientLiveTest {
- private boolean forceOverwrite = true;
- private String vmId = "jclouds-image-iso-1";
- private String osTypeId = "";
- private String controllerIDE = "IDE Controller";
- private String diskFormat = "";
- private String adminDisk = "testadmin.vdi";
private String guestId = "guest";
private String hostId = "host";
- private String vmName = "jclouds-image-virtualbox-iso-to-machine-test";
- private String isoName = "ubuntu-11.04-server-i386.iso";
+ private String vmName = "jclouds-image-virtualbox-iso-to-machine-sshtest";
@Test
public void testSshDaemonIsRunning() {
- VirtualBoxManager manager = (VirtualBoxManager) context
- .getProviderSpecificContext().getApi();
+ VirtualBoxManager manager = (VirtualBoxManager) context.getProviderSpecificContext().getApi();
ComputeServiceContext localHostContext = computeServiceForLocalhostAndGuest(
- hostId, "localhost", guestId, "localhost", new Credentials("toor",
- "password"));
+ hostId, "localhost", guestId, "localhost", new Credentials("toor","password"));
- getNodeWithSshDaemonRunning(manager, localHostContext);
+ getNodeWithSshDaemonRunning(manager, localHostContext);
ensureMachineIsLaunched(vmName);
RetryablePredicate predicate = new RetryablePredicate(
- new SshAvailable(localHostContext), 5, 1,
- TimeUnit.SECONDS);
+ new SshAvailable(localHostContext), 5, 1,
+ TimeUnit.SECONDS);
assertTrue(predicate.apply(guestId));
-
+
lockSessionOnMachineAndApply(manager, Shared, vmName, new Function() {
@Override
@@ -68,14 +59,23 @@ public class SshAvailableLiveTest extends BaseVirtualBoxClientLiveTest {
});
}
- private IMachine getNodeWithSshDaemonRunning(VirtualBoxManager manager,
- ComputeServiceContext localHostContext) {
+ private IMachine getNodeWithSshDaemonRunning(VirtualBoxManager manager, ComputeServiceContext localHostContext) {
try {
Predicate socketTester = new RetryablePredicate(
- new InetSocketAddressConnect(), 10, 1, TimeUnit.SECONDS);
- return new IsoToIMachine(manager, adminDisk, diskFormat, vmName,
- osTypeId, vmId, forceOverwrite, controllerIDE, localHostContext,
- hostId, guestId, socketTester, "127.0.0.1", 8080).apply(isoName);
+ new InetSocketAddressConnect(), 10, 1, TimeUnit.SECONDS);
+ String vmId = "jclouds-image-iso-2";
+ String isoName = "ubuntu-11.04-server-i386.iso";
+
+ String workingDir = PropertyUtils.getWorkingDirFromProperty();
+ StorageController ideController = StorageController.builder().name("IDE Controller").bus(StorageBus.IDE)
+ .attachISO(0, 0, workingDir + "/ubuntu-11.04-server-i386.iso")
+ .attachHardDisk(0, 1, workingDir + "/testadmin.vdi").build();
+ VmSpecification vmSpecification = VmSpecification.builder().id(vmId).name(vmName).osTypeId("")
+ .controller(ideController)
+ .forceOverwrite(true).build();
+
+ return new IsoToIMachine(manager, guestId, vmSpecification, localHostContext,
+ hostId, socketTester, "127.0.0.1", 8080, HEADLESS).apply(isoName);
} catch (IllegalStateException e) {
// already created
return manager.getVBox().findMachine(vmName);
@@ -84,7 +84,7 @@ public class SshAvailableLiveTest extends BaseVirtualBoxClientLiveTest {
private void ensureMachineIsLaunched(String vmName) {
applyForMachine(manager, vmName, new LaunchMachineIfNotAlreadyRunning(
- manager, ExecutionType.GUI, ""));
+ manager, ExecutionType.GUI, ""));
}
}
\ No newline at end of file