1. 程式人生 > >nova原始碼分析--API(2)

nova原始碼分析--API(2)

/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請求到服務端對應的處理函式之間的呼叫對映過程就清晰了。