Repository: jclouds-labs Updated Branches: refs/heads/master 6472341ad -> 172d6f349
Implement BaseImageToImage function. Project: http://git-wip-us.apache.org/repos/asf/jclouds-labs/repo Commit: http://git-wip-us.apache.org/repos/asf/jclouds-labs/commit/2b8bfcb8 Tree: http://git-wip-us.apache.org/repos/asf/jclouds-labs/tree/2b8bfcb8 Diff: http://git-wip-us.apache.org/repos/asf/jclouds-labs/diff/2b8bfcb8 Branch: refs/heads/master Commit: 2b8bfcb8cd9db8bd05d7c857054bd332f280f142 Parents: 6472341 Author: Trevor Flanagan <[email protected]> Authored: Fri Dec 1 21:07:26 2017 +0000 Committer: Ignasi Barrera <[email protected]> Committed: Tue Dec 5 09:17:59 2017 +0100 ---------------------------------------------------------------------- .../compute/functions/BaseImageToImage.java | 86 +++++++++++++ .../functions/OperatingSystemToOsFamily.java | 59 +++++++++ .../compute/functions/BaseImageToImageTest.java | 123 +++++++++++++++++++ .../OperatingSystemToOsFamilyTest.java | 90 ++++++++++++++ ...CloudControlComputeServiceContextModule.java | 45 +++++++ 5 files changed, 403 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/2b8bfcb8/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/BaseImageToImage.java ---------------------------------------------------------------------- diff --git a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/BaseImageToImage.java b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/BaseImageToImage.java new file mode 100644 index 0000000..e1b2dd2 --- /dev/null +++ b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/BaseImageToImage.java @@ -0,0 +1,86 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF 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.dimensiondata.cloudcontrol.compute.functions; + +import com.google.common.base.Function; +import com.google.common.base.Supplier; +import com.google.common.collect.FluentIterable; +import com.google.inject.Inject; +import org.jclouds.collect.Memoized; +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.dimensiondata.cloudcontrol.domain.BaseImage; +import org.jclouds.domain.Location; +import org.jclouds.location.predicates.LocationPredicates; + +import javax.inject.Singleton; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +@Singleton +public class BaseImageToImage implements Function<BaseImage, Image> { + + private final Supplier<Set<Location>> locations; + private final Function<org.jclouds.dimensiondata.cloudcontrol.domain.OperatingSystem, OsFamily> operatingSystemToOsFamily; + private static final Pattern OS_VERSION_EXTRACT_PATTERN = Pattern.compile("[A-Z]+(\\w+)(32|64)"); + + @Inject + BaseImageToImage(@Memoized final Supplier<Set<Location>> locations, + Function<org.jclouds.dimensiondata.cloudcontrol.domain.OperatingSystem, OsFamily> operatingSystemToOsFamily) { + this.locations = locations; + this.operatingSystemToOsFamily = operatingSystemToOsFamily; + } + + @Override + public Image apply(final BaseImage input) { + OsFamily osFamily; + if (input.guest() != null) { + osFamily = operatingSystemToOsFamily.apply(input.guest().operatingSystem()); + } else { + osFamily = OsFamily.UNRECOGNIZED; + } + String osVersion; + if (input.guest() != null) { + osVersion = parseVersion(input.guest().operatingSystem()); + } else { + osVersion = null; + } + boolean is64Bit = input.guest() != null && is64bit(input.guest().operatingSystem()); + + OperatingSystem os = OperatingSystem.builder().name(input.name()).description(input.description()) + .family(osFamily).version(osVersion).is64Bit(is64Bit).build(); + + return new ImageBuilder().ids(input.id()).name(input.name()).description(input.description()) + .status(Image.Status.AVAILABLE).operatingSystem(os).location( + FluentIterable.from(locations.get()).firstMatch(LocationPredicates.idEquals(input.datacenterId())) + .orNull()).build(); + } + + private boolean is64bit(final org.jclouds.dimensiondata.cloudcontrol.domain.OperatingSystem operatingSystem) { + return operatingSystem.id().endsWith("64"); + } + + String parseVersion(final org.jclouds.dimensiondata.cloudcontrol.domain.OperatingSystem operatingSystem) { + Matcher matcher = OS_VERSION_EXTRACT_PATTERN.matcher(operatingSystem.id()); + return matcher.matches() ? matcher.group(1) : "unknown"; + } + +} + http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/2b8bfcb8/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/OperatingSystemToOsFamily.java ---------------------------------------------------------------------- diff --git a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/OperatingSystemToOsFamily.java b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/OperatingSystemToOsFamily.java new file mode 100644 index 0000000..969b362 --- /dev/null +++ b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/OperatingSystemToOsFamily.java @@ -0,0 +1,59 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF 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.dimensiondata.cloudcontrol.compute.functions; + +import com.google.common.base.Function; +import org.jclouds.compute.domain.OsFamily; +import org.jclouds.dimensiondata.cloudcontrol.domain.OperatingSystem; + +import javax.inject.Singleton; +import java.util.regex.Pattern; + +@Singleton +public class OperatingSystemToOsFamily implements Function<OperatingSystem, OsFamily> { + + private static final String CENTOS = "CENTOS"; + private static final String REDHAT = "REDHAT"; + private static final String UBUNTU = "UBUNTU"; + private static final String SUSE = "SUSE"; + private static final String SLES = "SLES"; + private static final String SOLARIS = "SOLARIS"; + private static final String WINDOWS_FAMILY = "WINDOWS"; + private static final Pattern OTHER_LINUX_PATTERN = Pattern.compile("OTHER\\w+LINUX\\w+"); + + @Override + public OsFamily apply(final OperatingSystem os) { + if (os.family().equals(WINDOWS_FAMILY)) { + return OsFamily.WINDOWS; + } else if (os.id().startsWith(CENTOS)) { + return OsFamily.CENTOS; + } else if (os.id().startsWith(UBUNTU)) { + return OsFamily.UBUNTU; + } else if (os.id().startsWith(REDHAT)) { + return OsFamily.RHEL; + } else if (os.id().startsWith(SOLARIS)) { + return OsFamily.SOLARIS; + } else if (os.id().startsWith(SUSE) || os.id().startsWith(SLES)) { + return OsFamily.SUSE; + } else if (OTHER_LINUX_PATTERN.matcher(os.id()).matches()) { + return OsFamily.LINUX; + } else { + return OsFamily.UNRECOGNIZED; + } + } + +} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/2b8bfcb8/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/BaseImageToImageTest.java ---------------------------------------------------------------------- diff --git a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/BaseImageToImageTest.java b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/BaseImageToImageTest.java new file mode 100644 index 0000000..5c09ca4 --- /dev/null +++ b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/BaseImageToImageTest.java @@ -0,0 +1,123 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF 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.dimensiondata.cloudcontrol.compute.functions; + +import com.google.common.base.Supplier; +import com.google.common.base.Suppliers; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Lists; +import org.jclouds.compute.domain.Image; +import org.jclouds.dimensiondata.cloudcontrol.domain.CPU; +import org.jclouds.dimensiondata.cloudcontrol.domain.Cluster; +import org.jclouds.dimensiondata.cloudcontrol.domain.Disk; +import org.jclouds.dimensiondata.cloudcontrol.domain.Guest; +import org.jclouds.dimensiondata.cloudcontrol.domain.ImageNic; +import org.jclouds.dimensiondata.cloudcontrol.domain.OperatingSystem; +import org.jclouds.dimensiondata.cloudcontrol.domain.OsImage; +import org.jclouds.domain.Location; +import org.jclouds.domain.LocationBuilder; +import org.jclouds.domain.LocationScope; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import javax.xml.bind.DatatypeConverter; +import java.util.Set; + +import static org.testng.AssertJUnit.assertEquals; +import static org.testng.AssertJUnit.assertTrue; + +@Test(groups = "unit", testName = "BaseImageToImageTest") +public class BaseImageToImageTest { + + private final Location zone = new LocationBuilder().id("EU6").description("EU6").scope(LocationScope.ZONE).build(); + private final Supplier<Set<Location>> locations = Suppliers.<Set<Location>>ofInstance(ImmutableSet.of(zone)); + private BaseImageToImage baseImageToImage; + + @BeforeMethod + public void setUp() throws Exception { + baseImageToImage = new BaseImageToImage(locations, new OperatingSystemToOsFamily()); + } + + @Test + public void testOsImageToImage() throws Exception { + final OsImage osImage = OsImage.builder().id("12ea8472-6e4e-4068-b2cb-f04ecacd3962").name("CentOS 5 64-bit") + .description("DRaaS CentOS Release 5.9 64-bit").guest(Guest.builder().osCustomization(false) + .operatingSystem( + OperatingSystem.builder().id("CENTOS564").displayName("CENTOS5/64").family("UNIX").build()) + .build()).cpu(CPU.builder().count(2).speed("STANDARD").coresPerSocket(1).build()).memoryGb(4) + .nics(ImmutableList.of(ImageNic.builder().networkAdapter("E1000").key(4040).build())).disks(ImmutableList + .of(Disk.builder().id("98299851-37a3-4ebe-9cf1-090da9ae42a0").scsiId(0).sizeGb(20).speed("STANDARD") + .build())).softwareLabels(Lists.<String>newArrayList()).osImageKey("T-CENT-5-64-2-4-10") + .createTime(DatatypeConverter.parseDateTime("2016-06-09T17:36:31.000Z").getTime()).datacenterId("EU6") + .cluster(Cluster.builder().id("EU6-01").name("my cluster name").build()).build(); + + final Image image = baseImageToImage.apply(osImage); + assertEquals(osImage.id(), image.getId()); + assertEquals(osImage.name(), image.getName()); + assertEquals(Image.Status.AVAILABLE, image.getStatus()); + final org.jclouds.compute.domain.OperatingSystem operatingSystem = image.getOperatingSystem(); + + assertEquals(osImage.name(), operatingSystem.getName()); + assertEquals(osImage.description(), operatingSystem.getDescription()); + assertTrue(operatingSystem.is64Bit()); + assertEquals(zone, image.getLocation()); + } + + @Test + public void parseVersion_Centos() { + assertEquals("5", baseImageToImage + .parseVersion(OperatingSystem.builder().id("CENTOS532").displayName("").family("").build())); + } + + @Test + public void parseVersion_Suse() { + assertEquals("10", + baseImageToImage.parseVersion(OperatingSystem.builder().id("SUSE1032").displayName("").family("").build())); + } + + @Test + public void parseVersion_RedHat() { + assertEquals("6", baseImageToImage + .parseVersion(OperatingSystem.builder().id("REDHAT632").displayName("").family("").build())); + } + + @Test + public void parseVersion_Ubuntu() { + assertEquals("X", baseImageToImage + .parseVersion(OperatingSystem.builder().id("UBUNTUX64").displayName("").family("").build())); + } + + @Test + public void parseVersion_Windows() { + assertEquals("2003S", baseImageToImage + .parseVersion(OperatingSystem.builder().id("WIN2003S64").displayName("").family("").build())); + } + + @Test + public void parseVersion_Solaris() { + assertEquals("11", baseImageToImage + .parseVersion(OperatingSystem.builder().id("SOLARIS1164").displayName("").family("").build())); + } + + @Test + public void parseVersion_Unknown() { + assertEquals("unknown", + baseImageToImage.parseVersion(OperatingSystem.builder().id("XXXX").displayName("").family("").build())); + } + +} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/2b8bfcb8/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/OperatingSystemToOsFamilyTest.java ---------------------------------------------------------------------- diff --git a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/OperatingSystemToOsFamilyTest.java b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/OperatingSystemToOsFamilyTest.java new file mode 100644 index 0000000..e2c2fcb --- /dev/null +++ b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/OperatingSystemToOsFamilyTest.java @@ -0,0 +1,90 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF 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.dimensiondata.cloudcontrol.compute.functions; + +import org.jclouds.compute.domain.OsFamily; +import org.jclouds.dimensiondata.cloudcontrol.domain.OperatingSystem; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import static org.testng.AssertJUnit.assertEquals; + +@Test(groups = "unit", testName = "OperatingSystemToOsFamilyTest") +public class OperatingSystemToOsFamilyTest { + + private OperatingSystemToOsFamily operatingSystemToOsFamily; + + @BeforeMethod + public void setUp() throws Exception { + operatingSystemToOsFamily = new OperatingSystemToOsFamily(); + } + + @Test + public void apply_Centos() { + assertEquals(OsFamily.CENTOS, operatingSystemToOsFamily + .apply(OperatingSystem.builder().id("CENTOS532").displayName("").family("").build())); + } + + @Test + public void apply_Suse() { + assertEquals(OsFamily.SUSE, operatingSystemToOsFamily + .apply(OperatingSystem.builder().id("SUSE1032").displayName("").family("").build())); + } + + @Test + public void apply_Sles() { + assertEquals(OsFamily.SUSE, operatingSystemToOsFamily + .apply(OperatingSystem.builder().id("SLES1164").displayName("").family("").build())); + } + + @Test + public void apply_Solaris() { + assertEquals(OsFamily.SOLARIS, operatingSystemToOsFamily + .apply(OperatingSystem.builder().id("SOLARIS1032").displayName("").family("").build())); + } + + @Test + public void apply_Linux() { + assertEquals(OsFamily.LINUX, operatingSystemToOsFamily + .apply(OperatingSystem.builder().id("OTHER24XLINUX32").displayName("").family("").build())); + } + + @Test + public void apply_RedHat() { + assertEquals(OsFamily.RHEL, operatingSystemToOsFamily + .apply(OperatingSystem.builder().id("REDHAT632").displayName("").family("").build())); + } + + @Test + public void apply_Ubuntu() { + assertEquals(OsFamily.UBUNTU, operatingSystemToOsFamily + .apply(OperatingSystem.builder().id("UBUNTUX64").displayName("").family("").build())); + } + + @Test + public void apply_Windows() { + assertEquals(OsFamily.WINDOWS, operatingSystemToOsFamily + .apply(OperatingSystem.builder().id("WIN2003S64").displayName("").family("WINDOWS").build())); + } + + @Test + public void apply_Unrecognized() { + assertEquals(OsFamily.UNRECOGNIZED, + operatingSystemToOsFamily.apply(OperatingSystem.builder().id("XXX").displayName("").family("").build())); + } + +} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/2b8bfcb8/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/config/DimensionDataCloudControlComputeServiceContextModule.java ---------------------------------------------------------------------- diff --git a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/config/DimensionDataCloudControlComputeServiceContextModule.java b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/config/DimensionDataCloudControlComputeServiceContextModule.java new file mode 100644 index 0000000..8866a44 --- /dev/null +++ b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/config/DimensionDataCloudControlComputeServiceContextModule.java @@ -0,0 +1,45 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF 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.dimensiondata.cloudcontrol.config; + +import com.google.common.base.Function; +import com.google.inject.TypeLiteral; +import org.jclouds.compute.config.ComputeServiceAdapterContextModule; +import org.jclouds.compute.domain.Image; +import org.jclouds.compute.domain.OsFamily; +import org.jclouds.dimensiondata.cloudcontrol.compute.functions.BaseImageToImage; +import org.jclouds.dimensiondata.cloudcontrol.compute.functions.OperatingSystemToOsFamily; +import org.jclouds.dimensiondata.cloudcontrol.domain.BaseImage; +import org.jclouds.dimensiondata.cloudcontrol.domain.Datacenter; +import org.jclouds.dimensiondata.cloudcontrol.domain.OperatingSystem; +import org.jclouds.dimensiondata.cloudcontrol.domain.internal.ServerWithExternalIp; + +public class DimensionDataCloudControlComputeServiceContextModule + extends ComputeServiceAdapterContextModule<ServerWithExternalIp, BaseImage, BaseImage, Datacenter> { + + @Override + protected void configure() { + super.configure(); + + bind(new TypeLiteral<Function<BaseImage, Image>>() { + }).to(BaseImageToImage.class); + bind(new TypeLiteral<Function<OperatingSystem, OsFamily>>() { + }).to(OperatingSystemToOsFamily.class); + + } + +}
