60 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			60 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# Copyright (c) 2011 Openstack, LLC.
 | 
						|
# All Rights Reserved.
 | 
						|
#
 | 
						|
#    Licensed under the Apache License, Version 2.0 (the "License"); you may
 | 
						|
#    not use this file except in compliance with the License. You may obtain
 | 
						|
#    a copy of the License at
 | 
						|
#
 | 
						|
#         http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
#
 | 
						|
#    Unless required by applicable law or agreed to in writing, software
 | 
						|
#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
						|
#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 | 
						|
#    License for the specific language governing permissions and limitations
 | 
						|
#    under the License.
 | 
						|
 | 
						|
"""
 | 
						|
The BaseScheduler is the base class Scheduler for creating instances
 | 
						|
across zones. There are two expansion points to this class for:
 | 
						|
1. Assigning Weights to hosts for requested instances
 | 
						|
2. Filtering Hosts based on required instance capabilities
 | 
						|
"""
 | 
						|
 | 
						|
from nova import flags
 | 
						|
from nova import log as logging
 | 
						|
 | 
						|
from nova.scheduler import abstract_scheduler
 | 
						|
from nova.scheduler import host_filter
 | 
						|
 | 
						|
FLAGS = flags.FLAGS
 | 
						|
LOG = logging.getLogger('nova.scheduler.base_scheduler')
 | 
						|
 | 
						|
 | 
						|
class BaseScheduler(abstract_scheduler.AbstractScheduler):
 | 
						|
    """Base class for creating Schedulers that can work across any nova
 | 
						|
    deployment, from simple designs to multiply-nested zones.
 | 
						|
    """
 | 
						|
    def filter_hosts(self, topic, request_spec, hosts=None):
 | 
						|
        """Filter the full host list (from the ZoneManager)"""
 | 
						|
        filter_name = request_spec.get('filter', None)
 | 
						|
        # Make sure that the requested filter is legitimate.
 | 
						|
        selected_filter = host_filter.choose_host_filter(filter_name)
 | 
						|
 | 
						|
        # TODO(sandy): We're only using InstanceType-based specs
 | 
						|
        # currently. Later we'll need to snoop for more detailed
 | 
						|
        # host filter requests.
 | 
						|
        instance_type = request_spec.get("instance_type", None)
 | 
						|
        if instance_type is None:
 | 
						|
            # No way to select; return the specified hosts
 | 
						|
            return hosts or []
 | 
						|
        name, query = selected_filter.instance_type_to_filter(instance_type)
 | 
						|
        return selected_filter.filter_hosts(self.zone_manager, query)
 | 
						|
 | 
						|
    def weigh_hosts(self, topic, request_spec, hosts):
 | 
						|
        """Derived classes may override this to provide more sophisticated
 | 
						|
        scheduling objectives
 | 
						|
        """
 | 
						|
        # NOTE(sirp): The default logic is the same as the NoopCostFunction
 | 
						|
        return [dict(weight=1, hostname=hostname, capabilities=capabilities)
 | 
						|
                for hostname, capabilities in hosts]
 |