class Anjou::LaunchInstance

Constants

LAUNCH_TIMEOUT_SECONDS

Public Class Methods

create_and_launch_instance(users=[], host_user: nil) click to toggle source
# File lib/anjou/launch_instance.rb, line 9
def create_and_launch_instance(users=[], host_user: nil)
  host_user ||= users.first
  users << host_user unless users.include? host_user

  guard_enough users

  ensure_volumes_for users

  ensure_authorized_keys_for users

  user_data = Anjou::InstanceUserData.render_mime 'install-ruby', 'install-mosh'

  create_instance_for(host_user, user_data).tap do |instance|
    attach users, instance

    users.each do |user|
      home = Anjou::UserHome.new user, instance.dns_name
      puts "Creating login for #{user}..."
      home.create_linux_user
      puts "Mounting home directory for #{user}..."
      home.mount_home_dir
      puts "Installing authorized_keys for #{user}..."
      home.install_authorized_keys @authorized_keys[user]
    end
  end

end

Private Class Methods

attach(users, instance) click to toggle source
# File lib/anjou/launch_instance.rb, line 76
def attach users, instance
  users.each do |user|
    puts "Attaching user volume for #{user} to #{instance.dns_name}"
    ec2.attach user, instance
  end
end
create_instance_for(host_user, user_data) click to toggle source
# File lib/anjou/launch_instance.rb, line 47
def create_instance_for host_user, user_data
  puts "Creating Anjou instance for host user #{host_user}..."
  instance = ec2.create_instance username: host_user, user_data: user_data

  timeout_seconds = LAUNCH_TIMEOUT_SECONDS
  until instance.status == :running do
    raise "instance failed to start after #{LAUNCH_TIMEOUT_SECONDS}" if timeout_seconds <= 0
    sleep 1; timeout_seconds -= 1
  end
  puts "Anjou instance started at #{instance.dns_name} :)"
  instance
end
ec2() click to toggle source
# File lib/anjou/launch_instance.rb, line 39
def ec2
  @@ec2 ||= Anjou::EC2.new
end
ensure_authorized_keys_for(users) click to toggle source
# File lib/anjou/launch_instance.rb, line 69
def ensure_authorized_keys_for users
  @authorized_keys = {}
  users.each do |user|
    @authorized_keys[user] = Anjou::AuthorizedKeys.new(user)
  end
end
ensure_volumes_for(users) click to toggle source
# File lib/anjou/launch_instance.rb, line 60
def ensure_volumes_for users
  users.each do |user|
    unless ec2.user_volume_for(user)
      puts "Creating user volume for #{user}"
      ec2.create_user_volume(username: user)
    end
  end
end
guard_enough(users) click to toggle source
# File lib/anjou/launch_instance.rb, line 43
def guard_enough users
  raise "You must provide at least one user for this pairing workstation!" unless users.size > 0
end