创建 Network 及 Subnet 之后,我们就可以开始分析虚拟机的创建过程了。
在开始之前,我们先来看一下虚拟机创建概览,以免过早沉溺于细节,失去方向。概览图可参照之前翻译的文章(OpenStack 中虚拟机创建的请求流程)中提到的:
从该图我们也可以看到,创建一个虚拟机涉及到 Nova 内部服务(如 nova-conductor)和外部模块(如 cinder),复杂度还是挺高的。
下文我们先从路由及 nova-api 说起,然后一步步深入。
路由初始化
跟 Keystone 的 API 路由初始化方式不一样,Nova 是以扩展(extension)的方式来初始化的,具体可见如下代码:
1 | # api-paste.ini |
以 servers 为例,上边的初始化最终会初始化到 servers(Controller) API 的路由:
1 | # nova/api/openstack/compute/servers.py |
特别地,针对该 servers API,还需额外加载虚拟机创建相关的扩展:
1 | # nova/api/openstack/compute/servers.py |
路由部分到这里就差不多了,再细的我们不过多涉及。
nova-api 向外接收 HTTP 请求
注:nova-api 服务其实还包含了 metadata 服务(OpenStack 源码系列之 Nova:服务启动),这里我们暂不考虑它。
nova-api 是一个 WSGI 服务,向外接收 HTTP 请求(REST API)。它的职责在于将外部的 HTTP 请求路由
到相应的处理函数,并最终将结果返回给请求者。
nova-api 所做的事主要可以分为两个部分:
- 对请求者的合法性(通过 Keystonemiddleware)进行判定。这部分可参考之前博文 OpenStack 源码系列之 Keystone:Token 认证已有详细说明,这里就不多做解释了。
- 将合法请求路由到相应的处理函数。这部分前边路由部分已经做了说明,也可参考之前博文 OpenStack 源码系列之 Keystone:API 路由、Routes、PasteDeploy。
参数解析及访问控制
当创建虚拟机的 Rest API 请求进来之后,也通过了权限认证,那该 API 最终会路由到具体的函数 ServersController::create
。我们现在来看一下该函数的参数解析及访问控制的代码:
1 | # nova/api/openstack/compute/servers.py |
对这部分代码,用一张流程图来表示胜过前言万语:
其中,关于访问控制中的 Policy 相关的部分,细节部分可参考如下博文:
- openstack nova 基础知识——policy(非常好,但原博文已丢失,此是备份到印象笔记的副本)
- Nova 中的 policy
接下来,我们就要进入虚拟机创建过程的重要部分。且待后文分析。