nova原始碼分析--API(2)
阿新 • • 發佈:2018-12-21
/etc/nova/api-paste.ini檔案中的定義了以下三個composite:
[composite:osapi_compute] use = call:nova.api.openstack.urlmap:urlmap_factory /: oscomputeversions # v21 is an exactly feature match for v2, except it has more stringent # input validation on the wsgi surface (prevents fuzzing early on the # API). It also provides new features via API microversions which are # opt into for clients. Unaware clients will receive the same frozen # v2 API feature set, but with some relaxed validation /v2: openstack_compute_api_v21_legacy_v2_compatible /v2.1: openstack_compute_api_v21 [composite:openstack_compute_api_v21] use = call:nova.api.auth:pipeline_factory_v21 noauth2 = cors http_proxy_to_wsgi compute_req_id faultwrap request_log sizelimit osprofiler noauth2 osapi_compute_app_v21 keystone = cors http_proxy_to_wsgi compute_req_id faultwrap request_log sizelimit osprofiler authtoken keystonecontext osapi_compute_app_v21 [composite:openstack_compute_api_v21_legacy_v2_compatible] use = call:nova.api.auth:pipeline_factory_v21 noauth2 = cors http_proxy_to_wsgi compute_req_id faultwrap request_log sizelimit osprofiler noauth2 legacy_v2_compatible osapi_compute_app_v21 keystone = cors http_proxy_to_wsgi compute_req_id faultwrap request_log sizelimit osprofiler authtoken keystonecontext legacy_v2_compatible osapi_compute_app_v21 [app:osapi_compute_app_v21] paste.app_factory = nova.api.openstack.compute:APIRouterV21.factory
當收到http://xxxxxx/v2和http://xxxxxxx/v2.1的訪問請求時,執行一串過濾函式後,如使用者身份許可權驗證,將執行檔案nova/api/openstack/compute/routes.py中類APIRouterV21的factory函式。關於WSGI、Paste deploy可以參考文章http://lib.csdn.net/article/openstack/43185。
類APIRouterV21進一步實現了URL到處理函式的對映,以flavor和server為例看一下對映實現:
}), ('/flavors', { 'GET': [flavor_controller, 'index'], 'POST': [flavor_controller, 'create'] }), ('/flavors/detail', { 'GET': [flavor_controller, 'detail'] }), ('/flavors/{id}', { 'GET': [flavor_controller, 'show'], 'DELETE': [flavor_controller, 'delete'] }), }), ('/servers', { 'GET': [server_controller, 'index'], 'POST': [server_controller, 'create'] }), ('/servers/detail', { 'GET': [server_controller, 'detail'] }), ('/servers/{id}', { 'GET': [server_controller, 'show'], 'PUT': [server_controller, 'update'], 'DELETE': [server_controller, 'delete'] }),
以/flavors結尾的http GET請求,將被對映到flavor_controller中的index函式,以/servers結尾的http GET請求,將被對映到server_controller中的index函式,flavor_controller和server_controller的定義如下:
flavor_controller = functools.partial(_create_controller, flavors.FlavorsController, [ flavor_rxtx.FlavorRxtxController, flavor_access.FlavorActionController ], [ flavor_manage.FlavorManageController, flavor_access.FlavorActionController ] ) server_controller = functools.partial(_create_controller, servers.ServersController, [ config_drive.ConfigDriveController, extended_availability_zone.ExtendedAZController, extended_server_attributes.ExtendedServerAttributesController, extended_status.ExtendedStatusController, extended_volumes.ExtendedVolumesController, hide_server_addresses.Controller, keypairs.Controller, security_groups.SecurityGroupsOutputController, server_usage.ServerUsageController, ],
最終將分別呼叫檔案nova/api/openstack/compute/flavors.py中類FlavorsController的index()函式和檔案nova/api/openstack/compute/servers.py中類ServersController的index()函式,至此,從http的url請求到服務端對應的處理函式之間的呼叫對映過程就清晰了。