nova创建虚拟机源码分析系列之七 传入参数转换成内部id
上一篇博文将nova创建虚机的流程推进到了/compute/api.py中的create()函数,接下来就继续分析。
在分析之前简单介绍nova组件源码的架构。以conductor组件为例:

每个组件都会有这三个文件:api.py rpcapi.py manager.py。
- api.py conductor实现自身功能的文件
- rpcapi.py conductor提供给其他组件通过消息队列调用的接口函数
- manager.py 其他组件通过消息队列调用的处理端函数
下面是/compute/api.py中的create()函数。


/nova/compute/api::create()
- 检查是否创建多个实例,是否制定IP。检查是否从端口ID创建多个实例
- 检查域是否可用
- 创建过滤器
- 调用本类中create_instance()方法
总结:该函数的主要任务是对check policies、check quota、创建db记录,创建下一步中schedule所需要的调度规则信息filter_properties,将部分参数整合,
然后将创建请求发送到本类中的_create_instance()函数中,进行下一步处理。
/compute/api.py ::_create_instance()函数:



/nova/compute/api::create_instance()
- 规格化和设置一些参数,如安全组,最小数值,最大数值,块设备。
- 访问glance服务,获取image-id
- 检查网络是否超过配额
- 循环更新每一个主机的状态
- 调用/nova/conductor/api::build_instances()
总结:本函数的主要做的是获取镜像-id,检查网络,写入数据库等工作。
其中获取image-id的流程具有代表性,值得细细分析。
首先看glance架构:
glance-registry负责存储镜像的的具体信息,包括镜像的大小,格式,位置等。glance-backend负责存储真正的镜像。

当获取镜像时,首先会到glance-registry组件中获取将请求的镜像的数据,大小,格式,位置等,
然后到需要创建虚拟机时再去相应路径下载镜像作为虚机启动模板。
所以这里就会有一个请求镜像id的过程,从nova的以http请求的方式去调用glance-api,glance-api调用glance-registry查询数据库获得镜像的id。

代码流程如下:



session, image_id = self._get_session_and_image_id(context, id_or_uri)
return session.show(context, image_id,
include_locations=include_locations,
show_deleted=show_deleted)
这段代码的作用是通过glanceclient获取镜像文件信息。 在openstack中,不同组件之间的通信是通过RESTful API完成的,openstack的处理方式是为每个组件都包含了这样一个client,
它们都继承于HTTPClient这个基类,但做了一些个性化的封装,用于向各自的组件发送HTTP请求。具体到这里,nova需要和glace通信,以获取镜像文件的信息,所以需要声明了这样一个glanceclient。
代码self._get_session_and_image_id(context, id_or_uri) 的作用就是创建一个glaceclient对象,然后把这个对象封装入GlanceImageService类里,即返回值image_service。
然后调用该类下的show方法来获取镜像文件的信息。
摘录自:http://blog.csdn.net/qiuhan0314/article/details/43057591

可以看到这里有 image = self._client.call(context, version, 'get', image_id) 这条调用函数就是restful 请求。
这样就通过restful api获取了镜像id。由于镜像不是主题讨论的重点,所以就不再话下。
_create_instance()函数中另一个比较重要的方法是 _provision_instances(),该函数实现了对创建虚机时的各项配额进行检查,并将虚机信息写入数据库。


instance = self.create_db_entry_for_new_instance(context, instance_type, boot_meta, instance, security_groups,
block_device_mapping, num_instances, i, shutdown_terminate, create_instance=False)
是向数据库中写入实例信息的函数


介绍完/compuet/api.py文件中的_create_instance()函数,目前推进的进度在这里。

