阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

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

185次阅读
没有评论

共计 1723 个字符,预计需要花费 5 分钟才能阅读完成。

当你输入 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 在哪?不同的系统安装环境不一样,这里介绍一种小技巧寻找代码位置,如图所示:
当你输入 nova boot 时,client 做了什么?

UML 图:

找到 novaclient 代码位置后,我们就来查看它的目录结构:
当你输入 nova boot 时,client 做了什么?

目录结构简洁明了,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。当你输入 nova boot 时,client 做了什么?

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

  5. v1_1 实例定义在 /novaclient/v1_1/client.py 中。在该类中调用 nova 命令的方法。当你输入 nova boot 时,client 做了什么?
    我们创建虚拟机用的函数就在 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 调试工具查看一下输出如图:
    当你输入 nova boot 时,client 做了什么?
    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()。 当你输入 nova boot 时,client 做了什么?
    通过_print_server()打印信息。
    当你输入 nova boot 时,client 做了什么?

粗略分析了一下 novaclient 命令流程,其他命令可参考该过程,大同小异。后续会分析 nova 创建虚拟机过程。
如有错误不足,欢迎指出 ^_^

本文永久更新链接地址 :http://www.linuxidc.com/Linux/2016-08/134169.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计1723字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中