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/AttachNATRedirectRuleToMachine.java new file mode 100644 index 0000000000..b20aadb1cf --- /dev/null +++ b/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/functions/AttachNATRedirectRuleToMachine.java @@ -0,0 +1,51 @@ +/* + * 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 com.google.common.base.Function; +import org.virtualbox_4_1.IMachine; +import org.virtualbox_4_1.INetworkAdapter; + +import javax.annotation.Nullable; + +import static org.virtualbox_4_1.NATProtocol.TCP; +import static org.virtualbox_4_1.NetworkAttachmentType.NAT; + +/** + * @author Mattias Holmqvist + */ +public class AttachNATRedirectRuleToMachine implements Function { + + private long adapterIndex; + + public AttachNATRedirectRuleToMachine(long adapterSlot) { + this.adapterIndex = adapterSlot; + } + + @Override + public Void apply(@Nullable IMachine machine) { + INetworkAdapter networkAdapter = machine.getNetworkAdapter(adapterIndex); + networkAdapter.setAttachmentType(NAT); + networkAdapter.getNatDriver().addRedirect("guestssh", TCP, "127.0.0.1", 2222, "", 22); + networkAdapter.setEnabled(true); + machine.saveSettings(); + return null; + } +} 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 a65153e143..9dfe060bcb 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 @@ -29,11 +29,8 @@ import static org.virtualbox_4_1.AccessMode.ReadOnly; import static org.virtualbox_4_1.DeviceType.DVD; import static org.virtualbox_4_1.LockType.Shared; import static org.virtualbox_4_1.LockType.Write; -import static org.virtualbox_4_1.NATProtocol.TCP; -import static org.virtualbox_4_1.NetworkAttachmentType.NAT; import java.io.File; -import java.util.List; import javax.annotation.Resource; import javax.inject.Named; @@ -139,18 +136,7 @@ public class IsoToIMachine implements Function { new AttachHardDiskToMachineIfNotAlreadyAttached(controllerIDE, hardDisk, manager)); // NAT - lockMachineAndApply(manager, Write, vmName, new Function() { - - @Override - public Void apply(IMachine machine) { - machine.getNetworkAdapter(0l).setAttachmentType(NAT); - machine.getNetworkAdapter(0l).getNatDriver().addRedirect("guestssh", TCP, "127.0.0.1", 2222, "", 22); - machine.getNetworkAdapter(0l).setEnabled(true); - machine.saveSettings(); - return null; - } - - }); + ensureNATNetworkingIsAppliedToMachine(vmName); String guestAdditionsDvd = workingDir + "/VBoxGuestAdditions_4.1.2.iso"; final IMedium guestAdditionsDvdMedium = manager.getVBox().openMedium(guestAdditionsDvd, DeviceType.DVD, @@ -211,6 +197,10 @@ public class IsoToIMachine implements Function { return vm; } + private void ensureNATNetworkingIsAppliedToMachine(String vmName) { + lockMachineAndApply(manager, Write, vmName, new AttachNATRedirectRuleToMachine(0l)); + } + 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); 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/AttachNATRedirectRuleToMachineTest.java new file mode 100644 index 0000000000..be7cdd1fda --- /dev/null +++ b/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/AttachNATRedirectRuleToMachineTest.java @@ -0,0 +1,77 @@ +/* + * 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.testng.annotations.Test; +import org.virtualbox_4_1.*; + +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 + public void testApplyNetworkingToNonExistingAdapter() throws Exception { + Long adapterId = 0l; + IMachine machine = createMock(IMachine.class); + INetworkAdapter networkAdapter = createMock(INetworkAdapter.class); + INATEngine natEngine = createMock(INATEngine.class); + + expect(machine.getNetworkAdapter(adapterId)).andReturn(networkAdapter); + networkAdapter.setAttachmentType(NAT); + expect(networkAdapter.getNatDriver()).andReturn(natEngine); + natEngine.addRedirect("guestssh", TCP, "127.0.0.1", 2222, "", 22); + networkAdapter.setEnabled(true); + machine.saveSettings(); + + replay(machine, networkAdapter, natEngine); + + new AttachNATRedirectRuleToMachine(adapterId).apply(machine); + + verify(machine, networkAdapter, natEngine); + } + + @Test(expectedExceptions = VBoxException.class) + public void testRethrowInvalidAdapterSlotException() throws Exception { + Long adapterId = 30l; + IMachine machine = createMock(IMachine.class); + INetworkAdapter networkAdapter = createMock(INetworkAdapter.class); + INATEngine natEngine = createMock(INATEngine.class); + + String error = "VirtualBox error: Argument slot is invalid " + + "(must be slot < RT_ELEMENTS(mNetworkAdapters)) (0x80070057)"; + + VBoxException invalidSlotException = new VBoxException(createNiceMock(Throwable.class), error); + expect(machine.getNetworkAdapter(adapterId)).andThrow(invalidSlotException); + + replay(machine, networkAdapter, natEngine); + + new AttachNATRedirectRuleToMachine(adapterId).apply(machine); + + verify(machine, networkAdapter, natEngine); + } + + +}