module Backends::Ec2::Helpers::AwsConnectHelper

Public Class Methods

handle_service_error(error, logger) click to toggle source

Converts EC2 error codes to errors understood by rOCCI-server. This method will ALWAYS raise an error. See docs.aws.amazon.com/AWSEC2/latest/APIReference/api-error-codes.html

@param error [Aws::EC2::Errors::ServiceError] EC2 error instance @param logger [Logger] instance of a logging facility @effects none: call answered from within the backend

# File lib/backends/ec2/helpers/aws_connect_helper.rb, line 41
def self.handle_service_error(error, logger)
  error_code = error.class.to_s.split('::').last
  message = "#{error_code}: #{error.message}"

  case error_code
  when 'Unavailable'
    # service is not available, probably EC2's fault
    fail Backends::Errors::ServiceUnavailableError, message
  when 'AuthFailure', 'Blocked', 'SignatureDoesNotMatch'
    # something is wrong with our credentials
    fail Backends::Errors::AuthenticationError, message
  when 'CannotDelete', 'DependencyViolation', 'IncorrectState', 'IncorrectInstanceState'
    # action wasn't allowed in this state or context
    fail Backends::Errors::ResourceStateError, message
  when /^(.+)Format$/, /^(.+)ZoneMismatch$/, /^(.+)AlreadyExists$/, /^(.+)Duplicate$/
    # something was wrong with our request
    fail Backends::Errors::ResourceNotValidError, message
  when /^(.+)InUse$/, /^(.+)Conflict$/, /^(.+)NotSupported$/
    # again, wrong state to perform the given action
    fail Backends::Errors::ResourceStateError, message
  when /^Insufficient(.+)Capacity$/, /^(.+)LimitExceeded$/, 'DiskImageSizeTooLarge'
    # not enough resources or requesting too much for current limits
    fail Backends::Errors::ResourceCreationError, message
  when /^(.+)Malformed$/, 'InvalidParameterValue'
    # what we sent was malformed or didn't have the proper format
    fail Backends::Errors::IdentifierNotValidError, message
  when /^(.+)NotFound$/
    #
    fail Backends::Errors::ResourceNotFoundError, message
  else
    # 'InternalError', ...
    fail Backends::Errors::ResourceActionError, message
  end
end
rescue_aws_service(logger) { || ... } click to toggle source

Wraps calls to EC2 and provides basic error handling. This method requires a block, if no block is given a {Backends::Errors::StubError} error is raised.

@example

Backends::Ec2::Helpers::AwsConnectHelper.rescue_aws_service(@logger) do
  instance_statuses = @ec2_client.describe_instance_status.instance_statuses
  instance_statuses.each { |istatus| id_list << istatus[:instance_id] } if instance_statuses
end

@param logger [Logger] instance of a logging facility @effects none: call answered from within the backend

# File lib/backends/ec2/helpers/aws_connect_helper.rb, line 18
def self.rescue_aws_service(logger)
  fail Backends::Errors::StubError, 'AWS service-wrapper was called without a block!' unless block_given?

  begin
    yield
  rescue ::Aws::EC2::Errors::DryRunOperation => e
    logger.warn "[Backends] [Ec2Backend] DryRun: #{e.message}"
    fail Backends::Errors::MethodNotImplementedError, e.message
  rescue ::Aws::EC2::Errors::ServiceError => e
    handle_service_error(e, logger)
  rescue ::Seahorse::Client::NetworkingError => e
    logger.error "[Backends] [Ec2Backend] HTTP Error: #{e.message}"
    fail Backends::Errors::ServiceUnavailableError, e.message
  end
end