Extract CustomizeTemplateBuilder from JcloudsLocation
Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/f89ba453 Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/f89ba453 Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/f89ba453 Branch: refs/heads/master Commit: f89ba453253cadf2d0df1bf05d741543d8e36a9b Parents: 7582ebe Author: Sam Corbett <sam.corb...@cloudsoftcorp.com> Authored: Fri Dec 9 17:29:55 2016 +0000 Committer: Sam Corbett <sam.corb...@cloudsoftcorp.com> Committed: Tue Dec 20 15:40:12 2016 +0000 ---------------------------------------------------------------------- .../location/jclouds/JcloudsLocation.java | 88 +++------- .../customize/TemplateBuilderCustomizer.java | 29 ++++ .../customize/TemplateBuilderCustomizers.java | 164 +++++++++++++++++++ 3 files changed, 213 insertions(+), 68 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/f89ba453/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/JcloudsLocation.java ---------------------------------------------------------------------- diff --git a/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/JcloudsLocation.java b/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/JcloudsLocation.java index fd06a9a..67aa826 100644 --- a/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/JcloudsLocation.java +++ b/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/JcloudsLocation.java @@ -78,6 +78,8 @@ import org.apache.brooklyn.core.mgmt.persist.PersistenceObjectStore; import org.apache.brooklyn.core.mgmt.persist.jclouds.JcloudsBlobStoreBasedObjectStore; import org.apache.brooklyn.location.jclouds.networking.JcloudsPortForwarderExtension; import org.apache.brooklyn.location.jclouds.templates.PortableTemplateBuilder; +import org.apache.brooklyn.location.jclouds.templates.customize.TemplateBuilderCustomizer; +import org.apache.brooklyn.location.jclouds.templates.customize.TemplateBuilderCustomizers; import org.apache.brooklyn.location.jclouds.templates.customize.TemplateOptionCustomizer; import org.apache.brooklyn.location.jclouds.templates.customize.TemplateOptionCustomizers; import org.apache.brooklyn.location.jclouds.zone.AwsAvailabilityZoneExtension; @@ -92,7 +94,6 @@ import org.apache.brooklyn.util.core.ResourceUtils; import org.apache.brooklyn.util.core.config.ConfigBag; import org.apache.brooklyn.util.core.config.ResolvingConfigBag; import org.apache.brooklyn.util.core.flags.SetFromFlag; -import org.apache.brooklyn.util.core.flags.TypeCoercions; import org.apache.brooklyn.util.core.internal.ssh.ShellTool; import org.apache.brooklyn.util.core.internal.ssh.SshTool; import org.apache.brooklyn.util.core.internal.winrm.WinRmTool; @@ -109,7 +110,6 @@ import org.apache.brooklyn.util.exceptions.Exceptions; import org.apache.brooklyn.util.exceptions.ReferenceWithError; import org.apache.brooklyn.util.exceptions.UserFacingException; import org.apache.brooklyn.util.guava.Maybe; -import org.apache.brooklyn.util.javalang.Enums; import org.apache.brooklyn.util.javalang.Reflections; import org.apache.brooklyn.util.net.Cidr; import org.apache.brooklyn.util.net.Networking; @@ -120,7 +120,6 @@ import org.apache.brooklyn.util.ssh.IptablesCommands; import org.apache.brooklyn.util.ssh.IptablesCommands.Chain; import org.apache.brooklyn.util.ssh.IptablesCommands.Policy; import org.apache.brooklyn.util.stream.Streams; -import org.apache.brooklyn.util.text.ByteSizeStrings; import org.apache.brooklyn.util.text.KeyValueParser; import org.apache.brooklyn.util.text.StringPredicates; import org.apache.brooklyn.util.text.Strings; @@ -141,7 +140,6 @@ import org.jclouds.compute.domain.OperatingSystem; import org.jclouds.compute.domain.OsFamily; import org.jclouds.compute.domain.Template; import org.jclouds.compute.domain.TemplateBuilder; -import org.jclouds.compute.domain.TemplateBuilderSpec; import org.jclouds.compute.options.TemplateOptions; import org.jclouds.domain.Credentials; import org.jclouds.domain.LocationScope; @@ -1232,74 +1230,27 @@ public class JcloudsLocation extends AbstractCloudMachineProvisioningLocation im // ------------- constructing the template, etc ------------------------ - private interface CustomizeTemplateBuilder { - void apply(TemplateBuilder tb, ConfigBag props, Object v); - } - /** @deprecated since 0.11.0 use {@link TemplateOptionCustomizer} instead */ @Deprecated public interface CustomizeTemplateOptions extends TemplateOptionCustomizer { } /** properties which cause customization of the TemplateBuilder */ - public static final Map<ConfigKey<?>, CustomizeTemplateBuilder> SUPPORTED_TEMPLATE_BUILDER_PROPERTIES = ImmutableMap.<ConfigKey<?>,CustomizeTemplateBuilder>builder() - .put(OS_64_BIT, new CustomizeTemplateBuilder() { - public void apply(TemplateBuilder tb, ConfigBag props, Object v) { - Boolean os64Bit = TypeCoercions.coerce(v, Boolean.class); - if (os64Bit!=null) - tb.os64Bit(os64Bit); - }}) - .put(MIN_RAM, new CustomizeTemplateBuilder() { - public void apply(TemplateBuilder tb, ConfigBag props, Object v) { - tb.minRam( (int)(ByteSizeStrings.parse(Strings.toString(v), "mb")/1000/1000) ); - }}) - .put(MIN_CORES, new CustomizeTemplateBuilder() { - public void apply(TemplateBuilder tb, ConfigBag props, Object v) { - tb.minCores(TypeCoercions.coerce(v, Double.class)); - }}) - .put(MIN_DISK, new CustomizeTemplateBuilder() { - public void apply(TemplateBuilder tb, ConfigBag props, Object v) { - tb.minDisk( (int)(ByteSizeStrings.parse(Strings.toString(v), "gb")/1000/1000/1000) ); - }}) - .put(HARDWARE_ID, new CustomizeTemplateBuilder() { - public void apply(TemplateBuilder tb, ConfigBag props, Object v) { - tb.hardwareId(((CharSequence)v).toString()); - }}) - .put(IMAGE_ID, new CustomizeTemplateBuilder() { - public void apply(TemplateBuilder tb, ConfigBag props, Object v) { - tb.imageId(((CharSequence)v).toString()); - }}) - .put(IMAGE_DESCRIPTION_REGEX, new CustomizeTemplateBuilder() { - public void apply(TemplateBuilder tb, ConfigBag props, Object v) { - tb.imageDescriptionMatches(((CharSequence)v).toString()); - }}) - .put(IMAGE_NAME_REGEX, new CustomizeTemplateBuilder() { - public void apply(TemplateBuilder tb, ConfigBag props, Object v) { - tb.imageNameMatches(((CharSequence)v).toString()); - }}) - .put(OS_FAMILY, new CustomizeTemplateBuilder() { - public void apply(TemplateBuilder tb, ConfigBag props, Object v) { - Maybe<OsFamily> osFamily = Enums.valueOfIgnoreCase(OsFamily.class, v.toString()); - if (osFamily.isAbsent()) - throw new IllegalArgumentException("Invalid "+OS_FAMILY+" value "+v); - tb.osFamily(osFamily.get()); - }}) - .put(OS_VERSION_REGEX, new CustomizeTemplateBuilder() { - public void apply(TemplateBuilder tb, ConfigBag props, Object v) { - tb.osVersionMatches( ((CharSequence)v).toString() ); - }}) - .put(TEMPLATE_SPEC, new CustomizeTemplateBuilder() { - public void apply(TemplateBuilder tb, ConfigBag props, Object v) { - tb.from(TemplateBuilderSpec.parse(((CharSequence)v).toString())); - }}) - .put(DEFAULT_IMAGE_ID, new CustomizeTemplateBuilder() { - public void apply(TemplateBuilder tb, ConfigBag props, Object v) { - /* done in the code, but included here so that it is in the map */ - }}) - .put(TEMPLATE_BUILDER, new CustomizeTemplateBuilder() { - public void apply(TemplateBuilder tb, ConfigBag props, Object v) { - /* done in the code, but included here so that it is in the map */ - }}) + public static final Map<ConfigKey<?>, ? extends TemplateBuilderCustomizer> SUPPORTED_TEMPLATE_BUILDER_PROPERTIES = ImmutableMap.<ConfigKey<?>, TemplateBuilderCustomizer>builder() + .put(HARDWARE_ID, TemplateBuilderCustomizers.hardwareId()) + .put(IMAGE_DESCRIPTION_REGEX, TemplateBuilderCustomizers.imageDescription()) + .put(IMAGE_ID, TemplateBuilderCustomizers.imageId()) + .put(IMAGE_NAME_REGEX, TemplateBuilderCustomizers.imageNameRegex()) + .put(MIN_CORES, TemplateBuilderCustomizers.minCores()) + .put(MIN_DISK, TemplateBuilderCustomizers.minDisk()) + .put(MIN_RAM, TemplateBuilderCustomizers.minRam()) + .put(OS_64_BIT, TemplateBuilderCustomizers.os64Bit()) + .put(OS_FAMILY, TemplateBuilderCustomizers.osFamily()) + .put(OS_VERSION_REGEX, TemplateBuilderCustomizers.osVersionRegex()) + .put(TEMPLATE_SPEC, TemplateBuilderCustomizers.templateSpec()) + /* Both done in the code, but included here so that they are in the map */ + .put(DEFAULT_IMAGE_ID, TemplateBuilderCustomizers.noOp()) + .put(TEMPLATE_BUILDER, TemplateBuilderCustomizers.noOp()) .build(); /** properties which cause customization of the TemplateOptions */ @@ -1419,11 +1370,11 @@ public class JcloudsLocation extends AbstractCloudMachineProvisioningLocation im } // Apply the template builder and options properties - for (Map.Entry<ConfigKey<?>, CustomizeTemplateBuilder> entry : SUPPORTED_TEMPLATE_BUILDER_PROPERTIES.entrySet()) { + for (Map.Entry<ConfigKey<?>, ? extends TemplateBuilderCustomizer> entry : SUPPORTED_TEMPLATE_BUILDER_PROPERTIES.entrySet()) { ConfigKey<?> key = entry.getKey(); Object val = config.containsKey(key) ? config.get(key) : key.getDefaultValue(); if (val != null) { - CustomizeTemplateBuilder code = entry.getValue(); + TemplateBuilderCustomizer code = entry.getValue(); code.apply(templateBuilder, config, val); } } @@ -3100,4 +3051,5 @@ public class JcloudsLocation extends AbstractCloudMachineProvisioningLocation im return val1; } } + } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/f89ba453/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/templates/customize/TemplateBuilderCustomizer.java ---------------------------------------------------------------------- diff --git a/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/templates/customize/TemplateBuilderCustomizer.java b/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/templates/customize/TemplateBuilderCustomizer.java new file mode 100644 index 0000000..3c6e237 --- /dev/null +++ b/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/templates/customize/TemplateBuilderCustomizer.java @@ -0,0 +1,29 @@ +/* + * 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.apache.brooklyn.location.jclouds.templates.customize; + +import org.apache.brooklyn.util.core.config.ConfigBag; +import org.jclouds.compute.domain.TemplateBuilder; + +public interface TemplateBuilderCustomizer { + + void apply(TemplateBuilder tb, ConfigBag props, Object v); + +} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/f89ba453/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/templates/customize/TemplateBuilderCustomizers.java ---------------------------------------------------------------------- diff --git a/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/templates/customize/TemplateBuilderCustomizers.java b/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/templates/customize/TemplateBuilderCustomizers.java new file mode 100644 index 0000000..e4426d6 --- /dev/null +++ b/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/templates/customize/TemplateBuilderCustomizers.java @@ -0,0 +1,164 @@ +/* + * 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.apache.brooklyn.location.jclouds.templates.customize; + +import org.apache.brooklyn.location.jclouds.JcloudsLocationConfig; +import org.apache.brooklyn.util.core.config.ConfigBag; +import org.apache.brooklyn.util.core.flags.TypeCoercions; +import org.apache.brooklyn.util.guava.Maybe; +import org.apache.brooklyn.util.javalang.Enums; +import org.apache.brooklyn.util.text.ByteSizeStrings; +import org.apache.brooklyn.util.text.Strings; +import org.jclouds.compute.domain.OsFamily; +import org.jclouds.compute.domain.TemplateBuilder; +import org.jclouds.compute.domain.TemplateBuilderSpec; + +public class TemplateBuilderCustomizers { + + private TemplateBuilderCustomizers() { + } + + public static TemplateBuilderCustomizer hardwareId() { + return new HardwareIdTemplateBuilder(); + } + + public static TemplateBuilderCustomizer imageDescription() { + return new ImageDescriptionRegexTemplateBuilder(); + } + + public static TemplateBuilderCustomizer imageId() { + return new ImageIdTemplateBuilder(); + } + + public static TemplateBuilderCustomizer imageNameRegex() { + return new ImageNameRegexTemplateBuilder(); + } + + public static TemplateBuilderCustomizer minCores() { + return new MinCoresTemplateBuilder(); + } + + public static TemplateBuilderCustomizer minDisk() { + return new MinDiskTemplateBuilder(); + } + + public static TemplateBuilderCustomizer minRam() { + return new MinRamTemplateBuilder(); + } + + public static TemplateBuilderCustomizer noOp() { + return new NoOpTemplateBuilder(); + } + + public static TemplateBuilderCustomizer os64Bit() { + return new Os64BitTemplateBuidler(); + } + + public static TemplateBuilderCustomizer osFamily() { + return new OsFamilyTemplateBuilder(); + } + + public static TemplateBuilderCustomizer osVersionRegex() { + return new OsVersionRegexTemplateBuilder(); + } + + public static TemplateBuilderCustomizer templateSpec() { + return new TemplateSpecTemplateBuilder(); + } + + private static class MinRamTemplateBuilder implements TemplateBuilderCustomizer { + public void apply(TemplateBuilder tb, ConfigBag props, Object v) { + tb.minRam((int) (ByteSizeStrings.parse(Strings.toString(v), "mb") / 1000 / 1000)); + } + } + + private static class MinCoresTemplateBuilder implements TemplateBuilderCustomizer { + public void apply(TemplateBuilder tb, ConfigBag props, Object v) { + tb.minCores(TypeCoercions.coerce(v, Double.class)); + } + } + + private static class MinDiskTemplateBuilder implements TemplateBuilderCustomizer { + public void apply(TemplateBuilder tb, ConfigBag props, Object v) { + tb.minDisk((int) (ByteSizeStrings.parse(Strings.toString(v), "gb") / 1000 / 1000 / 1000)); + } + } + + private static class HardwareIdTemplateBuilder implements TemplateBuilderCustomizer { + public void apply(TemplateBuilder tb, ConfigBag props, Object v) { + tb.hardwareId(v.toString()); + } + } + + private static class ImageIdTemplateBuilder implements TemplateBuilderCustomizer { + public void apply(TemplateBuilder tb, ConfigBag props, Object v) { + tb.imageId(v.toString()); + } + } + + private static class ImageDescriptionRegexTemplateBuilder implements TemplateBuilderCustomizer { + public void apply(TemplateBuilder tb, ConfigBag props, Object v) { + tb.imageDescriptionMatches(v.toString()); + } + } + + private static class ImageNameRegexTemplateBuilder implements TemplateBuilderCustomizer { + public void apply(TemplateBuilder tb, ConfigBag props, Object v) { + tb.imageNameMatches(v.toString()); + } + } + + private static class OsFamilyTemplateBuilder implements TemplateBuilderCustomizer { + public void apply(TemplateBuilder tb, ConfigBag props, Object v) { + Maybe<OsFamily> osFamily = Enums.valueOfIgnoreCase(OsFamily.class, v.toString()); + if (osFamily.isAbsent()) { + throw new IllegalArgumentException("Invalid " + JcloudsLocationConfig.OS_FAMILY + " value " + v); + } + tb.osFamily(osFamily.get()); + } + } + + private static class OsVersionRegexTemplateBuilder implements TemplateBuilderCustomizer { + public void apply(TemplateBuilder tb, ConfigBag props, Object v) { + tb.osVersionMatches(v.toString()); + } + } + + private static class TemplateSpecTemplateBuilder implements TemplateBuilderCustomizer { + public void apply(TemplateBuilder tb, ConfigBag props, Object v) { + tb.from(TemplateBuilderSpec.parse(v.toString())); + } + } + + private static class Os64BitTemplateBuidler implements TemplateBuilderCustomizer { + public void apply(TemplateBuilder tb, ConfigBag props, Object v) { + Boolean os64Bit = TypeCoercions.coerce(v, Boolean.class); + if (os64Bit != null) { + tb.os64Bit(os64Bit); + } + } + } + + private static class NoOpTemplateBuilder implements TemplateBuilderCustomizer { + @Override + public void apply(TemplateBuilder tb, ConfigBag props, Object v) { + } + } +}