// 未經(jīng)博主本人允許,謝絕轉(zhuǎn)載,謝謝
近期有需求在openstack的nova-api模塊中添加接口添诉,借此機會搞清楚nova-api如何利用wsgi等組件做的url api mapping
https://docs.openstack.org/nova/latest/contributor/api.html 這是官網(wǎng)對如何擴展API做的說明
首先增加接口有兩種形式潭陪,一種是為已有的Resource擴展接口,由ControllerExtension入口做擴展即可培己,一種是新增了Resource及其相關(guān)接口,那么胚泌,由ResourceExtension入口做擴展省咨。用戶應(yīng)當(dāng)根據(jù)自己的業(yè)務(wù)場景來選擇合適的擴展方式。
兩個類及說明如下
以ControllerExtension為例玷室,可以看admin_password.py是如何做ControllerExtension的
首先實現(xiàn)了AdminPasswordController類零蓉,在其中實現(xiàn)change_password接口,接口用裝飾器標(biāo)注:@wsgi.action('changePassword')
這個裝飾器的作用是為函數(shù)屬性wsgi_action賦值穷缤,另wsgi_action='changePassword'敌蜂,后續(xù)在初始化的時候,會用到這個字段
接下來需要繼承V21APIExtensionBase類實現(xiàn)get_controller_extensions接口
這里面同時指明了這個AdminPasswordController類是為名為servers的resource擴展的
nova-api初始化時津肛,在APIRouterV21類初始化api路由表章喉,會做_register_controllers,此時會拿到所有ControllerExtension類的子類實例,調(diào)用get_controller_extensions秸脱,將用戶自己實現(xiàn)的controller注冊到對應(yīng)的resource實例(比如上面AdminPasswordController對應(yīng)的resource名字是servers落包,會根據(jù)servers拿到resource實例)的action和extension中,如action的注冊方式是提取這個controller的wsgi_actions信息摊唇,添加到resource實例中wsgi_actions字典中咐蝇,這個例子中,key是changePassword巷查,value是AdminPasswordController的change_password接口信息
如此有序,請求進來時,wsgi的__call__接口進入_process_stack接口吮便,進入get_method邏輯時
會根據(jù)wsgi_action字典記錄的action name找到對應(yīng)的Controller類和method name信息