nova-scheduler openstack Essex
run instance 调用过程:
1。消息队列消息驱动调度
nova.scheduler.manager.SchedulerManager.run_instance
|
2. 调用driver.schedule_run_instance
driver 通过读取nova.conf配置来动态import获得
if not scheduler_driver:
scheduler_driver = FLAGS.scheduler_driver
self .driver = utils.import_object(scheduler_driver)
|
3. 假设使用nova.scheduler.filter_scheduler
则调用
nova.scheduler.filter_scheduler.FilterScheduler.schedule_run_instance
|
4. 调用过滤机制
hosts = self .host_manager.filter_hosts(hosts, filter_properties)
|
加载host filter fn,通过nova.conf来加载
def _choose_host_filters( self , filters):
if filters is None :
filters = FLAGS.scheduler_default_filters
if not isinstance (filters, ( list , tuple )):
filters = [filters]
.....
.....
|
执行过滤:注意下面这一段代码:如果在启动虚拟机是添加availability_zone=”zone:hostname”字段,
则openstack会强制在此主机上创建虚拟机,不执行过滤机制,如果此主机不存在,报错。如果没有
availability_zone,或availability_zone=”zone”,则执行过滤策略。返回所有合法主机,如果没有
合法主机,虚拟机创建失败,否则进行weighted_host动作,选出一台虚拟机作为创建所在主机,
force_hosts = filter_properties.get( 'force_hosts' , [])
if force_hosts:
if not self .host in force_hosts:
LOG.debug(_( 'Host filter fails for non-forced host %(host)s' ),
{ 'host' : self .host})
return self .host in force_hosts
for filter_fn in filter_fns:
if not filter_fn( self , filter_properties):
LOG.debug(_( 'Host filter function %(func)s failed for '
'%(host)s' ),{ 'func' : repr (filter_fn), 'host' : self .host})
return False
|
关于availability_zone转换force_hosts过程,请查看nova.compute.api.API._create_instance中
#nova.compute.api.API._create_instance
if availability_zone:
availability_zone, _x, host = availability_zone.partition( ':' )
if not availability_zone:
availability_zone = FLAGS.default_schedule_zone
if context.is_admin and host:
filter_properties = { 'force_hosts' : [host]}
else :
filter_properties = {}
|
5。 创建虚拟机到对应节点上
发消息到对应主机上:
driver.cast_to_compute_host(context, weighted_host.host_state.host,
'run_instance' , instance_uuid = instance[ 'uuid' ], * * kwargs)
|