怎样写 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 中添加的新元素。
----------------------------------------------------------------
作者:好大一片云
博客地址:http://www.cnblogs.com/zhutianshi/
转载声明:可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明,谢谢合作!

This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.
作者:好大一片云
博客地址:http://www.cnblogs.com/zhutianshi/
转载声明:可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明,谢谢合作!

This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?