class EC2Launcher::HostnameGenerator
Helper class to generate sequential, numbered host names
Attributes
prefix[R]
suffix[R]
Public Class Methods
new(ec2, environment, application)
click to toggle source
@param [AWS::EC2] ec2 EC2 object used to query for existing instances @param [EC2Launcher::Environment] environment Environment to use for generating host names @param [EC2Launcher::Application] application Application to use for generating host names
# File lib/ec2launcher/hostname_generator.rb, line 24 def initialize(ec2, environment, application) @ec2 = ec2 @server_name_cache = nil @prefix = application.basename @prefix ||= application.name @env_suffix = environment.short_name @env_suffix ||= environment.name @suffix = @env_suffix unless application.name_suffix.nil? @suffix = "#{application.name_suffix}.#{@env_suffix}" end @host_number_regex = Regexp.new("#{@prefix}(\\d+)[.]#{@suffix.gsub(/[.]/, "[.]")}.*") # Load and cache instance names load_instances(@prefix, @suffix) @dynamic_generator = EC2Launcher::DynamicHostnameGenerator.new(nil, "#{@prefix}.#{@suffix}") end
Public Instance Methods
generate_dynamic_hostname(instance_id)
click to toggle source
Given an instance id, generates a dynamic short hostname typically in the form:
prefix + INSTANCE ID + application + environment
Examples:
9803da2.web.prod (no prefix) app-d709aa2ab.server.dev (prefix = "app-")
@param [String] instance_id AWS EC2 instance id
# File lib/ec2launcher/hostname_generator.rb, line 57 def generate_dynamic_hostname(instance_id) short_name = @dynamic_generator.generate_dynamic_hostname(instance_id) # Cache the new hostname @server_name_cache << short_name short_name end
generate_hostname()
click to toggle source
Generates a new host name and automatically caches it so that future requests don’t use the same name.
# File lib/ec2launcher/hostname_generator.rb, line 68 def generate_hostname() # Find next host number host_number = get_next_host_number() # Build short host name short_name = "#{@prefix}#{host_number}.#{@suffix}" # Cache the new hostname @server_name_cache << short_name short_name end
Private Instance Methods
get_next_host_number()
click to toggle source
Determines the next available number for a host name
# File lib/ec2launcher/hostname_generator.rb, line 99 def get_next_host_number() highest_server_number = 0 lowest_server_number = 32768 server_numbers = [] @server_name_cache.each do |server_name| unless @host_number_regex.match(server_name).nil? server_num = $1.to_i server_numbers << server_num end end highest_server_number = server_numbers.max # If the highest number server is less than 10, just add # 1 to it. Otherwise, find the first available # server number starting at 1. host_number = 0 if highest_server_number.nil? host_number = 1 elsif highest_server_number < 10 host_number = highest_server_number + 1 else # Try to start over with 1 and find the # first available host number server_number_set = Set.new(server_numbers) host_number = 1 while server_number_set.include?(host_number) do host_number += 1 end end host_number end
load_instances(prefix, suffix)
click to toggle source
Loads and caches instance host names
# File lib/ec2launcher/hostname_generator.rb, line 84 def load_instances(prefix, suffix) @server_name_cache = [] AWS.memoize do server_instances = nil run_with_backoff(60, 1, "searching for instances") do server_instances = @ec2.instances.filter("tag:Name", "#{prefix}*#{suffix}*") end server_instances.each do |i| next if i.status == :terminated @server_name_cache << i.tags[:Name] end end end