【OpenStack】OpenStack系列13之Nova源码解析与API扩展
- 学习思路
- 议程:代码结构-主干流程-分层架构-业务模型-数据库模型-消息模型

- 分布式架构:Api:横向扩展 rpc:纵向扩展
- 分层架构:Controller接口层、View/Manager逻辑层、DAO/Model数据库层
- Nova与其他组件交互

- 业务模型——数据库建模

- 消息模型
rabbitmqctl list_queues,可以列出所有的消息队列
或者通过web管理界面,使用guest/openstack登录可以浏览

- Nova代码结构
- 提纲挈领式的掌握,知道怎么定制化,知道组件之间的调用关系
- setup.cfg看所有的功能
- etc配置文件模版、nova放各个组件代码、可以通过outline查看类代码结构

- model对应数据库表结构

- db-api为业务层封装

- schedule,过滤规则、weght规则。DiskFilter继承BaseHostFilter实现host_passes,返回True还是False。在nova的配置文件里面配置实用哪些filter。

- virt目录最终nova调用底层api干活

- nova主干流程
- 调用流程
参考:

- 虚拟机状态

- 虚拟机创建流程-代码-函数调用关系图示。先了解全景图,了解代码调用关系,必要的时候再去看代码细节。

- Nova-api扩展
- 代码目录

- nova/api目录扩展
nova/db目录建数据库
nova/tests目录放测试代码
- 扩展方法
- 扩展代码部署在/nova/nova/api/openstack/compute/contrib下,如新增documents.py模块
- 模块需要定义Documents类,该类继承extensions.ExtensionDescriptor
- 修改该类的name、alias、namespace、updated属性
- 重写该类的get_resources方法,返回resources对象
- Resources对象的构造需要DocumentsController对象
- DocumentsController对象中定义了具体的api,实现增删改查方法,增删改查的函数名称需要按照约定进行
参考:
- 代码部署
- 拷贝代码到发布路径,不是源码路径。
cp nova/api/openstack/compute/contrib/documents.py /usr/lib/python2.6/site-packages/nova/api/openstack/compute/contrib/
或者不拷贝,重新安装nova,python setup.py install,自动拷贝到目标目录:

- 拷贝/usr/bin/nova-api到/root/openstack/nova/bin目录,方便使用eclipse进行调试。
- 测试
- Token-get:
http://10.20.0.88:5000/v2.0/tokens
POST
Content-Type application/json
{
"auth": {
"tenantName": "admin",
"passwordCredentials": {
"username": "admin",
"password": "admin"
}
}
}

获取得到token以及compute的endpoint
http://controller0:8774/v2/3edbf8dbb5234ac29831d608aa824c7e
- 测试扩展api加载是否成功
http://10.20.0.88:8774/v2/3edbf8dbb5234ac29831d608aa824c7e/extensions/os-documents
GET
X-Auth-Token XXXXXXXXXXXX
返回结果如下:
{
"extension" : {
"updated" : "2014-10-19T00:00:00+00:00",
"name" : "documents",
"links" : [ ],
"namespace" : "www.doc.com",
"alias" : "os-documents",
"description" : "Documents ExtensionDescriptor implementation"
}
}
说明加载成功!
- 接口测试
Index:
http://10.20.0.88:8774/v2/3edbf8dbb5234ac29831d608aa824c7e/os-documents
GET
X-Auth-Token XXXXXXXXXXXX
返回:{"documents": [{"id": "1001", "name": "docs1"}, {"id": "1002", "name": "docs2"}, {"id": "1003", "name": "docs3"}]}
show:
http://10.20.0.88:8774/v2/3edbf8dbb5234ac29831d608aa824c7e/os-documents/1002
GET
X-Auth-Token XXXXXXXXXXXX
返回:{"id": "1002", "name": "docs2"}
Create:
http://10.20.0.88:8774/v2/3edbf8dbb5234ac29831d608aa824c7e/os-documents
POST
X-Auth-Token XXXXXXXXXXXX
Content-Type application/json
{"document":{"id": "1004", "name": "docs4"}}
返回:{"id": "1004", "name": "docs4"}
再次查询,已经更新。
Update:
http://10.20.0.88:8774/v2/3edbf8dbb5234ac29831d608aa824c7e/os-documents/1004
PUT
X-Auth-Token XXXXXXXXXXXX
Content-Type application/json
{"document":{"id": "1004", "name": "docs4_MOD"}}
返回:{"id": "1004", "name": "docs4_MOD"}
再次查询,已经更新。
Delete:
http://10.20.0.88:8774/v2/3edbf8dbb5234ac29831d608aa824c7e/os-documents/1004
DELETE
X-Auth-Token XXXXXXXXXXXX
Content-Type application/json
返回:HTTP/1.1 202 Accepted
再次查询,已经删除。
附录:
012.openstack 学习导图

012.request-flow1:

012.request-flow2:

012.虚拟机创建流程-代码:

012.虚拟机创建流程-整体:

