分享

OpenStack 之Nova添加扩展API流程,附带资源的查找功能

xioaxu790 发表于 2014-6-11 10:30:01 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 2 19030
本帖最后由 xioaxu790 于 2014-6-11 10:34 编辑
问题导读:
1、Openstack中扩展API有哪些方式?


2、写一个新的模块来声明控制器实现扩展?




Openstack 中规定,扩展openstack的api有两种方式
1、创建新的WSGI 资源
2、扩展原有得WSGI资源得控制器(我得理解是,接受到API请求后,具体得响应逻辑)

这两种方式中,都要求写一个新的模块来声明控制器类去处理请求和实现扩展。
在一个API模块中,可以有一个或多个得资源和扩展控制器。
根据osapi_compute_extension 得配置, ExtensionManager 由nova/api/openstack/compute/contrib/ 下的__init__.py 文件加载标准的或者新的扩展。
所以扩展的api统一写在nova/api/openstack/compute/contrib/ 目录下
如本例子中得 nova/api/openstack/compute/contrib/documents.py


扩展API流程
实现控制器,完成对资源的基本操作,如增删改查和其他一些用户自定义的RESTful资源操作;
实现一个extensions.ExtensionDescriptor的子类, 并实现get_resources 或者(/以及)get_controller_extensions,来建立新的资源或扩展资源控制器(即改写原有的业务逻辑)。具体实现哪个方法这取决于是否要修改原有的RESTFul业务逻辑, 或者说两个功能都需要;
将控制器和扩展的资源类,写如新创建的的资源中; 规范是资源类是模块(问家名)首字母大写,这样做的目的是使nova.api.openstack.extensions.load_standard_extensions这个类能够是别该新资源,并予以加载;
当添加新的资源(extensions.ResourceExtension的子类)的时候,如果想要去除掉 {tenent_id} 链接,则需要编写自定义的路由访问规则(本例子中没有涉及)

documents.py 实现
  1. # vim: tabstop=4 shiftwidth=4 softtabstop=4
  2. # Author:  JiangYiTao
  3. # Email:  willierjyt@gmail.com
  4. import webob
  5. from webob import exc
  6. from nova import db
  7. from nova import exception
  8. from nova.api.openstack import extensions
  9. authorize = extensions.extension_authorizer('compute', 'documents')
  10. # 请求控制器, 即处理对资源的请求,予以响应
  11. class DocumentsController():
  12. """the Documents API Controller declearation"""
  13. def index(self, req):
  14. import pdb; pdb.set_trace()
  15. documents = {}
  16. context = req.environ['nova.context']
  17. authorize(context)
  18. documents["key"] =  "helloworld"
  19. return documents
  20. def create(self, req):
  21. documents = {}
  22. context = req.environ['nova.context']
  23. authorize(context)
  24. documents["key"] =  "helloworld"
  25. return documents
  26. def show(self, req, id):
  27. documents = {}
  28. context = req.environ['nova.context']
  29. authorize(context)
  30. try:
  31. document = db.document_get(context, id)
  32. except :
  33. raise webob.exc.HTTPNotFound(explanation="Document not found")
  34. documents["document"] = document
  35. return documents
  36. def update(self, req):
  37. documents = {}
  38. context = req.environ['nova.context']
  39. authorize(context)
  40. documents["key"] =  "helloworld"
  41. return documents
  42. def delete(self, req, id):
  43. return webob.Response(status_int=202)
  44. # 根据命名规范, 模块(python源文件)中的类名是模块名的首字母大写
  45. class Documents(extensions.ExtensionDescriptor):
  46. """Documents ExtensionDescriptor implementation"""
  47. name = "documents"
  48. alias = "os-documents"
  49. namespace = "www.www.com"
  50. updated = "2013-05-19T00:00:00+00:00"
  51. def get_resources(self):
  52. """register the new Documents Restful resource"""
  53. resources = [extensions.ResourceExtension('os-documents',
  54. DocumentsController())
  55. ]
