class Haas::Aws

Constants

CENTOS_IMAGES
UBUNTU_IMAGES

Public Class Methods

connect() click to toggle source
# File lib/haas/aws.rb, line 54
def self.connect
  @region = Haas::Config.options[:aws_region] || 'us-east-1'
  AWS.config(
    access_key_id: ENV['AWS_KEY'],
    secret_access_key: ENV['AWS_SECRET'],
    region: region
  )
  @ec2 = AWS::EC2.new
end
create_key_pair() click to toggle source
# File lib/haas/aws.rb, line 91
def self.create_key_pair
  key_pair = Haas::KeyPair.create(name: Haas.cluster.name)
  File.write(Haas.cluster.identity_file_path, key_pair.private_key)
  File.chmod(0600, Haas.cluster.identity_file_path)
end
ec2() click to toggle source
# File lib/haas/aws.rb, line 64
def self.ec2
  @ec2
end
is_cluster_ssh_open?(instances) click to toggle source
# File lib/haas/aws.rb, line 165
def self.is_cluster_ssh_open?(instances)
  instances.each do |instance|
    return false unless Haas::Utils.is_port_open?(instance.public_dns_name,22)
  end
  return true
end
launch_instances() click to toggle source
# File lib/haas/aws.rb, line 97
  def self.launch_instances
    image_id = UBUNTU_IMAGES["12.04"][region]

    if !ec2.security_groups.filter('group-name', 'haas-security-group').first
      security_group = ec2.security_groups.create('haas-security-group')
      security_group.authorize_ingress(:tcp, 22)
      security_group.authorize_ingress(:tcp, 80)
      security_group.authorize_ingress(:tcp, 443)
      security_group.authorize_ingress(:tcp, 8080)
      security_group.authorize_ingress(:tcp, 0..65535, security_group)
      security_group.authorize_ingress(:udp, 0..65535, security_group)
      security_group.authorize_ingress(:icmp, -1, security_group)
    end

    instances = ec2.instances.create({
      :image_id => image_id,
      :instance_type => Haas::Config.options[:instance_type],
      :key_name => Haas.cluster.name,
      :security_groups => ['haas-security-group'],
      :block_device_mappings => [
        {
          :device_name => "/dev/sda1",
          :ebs => {
            :volume_size => 8, # 8 GiB
            :delete_on_termination => true
          }
        },
        {
          :device_name => "/dev/sdf",
          :virtual_name => "ephemeral0"
        }
      ],
      :count => Haas::Config.options[:nb_instances].to_i
    })

    print "Waiting for the instances to start "
    while instances.any? {|i| i.status == :pending; } do
      print '.'
      sleep 1
    end
    puts " done"

    print "Waiting for the instances to be initialized and accessible "
    while !is_cluster_ssh_open?(instances) do
      print '.'
      sleep 1
    end
    puts " done"

    instances.each do |instance|
      Haas::Node.create(
        cluster_id: Haas.cluster.id,
        instance_id: instance.id,
        public_ip_address: instance.ip_address,
        public_dns_name: instance.public_dns_name,
        private_ip_address: instance.private_ip_address,
        private_dns_name: instance.private_dns_name
      )
    end
  end

  def self.terminate_cluster cluster
    ec2.client.terminate_instances({
      instance_ids: cluster.nodes.map(&:instance_id)
    })
    cluster.destroy
  end

  def self.is_cluster_ssh_open?(instances)
    instances.each do |instance|
      return false unless Haas::Utils.is_port_open?(instance.public_dns_name,22)
    end
    return true
  end

end
nb_instance_available() click to toggle source
# File lib/haas/aws.rb, line 76
def self.nb_instance_available
  account_attributes = ec2.client.describe_account_attributes\
  .data[:account_attribute_set]\
  .inject({}) do |m, i|
    m[i[:attribute_name]] = i[:attribute_value_set].first[:attribute_value]; m
  end

  max_instances = account_attributes["max-instances"].to_i
  return max_instances - nb_running_instances
end
nb_running_instances() click to toggle source
# File lib/haas/aws.rb, line 87
def self.nb_running_instances
  ec2.instances.inject({}) { |m, i| i.status == :running ? m[i.id] = i.status : nil; m }.length
end
region() click to toggle source
# File lib/haas/aws.rb, line 68
def self.region
  @region
end
ssh_user() click to toggle source
# File lib/haas/aws.rb, line 72
def self.ssh_user
  UBUNTU_IMAGES["12.04"]["config"]["ssh_user"]
end
terminate_cluster(cluster) click to toggle source
# File lib/haas/aws.rb, line 158
def self.terminate_cluster cluster
  ec2.client.terminate_instances({
    instance_ids: cluster.nodes.map(&:instance_id)
  })
  cluster.destroy
end