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:  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.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(具体使用见上一 篇日志)
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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/400627.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第8章:形态学操作

第8章:形态学操作one. 腐蚀操作:two. 膨胀:three. 通用形态学函数:four. 开运算:five. 闭运算:six. 形态学梯度运算:seven. 礼帽运算:eight. 黑帽运算:night. 核函数&…

【树莓派学习笔记】四、OpenCV的安装与卸载

目录安装修改host以连接上Github测试IP修改树莓派的hosts安装各种依赖包安装OpenCV只安装核心模块安装核心模块和opencv_contribC Opencv 测试编写测试源码编译测试卸载平台:树莓派3B 版本: 2021-05-07-raspios-buster-armhf 安装 修改host以连接上Git…

第9章:图像梯度

第9章:图像梯度one. Sobel理论基础1. 计算水平方向偏导数的近似值2. 计算垂直方向偏导数的近似值two. Sobel算子及函数的使用:1. 函数语法:2. 对像素取绝对值:3. 方向:three. Scharr 算子及函数使用:1. 函数语法:2. 实…

【树莓派学习笔记】五、处理、自动重命名并另存为图片

目录编写源码编译测试平台&#xff1a;树莓派3B 版本&#xff1a; 2021-05-07-raspios-buster-armhf 编写源码 所用源码修改自【机器视觉学习笔记】最近邻插值实现图片任意角度旋转&#xff08;C&#xff09; 在合适的地方编写源码 nano main.cpp#include <opencv2/openc…

第10章:Canny图像边缘检测

第10章&#xff1a;Canny图像边缘检测一、Canny边缘检测的基础&#xff1a;1. 应用高斯滤波去除图像噪声&#xff1a;2. 计算梯度3.非极大值抑制4. 应用双阈值确定边缘&#xff1a;二、Canny函数使用&#xff1a;​ Canny边缘检测是一种使用多级边缘检测算法检测边缘的方法。19…

【树莓派学习笔记】六、启用摄像头、实时视频、录像和截图

目录安装摄像头配置使用luvcview平台&#xff1a;树莓派3B 版本&#xff1a; 2021-05-07-raspios-buster-armhf 安装摄像头 配置 sudo raspi-config重启后 cd /dev ls可看到新增了video0设备 使用luvcview 安装 sudo apt-get install luvcview查看摄像设备详细信息 luv…

Android各种屏幕分辨率(VGA、HVGA、QVGA、WQVGA、WVGA、FWVGA) 详解

2019独角兽企业重金招聘Python工程师标准>>> VGA&#xff1a;Video Graphics Array&#xff0c;即&#xff1a;显示绘图矩阵&#xff0c;相当于640480 像素&#xff1b;HVGA&#xff1a;Half-size VGA&#xff0c;即&#xff1a;VGA的一半&#xff0c;分辨率为48032…

敏捷合同-摘自网络

敏捷软件开发实践的文化中存在着一个断层&#xff0c;该断层同样体现在许多敏捷团队中。这个断层就是业务分析人员在敏捷项目中的角色——谁来担任这个角色&#xff1f;它的作用 和价值是什么&#xff1f;它又是如何发生改变的&#xff1f;这种情况的潜台词&#xff08;其实我曾…

第11章:图像金字塔

第11章&#xff1a;图像金字塔一、理论基础&#xff1a;1. 向下采样&#xff1a;2. 向上采样&#xff1a;二、pyrDown函数使用&#xff1a;三、pyrUp函数及使用&#xff1a;四、采样可逆性研究五、拉普拉斯金字塔1. 定义&#xff1a;2. 应用&#xff1a;什么是图像金子塔&#…

【树莓派学习笔记】七、(免费)内网穿透将树莓派作为服务器管理网站

目录nginx安装开机自启动测试查看nginx安装路径查看配置文件路径(测试用)修改index.nginx-debian.html内网穿透免费方案ngrok原版方案下载ngrok连接账户开启内网穿透httpSSH网云穿方案开通隧道下载开启内网穿透开机自启动花生壳方案下载和安装添加内网穿透映射测试平台&#xf…

第12章:图像轮廓

