OpenStack 之Nova添加擴展API流程,附帶資源的查找功能

例子中涉及到SQLAlchemy 得相關操作,可以參考 上一隨筆

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流程

 

 
  1. 實現控制器,完成對資源的基本操作,如增刪改查和其他一些用戶自定義的RESTful資源操作;
  2. 實現一個extensions.ExtensionDescriptor的子類, 並實現get_resources 或者(/以及)get_controller_extensions,來建立新的資源或擴展資源控制器(即改寫原有的業務邏輯)。具體實現哪個方法這取決於是否要修改原有的RESTFul業務邏輯, 或者說兩個功能都需要;
  3. 將控制器和擴展的資源類,寫如新創建的的資源中; 規範是資源類是模塊(問家名)首字母大寫,這樣做的目的是使nova.api.openstack.extensions.load_standard_extensions這個類能夠是別該新資源,並予以加載;
  4. 當添加新的資源(extensions.ResourceExtension的子類)的時候,如果想要去除掉 {tenent_id} 鏈接,則需要編寫自定義的路由訪問規則(本例子中沒有涉及

documents.py 實現

 

複製代碼
 1 # vim: tabstop=4 shiftwidth=4 softtabstop=4
 2 
 3 # Author:  JiangYiTao 
 4 # Email:  [email protected]
 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.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 文件內容
複製代碼
# 完成通過由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(具體使用見上一 篇日誌)
 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


原文:http://www.cnblogs.com/willier/archive/2013/05/22/3092961.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章