def servers_for(*criteria)
if criteria.empty?
server_list.flatten
else
criteria = criteria.inject({}) do |hash, entry|
case entry
when Hash then hash.merge(entry)
else hash.merge(entry => {})
end
end
list = criteria.inject([]) do |aggregator, (group, properties)|
raise ArgumentError, "the value for any group must be a Hash, but got a #{properties.class} for #{group.inspect}" unless properties.is_a?(Hash)
bad_keys = properties.keys - [:only, :except]
raise ArgumentError, "unknown constraint(s) #{bad_keys.inspect} for #{group.inspect}" unless bad_keys.empty?
servers = groups[group].select do |server|
(properties[:only] || {}).all? { |prop, value| server[prop] == value } &&
!(properties[:except] || {}).any? { |prop, value| server[prop] == value }
end
aggregator.concat(servers)
end
list.uniq
end
end