The nova scheduler has a bunch of filters. See here: http://docs.openstack.org/developer/nova/devref/filter_scheduler.html
This is a quick summary of the filters in grizzly:
- affinity_filter - Don't put instances in a set on the same host
- aggregate_instance_extra_specs - Only build on hosts that support the desired instance type
- aggregate_multitenancy_isolation - This host is reserved for 'tenant_id'; only his vms can go here
- all_hosts_filter - All hosts are good, yippee!
- availability_zone_filter - Can only build in hosts that are in the desired 'availability_zone'
- compute_capabilities_filter - Check that vm's 'extra_specs' match hosts 'capabilities'
- compute_filter - Only build on active compute nodes
- core_filter - Only if we have enough cpu cores free
- disk_filter - Only if we have enough disk space free
- extra_specs_ops - NOT A FILTER - defines operators for compute_capabilities_filter, like >=
- image_props_filter - Checks the requirement of the VM image on architecture, hypervisor type, or virtual machine mode properties
- io_ops_filter - Don't build on hosts that are doing too much disk IO right now
- isolated_hosts_filter - Lets you specify a list of 'isolated' images and 'isolated' hosts. If image is in the list, host has to be in the list too, and vice versa.
- json_filter - Lets you make up your own filter using JSON in the configuration options
- num_instances_filter - Don't build if host has > X instances
- ram_filter - Don't build if there isn't enough free RAM
- retry_filter - Don't try to build if we already tried on this host
- trusted_filter - Only build in trusted compute pools
- type_filter - Only allow one instance type per host, eg. All VMs must be 512 MB size