怎样写 OpenStack Neutron 的 Extension (四)
上文说到需要在 /neutronclient/v2_0/myextension/extension.py 中分别定义五个 class:List/Show/Create/Delete/UpdateExtension。具体形式如下:
import argparse
import logging from neutronclient.neutron import v2_0 as neutronV20
from neutronclient.openstack.common.gettextutils import _
RESOURCE = 'myextension'
class ListExtension(neutronV20.ListCommand):
"""List extensions""" resource = RESOURCE
log = logging.getLogger(__name__ + '.ListExtension')
list_columns = ['id', 'name'] class ShowExtension(neutronV20.ShowCommand):
"""Show information of a given extension.""" resource = RESOURCE
log = logging.getLogger(__name__ + '.ShowExtension') class CreatePhysicalGateway(neutronV20.CreateCommand):
"""Create an extension.""" resource = RESOURCE
log = logging.getLogger(__name__ + '.CreateExtension') def add_known_arguments(self, parser):
parser.add_argument(
'name', metavar='NAME',
help=_('Name of extension to create')) def args2body(self, parsed_args):
body = {self.resource: {
'name': parsed_args.name}}
return body
class UpdateExtension(neutronV20.UpdateCommand):
"""update a given extension.""" resource = RESOURCE
log = logging.getLogger(__name__ + '.UpdateExtension')
class DeleteExtension(neutronV20.DeleteCommand):
"""Delete a given extension.""" resource = RESOURCE
log = logging.getLogger(__name__ + '.DeleteExtension')
这些 class 处在接受 CLI 命令的第一线,负责将命令转化成 API call。需要特别注意的是 CreateExtension 这个类,它有两个方法 add_known_arguments 和 args2body。前者定义了 CLI 命令接受哪些参数,后者规定如何将收到的参数打包起来。
这些参数打包之后就会发给 neutron 后台中我们自己定义的 plugin controller,但是如何发送这些参数还需要我们去 /neutronclient/v2_0/client.py 的 Client 类中设置:
首先是 uri 路径:
myextensions_path = "/myextensions"
myextension_path = "/myextensions/%s"
然后是每个操作所对应的传递方法:
@APIParamsCall
def list_myextensions(self, retrieve_all=True, **_params):
"""Fetches a list of all myextensions for a tenant."""
return self.list('myextensions', self.myextensions_path, retrieve_all,
**_params) @APIParamsCall
def show_myextension(self, myextension, **_params):
"""Fetches information of a certain entry in myextension."""
return self.get(self.myextension_path % (myextension), params=_params) @APIParamsCall
def create_myextension(self, body=None):
"""Creates a new myextension entry."""
return self.post(self.myextensions_path, body=body) @APIParamsCall
def delete_myextension(self, myextension):
"""Deletes the specified myextension."""
return self.delete(self.myextension_path % (myextension)) @APIParamsCall
def update_myextension(self, myextension, body=None):
"""Updates a myextension."""
return self.put(self.myextension_path % (myextension), body=body)
如此一来,我们自己实现的 neutron plugin 就能够收到 CLI 发送过来的命令啦。
下一章再来说说怎么修改 OpenStack 的 Dashboard 来显示我们在 extension 中添加的新元素。
怎样写 OpenStack Neutron 的 Extension (四)的更多相关文章
- 怎样写 OpenStack Neutron 的 Extension (一)
前两篇文章讨论了怎么写一个 Neutron 的插件.但是最基本的插件只包括 Network, Port,和 Subnet 三种资源.如果需要引入新的资源,比如一个二层的 gateway 的话,就需要在 ...
- 怎样写 OpenStack Neutron 的 Extension (三)
通过上几章的介绍,我们现在的 myplugin 文件夹看上去应该是这样的: - neutron/ - plugins/ - myplugin/ - __init__.py - plugin.py - ...
- 怎样写 OpenStack Neutron 的 Extension (二)
接着之前一篇文章,再来谈谈 Extension 的具体实现问题.我使用的是本地数据库加远程API调用的方法,所以先要定义一下数据库中 myextension 如何存储.首先,我们可以在自己的 plug ...
- 怎样写 OpenStack Neutron 的 Plugin (二)
其实上一篇博文中的内容已经涵盖了大部分写Neutron插件的技术问题,这里主要还遗留了一些有关插件的具体实现的问题. 首先,Neutron对最基本的三个资源:Network, Port 和 Subne ...
- 怎样写 OpenStack Neutron 的 Plugin (一)
鉴于不知道Neutron的人也不会看这篇文章,而知道的人也不用我再啰嗦Neutron是什么东西,我决定跳过Neutron简介,直接爆料. 首先要介绍一下我的开发环境.我没有使用DevStack,而是直 ...
- [转]OpenStack Neutron解析
1.为什么还需要linux bridge的部署方式? 2.哪一个网桥起着交换机的作用? 3.neutron如何实现私有网络的隔离 =================================== ...
- openstack Neutron分析(3)—— neutron-dhcp-agent源码分析
1.neutron dhcp3个主要部件分别为什么?2.dhcp模块包含哪些内容?3.Dnsmasq配置文件是如何创建和更新的?4.DHCP agent的信息存放在neutron数据库的哪个表中? 扩 ...
- OpenStack Neutron 之 Load Balance
OpenStack Neutron 之 Load Balance 负载均衡(Load Balance)是 OpenStack Neutron 支持的功能之一.负载均衡能够将网络请求分发到多个实际处理请 ...
- how to read openstack code: action extension
之前我们看过了core plugin, service plugin 还有resource extension. resource extension的作用是定义新的资源.而我们说过还有两种exten ...
随机推荐
- Java递归实现操作系统文件的复制、粘贴和删除功能
通过Java IO递归实现操作系统对文件的复制.粘贴和删除功能,剪切=复制+粘贴+删除 代码示例: import java.io.BufferedInputStream; import java.io ...
- 不用synchronized块的话如何实现一个原子的i++?
上周被问到这个问题,没想出来,后来提示说concurrent包里的原子类.回来学习一下. 一.何谓Atomic? Atomic一词跟原子有点关系,后者曾被人认为是最小物质的单位.计算机中的Atomic ...
- 一个自定义 HBase Filter -“通过RowKeys来高性能获取数据”
摘要: 大家在使用HBase和Solr搭建系统中经常遇到的一个问题就是:“我通过SOLR得到了RowKeys后,该怎样去HBase上取数据”.使用现有的Filter性能差劲,网上也没有现成的自定义Fi ...
- 04_最长上升子序列问题(LIS)
来源:刘汝佳<算法竞赛入门经典--训练指南> P60 问题6: 问题描述:给定n个整数a1,a2,...,an,按从左到右的顺序选出尽量多的整数,组成一个上升子序列(子序列可以理解为:删除 ...
- 构建多模块的Maven项目
在Eclipse下创建一个maven项目,该项目有多个模块组成. 1.创建父项目 File->New->Project->Maven->Maven Project(图一) ...
- Python pip – error: invalid command ‘bdist_wheel’
原文@http://software-engineer.gatsbylee.com/python-pip-error-invalid-command-bdist_wheel/ Python pip – ...
- SecureCRT 使用技巧
VanDyke CRT 和 VanDyke SecureCRT是最常用的终端仿真程序,简单的说就是windows下登录UNIX或Liunx服务器主机的软件.二者不同的是SecureCRT支持SSH∗( ...
- ubuntu apache2服务器配置
把django开发好的项目部署到apache2服务器. 记录我的配置过程. apache,django,mod_wsgi,python版本如下.不同版本大同小异. ii apache2 2.2.22- ...
- URAL 2014 Zhenya moves from parents --线段树
题意:儿子身无分文出去玩,只带了一张他爸的信用卡,当他自己现金不足的时候就会用信用卡支付,然后儿子还会挣钱,挣到的钱都是现金,也就是说他如果有现金就会先花现金,但是有了现金他不会还信用卡的钱.他每花一 ...
- POJ 1990 MooFest --树状数组
题意:牛的听力为v,两头牛i,j之间交流,需要max(v[i],v[j])*dist(i,j)的音量.求所有两两头牛交谈时音量总和∑(max(v[i],v[j])*abs(x[j]-x[i])) ,x ...