class Trebuchet::Server

Attributes

concurrency[RW]
config[RW]
connections[RW]
instances[RW]
result[RW]
time[RW]
url[RW]

Public Class Methods

new(config=nil) click to toggle source
# File lib/trebuchet/server.rb, line 5
def initialize config=nil
  if File.exists?("trebuchet.yml")
    file = File.open('trebuchet.yml')
  elsif File.exists?("~/.trebuchet")
    file = File.open("~/.trebuchet")
  end
  @config = config || YAML::load(file)
  @concurrency = "1"
  @time = "1M"
  @url = "http://www.example.com"
  regions = @config.fetch("aws-config", {}).fetch("regions", ["us-east-1"])

  @connections = []
  regions.each do |region|
    @connections << Fog::Compute.new(:provider => "AWS", :aws_access_key_id => @config.fetch("aws-config", {}).fetch("access_key_id"), :aws_secret_access_key => @config.fetch("aws-config", {}).fetch("access_key_secret"), :region => region)
  end

  refresh_instances
end

Public Instance Methods

run() click to toggle source
# File lib/trebuchet/server.rb, line 50
def run
  puts "Beginning Load Test"
  @result = Trebuchet::Result.new
  futures = []
  @instances.each do |instance|
    futures << Celluloid::Future.new { run_siege instance }
  end
  futures.each { |future| future.value }
  puts @result.to_s

  nil
end
start(num_of_servers=1) click to toggle source
# File lib/trebuchet/server.rb, line 25
def start num_of_servers=1
  puts "Starting #{num_of_servers} servers!"
  futures = []
  num_of_servers.times do
    futures << Celluloid::Future.new do
      @connections.sample.servers.bootstrap(:public_key_path => '~/.ssh/id_rsa.pub', :username => 'ubuntu', :tags => {:temporary => true}) rescue Net::SSH::Disconnect
    end
  end
  futures.each { |future| future.value }
  puts "#{num_of_servers} Servers Started!"

  refresh_instances

  puts "Setting up new instances!"
  @instances.each { |instance| setup_instance instance }

  puts "New instances configured and ready for use!"
end
stop() click to toggle source
# File lib/trebuchet/server.rb, line 44
def stop
  puts "Shutting down all instances"
  @instances.each { |instance| instance.destroy }
  refresh_instances
end

Private Instance Methods

refresh_instances() click to toggle source
# File lib/trebuchet/server.rb, line 64
def refresh_instances
  @instances = []
  @connections.each do |connection|
    new_instance = connection.servers.select { |instance| instance.tags.fetch("temporary", false) and instance.state == "running" }
    @instances << new_instance unless new_instance.empty?
  end
  @instances.flatten!

  nil
end
run_siege(instance) click to toggle source
# File lib/trebuchet/server.rb, line 84
def run_siege instance
  ssh = Net::SSH.start(instance.dns_name, "ubuntu")
  cmd = "siege -R ~/.siegerc -c #{concurrency} -t #{time} #{url}"
  res = ssh.exec! cmd
  ssh.close
  parse = Trebuchet::Parser.new(res)
  @result.add_parse(parse)
end
setup_instance(instance) click to toggle source
# File lib/trebuchet/server.rb, line 75
def setup_instance instance
  ssh = Net::SSH.start(instance.dns_name, "ubuntu")
  ssh.exec! "sudo apt-get install siege"
  ssh.exec! %{echo "verbose = false" > ~/.siegerc}
  ssh.exec! %{sudo sh -c "echo '*               hard    nofile            1000000' >> /etc/security/limits.conf"}
  ssh.exec! %{sudo sh -c "echo '*               soft    nofile            1000000' >> /etc/security/limits.conf"}
  ssh.close
end