Repository: brooklyn-server Updated Branches: refs/heads/master 1df0db3c8 -> c2326132d
BROOKLYN-520: better error if type missing Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/eb03dca5 Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/eb03dca5 Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/eb03dca5 Branch: refs/heads/master Commit: eb03dca56796c72cace595a2b8a86224365da8bd Parents: 1df0db3 Author: Aled Sage <[email protected]> Authored: Wed Jun 28 16:04:35 2017 +0100 Committer: Aled Sage <[email protected]> Committed: Wed Jun 28 17:38:09 2017 +0100 ---------------------------------------------------------------------- .../BrooklynComponentTemplateResolver.java | 12 +- .../brooklyn/ValidationMissingTypeYamlTest.java | 222 +++++++++++++++++++ 2 files changed, 232 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/eb03dca5/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java ---------------------------------------------------------------------- diff --git a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java index 7e9b562..e0cbe47 100644 --- a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java +++ b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java @@ -18,6 +18,8 @@ */ package org.apache.brooklyn.camp.brooklyn.spi.creation; +import static com.google.common.base.Preconditions.checkNotNull; + import java.util.ArrayList; import java.util.Collection; import java.util.LinkedHashSet; @@ -97,12 +99,12 @@ public class BrooklynComponentTemplateResolver { private final EntitySpecResolver serviceSpecResolver; private BrooklynComponentTemplateResolver(BrooklynClassLoadingContext loader, ConfigBag attrs, AbstractResource optionalTemplate, String type) { - this.loader = loader; + this.loader = checkNotNull(loader, "loader"); this.mgmt = loader.getManagementContext(); this.attrs = ConfigBag.newInstanceCopying(attrs); this.template = Maybe.fromNullable(optionalTemplate); this.yamlLoader = new BrooklynYamlTypeInstantiator.Factory(loader, this); - this.type = type; + this.type = checkNotNull(type, "type"); this.serviceSpecResolver = new CampServiceSpecResolver(mgmt, getServiceTypeResolverOverrides()); } @@ -130,6 +132,12 @@ public class BrooklynComponentTemplateResolver { private static BrooklynComponentTemplateResolver newInstance(BrooklynClassLoadingContext context, ConfigBag attrs, AbstractResource optionalTemplate) { String type = getDeclaredType(null, optionalTemplate, attrs); + if (Strings.isBlank(type)) { + String msg = "No type defined " + + (attrs == null ? ", no attributes supplied" : "in " + "[" + attrs.getAllConfigRaw() + "]") + + (optionalTemplate == null ? "" : ", template " + optionalTemplate); + throw new IllegalArgumentException(msg); + } return new BrooklynComponentTemplateResolver(context, attrs, optionalTemplate, type); } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/eb03dca5/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ValidationMissingTypeYamlTest.java ---------------------------------------------------------------------- diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ValidationMissingTypeYamlTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ValidationMissingTypeYamlTest.java new file mode 100644 index 0000000..d71f381 --- /dev/null +++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ValidationMissingTypeYamlTest.java @@ -0,0 +1,222 @@ +/* + * 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.camp.brooklyn; + +import org.apache.brooklyn.core.test.entity.TestApplication; +import org.apache.brooklyn.core.test.entity.TestEntity; +import org.apache.brooklyn.core.test.entity.TestEntityImpl; +import org.apache.brooklyn.core.test.policy.TestEnricher; +import org.apache.brooklyn.core.test.policy.TestPolicy; +import org.apache.brooklyn.entity.group.DynamicCluster; +import org.apache.brooklyn.test.Asserts; +import org.apache.brooklyn.util.text.Identifiers; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.testng.annotations.Test; + +@Test +public class ValidationMissingTypeYamlTest extends AbstractYamlTest { + private static final Logger log = LoggerFactory.getLogger(ValidationMissingTypeYamlTest.class); + + + @Test + public void testNoEntityTypeSpecifiedInTopLevelService() throws Exception { + try { + createAndStartApplication( + "services:", + "- foo: " + TestEntityImpl.class.getName()); + Asserts.shouldHaveFailedPreviously(); + } catch (Exception e) { + Asserts.expectedFailureContains(e, "must declare a type"); + } + } + + @Test + public void testNoEntityTypeInTopLevelCatalogEntity() throws Exception { + try { + addCatalogItems( + "brooklyn.catalog:", + " id: " + Identifiers.makeRandomId(8), + " version: 1.0.0", + " itemType: entity", + " item:", + " foo: " + TestEntity.class.getName()); + } catch (Exception e) { + Asserts.expectedFailureContains(e, "must declare a type"); + } + } + + @Test + public void testNoEntityTypeInTopLevelCatalogApp() throws Exception { + try { + addCatalogItems( + "brooklyn.catalog:", + " id: " + Identifiers.makeRandomId(8), + " version: 1.0.0", + " itemType: template", + " item:", + " services:", + " - foo: " + TestEntity.class.getName()); + } catch (Exception e) { + Asserts.expectedFailureContains(e, "must declare a type"); + } + } + + @Test + public void testNoEntityTypeSpecifiedInChildService() throws Exception { + try { + createAndStartApplication( + "services:", + "- type: " + TestApplication.class.getName(), + " brooklyn.children:", + " - foo: " + TestEntityImpl.class.getName()); + Asserts.shouldHaveFailedPreviously(); + } catch (Exception e) { + Asserts.expectedFailureContains(e, "No type defined"); + } + } + + @Test + public void testNoEntityTypeInChildCatalogEntity() throws Exception { + try { + addCatalogItems( + "brooklyn.catalog:", + " id: " + Identifiers.makeRandomId(8), + " version: 1.0.0", + " itemType: entity", + " item:", + " type: " + TestApplication.class.getName(), + " brooklyn.children:", + " - foo: " + TestEntityImpl.class.getName()); + } catch (Exception e) { + Asserts.expectedFailureContains(e, "No type defined"); + } + } + + @Test + public void testNoEntityTypeInChildCatalogApp() throws Exception { + try { + addCatalogItems( + "brooklyn.catalog:", + " id: " + Identifiers.makeRandomId(8), + " version: 1.0.0", + " itemType: template", + " item:", + " services:", + " - type: " + TestApplication.class.getName(), + " brooklyn.children:", + " - foo: " + TestEntityImpl.class.getName()); + } catch (Exception e) { + Asserts.expectedFailureContains(e, "No type defined"); + } + } + + @Test + public void testNoEntityTypeSpecifiedInEntitySpec() throws Exception { + try { + createAndStartApplication( + "services:", + "- type: " + DynamicCluster.class.getName(), + " brooklyn.config:", + " initialSize: 0", + " memberSpec: ", + " $brooklyn:entitySpec:", + " foo: " + TestEntityImpl.class.getName()); + Asserts.shouldHaveFailedPreviously(); + } catch (Exception e) { + Asserts.expectedFailureContains(e, "No type defined"); + } + } + + @Test + public void testNoEntityTypeInEntitySpecInCatalogEntity() throws Exception { + try { + addCatalogItems( + "brooklyn.catalog:", + " id: " + Identifiers.makeRandomId(8), + " version: 1.0.0", + " itemType: entity", + " item:", + " type: " + DynamicCluster.class.getName(), + " brooklyn.config:", + " initialSize: 0", + " memberSpec: ", + " $brooklyn:entitySpec:", + " foo: " + TestEntityImpl.class.getName()); + } catch (Exception e) { + Asserts.expectedFailureContains(e, "No type defined"); + } + } + + @Test + public void testNoEntityTypeInEntitySpecInCatalogApp() throws Exception { + try { + addCatalogItems( + "brooklyn.catalog:", + " id: " + Identifiers.makeRandomId(8), + " version: 1.0.0", + " itemType: template", + " item:", + " services:", + " - type: " + DynamicCluster.class.getName(), + " brooklyn.config:", + " initialSize: 0", + " memberSpec: ", + " $brooklyn:entitySpec:", + " foo: " + TestEntityImpl.class.getName()); + } catch (Exception e) { + Asserts.expectedFailureContains(e, "No type defined"); + } + } + + // TODO Preferred name should not be 'policy_type'; it should be 'type'! + @Test + public void testNoPolicyTypeSpecified() throws Exception { + try { + createAndStartApplication( + "services:", + "- type: " + TestApplication.class.getName(), + " brooklyn.policies:", + " - foo: " + TestPolicy.class.getName()); + Asserts.shouldHaveFailedPreviously(); + } catch (Exception e) { + Asserts.expectedFailureContains(e, "Missing key 'policy_type'"); + } + } + + // TODO Preferred name should not be 'enricher_type'; it should be 'type'! + @Test + public void testNoEnricherTypeSpecified() throws Exception { + try { + createAndStartApplication( + "services:", + "- type: " + TestApplication.class.getName(), + " brooklyn.enrichers:", + " - foo: " + TestEnricher.class.getName()); + Asserts.shouldHaveFailedPreviously(); + } catch (Exception e) { + Asserts.expectedFailureContains(e, "Missing key 'enricher_type'"); + } + } + + @Override + protected Logger getLogger() { + return log; + } +}
