| /* |
| * 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.demo; |
| |
| import static org.apache.brooklyn.core.sensor.DependentConfiguration.attributeWhenReady; |
| import static org.apache.brooklyn.core.sensor.DependentConfiguration.formatString; |
| import static org.apache.brooklyn.entity.java.JavaEntityMethods.javaSysProp; |
| |
| import java.util.List; |
| import java.util.concurrent.TimeUnit; |
| |
| import org.slf4j.Logger; |
| import org.slf4j.LoggerFactory; |
| import org.apache.brooklyn.entity.database.mysql.MySqlNode; |
| import org.apache.brooklyn.api.entity.EntitySpec; |
| import org.apache.brooklyn.api.sensor.AttributeSensor; |
| import org.apache.brooklyn.core.entity.AbstractApplication; |
| import org.apache.brooklyn.core.entity.Entities; |
| import org.apache.brooklyn.core.entity.StartableApplication; |
| import org.apache.brooklyn.core.location.PortRanges; |
| import org.apache.brooklyn.core.sensor.Sensors; |
| import org.apache.brooklyn.enricher.stock.Enrichers; |
| import org.apache.brooklyn.entity.webapp.ControlledDynamicWebAppCluster; |
| import org.apache.brooklyn.entity.webapp.DynamicWebAppCluster; |
| import org.apache.brooklyn.entity.webapp.JavaWebAppService; |
| import org.apache.brooklyn.entity.webapp.WebAppService; |
| import org.apache.brooklyn.entity.webapp.WebAppServiceConstants; |
| import org.apache.brooklyn.launcher.BrooklynLauncher; |
| import org.apache.brooklyn.policy.autoscaling.AutoScalerPolicy; |
| import org.apache.brooklyn.policy.enricher.HttpLatencyDetector; |
| import org.apache.brooklyn.util.CommandLineUtil; |
| |
| import com.google.common.collect.ImmutableMap; |
| import com.google.common.collect.Lists; |
| |
| /** |
| * Launches a 3-tier app with nginx, clustered jboss, and mysql. |
| **/ |
| public class WebClusterDatabaseExample extends AbstractApplication { |
| |
| public static final Logger LOG = LoggerFactory.getLogger(WebClusterDatabaseExample.class); |
| |
| public static final String WAR_PATH = "classpath://hello-world-sql-webapp.war"; |
| |
| public static final String DB_SETUP_SQL_URL = "classpath://visitors-creation-script.sql"; |
| |
| public static final String DB_TABLE = "visitors"; |
| public static final String DB_USERNAME = "brooklyn"; |
| public static final String DB_PASSWORD = "br00k11n"; |
| |
| public static final AttributeSensor<Integer> APPSERVERS_COUNT = Sensors.newIntegerSensor( |
| "appservers.count", "Number of app servers deployed"); |
| |
| @Override |
| public void initApp() { |
| MySqlNode mysql = addChild(EntitySpec.create(MySqlNode.class) |
| .configure("creationScriptUrl", DB_SETUP_SQL_URL)); |
| |
| ControlledDynamicWebAppCluster web = addChild(EntitySpec.create(ControlledDynamicWebAppCluster.class) |
| .configure(WebAppService.HTTP_PORT, PortRanges.fromString("8080+")) |
| .configure(JavaWebAppService.ROOT_WAR, WAR_PATH) |
| .configure(javaSysProp("brooklyn.example.db.url"), |
| formatString("jdbc:%s%s?user=%s\\&password=%s", |
| attributeWhenReady(mysql, MySqlNode.DATASTORE_URL), |
| DB_TABLE, DB_USERNAME, DB_PASSWORD)) ); |
| |
| web.enrichers().add(HttpLatencyDetector.builder(). |
| url(ControlledDynamicWebAppCluster.ROOT_URL). |
| rollup(10, TimeUnit.SECONDS). |
| build()); |
| |
| // simple scaling policy |
| web.getCluster().policies().add(AutoScalerPolicy.builder(). |
| metric(DynamicWebAppCluster.REQUESTS_PER_SECOND_IN_WINDOW_PER_NODE). |
| metricRange(10, 100). |
| sizeRange(1, 5). |
| build()); |
| |
| // expose some KPI's |
| enrichers().add(Enrichers.builder() |
| .propagating(WebAppServiceConstants.ROOT_URL, |
| DynamicWebAppCluster.REQUESTS_PER_SECOND_IN_WINDOW, |
| HttpLatencyDetector.REQUEST_LATENCY_IN_SECONDS_IN_WINDOW) |
| .from(web) |
| .build()); |
| |
| enrichers().add(Enrichers.builder() |
| .propagating(ImmutableMap.of(DynamicWebAppCluster.GROUP_SIZE, APPSERVERS_COUNT)) |
| .from(web) |
| .build()); |
| } |
| |
| public static void main(String[] argv) { |
| List<String> args = Lists.newArrayList(argv); |
| String port = CommandLineUtil.getCommandLineOption(args, "--port", "8081+"); |
| String location = CommandLineUtil.getCommandLineOption(args, "--location", "localhost"); |
| |
| BrooklynLauncher launcher = BrooklynLauncher.newInstance() |
| .application(EntitySpec.create(StartableApplication.class, WebClusterDatabaseExample.class).displayName("Brooklyn WebApp Cluster with Database example")) |
| .restServerPort(port) |
| .location(location) |
| .start(); |
| |
| Entities.dumpInfo(launcher.getApplications()); |
| } |
| } |