blob: c694bdda1baec79ef574cf8955f7eb53b5ad04ac [file] [log] [blame]
# 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.
brooklyn.catalog:
version: "0.12.0-SNAPSHOT" # BROOKLYN_VERSION
itemType: entity
items:
- id: org.apache.brooklyn.entity.webapp.nodejs.NodeJsWebAppService
item:
type: org.apache.brooklyn.entity.webapp.nodejs.NodeJsWebAppService
name: Node.JS Application
- id: org.apache.brooklyn.entity.webapp.jboss.JBoss7Server
item:
type: org.apache.brooklyn.entity.webapp.jboss.JBoss7Server
name: JBoss Application Server 7
description: AS7 - an open source Java application server from JBoss
- id: org.apache.brooklyn.entity.proxy.nginx.UrlMapping
item:
type: org.apache.brooklyn.entity.proxy.nginx.UrlMapping
name: URL Mapping
- id: org.apache.brooklyn.entity.webapp.DynamicWebAppFabric
item:
type: org.apache.brooklyn.entity.webapp.DynamicWebAppFabric
name: Dynamic Web App Fabric
- id: org.apache.brooklyn.entity.proxy.nginx.NginxController
item:
type: org.apache.brooklyn.entity.proxy.nginx.NginxController
name: Nginx Server
description: A single Nginx server. Provides HTTP and reverse proxy services
- id: org.apache.brooklyn.entity.webapp.jboss.JBoss6Server
item:
type: org.apache.brooklyn.entity.webapp.jboss.JBoss6Server
name: JBoss Application Server 6
description: AS6 - an open source Java application server from JBoss
- id: org.apache.brooklyn.entity.webapp.tomcat.Tomcat8Server
item:
type: org.apache.brooklyn.entity.webapp.tomcat.Tomcat8Server
name: Tomcat 8 Server
- id: org.apache.brooklyn.entity.proxy.LoadBalancerCluster
item:
type: org.apache.brooklyn.entity.proxy.LoadBalancerCluster
name: Load-balanced Cluster
description: |
A cluster of load balancers; configuring the cluster (through the LoadBalancer interface)
will configure all load balancers in the cluster.
- id: org.apache.brooklyn.entity.webapp.jetty.Jetty6Server
item:
type: org.apache.brooklyn.entity.webapp.jetty.Jetty6Server
name: Jetty6 Server
description: Old version (v6 @ Mortbay) of the popular Jetty webapp container
- id: org.apache.brooklyn.entity.webapp.DynamicWebAppCluster
item:
type: org.apache.brooklyn.entity.webapp.DynamicWebAppCluster
name: Dynamic Web-app Cluster
description: A cluster of web-apps, which can be dynamically re-sized; this does not include a load-balancer
- id: org.apache.brooklyn.entity.webapp.tomcat.TomcatServer
item:
type: org.apache.brooklyn.entity.webapp.tomcat.TomcatServer
name: Tomcat 7 Server
- id: org.apache.brooklyn.entity.dns.geoscaling.GeoscalingDnsService
item:
type: org.apache.brooklyn.entity.dns.geoscaling.GeoscalingDnsService
name: Geoscaling DNS Service
description: A geo-DNS service using geoscaling.com
- id: org.apache.brooklyn.entity.webapp.ControlledDynamicWebAppCluster
item:
type: org.apache.brooklyn.entity.webapp.ControlledDynamicWebAppCluster
name: Controlled Dynamic Web-app Cluster
description: A cluster of load-balanced web-apps, which can be dynamically re-sized
- id: load-balancer
item:
type: org.apache.brooklyn.entity.proxy.nginx.NginxController
name: Load Balancer (nginx)
description: |
Synonym for 'Nginx Server'.
Create a load balancer which will point at members in the group entity
referred to by the config key "serverPool".
The sensor advertising the port can be configured with the "member.sensor.portNumber" config key,
defaulting to `http.port`; all member entities which have published "service.up" will then be picked up.
- id: resilient-bash-web-cluster-template
itemType: template
name: "Template: Resilient Load-Balanced Bash Web Cluster with Sensors"
description: |
Sample YAML to provision a cluster of the bash/python web server nodes,
with sensors configured, and a load balancer pointing at them,
and resilience policies for node replacement and scaling
item:
name: Resilient Load-Balanced Bash Web Cluster (Brooklyn Example)
# this final example shows some of the advanced functionality:
# defining custom sensors, and a cluster with a "spec",
# policies for resilience and scaling based on that sensor,
# and wiring a load balancer in front of the cluster
# combining this with the riak cluster in the previous example
# is left as a suggested exercise for the user
services:
# define a cluster of the web nodes
- type: cluster
name: Cluster of Bash Web Nodes
id: my-web-cluster
brooklyn.config:
initialSize: 1
memberSpec:
$brooklyn:entitySpec:
# template bash-web-server-template is used as the spec for items in this cluster
# with a new message overwriting the previous,
# and a lot of sensors defined
type: bash-web-server-template
name: My Bash Web Server VM with Sensors
# and clear the location defined there so it is taken from this template
locations: []
brooklyn.config:
my.message: "part of the cluster"
brooklyn.initializers:
# make a simple request-count sensor, by counting the number of 200 responses in output.txt
- type: org.apache.brooklyn.core.sensor.ssh.SshCommandSensor
brooklyn.config:
name: reqs.count
targetType: int
period: 5s
command: "cat output.txt | grep HTTP | grep 200 | wc | awk '{print $1}'"
# and publish the port as a sensor so the load-balancer can pick it up
- type: org.apache.brooklyn.core.sensor.StaticSensor
brooklyn.config:
name: app.port
targetType: int
static.value: $brooklyn:config("my.app.port")
brooklyn.enrichers:
# derive reqs.per_sec from reqs.count
- type: org.apache.brooklyn.enricher.stock.YamlTimeWeightedDeltaEnricher
brooklyn.config:
enricher.sourceSensor: reqs.count
enricher.targetSensor: reqs.per_sec
enricher.delta.period: 1s
# and take an average over 30s for reqs.per_sec into reqs.per_sec.windowed_30s
- type: org.apache.brooklyn.enricher.stock.YamlRollingTimeWindowMeanEnricher
brooklyn.config:
enricher.sourceSensor: reqs.per_sec
enricher.targetSensor: reqs.per_sec.windowed_30s
enricher.window.duration: 30s
brooklyn.policies:
# restart if a failure is detected (with a max of one restart in 2m, sensor will propagate otherwise)
- type: org.apache.brooklyn.policy.ha.ServiceRestarter
brooklyn.config:
failOnRecurringFailuresInThisDuration: 2m
# back at the cluster, create a total per-sec and some per-node average
brooklyn.enrichers:
- type: org.apache.brooklyn.enricher.stock.Aggregator
brooklyn.config:
enricher.sourceSensor: reqs.per_sec
enricher.targetSensor: reqs.per_sec
transformation: sum
- type: org.apache.brooklyn.enricher.stock.Aggregator
brooklyn.config:
enricher.sourceSensor: reqs.per_sec
enricher.targetSensor: reqs.per_sec.per_node
transformation: average
- type: org.apache.brooklyn.enricher.stock.Aggregator
brooklyn.config:
enricher.sourceSensor: reqs.per_sec.windowed_30s
enricher.targetSensor: reqs.per_sec.windowed_30s.per_node
transformation: average
brooklyn.policies:
# resilience: if a per-node restart policy fails,
# just throw that node away and create a new one
- type: org.apache.brooklyn.policy.ha.ServiceReplacer
# and scale based on reqs/sec
- type: org.apache.brooklyn.policy.autoscaling.AutoScalerPolicy
brooklyn.config:
# scale based on reqs/sec (though in a real-world situation,
# reqs.per_sec.windowed_30s.per_node might be a better choice)
metric: reqs.per_sec.per_node
# really low numbers, so you can trigger a scale-out just by hitting reload a lot
metricUpperBound: 3
metricLowerBound: 1
# sustain 3 reqs/sec for 2s and it will scale out
resizeUpStabilizationDelay: 2s
# only scale down when sustained for 1m
resizeDownStabilizationDelay: 1m
maxPoolSize: 10
# and add a load-balancer pointing at the cluster
- type: load-balancer
id: load-bal
brooklyn.config:
# point this load balancer at the cluster, specifying port to forward to
loadbalancer.serverpool: $brooklyn:entity("my-web-cluster")
member.sensor.portNumber: app.port
# disable sticky sessions to allow easy validation of balancing via browser refresh
nginx.sticky: false
brooklyn.enrichers:
# publish a few useful info sensors and KPI's to the root of the app
- type: org.apache.brooklyn.enricher.stock.Propagator
brooklyn.config:
uniqueTag: propagate-load-balancer-url
producer: $brooklyn:entity("load-bal")
propagating:
- main.uri
- type: org.apache.brooklyn.enricher.stock.Propagator
brooklyn.config:
uniqueTag: propagate-reqs-per-sec
producer: $brooklyn:entity("my-web-cluster")
propagating:
- reqs.per_sec
- reqs.per_sec.windowed_30s.per_node
location:
jclouds:aws-ec2:
# edit these (or delete if credentials specified in brooklyn.properties)
identity: <REPLACE>
credential: <REPLACE>
region: eu-central-1
minRam: 2gb