您的位置:首页 > 运维架构

【OpenStack】OpenStack系列13之Nova源码解析与API扩展

2016-03-09 11:05 525 查看
学习思路

议程:代码结构-主干流程-分层架构-业务模型-数据库模型-消息模型



分布式架构: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主干流程

调用流程
参考:

http://ilearnstack.com/2013/04/26/request-flow-for-provisioning-instance-in-openstack/comment-page-1/

http://www.google.com.hk/imgres?imgurl=http://3.bp.blogspot.com/-lgqcvaFG_ak/UyV_FNd1n_I/AAAAAAAAABU/76rpDd5Rzro/s1600/adhoc-nova-boot-havana-07192013.png&imgrefurl=http://bodenr.blogspot.com/2014/03/openstack-nova-boot-server-call-diagram.html&h=620&w=1210&tbnid=n9hgUX4EOVe52M:&zoom=1&docid=MODxLOTD5C3AIM&ei=01RtVYWxD5Dh8AWDzIPIAw&tbm=isch



虚拟机状态



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



Nova-api扩展

参考:https://wiki.openstack.org/wiki/WritingRequestExtensions

代码目录



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,实现增删改查方法,增删改查的函数名称需要按照约定进行

参考:

https://wiki.openstack.org/wiki/WritingRequestExtensions

https://github.com/yongluo2013/osf-openstack-training/blob/master/code/nova-api/my-nova-api/nova/api/openstack/compute/contrib/documents.py

代码部署

拷贝代码到发布路径,不是源码路径。
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.虚拟机创建流程-整体:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: