module Rudy::Routines::Handlers::Host

Public Instance Methods

is_available?(rset, port=22) click to toggle source
# File lib/rudy/routines/handlers/host.rb, line 70
def is_available?(rset, port=22)
  raise NoMachines if rset.boxes.empty?
  rset.boxes.each do |rbox|
    mach = rbox.stash
    # This updates the DNS. It's important this happens
    # before and after the address is updated otherwise
    # certain errors will causes it to not be updated.  
    mach.refresh!
    msg = "Waiting for port #{port} on #{rbox.nickname} ..."
    port = 3389 if mach.windows?
    multi = mach.windows? ? 3 : 2
    interval, max = 1*multi, 30*multi
    Rudy::Utils.waiter(interval, max, STDOUT, msg, 0) {
      Rudy::Utils.service_available?(mach.dns_public, port)
    }
  end
end
is_running?(rset) click to toggle source

NOTE: This handler doesn't use Rudy::Routines.add_handler

# File lib/rudy/routines/handlers/host.rb, line 9
def is_running?(rset)
  raise NoMachines if rset.boxes.empty?
  rset.boxes.each do |rbox|
    msg = "Waiting for #{rbox.nickname} to boot..."
    multi = rbox.stash.windows? ? 6 : 3
    interval, max = 1*multi, 80*multi
    Rudy::Utils.waiter(interval, max, Rudy::Huxtable.logger, msg, 0) {
      inst = rbox.stash.get_instance
      inst && inst.running?
    }
  end
end
set_hostname(rset) click to toggle source
# File lib/rudy/routines/handlers/host.rb, line 88
def set_hostname(rset)
  raise NoMachines if rset.boxes.empty?
  
  # Set the hostname if specified in the machines config. 
  # :rudy -> change to Rudy's machine name
  # :default -> leave the hostname as it is
  # Anything else other than nil -> change to that value
  # NOTE: This will set hostname every time a routine is
  # run so we may want to make this an explicit action.
  hntype = current_machine_hostname || :rudy
  return if hntype.to_s.to_sym == :default
  rset.batch do
    unless self.stash.os == :windows
      hn = hntype == :rudy ? self.stash.name : hntype
      if self.user.to_s == 'root'  # ubuntu has a root user
        hostname hn
      else
        sudo do
          hostname hn
        end
      end
    end
  end
end
update_dns(rset) click to toggle source

Add instance info to machine and save it. This is really important for the initial startup so the metadata is updated right away. But it's also important to call here because if a routine was executed and an unexpected exception occurs before this update is executed the machine metadata won't contain the DNS information. Calling it here ensures that the metadata is always up-to-date.

If a machine has an associated elastic IP address, it will also be assigned in this step.

Each Rye:Box instance has a Rudy::Machine instance in its stash so rbox.stash.refresh! == machine.refresh!

# File lib/rudy/routines/handlers/host.rb, line 34
def update_dns(rset)
  raise NoMachines if rset.boxes.empty?
  rset.boxes.each do |rbox|
    mach = rbox.stash
    # Assign IP address only if we have one for that position
    if !mach.address.nil? && !mach.address.empty?
      begin
        # Make sure the address is associated to the current account
        if Rudy::AWS::EC2::Addresses.exists?(mach.address)
          li "Associating #{mach.address} to #{mach.instid}"
          Rudy::AWS::EC2::Addresses.associate(mach.address, mach.instid)
        else
          le "Unknown address: #{mach.address}"
        end
      rescue => ex
        le "Error associating address: #{ex.message}"
        ld ex.backtrace
      end
    end
    
    # Give EC2 some time to update their metadata
    msg = "Waiting for public DNS on #{rbox.nickname} ..."
    multi = rbox.stash.windows? ? 3 : 2
    interval, max = 2*multi, 60*multi
    Rudy::Utils.waiter(interval, max, STDOUT, msg, 0) {
      mach.refresh!
      if mach.address
        mach.dns_public.to_s =~ /#{mach.address.to_s.gsub('.', '-')}/
      else
        !mach.dns_public.nil? && !mach.dns_public.empty?
      end
    }
    rbox.host = mach.dns_public
  end
end