- 学习思路
- 议程:代码结构-主干流程-分层架构-业务模型-数据库模型-消息模型
- 分布式架构: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.虚拟机创建流程-整体: