module Rudy::AWS::EC2

Public Class Methods

connect(access_key=nil, secret_key=nil, region=nil, logger=nil) click to toggle source
# File lib/rudy/aws/ec2.rb, line 8
def self.connect(access_key=nil, secret_key=nil, region=nil, logger=nil)

  if region
    raise InvalidRegion, region unless Rudy::AWS.valid_region?(region)
    host = "#{region}.ec2.amazonaws.com"
  elsif ENV['EC2_URL']
    host = URL.parse(ENV['EC2_URL']).host
  end
  
  host ||= DEFAULT_EC2_HOST
  port ||= DEFAULT_EC2_PORT
  
  @@ec2 = ::AWS::EC2::Base.new(:port => port, :server=> host, :access_key_id => access_key, :secret_access_key => secret_key)
end

Protected Class Methods

execute_request(default=nil, timeout=nil, &request) click to toggle source

Execute AWS requests safely. This will trap errors and return a default value (if specified).

  • default A default response value

  • request A block which contains the AWS request

Returns the return value from the request is returned untouched or the default value on error or if the request returned nil.

# File lib/rudy/aws/ec2.rb, line 31
def self.execute_request(default=nil, timeout=nil, &request)
  timeout ||= 30
  raise "No block provided" unless request
  response = nil
  @@mutex.synchronize {
    begin
    
      Timeout::timeout(timeout) do
        response = request.call
      end
  
    # Raise the EC2 exceptions
    rescue ::AWS::Error, ::AWS::InvalidInstanceIDMalformed => ex  
      raise Rudy::AWS::Error, ex.message
  
    # NOTE: The InternalError is returned for non-existent volume IDs. 
    # It's probably a bug so we're ignoring it -- Dave. 
    rescue ::AWS::InternalError => ex
      raise Rudy::AWS::Error, ex.message
    
    rescue Timeout::Error => ex
      Rudy::Huxtable.le "Timeout (#{timeout}): #{ex.message}!"
    rescue SocketError => ex
      #Rudy::Huxtable.le ex.message
      #Rudy::Huxtable.le ex.backtrace
      raise SocketError, "Check your Internets!" unless @@global.offline
    ensure
      response ||= default
    end
    sleep 0.1  # defeat race conditions
  }
  response
end