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_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_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