if jclouds fails to find template, list the available images; and type-coerce minram etc coming from prop file (strings); and give examples of imageId, minRam in the docs
Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/d0527fa5 Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/d0527fa5 Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/d0527fa5 Branch: refs/heads/0.4.0 Commit: d0527fa592ff4bee61d840c863c245e9559603d1 Parents: 5d025ac Author: Alex Heneveld <[email protected]> Authored: Thu Sep 27 11:44:37 2012 -0400 Committer: Alex Heneveld <[email protected]> Committed: Fri Sep 28 00:21:23 2012 -0400 ---------------------------------------------------------------------- .../location/basic/jclouds/JcloudsLocation.java | 54 +++++++++++++++----- 1 file changed, 41 insertions(+), 13 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d0527fa5/core/src/main/java/brooklyn/location/basic/jclouds/JcloudsLocation.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/location/basic/jclouds/JcloudsLocation.java b/core/src/main/java/brooklyn/location/basic/jclouds/JcloudsLocation.java index 058e545..7c97a9e 100644 --- a/core/src/main/java/brooklyn/location/basic/jclouds/JcloudsLocation.java +++ b/core/src/main/java/brooklyn/location/basic/jclouds/JcloudsLocation.java @@ -13,6 +13,7 @@ import java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.Collection; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -30,6 +31,7 @@ import org.jclouds.compute.RunNodesException; import org.jclouds.compute.callables.RunScriptOnNode; import org.jclouds.compute.domain.ComputeMetadata; import org.jclouds.compute.domain.ExecResponse; +import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.domain.NodeMetadataBuilder; import org.jclouds.compute.domain.OsFamily; @@ -55,6 +57,7 @@ import brooklyn.location.basic.AbstractLocation; import brooklyn.location.basic.SshMachineLocation; import brooklyn.location.basic.jclouds.templates.PortableTemplateBuilder; import brooklyn.util.MutableMap; +import brooklyn.util.flags.TypeCoercions; import brooklyn.util.internal.Repeater; import brooklyn.util.text.Identifiers; @@ -650,11 +653,11 @@ public class JcloudsLocation extends AbstractLocation implements MachineProvisio public static final Map<String,CustomizeTemplateBuilder> SUPPORTED_TEMPLATE_BUILDER_PROPERTIES = ImmutableMap.<String,CustomizeTemplateBuilder>builder() .put("minRam", new CustomizeTemplateBuilder() { public void apply(TemplateBuilder tb, Map props, Object v) { - tb.minRam((Integer)v); + tb.minRam(TypeCoercions.coerce(v, Integer.class)); }}) .put("minCores", new CustomizeTemplateBuilder() { public void apply(TemplateBuilder tb, Map props, Object v) { - tb.minCores(toDouble(v)); + tb.minCores(TypeCoercions.coerce(v, Double.class)); }}) .put("hardwareId", new CustomizeTemplateBuilder() { public void apply(TemplateBuilder tb, Map props, Object v) { @@ -748,6 +751,8 @@ public class JcloudsLocation extends AbstractLocation implements MachineProvisio }}) .build(); + private static boolean listedAvailableTemplatesOnNoSuchTemplate = false; + private Template buildTemplate(ComputeService computeService, String providerLocationId, BrooklynJcloudsSetupHolder setup) { Map<String,? extends Object> properties = setup.allconf; Map unusedConf = setup.unusedConf; @@ -779,19 +784,42 @@ public class JcloudsLocation extends AbstractLocation implements MachineProvisio } } - Template template = templateBuilder.build(); - if (template.getImage().getName().contains(".rc-")) { - // release candidates might break things :( - if (templateBuilder instanceof PortableTemplateBuilder) { - if (((PortableTemplateBuilder)templateBuilder).getOsFamily()==null) { - templateBuilder.osFamily(OsFamily.UBUNTU); - Template template2 = templateBuilder.build(); - if (template2!=null) { - LOG.debug("preferring template {} over {}", template2, template); - template = template2; + Template template; + try { + template = templateBuilder.build(); + if (template.getImage().getName().contains(".rc-")) { + // release candidates might break things :( + if (templateBuilder instanceof PortableTemplateBuilder) { + if (((PortableTemplateBuilder)templateBuilder).getOsFamily()==null) { + templateBuilder.osFamily(OsFamily.UBUNTU); + Template template2 = templateBuilder.build(); + if (template2!=null) { + LOG.debug(""+this+" preferring template {} over {}", template2, template); + template = template2; + } } } } + } catch (Exception e) { + synchronized (this) { + // delay subsequent log.warns (put in synch block) so the "Loading..." message is obvious + LOG.warn("Unable to match required VM template constraints "+templateBuilder+" when trying to provision VM in "+this+" (rethrowing): "+e); + if (!listedAvailableTemplatesOnNoSuchTemplate) { + listedAvailableTemplatesOnNoSuchTemplate = true; + LOG.info("Loading available images at "+this+" for reference..."); + Map m1 = new LinkedHashMap(setup.allconf); + if (m1.remove("imageId")!=null) + // don't apply default filters if user has tried to specify an image ID + m1.put("anyOwner", true); + ComputeService computeServiceLessRestrictive = JcloudsUtil.buildOrFindComputeService(m1, new MutableMap()); + Set<? extends Image> imgs = computeServiceLessRestrictive.listImages(); + LOG.info(""+imgs.size()+" available images at "+this); + for (Image img: imgs) { + LOG.info(" Image: "+img); + } + } + } + throw new IllegalStateException("Unable to match required VM template constraints "+templateBuilder+" when trying to provision VM in "+this+". See list of images in log."); } TemplateOptions options = template.getOptions(); @@ -824,7 +852,7 @@ public class JcloudsLocation extends AbstractLocation implements MachineProvisio LOG.debug("jclouds using template {} to provision machine in {} for {}", new Object[] {template, this, setup.getCallerContext()}); return template; } - + private String getPublicHostname(NodeMetadata node, Map allconf) { if ("aws-ec2".equals(allconf != null ? allconf.get("provider") : null)) { String vmIp = null;