nova创建虚拟机源码分析系列之七 传入参数转换成内部id的更多相关文章
- nova创建虚拟机源码分析系列之五 nova源码分发实现
前面讲了很多nova restful的功能,无非是为本篇博文分析做铺垫.本节说明nova创建虚拟机的请求发送到openstack之后,nova是如何处理该条URL的请求,分析到处理的类. nova对于 ...
- nova创建虚拟机源码分析系列之三 PasteDeploy
上一篇博文介绍WSGI在nova创建虚拟机过程的作用是解析URL,是以一个最简单的例子去给读者有一个印象.在openstack中URL复杂程度也大大超过上一个例子.所以openstack使用了Past ...
- nova创建虚拟机源码分析系列之一 restful api
开始学习openstack源码,源码文件多,分支不少.按照学习的方法走通一条线是最好的,而网上推荐的最多的就是nova创建虚机的过程.从这一条线入手,能够贯穿openstack核心服务.写博文仅做学习 ...
- nova创建虚拟机源码分析系列之六 api入口create方法
openstack 版本:Newton 注:博文图片采用了很多大牛博客图片,仅作为总结学习,非商用.该图全面的说明了nova创建虚机的过程,从逻辑的角度清晰的描述了前端请求创建虚拟机之后发生的一系列反 ...
- nova创建虚拟机源码分析系列之八 compute创建虚机
/conductor/api.py _build_instance() /conductor/rpcapi.py _build_instance() 1 构造一些数据类型2 修改一些api版本信息 ...
- nova创建虚拟机源码分析系列之四 nova代码模拟
在前面的三篇博文中,介绍了restful和SWGI的实现.结合restful和WSGI配置就能够简单的实现nova服务模型的最简单的操作. 如下的内容是借鉴网上博文,因为写的很巧妙,将nova管理虚拟 ...
- nova创建虚拟机源码系列分析之二 wsgi模型
openstack nova启动时首先通过命令行或者dashborad填写创建信息,然后通过restful api的方式调用openstack服务去创建虚拟机.数据信息从客户端到达openstack服 ...
- Spark 源码分析系列
如下,是 spark 源码分析系列的一些文章汇总,持续更新中...... Spark RPC spark 源码分析之五--Spark RPC剖析之创建NettyRpcEnv spark 源码分析之六- ...
- MyCat源码分析系列之——SQL下发
更多MyCat源码分析,请戳MyCat源码分析系列 SQL下发 SQL下发指的是MyCat将解析并改造完成的SQL语句依次发送至相应的MySQL节点(datanode)的过程,该执行过程由NonBlo ...
随机推荐
- 翻译:MLAPP(2.1节)
笔者:尝试翻译MLAPP(Machine Learning: a Probabilistic Perspective)一书,供机器学习的学者参考,如有错误理解之处请指出,不胜感激!(如需转载,请联系本 ...
- 【2016美团】浏览器和服务器在基于https进行请求链接到数据传输过程中,用到了如下哪些技术
A.非对称加密技术 B.对称加密技术 C.散列(哈希)算法 D.数字证书 答案:ABCD HTTPS在传输数据之前需要客户端(浏览器)与服务端(网站)之间进行一次握手,在握手过程中将确立双方加密传输数 ...
- shim 和 polyfill
在前端,有两个词经常被提及:shim 和 polyfill.最近在翻译文章时又遇到了 polyfill 这个词,准备把这两个概念理清楚. 关于 JavaScript 的兼容性问题,通常有不同的解决方案 ...
- http://codeforces.com/contest/536/problem/B
B. Tavas and Malekas time limit per test 2 seconds memory limit per test 256 megabytes input standar ...
- BZOJ-1192-[HNOI2006]鬼谷子的钱袋
Description 鬼谷子非常聪明,正因为这样,他非常繁忙,经常有各诸侯车的特派员前来向他咨询时政.有一天,他在咸阳游历的时候,朋友告诉他在咸阳最大的拍卖行(聚宝商行)将要举行一场拍卖会,其中有一 ...
- 在CentOS6上配置MHA过程全记录
在CentOS6上配置MHA过程全记录 MHA(Master High Availability)是一款开源的MariaDB or MySQL高可用程序,为MariaDB or MySQL主从复制架构 ...
- Python in/not in --- if not/if + for...[if]...构建List+ python的else子句
区分几个容易出错的地方: in 成员运算符 - 如果字符串中包含给定的字符返回 True >>>"H" in a True not in 成员运算符 - 如果字符 ...
- MongoDB学习教程(3)-常用命令
1.MongoDB 条件操作符 描述 条件操作符用于比较两个表达式并从mongoDB集合中获取数据. 在本章节中,我们将讨论如何在MongoDB中使用条件操作符. MongoDB中条件操作符有: (& ...
- vue2购物车ch2-(商品列表显示)
1 index.html <!DOCTYPE html><html lang="en"><head> <meta charset=&quo ...
- ASP.NET没有魔法——ASP.NET MVC 与数据库之ORM
什么是ORM 对象关系映射(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转 ...