上一篇博文将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. JavaScript高级(01)

    前端开发工具 1.1. WebStorm介绍和下载 l  介绍 WebStorm是JetBrains 推出的一款强大的HTML5编辑工具,拥有丰富的代码快速编辑,可以智能的补全代码.代码格式化.htm ...

  2. Python网络编程socket练习(TCP)

    服务器端:server.py # -*- coding: utf-8 -*- from socket import * HOST='' PORT=5000 BUFF_SIZE=1024 ADDR=(H ...

  3. 在CentOS6上编译安装实现LAMP(php-modules)+phpMyAdmin安装过程全记录

    php与apache协作有三种模式:CGI.modules.FastCGI. 在CGI模式下,用户请求php文件时,apache会启动响应进程,调用php处理器处理请求,然后将结果返回给客户端.用户响 ...

  4. 使用Dapper进行参数化查询

    在使用Dapper操作Mysql数据库中我介绍了使用dapper进行CURD基本操作,但在示例代码中参数虽然也是通过@开头,但其实不是真正意义的参数化查询,而是拼接sql,这种方式不利于防止sql注入 ...

  5. XML编程

     XML编程 XML及其语法 XML约束之DTD XML编程(CRUD---Create Read Update Delete) XML约束之Schema XML语法: XML文档的组成: 一个X ...

  6. MVVM命令绑定原理

    跟据网上前辈们的资料.了解到命令在MVVM绑定有三种行式. 1.DelegateCommand 2.RelayCommand 3.AttachbehaviorCommand /// <summa ...

  7. 第二章 MySQL入门篇

    第一章 MySQL入门篇 一.MySql简介 简言: 和SQL Server数据库相同,MySQl也是一个关系型数据库管理系统.由瑞典的MySQL AB公司开发,2008年被SUN公司收购,2009年 ...

  8. 【学习】js学习笔记---字符串对象

    一.属性 1.length 字符串的长度,且不区分中英文的字节. 示例代码: var str="abcdefghijklmn"; var str1="中文汉语" ...

  9. 在 Ubuntu 14.04 中安装 Pepper Flash Player For Chromium

    转自:http://blog.csdn.net/ygzhong000/article/details/26160953

  10. Windows下MongoDB常用命令

    以下命令中的启动与暂停服务命令需要使用管理员身份运行cmd.exe,其他命令需要先cd到Mongodb安装目录的bin目录. 1.启动服务:net start [Mongodb服务名].示例: net ...