openstack如何扩展API之二:扩展原有核心API
时间:2022-05-07
本文章向大家介绍openstack如何扩展API之二:扩展原有核心API,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
openstack使用stevedore的插件机制,来提供了扩展接口功能(openstack官方称为Extending the API)。有了插件机制,我们在开发新的OpenStack功能时,通过扩展接口功能,在不改变openstack核心代码的前提下,就可以实现对OpenStack的功能扩展。
openstack中使用stevedore扩展接口可以分为三个步骤:声明插件,实现插件,注册插件。
1. 声明插件
在setup.cfg中声明插件的入口entry_points。(最终安装到了entry_points.txt)
[nova.api.v21.extensions]
extended_test = nova.api.openstack.compute.extended_test:ExtendedTest
2. 实现插件
所有实现的插件都放在nova/api/openstack/compute中。
实现了V21APIExtensionBase的子类。
本文新建一个extended_test.py:
from nova.api.openstack import extensions
from nova.api.openstack import wsgi
ALIAS = 'os-extended-test'
class TestServerController(wsgi.Controller):
def _extend_server(self, server, instance):
server['test'] = 'hello test'
@wsgi.extends
def show(self, req, resp_obj, id):
server = resp_obj.obj['server']
instance = req.get_db_instance(server['id'])
self._extend_server(server, instance)
@wsgi.extends
def detail(self, req, resp_obj):
servers = list(resp_obj.obj['servers'])
for server in servers:
instance = req.get_db_instance(server['id'])
self._extend_server(server, instance)
class ExtendedTest(extensions.V21APIExtensionBase):
"""extended test support."""
name = "ExtendedTest"
alias = ALIAS
version = 1
def get_resources(self):
return []
def get_controller_extensions(self):
server_extension = extensions.ControllerExtension(
self, 'servers', TestServerController())
return [server_extension]
3. 注册插件
插件的注册不需要我们再实现,openstack已经使用stevedore实现了。
Nova API启动过程中会加载api-paste.ini中定义的应用osapi_compute:
[app:osapi_compute_app_v21]
paste.app_factory = nova.api.openstack.compute:APIRouterV21.factory
在APIRouterV21初始化时注册了extension。
最后验证一下效果:
# nova show Ubuntu-12-04
这里我们在没有修改servers的核心api的条件下扩展了nova show对应的api。给虚拟机添加了一个属性test。
附:
如果想通过nova list-extensions命令查看到我们扩展的api还要进行下面的工作。
首先添加文件:
policies/extended_test.py
from oslo_policy import policy
from nova.policies import base
BASE_POLICY_NAME = 'os_compute_api:os-extended-test'
POLICY_ROOT = 'os_compute_api:os-extended-test:%s'
extended_test_policies = [
policy.RuleDefault(
name=BASE_POLICY_NAME,
check_str=base.RULE_ADMIN_API),
policy.RuleDefault(
name=POLICY_ROOT % 'create',
check_str=base.RULE_ANY),
policy.RuleDefault(
name=POLICY_ROOT % 'discoverable',
check_str=base.RULE_ANY),
policy.RuleDefault(
name=POLICY_ROOT % 'show',
check_str=base.RULE_ANY),
]
def list_rules():
return extended_test_policies
其次修改文件:
policies/__init__.py
from nova.policies import extended_common
......
def list_rules():
return itertools.chain(
......
extended_common.list_rules(),
......
最后查看是否能够查看到
# nova list-extensions
| ExtendedTest | extended test support. | os-extended-test | 2014-12-03T00:00:00Z |
关注本公众号,了解更多关于云计算虚拟化的知识。
- 数据中心进水了怎么办?数据中心如何防洪?
- 戴若犁:虚拟中的现实
- kvm虚拟化管理平台WebVirtMgr部署-完整记录(1)
- objective-C中如何判断一个类中有没有定义某个方法
- Steve Boswell:智能口罩让PM2.5滚蛋
- kvm虚拟化管理平台WebVirtMgr部署-完整记录(2)
- objective-C中的扩展方法与partial class
- 仿优酷Android客户端图片左右滑动(自动滑动)
- objective-C: NSString应该用initWithFormat? 还是 stringWithFormat?
- objective-C 的内存管理之-实例分析
- Tim Berners-Lee:网络的自由和开放
- android防止内存溢出浅析
- objective-C 的内存管理之-自动释放池(autorelease pool)
- objective-C 的内存管理之-引用计数
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux中文件/文件夹无法删除的解决方案
- GNU Parallel的具体使用
- crontab定时任务不执行的原因分析与解决方法
- 在Linux中安装ASPNET.Core3.0运行时的示例代码
- linux Bash脚本判别使用者的身份方法示例
- 配置Linux使用LDAP用户认证的方法
- linux Dig命令使用大全
- Ubuntu虚拟机下使用cutecom进行串口通信的方法
- 虚拟机Linux系统忘记密码修改root或其他用户密码的方法
- 在 RHEL8 /CentOS8 上建立多节点 Elastic stack 集群的方法
- linux 搭建svn服务器的方法步骤
- linux 下隐藏进程的一种方法及遇到的坑
- Ubuntu 18.04中截图工具shutter的编辑按钮不可用的解决办法
- Linux服务器利用防火墙iptables策略进行端口跳转的方法
- Linux下PHP网站服务器安全配置加固防护方法【推荐】