class EY::Serverside::Servers

Public Class Methods

from_hashes(server_hashes, shell) click to toggle source
# File lib/engineyard-serverside/servers.rb, line 26
def self.from_hashes(server_hashes, shell)
  servers = server_hashes.inject({}) do |memo, server_hash|
    server = Server.from_hash(server_hash)
    raise DuplicateHostname.new(server.hostname) if memo.key?(server.hostname)
    memo[server.hostname] = server
    memo
  end
  new(servers.values, shell)
end
new(servers, shell) click to toggle source
# File lib/engineyard-serverside/servers.rb, line 36
def initialize(servers, shell)
  @servers = servers
  @shell = shell
  @cache = {}
end

Public Instance Methods

==(other) click to toggle source
# File lib/engineyard-serverside/servers.rb, line 23
def ==(other) other.respond_to?(:to_a) && other.to_a == to_a end
in_groups(number) { |class.new(slice, shell)| ... } click to toggle source
# File lib/engineyard-serverside/servers.rb, line 50
def in_groups(number)
  div, mod = size.divmod number
  start = 0
  number.times do |index|
    length = div + (mod > 0 && mod > index ? 1 : 0)
    yield self.class.new(@servers.slice(start, length), @shell)
    start += length
  end
end
localhost() click to toggle source
# File lib/engineyard-serverside/servers.rb, line 42
def localhost
  @servers.find {|server| server.local? }
end
reject(*a, &b) click to toggle source
# File lib/engineyard-serverside/servers.rb, line 21
def reject(*a, &b) self.class.new @servers.reject(*a,&b), @shell end
remote() click to toggle source
# File lib/engineyard-serverside/servers.rb, line 46
def remote
  reject { |server| server.local? }
end
roles(*select_roles) { |roles(*select_roles)| ... } click to toggle source

We look up the same set of servers over and over. Cache them so we don’t have to find them every time Accepts a block (because it’s confusing when you send a block to this method and it doesn’t yield and it’s better than raising)

# File lib/engineyard-serverside/servers.rb, line 64
def roles(*select_roles, &block)
  if block_given?
    return yield(roles(*select_roles))
  end

  roles_set = Set.new select_roles.flatten.compact.map{|r| r.to_sym}
  if roles_set.empty? || roles_set.include?(:all)
    self
  else
    @cache[roles_set] ||= select { |server| server.matches_roles?(roles_set) }
  end
end
run(cmd, &block)
Alias for: run_on_each!
run_for_each(&block) click to toggle source
# File lib/engineyard-serverside/servers.rb, line 106
def run_for_each(&block)
  spawner = Spawner.new
  each { |server| spawner.add(block.call(server), @shell, server) }
  spawner.run
end
run_for_each!(&block) click to toggle source
# File lib/engineyard-serverside/servers.rb, line 112
def run_for_each!(&block)
  failures = run_for_each(&block).reject {|result| result.success? }

  if failures.any?
    commands = failures.map { |f| f.command }.uniq
    servers = failures.map { |f| f.server }.compact.map { |s| s.inspect }
    outputs = failures.map { |f| f.output }.uniq
    message = "The following command#{commands.size == 1 ? '' : 's'} failed"
    if servers.any?
      message << " on server#{servers.size == 1 ? '' : 's'} [#{servers.join(', ')}]"
    end
    message << "\n\n"
    commands.each do |cmd|
      message << "$ #{cmd}\n"
    end
    message << "\n" << outputs.join("\n\n") << "\n"
    raise EY::Serverside::RemoteFailure.new(message)
  end
end
run_on_each(cmd, &block) click to toggle source
# File lib/engineyard-serverside/servers.rb, line 77
def run_on_each(cmd, &block)
  run_for_each do |server|
    server.command_on_server('sh -l -c', cmd, &block)
  end
end
run_on_each!(cmd, &block) click to toggle source

Run a command on this set of servers.

# File lib/engineyard-serverside/servers.rb, line 84
def run_on_each!(cmd, &block)
  run_for_each! do |server|
    server.command_on_server('sh -l -c', cmd, &block)
  end
end
Also aliased as: run
select(*a, &b) click to toggle source
# File lib/engineyard-serverside/servers.rb, line 20
def select(*a, &b) self.class.new @servers.select(*a,&b), @shell end
sudo(cmd, &block)
Alias for: sudo_on_each!
sudo_on_each(cmd, &block) click to toggle source

Run a sudo command on this set of servers.

# File lib/engineyard-serverside/servers.rb, line 92
def sudo_on_each(cmd, &block)
  run_for_each do |server|
    server.command_on_server('sudo sh -l -c', cmd, &block)
  end
end
sudo_on_each!(cmd, &block) click to toggle source

Run a sudo command on this set of servers.

# File lib/engineyard-serverside/servers.rb, line 99
def sudo_on_each!(cmd, &block)
  run_for_each! do |server|
    server.command_on_server('sudo sh -l -c', cmd, &block)
  end
end
Also aliased as: sudo
to_a() click to toggle source
# File lib/engineyard-serverside/servers.rb, line 22
def to_a() @servers end