Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@ script:
- cfy blueprints validate -p ec2-blueprint.yaml
- cfy blueprints validate -p openstack-blueprint.yaml
- cfy blueprints validate -p openstack-nova-net-blueprint.yaml
- cfy blueprints validate -p openstack-haproxy-blueprint.yaml
- cfy blueprints validate -p singlehost-blueprint.yaml
- cfy blueprints validate -p softlayer-blueprint.yaml
- cfy blueprints validate -p cloudstack-blueprint.yaml
- cfy blueprints validate -p cloudstack-vpc-blueprint.yaml
- cfy local init -p local-blueprint.yaml
- cfy local execute -w install
- cfy local execute -w uninstall

3 changes: 3 additions & 0 deletions inputs/openstack-haproxy.yaml.template
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
image: ''
flavor: ''
agent_user: ''
334 changes: 334 additions & 0 deletions openstack-haproxy-blueprint.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,334 @@
###########################################################
# This Blueprint installs the nodecellar application behind
# an haproxy instance on an openstack cloud environment.
###########################################################

tosca_definitions_version: cloudify_dsl_1_0

imports:
- http://www.getcloudify.org/spec/cloudify/3.2m5/types.yaml
- http://www.getcloudify.org/spec/openstack-plugin/1.2m5/plugin.yaml
- http://www.getcloudify.org/spec/diamond-plugin/1.2m5/plugin.yaml
- types/nodecellar.yaml
- types/haproxy.yaml

#####################################################################################
# inputs section allows the user to use same
# blueprint for creating different deployments, each one
# with its own parameters.
# to specify deployment inputs run:
# - cfy deployments create -b <blueprint_id> -d <deployment_id> -i inputs.yaml
#####################################################################################

inputs:

image:
description: >
Image to be used when launching agent VM's

flavor:
description: >
Flavor of the agent VM's

agent_user:
description: >
User for connecting to agent VM's

node_types:

###########################################################
# We define a type that inherits openstack's default
# server, and adds monitoring capabillities on top of it.
###########################################################

nodecellar.nodes.MonitoredServer:
derived_from: cloudify.openstack.nodes.Server
properties:
cloudify_agent:
default:
user: { get_input: agent_user }
server:
default:
image: { get_input: image }
flavor: { get_input: flavor }
interfaces:

###########################################################
# We are infact telling cloudify to install a diamond
# monitoring agent on the server.
#
# (see https://github.com/BrightcoveOS/Diamond)
###########################################################

cloudify.interfaces.monitoring_agent:
install:
implementation: diamond.diamond_agent.tasks.install
inputs:
diamond_config:
default:
interval: 1
start: diamond.diamond_agent.tasks.start
stop: diamond.diamond_agent.tasks.stop
uninstall: diamond.diamond_agent.tasks.uninstall

###########################################################
# Adding some collectors. These collectors are necessary
# for the Cloudify UI to display the deafult metrics.
###########################################################

cloudify.interfaces.monitoring:
start:
implementation: diamond.diamond_agent.tasks.add_collectors
inputs:
collectors_config:
default:
CPUCollector: {}
MemoryCollector: {}
LoadAverageCollector: {}
DiskUsageCollector:
config:
devices: x?vd[a-z]+[0-9]*$
NetworkCollector: {}

node_templates:

mongod_host:
type: nodecellar.nodes.MonitoredServer
relationships:

###########################################################
# Attaching the mongo security group to the mongo host
###########################################################

- target: mongod_security_group
type: cloudify.openstack.server_connected_to_security_group

nodejs_host:
type: nodecellar.nodes.MonitoredServer

###########################################################
# Setting the nodejs_host initial number of instances to 2.
# The default values for instances.deploy is 1.
###########################################################

instances:
deploy: 2

relationships:

###########################################################
# Attaching the nodecellar security group to
# the nodecellar host
###########################################################

- target: nodecellar_security_group
type: cloudify.openstack.server_connected_to_security_group

haproxy_frontend_host:
type: nodecellar.nodes.MonitoredServer
relationships:

###########################################################
# Attaching a floating ip to the haproxy frontend host
###########################################################

- type: cloudify.openstack.server_connected_to_floating_ip
target: frontend_floatingip

###########################################################
# Attaching the haproxy frontend security group to
# the haproxy frontend host
###########################################################

- type: cloudify.openstack.server_connected_to_security_group
target: haproxy_frontend_security_group

mongod:
type: nodecellar.nodes.MongoDatabase
properties:
port: 27017
interfaces:
cloudify.interfaces.lifecycle:

###########################################################
# The MongoDBCollector depends on a python library called
# pymongo. We install this library in the 'configure'
# lifecycle hook of this node.
###########################################################

configure: scripts/mongo/install-pymongo.sh

###########################################################
# Notice that this node defines an additional collector
# to collect data on the MongoDB.
###########################################################

