lib/cloudster/elb.rb
module Cloudster
#==Elb resource
#Output values : canonical_hosted_zone_name, canonical_hosted_zone_name_id, dns_name, source_security_group_name, source_security_group_owner
class Elb
extend Cloudster::Output
# Initialize an Elb instance
#
# ==== Notes
# options parameter must include values for :name, :instance_names
#
# ==== Examples
# elb = Cloudster::Elb.new(
# :name => 'LoadBalancer',
# :instance_names => ['AppServer1','AppServer2'],
# :listeners => [{:port => 80, :instance_port => 8080, :protocol => 'HTTP'}]
# )
#
# ==== Parameters
# * options<~Hash> -
# * :name: String containing the name for the Elb resource
# * :instance_names: Array containing the names of the Ec2 resources which will be added under the ELB
# * :listeners: Array of listener hashes. Each listener must be registered for a specific port, and you can not have more than one listener for a given port. Default : {:port => 80, :instance_port => 80, :protocol => 'HTTP'}
def initialize(options = {})
require_options(options, [:name, :instance_names])
@name = options[:name]
@instance_names = options[:instance_names]
@listeners = options[:listeners] || [{:port => 80, :instance_port => 80, :protocol => 'HTTP'}]
end
# Returns a Ruby hash version of the Cloud Formation template for the resource instance
#
# ==== Examples
# elb = Cloudster::Elb.new(
# :name => 'LoadBalancer',
# :instance_names => ['AppServer1','AppServer2']
# )
# elb.template
#
# ==== Returns
# * Ruby hash version of the Cloud Formation template for the resource instance
def template
Elb.template({:name =>@name, :instance_names => @instance_names, :listeners => @listeners})
end
# Class method that returns a Ruby hash version of the Cloud Formation template
#
# ==== Examples
# template = Cloudster::Elb.template(
# :name => 'LoadBalances',
# :instance_names => ['AppServer1', 'AppServer2'],
# :listeners => [{:port => 80, :instance_port => 80, :protocol => 'HTTP'}]
# )
#
# ==== Parameters
# * options<~Hash> -
# *Keys:
# * :name: String containing the name for the Elb resource
# * :instance_names: Array containing the names of the Ec2 resources which will be added under the ELB
# * :listeners: Array of listener hashes. Each listener must be registered for a specific port, and you can not have more than one listener for a given port. Default : {:port => 80, :instance_port => 80, :protocol => 'HTTP'}
# ==== Returns
# * Ruby hash version of the Cloud Formation template
def self.template(options = {})
require_options(options, [:name, :instance_names])
properties = {"AvailabilityZones" => { "Fn::GetAZs" => "" },
"Listeners" => get_listeners_for_template(options[:listeners]),
"HealthCheck" => {
"Target" => { "Fn::Join" => [ "", ["HTTP:", "80", "/"]]},
"HealthyThreshold" => "3",
"UnhealthyThreshold" => "5",
"Interval" => "30",
"Timeout" => "5"
}
}
properties.merge!({"Instances" => get_instance_name_list_for_template(options[:instance_names])})
template = {'Resources' => {
options[:name] => {
'Type' => 'AWS::ElasticLoadBalancing::LoadBalancer',
'Properties' => properties
}
}
}
outputs = {
options[:name] => {
'canonical_hosted_zone_name' => {'Fn::GetAtt' => [options[:name], 'CanonicalHostedZoneName']},
'canonical_hosted_zone_name_id' => {'Fn::GetAtt' => [options[:name], 'CanonicalHostedZoneNameID']},
'dns_name' => {'Fn::GetAtt' => [options[:name], 'DNSName']},
'source_security_group_name' => {'Fn::GetAtt' => [options[:name], 'SourceSecurityGroup.GroupName']},
'source_security_group_owner' => {'Fn::GetAtt' => [options[:name], 'SourceSecurityGroup.OwnerAlias']}
}
}
template['Outputs'] = output_template(outputs)
return template
end
private
#Gets the instance names in a format expected by the Template for ELB
def self.get_instance_name_list_for_template(instance_names)
instance_list = []
instance_names.each do |instance_name|
instance_list << {'Ref' => instance_name}
end
return instance_list
end
#Get listeners array for template
def self.get_listeners_for_template(listeners)
default_listener = [{:port => 80, :instance_port => 80, :protocol => 'HTTP'}]
listeners = default_listener if listeners.nil?
listener_array = []
listeners.each do |listener|
listener_array << { "LoadBalancerPort" => "#{listener[:port]}",
"InstancePort" => "#{listener[:instance_port]}",
"Protocol" => "#{listener[:protocol]}"
}
end
return listener_array
end
end
end