diff --git a/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/config/VirtualBoxComputeServiceContextModule.java b/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/config/VirtualBoxComputeServiceContextModule.java index 0417ac4623..0bc7c65c8b 100644 --- a/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/config/VirtualBoxComputeServiceContextModule.java +++ b/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/config/VirtualBoxComputeServiceContextModule.java @@ -42,7 +42,6 @@ import org.jclouds.location.Provider; import org.jclouds.location.suppliers.OnlyLocationOrFirstZone; import org.jclouds.virtualbox.compute.VirtualBoxComputeServiceAdapter; import org.jclouds.virtualbox.functions.IMachineToHardware; -import org.jclouds.virtualbox.functions.IMachineToImage; import org.jclouds.virtualbox.functions.IMachineToNodeMetadata; import org.virtualbox_4_1.IMachine; import org.virtualbox_4_1.MachineState; @@ -99,7 +98,7 @@ public class VirtualBoxComputeServiceContextModule extends ComputeServiceAdapter @Override protected TemplateBuilder provideTemplate(Injector injector, TemplateBuilder template) { - return template.osFamily(OsFamily.UBUNTU).os64Bit(false).osVersionMatches("11.04-server"); + return template.osFamily(OsFamily.UBUNTU).osVersionMatches("11.04"); } @VisibleForTesting diff --git a/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/domain/YamlImage.java b/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/domain/YamlImage.java index 9950d4db14..fb4c472c76 100644 --- a/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/domain/YamlImage.java +++ b/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/domain/YamlImage.java @@ -23,7 +23,7 @@ package org.jclouds.virtualbox.domain; -import static org.jclouds.virtualbox.functions.IMachineToImage.osFamily; +import static org.jclouds.compute.util.ComputeServiceUtils.parseOsFamilyOrUnrecognized; import java.util.List; import java.util.Map; @@ -141,8 +141,8 @@ public class YamlImage { public Image apply(YamlImage arg0) { if (arg0 == null) return null; - - OsFamily family = osFamily().apply(arg0.os_family); + OsFamily family = parseOsFamilyOrUnrecognized(arg0.os_family); + OperatingSystem operatingSystem = OperatingSystem.builder() .description(arg0.os_description) .family(family) diff --git a/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/functions/IMachineToImage.java b/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/functions/IMachineToImage.java index 5f38aa0cc1..dd67144fdc 100644 --- a/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/functions/IMachineToImage.java +++ b/sandbox-apis/virtualbox/src/main/java/org/jclouds/virtualbox/functions/IMachineToImage.java @@ -21,7 +21,15 @@ package org.jclouds.virtualbox.functions; -import com.google.common.base.Function; +import static com.google.common.base.Preconditions.checkNotNull; +import static org.jclouds.compute.util.ComputeServiceUtils.parseOsFamilyOrUnrecognized; +import static org.jclouds.compute.util.ComputeServiceUtils.parseVersionOrReturnEmptyString; + +import java.util.Map; + +import javax.inject.Inject; +import javax.inject.Singleton; + import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.ImageBuilder; import org.jclouds.compute.domain.OperatingSystem; @@ -31,77 +39,33 @@ import org.virtualbox_4_1.IGuestOSType; import org.virtualbox_4_1.IMachine; import org.virtualbox_4_1.VirtualBoxManager; -import javax.inject.Inject; - +import com.google.common.base.Function; +@Singleton public class IMachineToImage implements Function { - private static final String UBUNTU = "Ubuntu"; - - private VirtualBoxManager virtualboxManager; + private final VirtualBoxManager virtualboxManager; + private final Map> osVersionMap; @Inject - public IMachineToImage(VirtualBoxManager virtualboxManager) { - this.virtualboxManager = virtualboxManager; + public IMachineToImage(VirtualBoxManager virtualboxManager, Map> osVersionMap) { + this.virtualboxManager = checkNotNull(virtualboxManager, "virtualboxManager"); + this.osVersionMap = checkNotNull(osVersionMap, "osVersionMap"); } @Override public Image apply(@Nullable IMachine from) { + if (from == null) + return null; IGuestOSType guestOSType = virtualboxManager.getVBox().getGuestOSType(from.getOSTypeId()); + OsFamily family = parseOsFamilyOrUnrecognized(guestOSType.getDescription()); + String version = parseVersionOrReturnEmptyString(family, guestOSType.getDescription(), + osVersionMap); + OperatingSystem os = OperatingSystem.builder().description(guestOSType.getDescription()).family(family) + .version(version).is64Bit(guestOSType.getIs64Bit()).build(); - OsFamily family = osFamily().apply(guestOSType.getDescription()); - OperatingSystem os = OperatingSystem.builder() - .description(guestOSType.getDescription()) - .family(family) - .version(osVersion().apply(guestOSType.getDescription())) - .is64Bit(guestOSType.getIs64Bit()) - .build(); - - return new ImageBuilder() - .id("" + from.getId()) - .description(from.getDescription()) - .operatingSystem(os) - .build(); + return new ImageBuilder().id("" + from.getId()).description(from.getDescription()).operatingSystem(os).build(); } - /** - * Parses the item description to determine the OSFamily - * - * @return the @see OsFamily or OsFamily.UNRECOGNIZED - */ - public static Function osFamily() { - - return new Function() { - @Override - public OsFamily apply(String osDescription) { - if (osDescription.startsWith("linux")) return OsFamily.LINUX; - if (osDescription.startsWith("Ubuntu")) return OsFamily.LINUX; - return OsFamily.UNRECOGNIZED; - } - }; - } - - /** - * Parses the item description to determine the os version - * - * @return the version, empty if not found - */ - public static Function osVersion() { - return new Function() { - @Override - public String apply(String osDescription) { - OsFamily family = osFamily().apply(osDescription); - if (family.equals(OsFamily.LINUX)) - return parseVersion(osDescription, UBUNTU); - else - return ""; - } - }; - } - - private static String parseVersion(String description, String os) { - String noOsName = description.replaceFirst(os, "").trim(); - return noOsName.split(" ")[0]; - } } diff --git a/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/compute/VirtualBoxTemplateBuilderLiveTest.java b/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/compute/VirtualBoxTemplateBuilderLiveTest.java index 5ec6169858..6459ca2bfe 100644 --- a/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/compute/VirtualBoxTemplateBuilderLiveTest.java +++ b/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/compute/VirtualBoxTemplateBuilderLiveTest.java @@ -21,7 +21,7 @@ import com.google.common.collect.ImmutableSet; * @author Andrea Turli */ -@Test(groups = "live") +@Test(groups = "live", testName = "VirtualBoxTemplateBuilderLiveTest") public class VirtualBoxTemplateBuilderLiveTest extends BaseTemplateBuilderLiveTest { public VirtualBoxTemplateBuilderLiveTest() { @@ -36,14 +36,7 @@ public class VirtualBoxTemplateBuilderLiveTest extends BaseTemplateBuilderLiveTe public boolean apply(OsFamilyVersion64Bit input) { switch (input.family) { case UBUNTU: - return !(input.version.startsWith("11") || input.version.equals("8.04")) && input.is64Bit; - case DEBIAN: - return !(input.version.equals("6.0")) && input.is64Bit; - case CENTOS: - return !(input.version.matches("5.[023]") || input.version.equals("8.04")) && input.is64Bit; - case WINDOWS: - return input.version.equals("2008 SP2") || input.version.equals("") - || (input.version.equals("2008 R2") && input.is64Bit); + return input.version.equals("11.04") && !input.is64Bit; default: return false; } @@ -54,8 +47,9 @@ public class VirtualBoxTemplateBuilderLiveTest extends BaseTemplateBuilderLiveTe @Test public void testTemplateBuilder() { + System.out.println(this.context.getComputeService().listImages()); Template defaultTemplate = this.context.getComputeService().templateBuilder().build(); - assertEquals(defaultTemplate.getImage().getOperatingSystem().is64Bit(), true); + assertEquals(defaultTemplate.getImage().getOperatingSystem().is64Bit(), false); assertEquals(defaultTemplate.getImage().getOperatingSystem().getVersion(), "10.04"); assertEquals(defaultTemplate.getImage().getOperatingSystem().getFamily(), OsFamily.UBUNTU); assertEquals(getCores(defaultTemplate.getHardware()), 1.0d); diff --git a/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/IMachineToImageTest.java b/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/IMachineToImageTest.java index a0a96d4e3a..6ae95f429d 100644 --- a/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/IMachineToImageTest.java +++ b/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/IMachineToImageTest.java @@ -21,16 +21,6 @@ package org.jclouds.virtualbox.functions; - -import com.google.common.base.Function; -import org.jclouds.compute.domain.Image; -import org.jclouds.compute.domain.OsFamily; -import org.testng.annotations.Test; -import org.virtualbox_4_1.IGuestOSType; -import org.virtualbox_4_1.IMachine; -import org.virtualbox_4_1.IVirtualBox; -import org.virtualbox_4_1.VirtualBoxManager; - import static org.easymock.EasyMock.eq; import static org.easymock.EasyMock.expect; import static org.easymock.classextension.EasyMock.createNiceMock; @@ -38,14 +28,34 @@ import static org.easymock.classextension.EasyMock.replay; import static org.testng.Assert.assertEquals; import static org.testng.AssertJUnit.assertTrue; +import java.util.Map; + +import org.jclouds.compute.config.BaseComputeServiceContextModule; +import org.jclouds.compute.domain.Image; +import org.jclouds.compute.domain.OsFamily; +import org.jclouds.compute.reference.ComputeServiceConstants; +import org.jclouds.json.Json; +import org.jclouds.json.config.GsonModule; +import org.testng.annotations.Test; +import org.virtualbox_4_1.IGuestOSType; +import org.virtualbox_4_1.IMachine; +import org.virtualbox_4_1.IVirtualBox; +import org.virtualbox_4_1.VirtualBoxManager; + +import com.google.inject.Guice; + @Test(groups = "unit") public class IMachineToImageTest { + Map> map = new BaseComputeServiceContextModule() { + }.provideOsVersionMap(new ComputeServiceConstants.ReferenceData(), Guice.createInjector(new GsonModule()) + .getInstance(Json.class)); + @Test public void testConvert() throws Exception { VirtualBoxManager vbm = createNiceMock(VirtualBoxManager.class); - IVirtualBox vBox= createNiceMock(IVirtualBox.class); + IVirtualBox vBox = createNiceMock(IVirtualBox.class); IMachine vm = createNiceMock(IMachine.class); IGuestOSType guestOsType = createNiceMock(IGuestOSType.class); String linuxDescription = "Ubuntu 10.04"; @@ -59,33 +69,54 @@ public class IMachineToImageTest { replay(vbm, vBox, vm, guestOsType); - IMachineToImage fn = new IMachineToImage(vbm); + IMachineToImage fn = new IMachineToImage(vbm, map); Image image = fn.apply(vm); assertEquals(image.getDescription(), "my-ubuntu-machine"); assertEquals(image.getOperatingSystem().getDescription(), linuxDescription); assertTrue(image.getOperatingSystem().is64Bit()); - assertEquals(image.getOperatingSystem().getFamily(), OsFamily.LINUX); + assertEquals(image.getOperatingSystem().getFamily(), OsFamily.UBUNTU); assertEquals(image.getOperatingSystem().getVersion(), "10.04"); } @Test - public void testOsVersion() throws Exception { + public void testConvert1() throws Exception { - String osDescription = "Ubuntu 10.04"; + VirtualBoxManager vbm = createNiceMock(VirtualBoxManager.class); + IVirtualBox vBox = createNiceMock(IVirtualBox.class); + IMachine vm = createNiceMock(IMachine.class); + IGuestOSType guestOsType = createNiceMock(IGuestOSType.class); + String guestOsDescription = "ubuntu 11.04 server (i386)"; + String vmDescription = "ubuntu-11.04-server-i386"; + expect(vbm.getVBox()).andReturn(vBox).anyTimes(); - Function iMachineStringFunction = IMachineToImage.osVersion(); - assertEquals("10.04", iMachineStringFunction.apply(osDescription)); + expect(vm.getOSTypeId()).andReturn("os-type").anyTimes(); + expect(vBox.getGuestOSType(eq("os-type"))).andReturn(guestOsType); + expect(vm.getDescription()).andReturn(vmDescription).anyTimes(); + expect(guestOsType.getDescription()).andReturn(guestOsDescription).anyTimes(); + expect(guestOsType.getIs64Bit()).andReturn(true); + + replay(vbm, vBox, vm, guestOsType); + + IMachineToImage fn = new IMachineToImage(vbm, map); + + Image image = fn.apply(vm); + + assertEquals(image.getDescription(), vmDescription); + assertEquals(image.getOperatingSystem().getDescription(), guestOsDescription); + assertTrue(image.getOperatingSystem().is64Bit()); + assertEquals(image.getOperatingSystem().getFamily(), OsFamily.UBUNTU); + assertEquals(image.getOperatingSystem().getVersion(), "11.04"); } @Test public void testUnparseableOsString() throws Exception { - + VirtualBoxManager vbm = createNiceMock(VirtualBoxManager.class); - IVirtualBox vBox= createNiceMock(IVirtualBox.class); + IVirtualBox vBox = createNiceMock(IVirtualBox.class); IMachine vm = createNiceMock(IMachine.class); IGuestOSType guestOsType = createNiceMock(IGuestOSType.class); @@ -100,12 +131,11 @@ public class IMachineToImageTest { replay(vbm, vBox, vm, guestOsType); - Image image = new IMachineToImage(vbm).apply(vm); + Image image = new IMachineToImage(vbm, map).apply(vm); assertEquals(image.getOperatingSystem().getDescription(), "SomeOtherOs 2.04"); assertEquals(image.getOperatingSystem().getVersion(), ""); } - } 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 95d6a07a7b..3ed8e4883a 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 @@ -30,22 +30,32 @@ import static com.google.common.collect.Iterables.any; import static org.jclouds.virtualbox.experiment.TestUtils.computeServiceForLocalhostAndGuest; import static org.testng.Assert.assertTrue; -import java.io.IOException; -import java.net.URI; +import java.util.Map; import java.util.Set; import org.jclouds.compute.ComputeServiceContext; +import org.jclouds.compute.config.BaseComputeServiceContextModule; import org.jclouds.compute.domain.Image; +import org.jclouds.compute.domain.OsFamily; +import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.domain.Credentials; +import org.jclouds.json.Json; +import org.jclouds.json.config.GsonModule; import org.jclouds.virtualbox.BaseVirtualBoxClientLiveTest; import org.testng.annotations.BeforeGroups; import org.testng.annotations.Test; import org.virtualbox_4_1.IMachine; import org.virtualbox_4_1.VirtualBoxManager; +import com.google.inject.Guice; + @Test(groups = "live", singleThreaded = true, testName = "IsoToIMachineLiveTest") public class IsoToIMachineLiveTest extends BaseVirtualBoxClientLiveTest { - + + Map> map = new BaseComputeServiceContextModule() { + }.provideOsVersionMap(new ComputeServiceConstants.ReferenceData(), Guice.createInjector(new GsonModule()) + .getInstance(Json.class)); + private String settingsFile = null; private boolean forceOverwrite = true; private String vmId = "jclouds-image-iso-1"; @@ -83,7 +93,7 @@ public class IsoToIMachineLiveTest extends BaseVirtualBoxClientLiveTest { guestId, new Credentials("toor", "password")).apply("ubuntu-11.04-server-i386.iso"); - IMachineToImage iMachineToImage = new IMachineToImage(manager); + IMachineToImage iMachineToImage = new IMachineToImage(manager, map); Image newImage = iMachineToImage.apply(imageMachine); //TODO add the description to the cache of the images or serialize to YAML the image desc Set images = context.getComputeService().listImages(); diff --git a/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/admin/ImageFromYamlStreamTest.java b/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/admin/ImageFromYamlStreamTest.java index 92cbb15622..6ada15cb17 100644 --- a/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/admin/ImageFromYamlStreamTest.java +++ b/sandbox-apis/virtualbox/src/test/java/org/jclouds/virtualbox/functions/admin/ImageFromYamlStreamTest.java @@ -8,54 +8,47 @@ import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.ImageBuilder; import org.jclouds.compute.domain.OperatingSystem; import org.jclouds.compute.domain.OsFamily; -import org.jclouds.virtualbox.BaseVirtualBoxClientLiveTest; import org.testng.annotations.Test; import com.google.common.collect.ImmutableMap; /** -* -* 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. -* -* -* @author Andrea Turli -*/ + * + * 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. + * + * + * @author Andrea Turli + */ @Test(groups = "unit") public class ImageFromYamlStreamTest { - - public static final Image TEST1 = new ImageBuilder() - .id("myTestId") - .name("ubuntu-11.04-server-i386") - .description("ubuntu 11.04 server (i386)") - .operatingSystem(OperatingSystem.builder() - .description("ubuntu") - .family(OsFamily.LINUX) - .version("11.04") - .build()) - .build(); - @Test - public void testNodesParse() throws Exception { - InputStream is = getClass().getResourceAsStream("/testImages.yaml"); - ImageFromYamlStream parser = new ImageFromYamlStream(); - assertEquals(parser.apply(is).asMap(), ImmutableMap.of(TEST1.getId(), TEST1)); - is.close(); - } + public static final Image TEST1 = new ImageBuilder() + .id("myTestId") + .name("ubuntu-11.04-server-i386") + .description("ubuntu 11.04 server (i386)") + .operatingSystem( + OperatingSystem.builder().description("ubuntu").family(OsFamily.UBUNTU).version("11.04").build()) + .build(); + + @Test + public void testNodesParse() throws Exception { + InputStream is = getClass().getResourceAsStream("/testImages.yaml"); + ImageFromYamlStream parser = new ImageFromYamlStream(); + assertEquals(parser.apply(is).asMap(), ImmutableMap.of(TEST1.getId(), TEST1)); + is.close(); + } - } \ No newline at end of file diff --git a/sandbox-apis/virtualbox/src/test/resources/testImages.yaml b/sandbox-apis/virtualbox/src/test/resources/testImages.yaml index d17a4e01a9..137a34ebf0 100644 --- a/sandbox-apis/virtualbox/src/test/resources/testImages.yaml +++ b/sandbox-apis/virtualbox/src/test/resources/testImages.yaml @@ -3,7 +3,7 @@ images: name: ubuntu-11.04-server-i386 description: ubuntu 11.04 server (i386) os_arch: x86 - os_family: linux + os_family: ubuntu os_description: ubuntu os_version: 11.04 iso: http://releases.ubuntu.com/11.04/ubuntu-11.04-server-i386.iso