【OpenStack】OpenStack系列13之Nova源码解析与API扩展的更多相关文章
- 老生常谈系列之Aop--Spring Aop源码解析(二)
老生常谈系列之Aop--Spring Aop源码解析(二) 前言 上一篇文章老生常谈系列之Aop--Spring Aop源码解析(一)已经介绍完Spring Aop获取advice切面增强方法的逻辑, ...
- 老生常谈系列之Aop--Spring Aop源码解析(一)
老生常谈系列之Aop--Spring Aop源码解析(一) 前言 上一篇文章老生常谈系列之Aop--Spring Aop原理浅析大概阐述了动态代理的相关知识,并且最后的图给了一个Spring Aop实 ...
- Java 集合系列Stack详细介绍(源码解析)和使用示例
Stack简介 Stack是栈.它的特性是:先进后出(FILO, First In Last Out). java工具包中的Stack是继承于Vector(矢量队列)的,由于Vector是通过数组实现 ...
- 小学徒成长系列—StringBuilder & StringBuffer关键源码解析
在前面的博文<小学徒成长系列—String关键源码解析>和<小学徒进阶系列—JVM对String的处理>中,我们讲到了关于String的常用方法以及JVM对字符串常量Strin ...
- ThreadPoolExecutor系列<三、ThreadPoolExecutor 源码解析>
本文系作者原创,转载请注明出处:http://www.cnblogs.com/further-further-further/p/7681826.html 在源码解析前,需要先理清线程池控制的运行状态 ...
- openstack nova 源码解析 — Nova API 执行过程从(novaclient到Action)
目录 目录 Nova API Nova API 的执行过程 novaclient 将 Commands 转换为标准的HTTP请求 PasteDeploy 将 HTTP 请求路由到具体的 WSGI Ap ...
- jquery源码解析:jQuery扩展方法extend的详解
jQuery中要扩展方法或者属性都是通过extend方法实现的.所谓的jQuery插件也是通过extend方法实现的. jQuery.extend扩展的是工具方法,也就是静态方法.jQuery.fn. ...
- TiKV 源码解析系列 - Raft 的优化
本系列文章主要面向 TiKV 社区开发者,重点介绍 TiKV 的系统架构,源码结构,流程解析.目的是使得开发者阅读之后,能对 TiKV 项目有一个初步了解,更好的参与进入 TiKV 的开发中.本文是本 ...
- [源码解析] PyTorch 分布式之弹性训练(6)---监控/容错
[源码解析] PyTorch 分布式之弹性训练(6)---监控/容错 目录 [源码解析] PyTorch 分布式之弹性训练(6)---监控/容错 0x00 摘要 0x01 总体逻辑 1.1 Node集 ...
随机推荐
- 第一次作业---安卓开发工具Android studio发展演变
Android studio2013年由谷歌推出,用于安卓端的开发,我所使用的版本为2015年5月推出的1.3.2. 1.安装.配置.作为麻瓜的我,刚刚接触Android studio时在安装方面走了 ...
- SQL中exists的使用方法
EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False exists : 强调的是是否返回结果集,不要求知道返回什么, exists 与 in ...
- hdu1890 伸展树(区间反转)
对于大神来说这题是水题.我搞这题花了快2天. 伸展树的优点有什么,就是树不管你怎么旋转序列是不会改变得,并且你要使区间反转,只要把第k大的点转到根结点,那么它的左子树就是要交换的区间[l,r),然后交 ...
- 使用ssis完成excel的数据导入
SSIS(SQL Server Integration Service)是从MS SQL 2005开始引入的,是一种ETL(Extract Transform Load)工具,SSIS比普通的ETL更 ...
- struts2中怎么把action中的值传递到jsp页面
对于如何把struts2的action中的值传到jsp页面中,主要的方法有2种: 使用转发视图利用request域中储存所需的值 使用重定向时存储数据进入session使其在jsp中可以获得 下面,让 ...
- 【ZOJ 3844】Easy Task
题意 每次把序列中最大的数a的一个和最小的数b的一个变成a-b.求最后是否能使序列里的数全部相同,能则输出这个相同的数. 分析 一定是有解的,不断减少最大数的个数,最大数减少为0个时,就是减少了不同数 ...
- BZOJ2456 mode
Description 给你一个n个数的数列,其中某个数出现了超过n div 2次即众数,请你找出那个数. Input 第1行一个正整数n. 第2行n个正整数用空格隔开. Output 一行一个正整数 ...
- [IOS+PHP Jason格式的发送与解析]
服务器端PHP文件connect.php: <?php $q = mysql_connect("localhost","root","" ...
- PHP实现Restful风格的API
Restful是一种设计风格而不是标准,比如一个接口原本是这样的: http://www1.qixoo.com/user/view/id/1表示获取id为1的用户信息,如果使用Restful风格,可以 ...
- Asp.Net MVC3 简单入门详解过滤器Filter
http://www.cnblogs.com/boruipower/archive/2012/11/18/2775924.html 前言 在开发大项目的时候总会有相关的AOP面向切面编程的组件,而MV ...