• nova创建虚拟机源码分析系列之五 nova源码分发实现


     前面讲了很多nova restful的功能,无非是为本篇博文分析做铺垫。本节说明nova创建虚拟机的请求发送到openstack之后,nova是如何处理该条URL的请求,分析到处理的类。

    nova对于URL请求的处理在上一篇博文中以刻画了简化版的模型,参考该模型,能够快速理解openstack中真实的处理情景。

    首先来熟悉nova的代码

    openstack  nova的源码分布如下,其中比较重要的是nova文件夹,几乎所有的功能实现都是在这个文件夹下。

    WSGI服务器的实现。

    路径:/nova/service.py

    configure.ini配置文件

    路径:/etc/nova/api-paste.ini

    #############
    # OpenStack #
    #############
    
    [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
    #<-------------------------------------------->#
    #http://192.168.252.177:8000/v2.0
    #判断api的版本信息,也是IP地址之后的第一个路径
    #<-------------------------------------------->#
    /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 sizelimit noauth2 osapi_compute_app_v21
    keystone = cors http_proxy_to_wsgi compute_req_id faultwrap sizelimit 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 sizelimit noauth2 legacy_v2_compatible osapi_compute_app_v21
    keystone = cors http_proxy_to_wsgi compute_req_id faultwrap sizelimit authtoken keystonecontext legacy_v2_compatible osapi_compute_app_v21
    
    [filter:request_id]
    paste.filter_factory = oslo_middleware:RequestId.factory
    
    [filter:compute_req_id]
    paste.filter_factory = nova.api.compute_req_id:ComputeReqIdMiddleware.factory
    
    [filter:faultwrap]
    paste.filter_factory = nova.api.openstack:FaultWrapper.factory
    
    [filter:noauth2]
    paste.filter_factory = nova.api.openstack.auth:NoAuthMiddleware.factory
    
    [filter:sizelimit]
    paste.filter_factory = oslo_middleware:RequestBodySizeLimiter.factory
    
    [filter:http_proxy_to_wsgi]
    paste.filter_factory = oslo_middleware.http_proxy_to_wsgi:HTTPProxyToWSGI.factory
    
    [filter:legacy_v2_compatible]
    paste.filter_factory = nova.api.openstack:LegacyV2CompatibleWrapper.factory
    
    #<-------------------------------------------->#
    #最终到了应用的部分,osapi_compute_app_v21的实现在
    /nova/api/openstack/compute/__init__.py中
    #<-------------------------------------------->#
    [app:osapi_compute_app_v21]
    paste.app_factory = nova.api.openstack.compute:APIRouterV21.factory
    
    [pipeline:oscomputeversions]
    pipeline = faultwrap http_proxy_to_wsgi oscomputeversionapp
    
    [app:oscomputeversionapp]
    paste.app_factory = nova.api.openstack.compute.versions:Versions.factory
     

    configure.ini的分发策略是:

    
    
    /       --->  [composite:osapi_compute]
    /v2     --->  openstack_compute_api_v21_legacy_v2_compatible
    /v2.1   --->  openstack_compute_api_v21
    
    
    openstack_compute_api_v21_legacy_v2_compatible 的实现:
    根据配置文件,可以选择两中认证模式,分别是:
    keystone 的认证方法是: cors--> http_proxy_to_wsgi --> compute_req_id --> faultwrap 
    --> sizelimit --> authtoken --> keystonecontext -->
    --> legacy_v2_compatible---- osapi_compute_app_v21
    前面都是过滤,直到最后的osapi_compute_app_v21是处理函数。
    处理函数的实现:

     在nova/api/openstack/compute下的APIRouterV21.factory工厂方法中,所以下一步,会进入该方法。

    APIRouterV21.factory
    路径:/nova/api/openstack/compute/__init__.py


    该类是继承自:nova.api.openstack.APIRouterV21,功能实现在该类中。
    APIRouterV21
    路径:/nova/api/openstack/__init__.py

     这里实现了一个重要的URL和处理方法绑定功能,功能如同下面的函数。请求方法 + URL 绑定到对应的处理函数上,实现注册的功能。

    该类继承自 base_wsgi.Router,所以去该类上查看具体的实现。

    base_wsgi.Router

    路径:nova/wsgi.py

     看到这里就应该很熟悉了,mapper对象,RoutesMiddleware()函数,_dispatch()函数。

    mapper将请求URL解析,根据注册的方法和处理函数获取处理的类,然后将该类传递给_dispatch()函数。函数_dispatch获取处理的类的名称,

    然后判断是否为空,如果存在该类,则在return中调用该类的__call__方法。

    注:__call__()方法是python类中的一个方法。在函数返回当中不能返回一个对象,可以返回一个函数。所以__call__实现功能是在python类中调用该类的方法,变量

    实现一个函数的功能。

    在_disptach函数最后的返回中,调用了处理类的__call__方法。nova创建虚拟机过程中,就会调用Controller中的create方法,所以调用的就是下面的方法:

     

     

     








  • 相关阅读:
    动态规划-矩阵链乘法
    钢条切割问题
    代码着色
    Sublime配置C和C++编译运行环境
    Guava中集合类的简单实用
    Junit单元测试入门
    Sublime Text 快捷键
    Editplus 的配色方案
    利用Wireshark任意获取QQ好友IP实施精准定位
    linux下实现定时执行php脚本
  • 原文地址:https://www.cnblogs.com/goldsunshine/p/7777161.html
Copyright © 2020-2023  润新知