// 未经博主本人允许,谢绝转载,谢谢
近期有需求在openstack的nova-api模块中添加接口,借此机会搞清楚nova-api如何利用wsgi等组件做的url api mapping
https://docs.openstack.org/nova/latest/contributor/api.html 这是官网对如何扩展API做的说明
首先增加接口有两种形式,一种是为已有的Resource扩展接口,由ControllerExtension入口做扩展即可,一种是新增了Resource及其相关接口,那么,由ResourceExtension入口做扩展。用户应当根据自己的业务场景来选择合适的扩展方式。
两个类及说明如下
以ControllerExtension为例,可以看admin_password.py是如何做ControllerExtension的
首先实现了AdminPasswordController类,在其中实现change_password接口,接口用装饰器标注:@wsgi.action('changePassword')
这个装饰器的作用是为函数属性wsgi_action赋值,另wsgi_action='changePassword',后续在初始化的时候,会用到这个字段
接下来需要继承V21APIExtensionBase类实现get_controller_extensions接口
这里面同时指明了这个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接口信息
如此,请求进来时,wsgi的__call__接口进入_process_stack接口,进入get_method逻辑时
会根据wsgi_action字典记录的action name找到对应的Controller类和method name信息