上文说到需要在 /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 (四)的更多相关文章

  1. 怎样写 OpenStack Neutron 的 Extension (一)

    前两篇文章讨论了怎么写一个 Neutron 的插件.但是最基本的插件只包括 Network, Port,和 Subnet 三种资源.如果需要引入新的资源,比如一个二层的 gateway 的话,就需要在 ...

  2. 怎样写 OpenStack Neutron 的 Extension (三)

    通过上几章的介绍,我们现在的 myplugin 文件夹看上去应该是这样的: - neutron/ - plugins/ - myplugin/ - __init__.py - plugin.py - ...

  3. 怎样写 OpenStack Neutron 的 Extension (二)

    接着之前一篇文章,再来谈谈 Extension 的具体实现问题.我使用的是本地数据库加远程API调用的方法,所以先要定义一下数据库中 myextension 如何存储.首先,我们可以在自己的 plug ...

  4. 怎样写 OpenStack Neutron 的 Plugin (二)

    其实上一篇博文中的内容已经涵盖了大部分写Neutron插件的技术问题,这里主要还遗留了一些有关插件的具体实现的问题. 首先,Neutron对最基本的三个资源:Network, Port 和 Subne ...

  5. 怎样写 OpenStack Neutron 的 Plugin (一)

    鉴于不知道Neutron的人也不会看这篇文章,而知道的人也不用我再啰嗦Neutron是什么东西,我决定跳过Neutron简介,直接爆料. 首先要介绍一下我的开发环境.我没有使用DevStack,而是直 ...

  6. [转]OpenStack Neutron解析

    1.为什么还需要linux bridge的部署方式? 2.哪一个网桥起着交换机的作用? 3.neutron如何实现私有网络的隔离 =================================== ...

  7. openstack Neutron分析(3)—— neutron-dhcp-agent源码分析

    1.neutron dhcp3个主要部件分别为什么?2.dhcp模块包含哪些内容?3.Dnsmasq配置文件是如何创建和更新的?4.DHCP agent的信息存放在neutron数据库的哪个表中? 扩 ...

  8. OpenStack Neutron 之 Load Balance

    OpenStack Neutron 之 Load Balance 负载均衡(Load Balance)是 OpenStack Neutron 支持的功能之一.负载均衡能够将网络请求分发到多个实际处理请 ...

  9. how to read openstack code: action extension

    之前我们看过了core plugin, service plugin 还有resource extension. resource extension的作用是定义新的资源.而我们说过还有两种exten ...

随机推荐

  1. 使用Httpclient来替代客户端的jsonp跨域解决方案

    最近接手一个项目,新项目需要调用老项目的接口,但是老项目和新项目不再同一个域名下,所以必须进行跨域调用了,但是老项目又不能进行任何修改,所以jsonp也无法解决了,于是想到了使用了Httpclient ...

  2. Python pass语句作用与用法

    Python中的pass语句作用是什么?表示它不做任何事情,一般用做占位语句.pass语句具体作用及使用方法,我们往下看. pass语句在函数中的作用 当你在编写一个程序时,执行语句部分思路还没有完成 ...

  3. 给Azure 虚机的硬盘扩充容量[转]

    接到用户的需求,需要给Azure 上虚机的硬盘扩充空间,网上找到下面的资源,做个备忘: https://github.com/azure-contrib/WindowsAzureDiskResizer

  4. C中不安全函数

    C 中大多数缓冲区溢出问题可以直接追溯到标准 C 库.最有害的罪魁祸首是不进行自变量检查的.有问题的字符串操作(strcpy.strcat.sprintf 和 gets).一般来讲,象“避免使用 st ...

  5. [转]Jquery easyui开启行编辑模式增删改操作

    本文转自:http://www.cnblogs.com/nyzhai/archive/2013/05/14/3077152.html Jquery easyui开启行编辑模式增删改操作先上图 Html ...

  6. WEB安全--CSRF剖析

    CSRF攻击:攻击者构造合法的HTTP请求,随后利用用户的身份操作用户帐户的一种攻击方式. 一.CSRF攻击原理CSRF的攻击建立在浏览器与Web服务器的会话中:欺骗用户访问URL.二.CSRF攻击场 ...

  7. Bellman-Ford算法解决单源最短路问题

    #include<stdio.h> #include<stdlib.h> #include<stdbool.h> #define max 100 #define I ...

  8. J2EE笔记3

    7. MVC 设计模式. 6. 和属性相关的方法: 1). 方法 void setAttribute(String name, Object o): 设置属性 Object getAttribute( ...

  9. UVALive 6168 Fat Ninjas --二分小数+搜索

    题意:一个NxN的网格地板,有一些激光束从天花板垂直射向地面的某个网格,一个圆要安全地从左走到右,不碰到上边界,下边界以及激光束,问这个圆的直径最大能达到多大. 分析:可以二分直径,关键在check函 ...

  10. java 21 - 6 字符缓冲流的特殊方法以及该方法高效复制文件

    字符缓冲流的特殊方法: A.BufferedWriter: public void newLine():根据系统来决定换行符 private static void write() throws IO ...