本文为扶艾原创文章,版权所有,禁止转载!
请大家静下心来看源码分析的文章,看完后相信你会有收获的!
本文来自于微信公众号“扶艾”,欢迎大家关注获取更多精彩内容!
上一篇文章我们分析了nova api是如何接收请求的,这篇文章我们将分析接收到请求之后创建虚拟机的流程。
nova api请求接收到请求之后,是执行的路径1的create方法。这个整合了创建虚拟机的用到的参数,并作了简单的合法性检测。之后调用了self.compute_api.create()方法。这里省略了很多异常处理,也就是说在后面调用中也会有很多的合法性检测,包括镜像不可用、虚拟机模版未找到、模版配置与镜像不符合等等这些都会抛出异常。
路径1. /usr/lib/python2.7/site-packages/nova/api/openstack/compute/servers.py
部分源码:
from nova import compute
class ServerController():
def __init__(self):
self.compute_api = comptute.API()
def create(self, req, body):
...
#获取创建虚拟机的参数
server_dict = body['server']
#获取参数中的虚拟机管理员密码,如果没有则生成一个随机密码
password = self._get_server_admin_password(server_dict)
#获取参数中的虚拟机名称,去除名称中的前后空格
name = common.normalize_name(server_dict['name'])
...
#初始化一个字典用于存放创建虚拟机需要到参数
create_kwargs = {}
#将server_dict中的部分参数做合法性检测后赋值给create_kwargs
self._create_by_func_list(server_dict, create_kwargs, body)
...
try:
(instances, resv_id) = self.compute_api.create(context,
inst_type,
image_uuid,
display_name=name,
display_description=description,
availability_zone=availability_zone,
forced_host=host, forced_node=node,
metadata=server_dict.get('metadata', {}),
admin_password=password,
requested_networks=requested_networks,
check_server_group_quota=True,
supports_multiattach=supports_multiattach,
**create_kwargs)
except ...
raise
...省略各种except
路径1中最后调用的是self.compute_api.create()方法,self.compute_api是在ServerController的init方法中赋值的compute.API()。根据下面路径2的源码可以发现,这里的compute.API()为nova.compute.api.API类,所以self.comput_api.create()方法即是nova.compute.api.API.create()
路径2. /usr/lib/python2.7/site-packages/nova/compute/__init__.py
部分源码:
def API():
#这里根据配置文件的设置来确定是否导入cell_api,默认导入nova.compute.api.API
class_name = _get_compute_api_class_name()
return importutils.import_object(class_name, *args, **kwargs)
在路径3的create方法中检测可用域是否可用,构建了一个筛选计算节点需要满足的基本条件组成的字典,然后调用了self._create_instance()方法
路径3. /usr/lib/python2.7/site-packages/nova/compute/api.py
部分源码
from nova import conductor
class API():
def __init__():
self.compute_task_api = conductor.ComputeTaskAPI()
def create(self, context, instance_type,
image_h