当你输入上图命令后,会发生什么?
导读:本博文以nova boot为例分析nova创建虚拟机时, nova client的工作流程。 在之后的博文中会分析 nova 创建虚拟机的后续流程。
基础简介:
nova boot –image 89b959c5-ac9f-4f7e-9094-0a17cd6d78cf –flavor 1 my_instance
该命令为nova创建虚拟机,用到的虚拟机镜像 ID 为image,虚拟机配合用的是内置套餐1(最mini型),虚拟机名字叫做 my_instance。
正文:
就像所有的程序都有main函数一样,我们nova的main函数定义在
/usr/bin/nova.py
代码可谓简洁明了
import sys
from novaclient.shell import main
if __name__ == "__main__":
sys.exit(main())
看来真正的main函数被指向了 novaclient.shell.py中
那么问题来了,novaclient在哪?不同的系统安装环境不一样,这里介绍一种小技巧寻找代码位置,如图所示:
UML 图:
找到novaclient代码位置后,我们就来查看它的目录结构:
目录结构简洁明了,novaclient使用两种api,分别是V1_1和V3,我们这里主要使用V1_1。
回归到代码主线
- /usr/bin/nova.py main() —> /novaclient/shell.py main() #简单调用,传递用户输入参数。
- shell.py main() —> shell.py OpenStackComputeShell类中main() #使用一个map()函数将用户输入的参数递归解析出来传入。
类中main()中主要做三件事,(1)根据传进来参数给各种变量赋值。(2)验证身份合法性。(3)创建一个client的实例中创建client代码如下。(4)创建一个HttpClient。
client.Client定义在 /novaclient/client.py中,其根据version参数确定使用api的版本号,并返回一个指定版本的实例。这里返回的是v1_1版本的实例。
- v1_1实例定义在/novaclient/v1_1/client.py中。在该类中调用nova命令的方法。
我们创建虚拟机用的函数就在servers.ServerManager()中。 - /novaclient/v1_1/server.py 我们来看 ServerManager class。里面封装的函数有
create,start,pause,lock等等若干对虚拟机的操作。我们追溯一下ServerManager的父类,可以看到这样的继承关系:ServerManager->base.BootingManagerWithFind->base.ManagerWithFind->base.Manager。ServerManager中create中调用的是base.Manager类中的 _create()函数。 - base路径为/novaclient/base.py 看一下Manager类中_create()函数,这里面根据参数封装了http请求,使用ipdb调试工具查看一下输出如图:
8._create()中api.client.post()方法发送http请求,并返回结果。api.client.post()在/novaclient/openstack/common/apiclient/client.py 其中client_request()该函数发送http请求。
9._create函数执行完,返回至/novaclient/v1_1/server.py中的_boot(),然后再回到create(),再返回至/novaclient/v1_1/shell.py中的do_boot()。
通过_print_server()打印信息。
粗略分析了一下novaclient 命令流程,其他命令可参考该过程,大同小异。后续会分析nova创建虚拟机过程。
如有错误不足,欢迎指出^_^