“
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
领取专属 10元无门槛券
私享最新 技术干货