From 2aea0c3caa4a1224bee8230079347d6f47ae809a Mon Sep 17 00:00:00 2001 From: andreaturli Date: Tue, 3 Jan 2012 00:27:02 +0000 Subject: [PATCH] issue 384: IMachineToVmSpec + Test --- .../functions/IMachineToVmSpec.java | 104 ++++++++++++++++++ .../functions/IMachineToVmSpecTest.java | 102 +++++++++++++++++ 2 files changed, 206 insertions(+) create mode 100644 sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/functions/IMachineToVmSpec.java create mode 100644 sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/IMachineToVmSpecTest.java diff --git a/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/functions/IMachineToVmSpec.java b/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/functions/IMachineToVmSpec.java new file mode 100644 index 0000000000..60ea63111f --- /dev/null +++ b/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/functions/IMachineToVmSpec.java @@ -0,0 +1,104 @@ +/** + * 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 java.util.List; + +import javax.annotation.Nullable; +import javax.annotation.Resource; +import javax.inject.Named; + +import org.jclouds.compute.reference.ComputeServiceConstants; +import org.jclouds.logging.Logger; +import org.jclouds.virtualbox.domain.HardDisk; +import org.jclouds.virtualbox.domain.StorageController; +import org.jclouds.virtualbox.domain.StorageController.Builder; +import org.jclouds.virtualbox.domain.VmSpec; +import org.virtualbox_4_1.CleanupMode; +import org.virtualbox_4_1.DeviceType; +import org.virtualbox_4_1.IMachine; +import org.virtualbox_4_1.IMedium; +import org.virtualbox_4_1.IMediumAttachment; +import org.virtualbox_4_1.IStorageController; + +import com.google.common.base.Function; +import com.google.common.collect.Lists; + +/** + * Get a VmSpec from an IMachine + * + * @author Andrea Turli + */ +public class IMachineToVmSpec implements Function { + + @Resource + @Named(ComputeServiceConstants.COMPUTE_LOGGER) + protected Logger logger = Logger.NULL; + + @Override + public VmSpec apply(@Nullable IMachine machine) { + List controllers = buildControllers(machine); + + // TODO some parameters are predefined cause the IMachine doesn't have the + // concept i.e.: cleanUpMode + org.jclouds.virtualbox.domain.VmSpec.Builder vmSpecBuilder = VmSpec + .builder(); + + vmSpecBuilder.id(machine.getId()).name(machine.getName()) + .memoryMB(machine.getMemorySize().intValue()) + .osTypeId(machine.getOSTypeId()).forceOverwrite(true) + .cleanUpMode(CleanupMode.Full); + + for (StorageController storageController : controllers) { + vmSpecBuilder.controller(storageController); + } + + return vmSpecBuilder.build(); + } + + private List buildControllers(IMachine machine) { + + List controllers = Lists.newArrayList(); + for (IStorageController iStorageController : machine + .getStorageControllers()) { + + Builder storageControlleBuiler = StorageController.builder(); + for (IMediumAttachment iMediumAttachment : machine + .getMediumAttachmentsOfController(iStorageController.getName())) { + IMedium iMedium = iMediumAttachment.getMedium(); + if (iMedium.getDeviceType().equals(DeviceType.HardDisk)) { + storageControlleBuiler.attachHardDisk(HardDisk.builder() + .diskpath(iMedium.getLocation()).autoDelete(true) + .controllerPort(iMediumAttachment.getPort()) + .deviceSlot(iMediumAttachment.getDevice().intValue()) + .build()); + } else if (iMedium.getDeviceType().equals(DeviceType.DVD)) { + storageControlleBuiler.attachISO(iMediumAttachment.getPort(), + iMediumAttachment.getDevice().intValue(), + iMedium.getLocation()); + } + } + controllers.add(storageControlleBuiler + .name(iStorageController.getName()) + .bus(iStorageController.getBus()).build()); + } + return controllers; + } +} diff --git a/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/IMachineToVmSpecTest.java b/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/IMachineToVmSpecTest.java new file mode 100644 index 0000000000..da62099a2c --- /dev/null +++ b/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/IMachineToVmSpecTest.java @@ -0,0 +1,102 @@ +/** + * 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.expect; +import static org.easymock.classextension.EasyMock.createNiceMock; +import static org.easymock.classextension.EasyMock.replay; +import static org.testng.Assert.assertEquals; + +import org.jclouds.virtualbox.domain.HardDisk; +import org.jclouds.virtualbox.domain.IsoImage; +import org.jclouds.virtualbox.domain.StorageController; +import org.jclouds.virtualbox.domain.VmSpec; +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.IMediumAttachment; +import org.virtualbox_4_1.IStorageController; +import org.virtualbox_4_1.StorageBus; +import org.virtualbox_4_1.VirtualBoxManager; + +import com.google.common.collect.Lists; + +@Test(groups = "unit") +public class IMachineToVmSpecTest { + + private static final String PATH_TO_DVD = "/path/to/dvd"; + private static final String PATH_TO_HD = "/path/to/hd"; + private static final StorageBus CONTROLLER_BUS = StorageBus.IDE; + private static final long MEMORY_SIZE = 512L; + private static final String VM_NAME = "test"; + private static final String CONTROLLER_NAME = "IDE Controller"; + private static final String VM_ID = "test"; + + @Test + public void testConvert() throws Exception { + + VirtualBoxManager vbm = createNiceMock(VirtualBoxManager.class); + IStorageController iStorageController = createNiceMock(IStorageController.class); + + IMediumAttachment iMediumAttachment = createNiceMock(IMediumAttachment.class); + IMedium hd = createNiceMock(IMedium.class); + IMedium dvd = createNiceMock(IMedium.class); + + IMachine vm = createNiceMock(IMachine.class); + + expect(vm.getStorageControllers()).andReturn(Lists.newArrayList(iStorageController)).anyTimes(); + expect(iStorageController.getName()).andReturn(CONTROLLER_NAME).anyTimes(); + expect(iStorageController.getBus()).andReturn(CONTROLLER_BUS).anyTimes(); + expect(vm.getMediumAttachmentsOfController(CONTROLLER_NAME)).andReturn(Lists.newArrayList(iMediumAttachment)).anyTimes(); + expect(iMediumAttachment.getPort()).andReturn(0).once(); + expect(iMediumAttachment.getDevice()).andReturn(0).once(); + + expect(iMediumAttachment.getMedium()).andReturn(hd); + expect(hd.getDeviceType()).andReturn(DeviceType.HardDisk).once(); + expect(hd.getLocation()).andReturn(PATH_TO_HD).once(); + + expect(iMediumAttachment.getMedium()).andReturn(dvd); + expect(dvd.getDeviceType()).andReturn(DeviceType.DVD).once(); + expect(dvd.getLocation()).andReturn(PATH_TO_DVD).once(); + + expect(vm.getName()).andReturn(VM_NAME).anyTimes(); + expect(vm.getId()).andReturn(VM_ID).anyTimes(); + expect(vm.getMemorySize()).andReturn(MEMORY_SIZE).anyTimes(); + + replay(vbm, iStorageController, iMediumAttachment, hd, dvd, vm); + + VmSpec vmSpec = new IMachineToVmSpec().apply(vm); + + assertEquals(vmSpec.getVmName(), VM_NAME); + assertEquals(vmSpec.getVmId(), VM_ID); + assertEquals(vmSpec.getMemory(), MEMORY_SIZE); + for(StorageController controller : vmSpec.getControllers()) { + assertEquals(controller.getName(), CONTROLLER_NAME); + assertEquals(controller.getBus(), CONTROLLER_BUS); + for (HardDisk hardDisk : controller.getHardDisks()) { + assertEquals(hardDisk.getDiskPath(), PATH_TO_HD); + } + for (IsoImage iso : controller.getIsoImages()) { + assertEquals(iso.getSourcePath(), PATH_TO_DVD); + } + } + } +}