上一篇博文将nova创建虚机的流程推进到了/compute/api.py中的create()函数,接下来就继续分析。

在分析之前简单介绍nova组件源码的架构。以conductor组件为例:

每个组件都会有这三个文件:api.py rpcapi.py manager.py。

  1. api.py              conductor实现自身功能的文件
  2. rpcapi.py         conductor提供给其他组件通过消息队列调用的接口函数
  3. manager.py    其他组件通过消息队列调用的处理端函数

下面是/compute/api.py中的create()函数。

/nova/compute/api::create()

  1. 检查是否创建多个实例,是否制定IP。检查是否从端口ID创建多个实例
  2. 检查域是否可用
  3. 创建过滤器
  4. 调用本类中create_instance()方法

总结:该函数的主要任务是对check policies、check quota、创建db记录,创建下一步中schedule所需要的调度规则信息filter_properties,将部分参数整合,

然后将创建请求发送到本类中的_create_instance()函数中,进行下一步处理。

/compute/api.py ::_create_instance()函数:

/nova/compute/api::create_instance()

  1. 规格化和设置一些参数,如安全组,最小数值,最大数值,块设备。
  2. 访问glance服务,获取image-id
  3. 检查网络是否超过配额
  4. 循环更新每一个主机的状态
  5. 调用/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的更多相关文章

  1. nova创建虚拟机源码分析系列之五 nova源码分发实现

    前面讲了很多nova restful的功能,无非是为本篇博文分析做铺垫.本节说明nova创建虚拟机的请求发送到openstack之后,nova是如何处理该条URL的请求,分析到处理的类. nova对于 ...

  2. nova创建虚拟机源码分析系列之三 PasteDeploy

    上一篇博文介绍WSGI在nova创建虚拟机过程的作用是解析URL,是以一个最简单的例子去给读者有一个印象.在openstack中URL复杂程度也大大超过上一个例子.所以openstack使用了Past ...

  3. nova创建虚拟机源码分析系列之一 restful api

    开始学习openstack源码,源码文件多,分支不少.按照学习的方法走通一条线是最好的,而网上推荐的最多的就是nova创建虚机的过程.从这一条线入手,能够贯穿openstack核心服务.写博文仅做学习 ...

  4. nova创建虚拟机源码分析系列之六 api入口create方法

    openstack 版本:Newton 注:博文图片采用了很多大牛博客图片,仅作为总结学习,非商用.该图全面的说明了nova创建虚机的过程,从逻辑的角度清晰的描述了前端请求创建虚拟机之后发生的一系列反 ...

  5. nova创建虚拟机源码分析系列之八 compute创建虚机

    /conductor/api.py _build_instance()  /conductor/rpcapi.py  _build_instance() 1 构造一些数据类型2 修改一些api版本信息 ...

  6. nova创建虚拟机源码分析系列之四 nova代码模拟

    在前面的三篇博文中,介绍了restful和SWGI的实现.结合restful和WSGI配置就能够简单的实现nova服务模型的最简单的操作. 如下的内容是借鉴网上博文,因为写的很巧妙,将nova管理虚拟 ...

  7. nova创建虚拟机源码系列分析之二 wsgi模型

    openstack nova启动时首先通过命令行或者dashborad填写创建信息,然后通过restful api的方式调用openstack服务去创建虚拟机.数据信息从客户端到达openstack服 ...

  8. Spark 源码分析系列

    如下,是 spark 源码分析系列的一些文章汇总,持续更新中...... Spark RPC spark 源码分析之五--Spark RPC剖析之创建NettyRpcEnv spark 源码分析之六- ...

  9. MyCat源码分析系列之——SQL下发

    更多MyCat源码分析,请戳MyCat源码分析系列 SQL下发 SQL下发指的是MyCat将解析并改造完成的SQL语句依次发送至相应的MySQL节点(datanode)的过程,该执行过程由NonBlo ...

随机推荐

  1. 机器学习之numpy库中常用的函数介绍(一)

    1. mat() mat()与array的区别: mat是矩阵,数据必须是2维的,是array的子集,包含array的所有特性,所做的运算都是针对矩阵来进行的. array是数组,数据可以是多维的,所 ...

  2. 51nod 2006 飞行员配对(二分图最大匹配) 裸匈牙利算法 求二分图最大匹配题

    题目: 题目已经说了是最大二分匹配题, 查了一下最大二分匹配题有两种解法, 匈牙利算法和网络流. 看了一下觉得匈牙利算法更好理解, 然后我照着小红书模板打了一遍就过了. 匈牙利算法:先试着把没用过的左 ...

  3. Google赛马分析

    原题 想必田忌赛马的故事,大家都耳熟能详.但是,大家知道Goolge的童鞋们是怎么赛马的么?不过,首先,大家要先尝试一下:有25匹马,每次只能五匹一起跑,那么最少跑几次,才能确定前三甲呢? 分析 这样 ...

  4. MySQL 高效查询

    在“现场加号&预约排队”项目中,“号贩子排查任务”在线下测试的时候没有问题,但是线上后,由于线上的数据量较大,导致在执行查询的时系统崩溃:后来经过查找,发现写的sql不合理,查出了许多用不到的 ...

  5. AspxGridView控件的使用

    在网上找到的不错的资料: http://www.lmwlove.com/ai/SubjectID6 以下是自我总结: 要实现的功能:使用AspxGridView显示Scott数据库中emp与dept两 ...

  6. win10 uwp 获得焦点改变

    本文讲的是当我们应用失去焦点时,我们获得事件,当我们应用获得焦点,同样获得事件.同时,在应用不可以见时,我们也可以获得. 上面一张图,开始是应用启动,获得焦点,应用显示.然后我们打开另一个应用,切换, ...

  7. (10.20)Java小作业!

    今天想要和大家分享一道我最近遇到的题,里面既包括了嵌套循环的运用,还有函数的定义与调用,我个人觉得挺有价值的. 打印一个由*号构成的等腰三角形: 具体的解题方法如下: public class get ...

  8. table插件

    //动态添加一行function addRow(){ var firstrow=document.getElementById('firstrow'); var firstCopy=firstrow. ...

  9. LINUX 笔记-Shell 脚本控制语句

    1.if 语句 if condition1;then command1 elif condition2;then command2 else command3 fi 2.case 语句 case va ...

  10. 242. Valid Anagram(leetcode)

    Given two strings s and t, write a function to determine if t is an anagram of s. For example, s = & ...