self.compute_task_api.schedule_and_build_instances函数的定义在nova/conductor/api.py中的类ComputeTaskAPI中,代码如下:
def schedule_and_build_instances(self, context, build_requests,
request_spec, image,
admin_password, injected_files,
requested_networks, block_device_mapping,
tags=None):
self.conductor_compute_rpcapi.schedule_and_build_instances(
context, build_requests, request_spec, image,
admin_password, injected_files, requested_networks,
block_device_mapping, tags)
直接调用self.conductor_compute_rpcapi.schedule_and_build_instances函数,该函数在文件nova/conductor/rpcapi.py中的ComputeTaskAPI类中定义,代码如下:
def schedule_and_build_instances(self, context, build_requests,
request_specs,
image, admin_password, injected_files,
requested_networks,
block_device_mapping,
tags=None):
version = '1.17'
kw = {'build_requests': build_requests,
'request_specs': request_specs,
'image': jsonutils.to_primitive(image),
'admin_password': admin_password,
'injected_files': injected_files,
'requested_networks': requested_networks,
'block_device_mapping': block_device_mapping,
'tags': tags}
if not self.client.can_send_version(version):
version = '1.16'
del kw['tags']
cctxt = self.client.prepare(version=version)
cctxt.cast(context, 'schedule_and_build_instances', **kw)
准备参数kw,通过rpc调用服务端的schedule_and_build_instances函数。服务端对应的函数在文件nova/conductor/manager.py中的类ComputeTaskManager中,代码如下:
def schedule_and_build_instances(self, context, build_requests,
request_specs, image,
admin_password, injected_files,
requested_networks, block_device_mapping,
tags=None):
# Add all the UUIDs for the instances
instance_uuids = [spec.instance_uuid for spec in request_specs]
try:
hosts = self._schedule_instances(context, request_specs[0],
instance_uuids)
except Exception as exc:
LOG.exception('Failed to schedule instances')
self._bury_in_cell0(context, request_specs[0], exc,
build_requests=build_requests,
block_device_mapping=block_device_mapping)
return
self._schedule_instances函数的功能为为将要创建的虚拟机挑选运行的物理节点,代码定义如下:
def _schedule_instances(self, context, request_spec,
instance_uuids=None):
scheduler_utils.setup_instance_group(context, request_spec)
hosts = self.scheduler_client.select_destinations(context,
request_spec, instance_uuids)
return hosts
scheduler_utils.setup_instance_group函数的定义在文件./nova/scheduler/utils.py中,获取group相关的信息,并设置到request_spec.instance_group中的变量。self.scheduler_client.select_destinations通过一系列的包装调用,最后将调用./nova/scheduler/rpcapi.py文件中的类SchedulerAPI中的select_destinations函数,定义如下: