接着上篇文章,我们来继续分析_create_instance方法。这个方法定义在nova/nova/compute/api.py中。
class API(base.Base):
def _create_instance(self,context,instance_type,
...):
...
#验证客户端传入参数,做虚拟机创建前的准备工作
(instances,request_spec,filter_properties) = self._validate_and_provision_instance(context,
instance_type,
...)
for instance in instances:
#更新InstanceAction表记录
self._record_action_start(context,instance,instance_actions.CREATE)
#向Nova Scheduler服务发送RPC请求,创建虚拟机
self.scheduler_rpcapi.run_instance(context,...)
return (instances,reservation_id)
可以看到_create_instance方法包括三个步骤:1.调用_validate_and_provision_instance方法完成虚拟机创建的准备工作。2.调用_record_action_start方法更新数据库中InstanceAction表的记录,将虚拟机状态改为“开始创建”。3.调用scheduler_rpcapi.run_instance方法,向Nova Scheduler服务发送RPC请求,将虚拟机创建请求交给Nova Scheduler服务处理。
1. _validate_and_provision_instance
这个方法非常重要,它主要完成的是对输入的各个参数的检验,其中完成了一个非常重要的任务,就是资源的配额管理。该方法的定义如下。
class API(base.Base):
def _validate_and_provision_instance(self,context,instance_type,
...):
#一些参数的验证和初始化
if not metadata:
metadata = {}
if not security_group:
security_group = 'default'
...
#如果客户端没有指定虚拟机规格,则使用默认的格式
if not instance_type:
instance_type = instance_type.get_default_instance_type()
...
#根据配额资源限制计算所要建立实例的数目,并获取了分配好的资源(块存储)的UUID的列表