cloudify.interfaces.monitoring:
start:
implementation: diamond.diamond_agent.tasks.add_collectors
inputs:
collectors_config:
MongoDBCollector:
config:
hosts: localhost:27017
relationships:
- type: cloudify.relationships.contained_in
target: mongod_host

nodejs:
type: nodecellar.nodes.NodeJSServer
relationships:
- type: cloudify.relationships.contained_in
target: nodejs_host

nodecellar:
type: nodecellar.nodes.NodecellarApplicationModule
properties:
port: 8080
relationships:

################################
# Setting the mongo connection
################################

- type: node_connected_to_mongo
target: mongod

################################
# Setting the nodejs connection
################################

- type: node_contained_in_nodejs
target: nodejs

################################
# Setting the haproxy connection
################################

- type: app_connected_to_haproxy
target: haproxy


########################################
# Note: only ubuntu haproxy installation
# is supported.
########################################

haproxy:
type: haproxy.nodes.Proxy
properties:

###########################################################
# This is the port that will be used by haproxy.
###########################################################
frontend_port: 80

###########################################################
# This is the port that will be used by haproxy to display
# statistics.
###########################################################
statistics_port: 9000

backend_app_port: { get_property: [ nodecellar, port ] }

relationships:
- target: haproxy_frontend_host
type: cloudify.relationships.contained_in
interfaces:

###########################################################
# Notice that this node defines an additional collector
# to collect data on the haproxy instance.
# Also notice that in the URL, port 9000 is used. If you
# choose to change this port on the haproxy node template,
# this URL should be updated as well.
###########################################################

cloudify.interfaces.monitoring:
start:
implementation: diamond.diamond_agent.tasks.add_collectors
inputs:
collectors_config:
HAProxyCollector:
config:
url: http://127.0.0.1:9000/haproxy_stats;csv

###########################################################
# A security group to enable access to the nodejs host
# using the port of the nodecellar application.
#
# This security group will be attached to the nodejs_host
###########################################################

nodecellar_security_group:
type: cloudify.openstack.nodes.SecurityGroup
properties:
security_group:
name: nodecellar_security_group
rules:
- remote_ip_prefix: 0.0.0.0/0
port: { get_property: [ nodecellar, port ] }


###########################################################
# A security group to enable access to the mongo host
# using the port of the mongo node.
#
# We need this so that the nodecellar application can
# comminicate with MongoDB, since they are running on
# different hosts.
###########################################################

mongod_security_group:
type: cloudify.openstack.nodes.SecurityGroup
properties:
security_group:
name: mongod_security_group
rules:
- remote_ip_prefix: 0.0.0.0/0
port: { get_property: [ mongod, port ] }
- remote_ip_prefix: 0.0.0.0/0
port: 28017

###########################################################
# A security group to enable access to the haproxy frontend
# host using the haproxy frontend_port property.
# In addition, we open the statistics port (9000) of haproxy
#
# This security group will be attached to the
# haproxy_frontend_host
###########################################################

haproxy_frontend_security_group:
type: cloudify.openstack.nodes.SecurityGroup
properties:
security_group:
name: haproxy_frontend_security_group
rules:
- remote_ip_prefix: 0.0.0.0/0
port: { get_property: [ haproxy, frontend_port ] }
- remote_ip_prefix: 0.0.0.0/0
port: { get_property: [ haproxy, statistics_port ]}

###########################################################
# A floating ip to be attached to the haproxy frontend host,
# since eventually we want to be able to access the application
# from any machine, on any network.
###########################################################

frontend_floatingip:
type: cloudify.openstack.nodes.FloatingIP


###########################################################
# This outputs section exposes the application endpoint.
# You can access it by running:
# - cfy deployments -d <deployment_id> outputs
###########################################################

outputs:
endpoint:
description: Web application endpoint
value:
ip_address: { get_attribute: [ frontend_floatingip, floating_ip_address ] }
port: { get_property: [haproxy, frontend_port] }
38 changes: 38 additions & 0 deletions resources/haproxy/haproxy.cfg.template
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
global
daemon
maxconn {{global_maxconn}}

defaults
mode {{mode}}
timeout connect {{timeout_connect}}
timeout client {{timeout_client}}
timeout server {{timeout_server}}

frontend {{frontend_id}}
bind *:{{frontend_port}}
default_backend {{default_backend}}

backend {{default_backend}}
{% for id, backend in backends.iteritems() %}
server {{ id }} {{ backend.address }}:{{ backend.port }} maxconn {{ backend.maxconn }}
{% endfor %}

listen stats 0.0.0.0:{{statistics_port}}
mode http
balance
timeout client 5000
timeout connect 4000
timeout server 30000

#This is the virtual URL to access the stats page
stats uri /haproxy_stats

#Authentication realm. This can be set to anything. Escape space characters with a backslash.
stats realm HAProxy\ Statistics

#The user/pass you want to use. Change this password!
stats auth admin:password

#This allows you to take down and bring up back end servers.
#This will produce an error on older versions of HAProxy.
stats admin if TRUE
Loading