第12章&#xff1a;图像轮廓一、查找并绘制轮廓&#xff1a;1. 查找图像轮廓&#xff1a;2. 绘制图像轮廓&#xff1a;3. 绘制轮廓实例&#xff1a;二、矩特征1. 矩的计算&#xff1a;moments函数2. 计算轮廓面积&#xff1a;contourArea函数3. 计算轮廓长度&#xff1a;arcLen…

【树莓派学习笔记】八、两步安装VS Code (Visual Studio Code)

目录下载安装使用(可选)安装插件C/CCMake ToolsCode Runner平台&#xff1a;树莓派3B 版本&#xff1a; 2021-05-07-raspios-buster-armhf 下载 官网下载 Download Visual Studio Code 发送到树莓派 安装 sudo dpkg -i Desktop/code_1.60.2-1632316275_armhf.deb 使用 在…

20 best jquery 截图

digguka, January 05, 2012jQuery Image Crop - A very useful list of tools for cropping, zooming and resizing of images. Some of plugins come with the ability to upload croped images. 转载于:https://www.cnblogs.com/yqskj/archive/2013/05/25/3098411.html

【RK3399Pro学习笔记】一、Thinker Edge R 安装系统和VNC服务

目录下载固件安装USB驱动下载烧录工具刷机第一次开机连接WifiSSH登录换源设置语言安装VNC服务平台&#xff1a;华硕 Thinker Edge R 瑞芯微 RK3399Pro 固件版本&#xff1a;Tinker_Edge_R-Debian-Stretch-V1.0.4-20200615 风火轮论坛资料网盘 提取码&#xff1a;wqbd 下载固件…

第13章:直方图处理

第13章&#xff1a;直方图处理一、直方图的含义&#xff1a;1. 普通直方图&#xff1a;2. 归一化直方图&#xff1a;二、绘制直方图&#xff1a;1. 使用Numpy绘制直方图&#xff1a;2. 使用OpenCV绘制直方图&#xff1a;3. 使用掩码绘制直方图&#xff1a;三、直方图均衡化&…

操作系统 内存管理篇

一.程序的装入和链接 装入方式&#xff1a; 链接方式&#xff1a; 二.进程的内存映像 三.内存的分配 1.连续分配 分配方式&#xff1a; 2.不连续分配 分页&#xff1a;页面大小一致 引入快表&#xff08;和 cache 处理思路一致&#xff09; 升级到二级页表 分段&#xff1a;…

【RK3399Pro学习笔记】二、Thinker Edge R 内网穿透以实现远程SSH

目录免费方案花生壳下载安装添加内网穿透映射测试平台&#xff1a;华硕 Thinker Edge R 瑞芯微 RK3399Pro 固件版本&#xff1a;Tinker_Edge_R-Debian-Stretch-V1.0.4-20200615 因Thinker Edge R安装的镜像为64位的版本 getconf LONG_BIT免费方案 花生壳 下载 在花生壳下载…

第14章:傅里叶变换

第14章&#xff1a;傅里叶变换一、理论基础&#xff1a;二、Numpy实现傅里叶变换&#xff1a;1. 实现傅里叶变换&#xff1a;2. 逆傅里叶变换&#xff1a;3. 高通滤波示例&#xff1a;三、OpenCV实现傅里叶变换&#xff1a;1. 实现傅里叶变换&#xff1a;2. 实现逆傅里叶变换&a…

代码能不能不要写得这么烂?!

我是一个研二的即将实习和毕业的普通屌丝研究生&#xff0c;带着几个研一的同学一起做数据挖掘项目。为了在毕业的时候防止青黄不接导致老师不让我毕业&#xff0c;于是从他们刚进实验室起&#xff0c;就“开始了设计模式和代码风格的培养”。具体的做法&#xff0c;就是扔给他…

【Kali 树莓派版学习笔记】安装系统和VNC服务

目录下载固件和烧录系统第一次开机SSH连接换源设置语言安装VNC平台&#xff1a;树莓派3B 版本&#xff1a; Linux kali 5.4.83-Re4son-v7 #1 SMP Sat May 15 03:22:58 UTC 2021 armv7l GNU/Linux 下载固件和烧录系统 Get Kali 格式化TF卡 使用Win32DiskImager刷入镜像 第…