334: def servers_for(*criteria)
335: if criteria.empty?
336: server_list.flatten
337: else
338:
339:
340: criteria = criteria.inject({}) do |hash, entry|
341: case entry
342: when Hash then hash.merge(entry)
343: else hash.merge(entry => {})
344: end
345: end
346:
347: list = criteria.inject([]) do |aggregator, (group, properties)|
348: raise ArgumentError, "the value for any group must be a Hash, but got a #{properties.class} for #{group.inspect}" unless properties.is_a?(Hash)
349: bad_keys = properties.keys - [:only, :except]
350: raise ArgumentError, "unknown constraint(s) #{bad_keys.inspect} for #{group.inspect}" unless bad_keys.empty?
351:
352: servers = groups[group].select do |server|
353: (properties[:only] || {}).all? { |prop, value| server[prop] == value } &&
354: !(properties[:except] || {}).any? { |prop, value| server[prop] == value }
355: end
356:
357: aggregator.concat(servers)
358: end
359:
360: list.uniq
361: end
362: end