在ironic的文档中,我们可以看到:
compute_driver=nova.virt.ironic.IronicDriver compute_dirver是用来最终生成目标机的东西,这里说目标机是因为可能是虚机也可能是物理机,生成虚机有一般nova所用的libvirt,也有hyperv,xenapi,vmwareapi,这些在 nova/virt下可以看到,相应的分配一个物理机就是ironic了。 前面讲了很多如何看,如何调试ironic,事实上,ironic的blueprint中是有可能将其作为一个单独的项目,脱离openstack而独立存在的,在ironic中和openstack的其他模块 打交道的地方只有几个,common库就不说了,存放deploy需要使用的镜像,可以是glance也可以是swift,pxe启动时使用DHCP服务器,使用neutron中的ml2层的dnsmsaq,使用 keystone做了auth相关的操作等等,而这些操作都是可以拿掉的,作为一个pecan项目,ironic有自己的入口和方式,某种程度上和其他的openstack模块不一样,那么把ironic 仅仅当做是产生目标机的一个lib库的话,从nova收到创建一个目标机开始,是怎么玩儿的呢。 结合install的guide和源码 在所有请求与相应之前,nova的相关服务要启动,安装好了之后nova的相关服务启动文件和ironic一样在/usr/bin目录下,系统启动服务时候调用这些脚本,脚本启动nova/cmd 下的入口文件启动compute,conductor,scheduler等各种服务,服务做一些初始化的工作,读取配置文件fill CONF,数据库初始化,stevedore读取系统设置的entry_point载入 可能需要使用的driver对应关系,作为server段使用messaging连接MQ,准备接受RPC请求,等等。。。。一大堆工作,在ironic中使用了pecan,所以rest请求相关的route操作由 pecan项目源生的方式完成,对于像nova一样的其他项目则是使用python基本的WSGI规范启动service,使用paste,webob,router这一套来完成rest入口设定,路由配置, request/response等各种操作,这些东西具体怎么弄的,我之前总结过不过没哟post到网上,今后我会整理之后放上来,这里不会对nova相关的东西说的很细 1. nova 收到一个请求,说创建一个机器, 在nova的paste.ini文件中nova.api.openstack.compute:APIRouter.factory 作为router的入口,不同版本的rest会有不同的入口,这里使用v2的rest,通过router中的mapper 找到对应的controller,由于是创建机器,属于server相关的操作,插卡nova 的rest api: http://developer.openstack.org/api-ref-compute-v2.htmlPOST /v2/{tenant_id}/servers Create server对应的controller在/nova/api/openstack/compute/server.py中的Controller,调用create方法, 方法中会解析post进来的request body做image,flavor,network等等的相关 初始化工作,最后调用nova.compute.API().create方法(这里有cell的判断与使用,先暂时不讲),简单看会调用nova.compute.api.API.create中check一些policy相关的操作, 这个create的调用过程是比较长的,也是整个nova的核心,再经过一堆filter,调用nova.conductor.ConductorTaskAPI.build_instance,和ironic一样,现在的openstack设计 里,conductor中的操作最终编程RPC调用,rpc发送消息到具体的conductor上执行操作或者改动数据库等操作(nova比较复杂,调用跳来跳去,事实上和其他模块一样,调用 跳转都是rest -> conductor(涉及到conductor类型的选择可能会再次跳转) -> rpc call ->compute manager) 此处执行nova.conductor.rpcapi.ComputeTaskAPI.build_instance,rpc调用被conductor_manager收到,再次使用rpc call发到nova.compute.rpcapi接收调用方法变成 "build_and_run_instance",再次rpc调用,执行nova.compute.manager.ComputeManager.build_and_run_instance 2. 正常的nova build instance是上面的过程,但是使用ironic的话,compute_manager变成了ironic.nova.compute.manager.ClusteredComputeManager, 该类集成自nova.compute.manager.ComputeManager,只是实现了几个方法而已,事实上build_and_run_instance 方法还是在nova的compute_manager中 firefox总是crash。。。打击,待续。。。