如何开发一个neutron service plugin

Neutron实现了一种可插拔的框架,开发者只需遵循规则,开发相应的plugin、driver、extensions,就能实现对资源的定制化操作。

Neutron的service plugin,主要实现了对2层以上资源进行增删改查的api,同时还要对数据库进行相应的读写,有些plugin还需要将用户的请求下发到底层的软件或设备上。

开发步骤

1、API接口的定义,定义接口函数参数,neutron的api主要是对资源的增删改查;

2、数据表设计,主要是定义新增资源的属性、数据依赖等;

3、编写extension,新的资源及其api是以extension的形式让neutron-server识别到的,通过extension,neutron-server可以将rest请求route到plugin上;

4、开发Plugin,编写业务逻辑;

5、开发命令行工具(可选)

下面通过一个极简的案例,描述如何开发一个neutron service plugin。

我们要开发的plugin名字叫vpc_connection,只实现对资源的rest访问,不涉及数据库交互等其他功能。

1.编辑neutron/plugins/common/constants.py文件,红色文字为新增内容。

CORE = "CORE"

……………………

L3_ROUTER_NAT = "L3_ROUTER_NAT"

VPC_CONNECTION = "VPC_CONNECTION"

#maps extension alias to service type

EXT_TO_SERVICE_MAPPING = {

……………

'router': L3_ROUTER_NAT,

'vpcconnection': VPC_CONNECTION,

}

ALLOWED_SERVICES = [CORE, DUMMY, LOADBALANCER, FIREWALL, VPN, METERING,

L3_ROUTER_NAT, LOADBALANCERV2,VPC_CONNECTION] #从配置中加载service_plugin时有合法性检查

COMMON_PREFIXES = {

CORE: "",

…………

VPC_CONNECTION: "",

}

的作用是给新资源起个名字,并将其加入到EXT_TO_SERVICE_MAPPING中。

的作用是:如果在/etc/neutron/neutron.conf service_plugins中配置了某个plugin,在neutron-server加载plugin时会用ALLOWED_SERVICES检查配置中的plugin是否合法。只有定义在ALLOWED_SERVICES中的plugin才是能被使用的plugin。

是定义rest api前缀,这里定义的前缀为空,也就是无前缀。neutron的rest api一般是“/v2.0/prefixes/resource-name”。那么vpc_connection plugin api url为“/v2.0/vpc-connections”

2.编写extension

neutron/extensions/vpcconnection.py

Extension的内容主要有RESOURCE_ATTRIBUTE_MAP、Extension类和一个VpcConnectionPluginBase抽象类,该类定义了api。

RESOURCE_ATTRIBUTE_MAP定义了资源的属性及其访问权限。

创建一个ExtensionDescriptor的子类,子类的名称必须和文件名一致,且类名第一个字母大写。

创建一个抽象类,定义API的接口函数,接口主要定义对资源的create、get、update、delete操作,接口函数名必须为action_resource的形式,例如delete_vpc_connection。

3.编写plugin

neutron/services/vpc_connection/vpc_connection_plugin.py

编写VpcConnectionPlugin类,该类继承了VpcConnectionPluginBase,并实现了相关的接口函数。这里的api只是简单地输出日志。

完成以上代码编写,基本完成了一个plugin的开发。下面需要让neutron-server在启动的时候能够找到VpcConnectionPlugin。

4.增加新增plugin的导入路径

编辑neutron/setup.cfg文件,增加plugin的路径:

[neutron.service_plugins]

打包之后,这些配置会在/usr/lib/python2.7/site-packages/neutron-version-xxx-py2.7.egg-info/entry_points.txt文件中。

5.配置/etc/neutron/neutron.conf

[DEFAULT]

service_plugins = router, vpc_connection

Neutron-server初始化的时候,会参考/etc/neutron/neutron.conf的service_plugins配置,将vpc_connection plugin导入并初始化。导入使用了importutils库,它会在entry_points.txt文件中搜索相应的类。最后重启neutron-server。

测试

向neutorn-server发送 “GET /v2.0/vpc-connections”,测试service plugin是否可用。

Neutron-server的日志

END

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180209G0XC1N00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券