复制代码


扩展api时所修改的文件
  1. nova/db/api.py
  2. nova/db/sqlalchemy/api.py
  3. nova/db/sqlalchemy/models.py
复制代码


nova/db/api.py 文件内容
#数据操作API提供的方法,由Nova API 根据请求进行相应的操作, 由上面的请求控制器进行调用
  1. def document_get(context, document_id):
  2. """Get a document or raise if it does not exist."""
  3. return IMPL.document_get(context, document_id)
复制代码


nova/db/sqlalchemy/api.py 文件内容
  1. # 完成通过由SQLAlchemy操作数据库
  2. @require_admin_context
  3. def document_get(context, document_id): 4        session = get_session()
  4. with session.begin():
  5. query = model_query(context, models.Document, session=session, read_deleted="yes").filter_by(id=document_id)
  6. result = query.first()
  7. if not result or not query:
  8. raise Exception()
  9. return result
复制代码



SQLAlchemy 中定义的资源
nova/db/sqlalchemy/models.py(具体使用见上一 篇日志)
  1. class Document(BASE, NovaBase):
  2. """Represents a document of customized extension."""
  3. __tablename__ = 'documents'
  4. id = Column(Integer, primary_key=True)
  5. title = Column(String(255))
复制代码

至此,添加添加新的nova API功能完成
重起api服务
调用
  1. curl -v -X GET -H 'X-Auth-Token: 8e5971b3ce0a4f039b895681e7c29361' http://127.0.0.1:8774/v2/9b5903dd2d3443d8bb75ddffac27239a/extensions/os-documents  | python -mjson.tool命令,
复制代码


可以看到返回,扩展添加成功
  1. {
复制代码


数据库添加表documents, 结构如下
  1. mysql> desc documents;
  2. +------------+--------------+------+-----+---------+----------------+
  3. | Field      | Type         | Null | Key | Default | Extra          |
  4. +------------+--------------+------+-----+---------+----------------+
  5. | id         | int(11)      | NO   | PRI | NULL    | auto_increment |
  6. | title      | varchar(255) | NO   |     | NULL    |                |
  7. | created_at | datetime     | YES  |     | NULL    |                |
  8. | updated_at | datetime     | YES  |     | NULL    |                |
  9. | deleted_at | datetime     | YES  |     | NULL    |                |
  10. | deleted    | int(11)      | YES  |     | NULL    |                |
  11. +------------+--------------+------+-----+---------+----------------+
  12. 6 rows in set (0.05 sec)
复制代码


  1. mysql> select * from documents;
  2. +----+----------------+------------+------------+------------+---------+
  3. | id | title          | created_at | updated_at | deleted_at | deleted |
  4. +----+----------------+------------+------------+------------+---------+
  5. |  1 | abcdefgiifeife | NULL       | NULL       | NULL       |    NULL |
  6. |  2 | 1qaz2wsx       | NULL       | NULL       | NULL       |    NULL |
  7. +----+----------------+------------+------------+------------+---------+
  8. 2 rows in set (0.03 sec)
复制代码



调用命令
  1. curl  -X GET -H 'X-Auth-Token: 8e5971b3ce0a4f039b895681e7c29361' http://127.0.0.1:8774/v2/9b5903dd2d3443d8bb75ddffac27239a/os-documents/1  | python -mjson.tool
  2. 返回结果
  3. {
  4. "document": {
  5. "created_at": null,
  6. "deleted": null,
  7. "deleted_at": null,
  8. "id": 1,
  9. "title": "abcdefgiifeife",
  10. "updated_at": null
  11. }
复制代码

至此新添加的资源,API 扩展成功, 可以在此基础上进行进一步的修改,完成需求



已有(2)人评论

跳转到指定楼层
junzi234 发表于 2014-6-11 14:56:19
不错,留着备用
回复

使用道具 举报

lbwahoo 发表于 2014-7-17 21:50:34
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条