openstack之在nova-api中扩展接口

// 未经博主本人允许,谢绝转载,谢谢

近期有需求在openstack的nova-api模块中添加接口,借此机会搞清楚nova-api如何利用wsgi等组件做的url api mapping

https://docs.openstack.org/nova/latest/contributor/api.html 这是官网对如何扩展API做的说明

首先增加接口有两种形式,一种是为已有的Resource扩展接口,由ControllerExtension入口做扩展即可,一种是新增了Resource及其相关接口,那么,由ResourceExtension入口做扩展。用户应当根据自己的业务场景来选择合适的扩展方式。

两个类及说明如下


openstack之在nova-api中扩展接口_第1张图片

以ControllerExtension为例,可以看admin_password.py是如何做ControllerExtension的

首先实现了AdminPasswordController类,在其中实现change_password接口,接口用装饰器标注:@wsgi.action('changePassword')

这个装饰器的作用是为函数属性wsgi_action赋值,另wsgi_action='changePassword',后续在初始化的时候,会用到这个字段

接下来需要继承V21APIExtensionBase类实现get_controller_extensions接口


openstack之在nova-api中扩展接口_第2张图片

这里面同时指明了这个AdminPasswordController类是为名为servers的resource扩展的

nova-api初始化时,在APIRouterV21类初始化api路由表,会做_register_controllers,此时会拿到所有ControllerExtension类的子类实例,调用get_controller_extensions,将用户自己实现的controller注册到对应的resource实例(比如上面AdminPasswordController对应的resource名字是servers,会根据servers拿到resource实例)的action和extension中,如action的注册方式是提取这个controller的wsgi_actions信息,添加到resource实例中wsgi_actions字典中,这个例子中,key是changePassword,value是AdminPasswordController的change_password接口信息


openstack之在nova-api中扩展接口_第3张图片

如此,请求进来时,wsgi的__call__接口进入_process_stack接口,进入get_method逻辑时


openstack之在nova-api中扩展接口_第4张图片

会根据wsgi_action字典记录的action name找到对应的Controller类和method name信息

你可能感兴趣的:(openstack之在nova-api中扩展接口)