nova创建虚拟机源码分析系列之七 传入参数转换成内部id

上一篇博文将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()函数,目前推进的进度在这里。

时间: 2024-08-01 22:42:44

nova创建虚拟机源码分析系列之七 传入参数转换成内部id的相关文章

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

/conductor/api.py _build_instance()  /conductor/rpcapi.py  _build_instance() 1 构造一些数据类型2 修改一些api版本信息3 投入消息队列  /conductor/manager.py  _build_instance()1 过滤信息2 调度模块工作(选出最合适的主机,并返回)3 调用/nova/compute/rpcapi.py::build_and_run_instance() 此时已经拿到最合适主机 /compu

Spark 源码分析系列

如下,是 spark 源码分析系列的一些文章汇总,持续更新中...... Spark RPC spark 源码分析之五--Spark RPC剖析之创建NettyRpcEnv spark 源码分析之六--Spark RPC剖析之Dispatcher和Inbox.Outbox剖析 spark 源码分析之七--Spark RPC剖析之RpcEndPoint和RpcEndPointRef剖析 spark 源码分析之八--Spark RPC剖析之TransportContext和TransportClie

Cordova Android源码分析系列一(项目总览和CordovaActivity分析)

PhoneGap/Cordova是一个专业的移动应用开发框架,是一个全面的WEB APP开发的框架,提供了以WEB形式来访问终端设备的API的功能.这对于采用WEB APP进行开发者来说是个福音,这可以避免了原生开发的某些功能.Cordova 只是个原生外壳,app的内核是一个完整的webapp,需要调用的原生功能将以原生插件的形式实现,以暴露js接口的方式调用. Cordova Android项目是Cordova Android原生部分的Java代码实现,提供了Android原生代码和上层We

jQuery源码分析系列(33) : AJAX中的前置过滤器和请求分发器

jQuery1.5以后,AJAX模块提供了三个新的方法用于管理.扩展AJAX请求,分别是: 1.前置过滤器 jQuery. ajaxPrefilter 2.请求分发器 jQuery. ajaxTransport, 3.类型转换器 ajaxConvert 源码结构: jQuery.extend({ /** * 前置过滤器 * @type {[type]} */ ajaxPrefilter: addToPrefiltersOrTransports(prefilters), /** * 请求分发器 *

jQuery源码分析系列(36) : Ajax - 类型转化器

什么是类型转化器? jQuery支持不同格式的数据返回形式,比如dataType为 xml, json,jsonp,script, or html 但是浏览器的XMLHttpRequest对象对数据的响应只有 responseText与responseXML 二种 所以现在我要定义dataType为jsonp,那么所得的最终数据是一个json的键值对,所以jQuery内部就会默认帮你完成这个转化工作 jQuery为了处理这种执行后数据的转化,就引入了类型转化器,如果没有指定类型就依据响应头Con

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

更多MyCat源码分析,请戳MyCat源码分析系列 SQL下发 SQL下发指的是MyCat将解析并改造完成的SQL语句依次发送至相应的MySQL节点(datanode)的过程,该执行过程由NonBlockingSession.execute()触发: public void execute(RouteResultset rrs, int type) { // clear prev execute resources clearHandlesResources(); if (LOGGER.isDe

Dubbo源码分析系列-服务的发布

RPC简化类图 RPC模块核心接口和抽象实现 默认实现Dubbo协议的接口和抽象实现 服务发布过程 调用过程 上图是服务提供者暴露服务的主过程: 首先ServiceConfig类拿到对外提供服务的实际类ref(如:HelloWorldImpl),然后通过ProxyFactory类的getInvoker方法使用ref生成一个AbstractProxyInvoker实例,到这一步就完成具体服务到Invoker的转化.接下来就是Invoker转换到Exporter的过程. Dubbo处理服务暴露的关键

jQuery源码分析系列(37) : Ajax 总结

综合前面的分析,我们总结如下3大块: jQuery1.5以后,AJAX模块提供了三个新的方法用于管理.扩展AJAX请求 前置过滤器 jQuery. ajaxPrefilter 请求分发器 jQuery. ajaxTransport 类型转换器 ajaxConvert 为了整体性与扩展性考虑,把整个结构通过Deferred实现异步链式模型,Promise对象可以轻易的绑定成功.失败.进行中三种状态的回调函数,然后通过在状态码在来回调不同的函数就行了 出于同源策略考虑,存在跨域问题,所以ajax内部

Cordova Android源码分析系列二(CordovaWebView相关类分析)

本篇文章是Cordova Android源码分析系列文章的第二篇,主要分析CordovaWebView和CordovaWebViewClient类,通过分析代码可以知道Web网页加载的过程,错误出来,多线程处理等. CordovaWebView类分析 CordovaWebView类继承了Android WebView类,这是一个很自然的实现,共1000多行代码.包含了PluginManager pluginManager,BroadcastReceiver receiver,CordovaInt