/* * 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 java.util.Map; import java.util.concurrent.Callable; import org.apache.brooklyn.api.entity.Entity; import org.apache.brooklyn.api.policy.Policy; import org.apache.brooklyn.config.ConfigKey; import org.apache.brooklyn.core.entity.Entities; import org.apache.brooklyn.core.entity.EntityInternal; import org.apache.brooklyn.core.test.entity.TestEntity; import org.apache.brooklyn.core.test.policy.TestPolicy; import org.apache.brooklyn.test.Asserts; import org.apache.brooklyn.util.collections.MutableMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.testng.Assert; import org.testng.annotations.Test; import com.google.common.base.Predicates; import com.google.common.base.Supplier; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; @Test public class PoliciesYamlTest extends AbstractYamlTest { static final Logger log = LoggerFactory.getLogger(PoliciesYamlTest.class); @Test public void testWithAppPolicy() throws Exception { Entity app = createAndStartApplication(loadYaml("test-app-with-policy.yaml")); waitForApplicationTasks(app); Assert.assertEquals(app.getDisplayName(), "test-app-with-policy"); log.info("App started:"); Entities.dumpInfo(app); Assert.assertEquals(app.policies().size(), 1); Policy policy = app.policies().iterator().next(); Assert.assertTrue(policy instanceof TestPolicy); Assert.assertEquals(policy.getConfig(TestPolicy.CONF_NAME), "Name from YAML"); Assert.assertEquals(policy.getConfig(TestPolicy.CONF_FROM_FUNCTION), "$brooklyn: is a fun place"); Map<?, ?> leftoverProperties = ((TestPolicy) policy).getLeftoverProperties(); Assert.assertEquals(leftoverProperties.get("policyLiteralValue1"), "Hello"); Assert.assertEquals(leftoverProperties.get("policyLiteralValue2"), "World"); Assert.assertEquals(leftoverProperties.size(), 2); } @Test public void testWithEntityPolicy() throws Exception { Entity app = createAndStartApplication(loadYaml("test-entity-with-policy.yaml")); waitForApplicationTasks(app); Assert.assertEquals(app.getDisplayName(), "test-entity-with-policy"); log.info("App started:"); Entities.dumpInfo(app); Assert.assertEquals(app.policies().size(), 0); Assert.assertEquals(app.getChildren().size(), 1); Entity child = app.getChildren().iterator().next(); Assert.assertEquals(child.policies().size(), 1); Policy policy = child.policies().iterator().next(); Assert.assertNotNull(policy); Assert.assertTrue(policy instanceof TestPolicy, "policy=" + policy + "; type=" + policy.getClass()); Assert.assertEquals(policy.getConfig(TestPolicy.CONF_NAME), "Name from YAML"); Assert.assertEquals(policy.getConfig(TestPolicy.CONF_FROM_FUNCTION), "$brooklyn: is a fun place"); Assert.assertEquals(((TestPolicy) policy).getLeftoverProperties(), ImmutableMap.of("policyLiteralValue1", "Hello", "policyLiteralValue2", "World")); Assert.assertEquals(policy.getConfig(TestPolicy.TEST_ATTRIBUTE_SENSOR), TestEntity.NAME); } @Test public void testChildWithPolicy() throws Exception { Entity app = createAndStartApplication(loadYaml("test-entity-basic-template.yaml", " brooklyn.config:", " test.confName: parent entity", " brooklyn.children:", " - serviceType: org.apache.brooklyn.core.test.entity.TestEntity", " name: Child Entity", " brooklyn.policies:", " - policyType: org.apache.brooklyn.core.test.policy.TestPolicy", " brooklyn.config:", " test.confName: Name from YAML", " test.attributeSensor: $brooklyn:sensor(\"org.apache.brooklyn.core.test.entity.TestEntity\", \"test.name\")")); waitForApplicationTasks(app); Assert.assertEquals(app.getChildren().size(), 1); Entity firstEntity = app.getChildren().iterator().next(); Assert.assertEquals(firstEntity.getChildren().size(), 1); final Entity child = firstEntity.getChildren().iterator().next(); Assert.assertEquals(child.getChildren().size(), 0); Assert.assertEquals(app.policies().size(), 0); Assert.assertEquals(firstEntity.policies().size(), 0); Asserts.eventually(new Supplier<Integer>() { @Override public Integer get() { return child.policies().size(); } }, Predicates.<Integer> equalTo(1)); Policy policy = child.policies().iterator().next(); Assert.assertTrue(policy instanceof TestPolicy); Assert.assertEquals(policy.getConfig(TestPolicy.TEST_ATTRIBUTE_SENSOR), TestEntity.NAME); } @Test public void testMultiplePolicyReferences() throws Exception { final Entity app = createAndStartApplication(loadYaml("test-referencing-policies.yaml")); waitForApplicationTasks(app); Assert.assertEquals(app.getDisplayName(), "test-referencing-policies"); Entity entity1 = null, entity2 = null, child1 = null, child2 = null, grandchild1 = null, grandchild2 = null; Assert.assertEquals(app.getChildren().size(), 2); for (Entity child : app.getChildren()) { if (child.getDisplayName().equals("entity 1")) entity1 = child; if (child.getDisplayName().equals("entity 2")) entity2 = child; } Assert.assertNotNull(entity1); Assert.assertNotNull(entity2); Assert.assertEquals(entity1.getChildren().size(), 2); for (Entity child : entity1.getChildren()) { if (child.getDisplayName().equals("child 1")) child1 = child; if (child.getDisplayName().equals("child 2")) child2 = child; } Assert.assertNotNull(child1); Assert.assertNotNull(child2); Assert.assertEquals(child1.getChildren().size(), 2); for (Entity child : child1.getChildren()) { if (child.getDisplayName().equals("grandchild 1")) grandchild1 = child; if (child.getDisplayName().equals("grandchild 2")) grandchild2 = child; } Assert.assertNotNull(grandchild1); Assert.assertNotNull(grandchild2); ImmutableSet<Policy> policies = new ImmutableSet.Builder<Policy>() .add(getPolicy(app)) .add(getPolicy(entity1)) .add(getPolicy(entity2)) .add(getPolicy(child1)) .add(getPolicy(child2)) .add(getPolicy(grandchild1)) .add(getPolicy(grandchild2)) .build(); Map<ConfigKey<Entity>, Entity> keyToEntity = new ImmutableMap.Builder<ConfigKey<Entity>, Entity>() .put(ReferencingYamlTestEntity.TEST_REFERENCE_APP, app) .put(ReferencingYamlTestEntity.TEST_REFERENCE_ENTITY1, entity1) .put(ReferencingYamlTestEntity.TEST_REFERENCE_ENTITY2, entity2) .put(ReferencingYamlTestEntity.TEST_REFERENCE_CHILD1, child1) .put(ReferencingYamlTestEntity.TEST_REFERENCE_CHILD2, child2) .put(ReferencingYamlTestEntity.TEST_REFERENCE_GRANDCHILD1, grandchild1) .put(ReferencingYamlTestEntity.TEST_REFERENCE_GRANDCHILD2, grandchild2) .build(); for (Policy policy : policies) checkReferences(policy, keyToEntity); } private void checkReferences(final Policy policy, Map<ConfigKey<Entity>, Entity> keyToEntity) throws Exception { for (final ConfigKey<Entity> key : keyToEntity.keySet()) { final Entity entity = keyToEntity.get(key); // Grab an entity whose execution context we can use Entity fromConfig = ((EntityInternal)entity).getExecutionContext().submit(MutableMap.of(), new Callable<Entity>() { @Override public Entity call() throws Exception { return (Entity) policy.getConfig(key); } }).get(); Assert.assertEquals(fromConfig, keyToEntity.get(key)); } } private Policy getPolicy(Entity entity) { Assert.assertEquals(entity.policies().size(), 1); Policy policy = entity.policies().iterator().next(); Assert.assertTrue(policy instanceof TestReferencingPolicy); return policy; } @Override protected Logger getLogger() { return log; } }