当你输入 nova boot时,client做了什么?

这里写图片描述
当你输入上图命令后,会发生什么?

导读:本博文以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。


回归到代码主线

  1. /usr/bin/nova.py main() —> /novaclient/shell.py main() #简单调用,传递用户输入参数。
  2. shell.py main() —> shell.py OpenStackComputeShell类中main() #使用一个map()函数将用户输入的参数递归解析出来传入。
  3. 类中main()中主要做三件事,(1)根据传进来参数给各种变量赋值。(2)验证身份合法性。(3)创建一个client的实例中创建client代码如下。(4)创建一个HttpClient。这里写图片描述

  4. client.Client定义在 /novaclient/client.py中,其根据version参数确定使用api的版本号,并返回一个指定版本的实例。这里返回的是v1_1版本的实例。

  5. v1_1实例定义在/novaclient/v1_1/client.py中。在该类中调用nova命令的方法。这里写图片描述
    我们创建虚拟机用的函数就在servers.ServerManager()中。
  6. /novaclient/v1_1/server.py 我们来看 ServerManager class。里面封装的函数有
    create,start,pause,lock等等若干对虚拟机的操作。我们追溯一下ServerManager的父类,可以看到这样的继承关系:ServerManager->base.BootingManagerWithFind->base.ManagerWithFind->base.Manager。ServerManager中create中调用的是base.Manager类中的 _create()函数。
  7. 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创建虚拟机过程。
如有错误不足,欢迎指出^_^

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值