OpenStack 之Nova添加扩展API流程,附带资源的查找功能
例子中涉及到SQLAlchemy 得相關操作,可以參考?上一隨筆
Openstack 中規定,擴展openstack得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流程
?
documents.py 實現
?
1 # vim: tabstop=4 shiftwidth=4 softtabstop=4 2 3 # Author: JiangYiTao 4 # Email: willierjyt@gmail.com 5 6 import webob 7 from webob import exc 8 9 from nova import db 10 from nova import exception 11 from nova.api.openstack import extensions 12 authorize = extensions.extension_authorizer('compute', 'documents') 13 14 # 請求控制器, 即處理對資源的請求,予以響應 15 class DocumentsController(): 16 """the Documents API Controller declearation""" 17 18 def index(self, req): 19 import pdb; pdb.set_trace() 20 documents = {} 21 context = req.environ['nova.context'] 22 authorize(context) 23 24 documents["key"] = "helloworld" 25 return documents 26 27 def create(self, req): 28 documents = {} 29 context = req.environ['nova.context'] 30 authorize(context) 31 32 documents["key"] = "helloworld" 33 return documents 34 35 def show(self, req, id):37 documents = {} 38 context = req.environ['nova.context'] 39 authorize(context) 40 41 try: 42 document = db.document_get(context, id) 43 except : 44 raise webob.exc.HTTPNotFound(explanation="Document not found") 45 46 documents["document"] = document 47 return documents 48 49 def update(self, req): 50 documents = {} 51 context = req.environ['nova.context'] 52 authorize(context) 53 54 documents["key"] = "helloworld" 55 return documents 56 57 def delete(self, req, id): 58 return webob.Response(status_int=202) 59 # 根據命名規范, 模塊(python源文件)中的類名是模塊名的首字母大寫 60 class Documents(extensions.ExtensionDescriptor): 61 """Documents ExtensionDescriptor implementation""" 62 63 name = "documents" 64 alias = "os-documents" 65 namespace = "www.www.com" 66 updated = "2013-05-19T00:00:00+00:00" 67 68 def get_resources(self): 69 """register the new Documents Restful resource""" 70 71 resources = [extensions.ResourceExtension('os-documents', 72 DocumentsController()) 73 ] 74 75 return resources
在之后可以由以下幾種方式來操作documents 資源 GET v2/{tenant_id}/ os-documents POST v2/{tenant_id}/ os-documents GET v2/{tenant_id}/ os-documents/{document_id} PUT v2/{tenant_id}/ os-documents/{document_id} DELETE v2/{tenant_id}/ os-documents/{document_id}
?
?擴展api時所修改的文件
1 nova/db/api.py 2 nova/db/sqlalchemy/api.py 3 nova/db/sqlalchemy/models.pynova/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 文件內容
# 完成通過由SQLAlchemy操作數據庫
1 @require_admin_context 2 def document_get(context, document_id): 4 session = get_session() 5 with session.begin(): 6 query = model_query(context, models.Document, session=session, read_deleted="yes").filter_by(id=document_id) 7 8 result = query.first() 9 10 if not result or not query: 11 raise Exception() 12 13 return result
SQLAlchemy 中定義的資源
nova/db/sqlalchemy/models.py(具體使用見上一 篇日志) 1 class Document(BASE, NovaBase): 2 """Represents a document of customized extension.""" 3 4 __tablename__ = 'documents' 5 id = Column(Integer, primary_key=True) 6 title = Column(String(255)) View Code 至此,添加添加新的nova API功能完成重起api服務
調用?curl -v -X GET -H 'X-Auth-Token: 8e5971b3ce0a4f039b895681e7c29361' http://127.0.0.1:8774/v2/9b5903dd2d3443d8bb75ddffac27239a/extensions/os-documents ?| python -mjson.tool命令,
可以看到返回,擴展添加成功
1 { 2 "extension": { 3 "alias": "os-documents", 4 "description": "Documents ExtensionDescriptor implementation", 5 "links": [], 6 "name": "documents", 7 "namespace": "www.www.com", 8 "updated": "2013-05-19T00:00:00+00:00" 9 } 10 } 數據庫添加表documents, 結構如下 mysql> desc documents; +------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | title | varchar(255) | NO | | NULL | | | created_at | datetime | YES | | NULL | | | updated_at | datetime | YES | | NULL | | | deleted_at | datetime | YES | | NULL | | | deleted | int(11) | YES | | NULL | | +------------+--------------+------+-----+---------+----------------+ 6 rows in set (0.05 sec) mysql> select * from documents; +----+----------------+------------+------------+------------+---------+ | id | title | created_at | updated_at | deleted_at | deleted | +----+----------------+------------+------------+------------+---------+ | 1 | abcdefgiifeife | NULL | NULL | NULL | NULL | | 2 | 1qaz2wsx | NULL | NULL | NULL | NULL | +----+----------------+------------+------------+------------+---------+ 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 } 12 }至此新添加的資源,API 擴展成功, 可以在此基礎上進行進一步的修改,完成需求
參考文檔:https://www.ibm.com/developerworks/community/blogs/e93514d3-c4f0-4aa0-8844-497f370090f5/entry/openstack_nova_api?lang=zh
http://docs.openstack.org/developer/nova/devref/addmethod.openstackapi.html
轉載于:https://www.cnblogs.com/willier/archive/2013/05/22/3092961.html
總結
以上是生活随笔為你收集整理的OpenStack 之Nova添加扩展API流程,附带资源的查找功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python学习笔记:遍历目录
- 下一篇: FreeBSD9.1安装Gnome2桌面