/* * 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.qa.camp; import java.net.URI; import java.util.Collection; import java.util.Iterator; import java.util.List; import org.apache.brooklyn.api.entity.Entity; import org.apache.brooklyn.camp.brooklyn.AbstractYamlTest; import org.apache.brooklyn.core.entity.Attributes; import org.apache.brooklyn.core.entity.Entities; import org.apache.brooklyn.core.entity.EntityInternal; import org.apache.brooklyn.core.sensor.Sensors; import org.apache.brooklyn.entity.group.DynamicCluster; import org.apache.brooklyn.entity.webapp.JavaWebAppSoftwareProcess; import org.apache.brooklyn.test.EntityTestUtils; import org.apache.brooklyn.util.collections.CollectionFunctionals; import org.apache.brooklyn.util.collections.MutableList; import org.apache.brooklyn.util.math.MathPredicates; import org.apache.brooklyn.util.text.StringPredicates; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.testng.Assert; import org.testng.annotations.Test; import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.collect.Iterables; /** Tests some improvements to enricher classes to make them a bit more yaml friendly. * Called "SlightlySimpler" as it would be nice to make enrichers a lot more yaml friendly! */ @Test public class EnrichersSlightlySimplerYamlTest extends AbstractYamlTest { private static final Logger log = LoggerFactory.getLogger(EnrichersSlightlySimplerYamlTest.class); @SuppressWarnings({ "unchecked", "rawtypes" }) @Test public void testWithAppEnricher() throws Exception { Entity app = createAndStartApplication(loadYaml("test-app-with-enrichers-slightly-simpler.yaml")); waitForApplicationTasks(app); log.info("Started "+app+":"); Entities.dumpInfo(app); Entity cluster = Iterables.getOnlyElement( app.getChildren() ); Collection<Entity> leafs = ((DynamicCluster)cluster).getMembers(); Iterator<Entity> li = leafs.iterator(); Entity e1 = li.next(); ((EntityInternal)e1).sensors().set(Sensors.newStringSensor("ip"), "127.0.0.1"); EntityTestUtils.assertAttributeEqualsEventually(e1, Sensors.newStringSensor("url"), "http://127.0.0.1/"); EntityTestUtils.assertAttributeEqualsEventually(e1, Attributes.MAIN_URI, URI.create("http://127.0.0.1/")); int i=2; while (li.hasNext()) { Entity ei = li.next(); ((EntityInternal)ei).sensors().set(Sensors.newStringSensor("ip"), "127.0.0."+i); i++; } EntityTestUtils.assertAttributeEventually(cluster, Sensors.newSensor(Iterable.class, "urls.list"), (Predicate)CollectionFunctionals.sizeEquals(3)); EntityTestUtils.assertAttributeEventually(cluster, Sensors.newSensor(String.class, "urls.list.comma_separated.max_2"), StringPredicates.matchesRegex("\"http:\\/\\/127[^\"]*\\/\",\"http:\\/\\/127[^\"]*\\/\"")); EntityTestUtils.assertAttributeEventually(cluster, Attributes.MAIN_URI, Predicates.notNull()); URI main = cluster.getAttribute(Attributes.MAIN_URI); Assert.assertTrue(main.toString().matches("http:\\/\\/127.0.0..\\/"), "Wrong URI: "+main); EntityTestUtils.assertAttributeEventually(app, Attributes.MAIN_URI, Predicates.notNull()); main = app.getAttribute(Attributes.MAIN_URI); Assert.assertTrue(main.toString().matches("http:\\/\\/127.0.0..\\/"), "Wrong URI: "+main); // TODO would we want to allow "all-but-usual" as the default if nothing specified } @Test(groups="Integration") public void testWebappWithAveragingEnricher() throws Exception { Entity app = createAndStartApplication(loadYaml("test-webapp-with-averaging-enricher.yaml")); waitForApplicationTasks(app); log.info("Started "+app+":"); Entities.dumpInfo(app); List<JavaWebAppSoftwareProcess> appservers = MutableList.copyOf(Entities.descendants(app, JavaWebAppSoftwareProcess.class)); Assert.assertEquals(appservers.size(), 3); EntityInternal srv0 = (EntityInternal) appservers.get(0); EntityInternal dwac = (EntityInternal) srv0.getParent(); EntityInternal cdwac = (EntityInternal) dwac.getParent(); srv0.sensors().set(Sensors.newDoubleSensor("my.load"), 20.0); EntityTestUtils.assertAttributeEventually(dwac, Sensors.newSensor(Double.class, "my.load.averaged"), MathPredicates.equalsApproximately(20)); EntityTestUtils.assertAttributeEventually(cdwac, Sensors.newSensor(Double.class, "my.load.averaged"), MathPredicates.equalsApproximately(20)); srv0.sensors().set(Sensors.newDoubleSensor("my.load"), null); EntityTestUtils.assertAttributeEventually(cdwac, Sensors.newSensor(Double.class, "my.load.averaged"), Predicates.isNull()); ((EntityInternal) appservers.get(1)).sensors().set(Sensors.newDoubleSensor("my.load"), 10.0); ((EntityInternal) appservers.get(2)).sensors().set(Sensors.newDoubleSensor("my.load"), 20.0); EntityTestUtils.assertAttributeEventually(cdwac, Sensors.newSensor(Double.class, "my.load.averaged"), MathPredicates.equalsApproximately(15)); srv0.sensors().set(Sensors.newDoubleSensor("my.load"), 0.0); EntityTestUtils.assertAttributeEventually(cdwac, Sensors.newSensor(Double.class, "my.load.averaged"), MathPredicates.equalsApproximately(10)); } @Override protected Logger getLogger() { return log; } }