启动nova-api服务解析(ocata版本)

启动nova的api服务时,需要调用nova-api命令,nova-api命令最终是调用nova.cmd.api模块里的main方法。

nova-api命令的main方法解析:

def main():
    config.parse_args(sys.argv)#此方法会解析命令行传入进来的参数(sys.argv),配置文件的参数管理使用oslo.config模块进行管理。
    logging.setup(CONF, "nova")#调用solo.log模块建立nova域的日志空间
    utils.monkey_patch()#此方法会根据配置文件里的monkey_path参数来确定是否对某些模块打补丁。
    objects.register_all()#注册所有需要的模块对象
    if 'osapi_compute' in CONF.enabled_apis:
        #这里对于缓存nova-compute服务版本是必要的当使用网络ID为'auto'或'none',发出服务器创建请求时,将会查找该版本。
        objects.Service.enable_min_version_cache()
    log = logging.getLogger(__name__)#构建获取logger

    gmr.TextGuruMeditation.setup_autorun(version)#使用oslo.reports模块来管理收集错误报告

    launcher = service.process_launcher()#获取oslo.service模块的服务启动实例
    started = 0
    for api in CONF.enabled_apis:#定义了api-paste.ini两个默认的sections名,分别为osapi_compute,metadata
        should_use_ssl = api in CONF.enabled_ssl_apis
        try:
            server = service.WSGIService(api, use_ssl=should_use_ssl)#遍历启wsgi服务实例,会根据api-paste.ini配置文件加载app
            launcher.launch_service(server, workers=server.workers or 1)
            started += 1
        except exception.PasteAppNotFound as ex:
            log.warning(
                _LW("%s. ``enabled_apis`` includes bad values. "
                    "Fix to remove this warning."), ex)

    if started == 0:
        log.error(_LE('No APIs were started. '
                      'Check the enabled_apis config option.'))
        sys.exit(1)

    launcher.wait()#服务阻塞

api-paste.ini解析:

pasteDeploy通过文件配置的方式将各个功能以模块化的方式组装在一起。这样做的好处是把各个功能特性分块化后方便组装与拆卸,起到了松耦合的作用。

############
# Metadata #
############
[composite:metadata]
use = egg:Paste#urlmap   #调用paste模块的urlmap来转发URL,配置文件中的enabled_apis的其中一个默认值就是metadata
/: meta    #将/的路径转发到[pipeline:meta]处理,:号也可以换成=号来映射

[pipeline:meta]
pipeline = cors metaapp

[app:metaapp]
paste.app_factory = nova.api.metadata.handler:MetadataRequestHandler.factory

#############
# OpenStack #
#############

[composite:osapi_compute] #这里的url路径映射是使用:号,也可以换成=号来代替
use = call:nova.api.openstack.urlmap:urlmap_factory #这里nova自定义了urlmap工厂来处理URL,配置文件中的enabled_apis的其中一个默认值就是osapi_compute
/: oscomputeversions         #将/的路径转发到[pipeline:oscomputeversions]处理
# v21是与v2完全匹配的功能,但它在wsgi表面上具有更严格的输入验证(防止API早期模糊化)。
# 它还通过API微版本提供了新功能,这些微版本可供客户选择。不知情的客户端将接收到相同的冻结v2 API特性集,但有一些宽松的验证
/v2: openstack_compute_api_v21_legacy_v2_compatible #将/v2开头的url转到[composite:openstack_compute_api_v21_legacy_v2_compatible]处理
/v2.1: openstack_compute_api_v21    #将/v2.1开头的url转到[composite:openstack_compute_api_v21]处理

[composite:openstack_compute_api_v21]
#调用自定义的composite工厂方法。方法里会根据配置文件的认证策略来决定加载下面哪一种应用,默认加载keystone,也可以将配置文件里的auth_strategy设置为noauth2。
use = call:nova.api.auth:pipeline_factory_v21
#在noauth2和keystone配置里不同的地方是noauth2和authtoken这两个认证filter,authtoken会先进行keystone登陆验证
noauth2 = cors http_proxy_to_wsgi compute_req_id faultwrap sizelimit osprofiler noauth2 osapi_compute_app_v21
keystone = cors http_proxy_to_wsgi compute_req_id faultwrap 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 sizelimit osprofiler noauth2 legacy_v2_compatible osapi_compute_app_v21
keystone = cors http_proxy_to_wsgi compute_req_id faultwrap sizelimit osprofiler authtoken keystonecontext legacy_v2_compatible osapi_compute_app_v21

[filter:request_id]
# 它确保为每个API请求分配请求ID并将其设置到request environment。请求ID也被添加到API响应中。 
paste.filter_factory = oslo_middleware:RequestId.factory # 确保请求ID的中间件

[filter:compute_req_id]
# 它确保为每个请求到compute服务的api分配请求ID并将其设置到request environ。请求ID也被添加到API响应中。
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:osprofiler]
paste.filter_factory = nova.profiler:WsgiMiddleware.factory

[filter:sizelimit]
paste.filter_factory = oslo_middleware:RequestBodySizeLimiter.factory #限制传入请求的大小的中间件。 

[filter:http_proxy_to_wsgi]
# 此中间件使用远程HTTP反向代理提供的环境变量重载WSGI环境变量。 
paste.filter_factory = oslo_middleware.http_proxy_to_wsgi:HTTPProxyToWSGI.factory # 到WSGI终止中间件的HTTP代理。 

[filter:legacy_v2_compatible]
paste.filter_factory = nova.api.openstack:LegacyV2CompatibleWrapper.factory

[app:osapi_compute_app_v21]
paste.app_factory = nova.api.openstack.compute:APIRouterV21.factory

[pipeline:oscomputeversions]
pipeline = cors faultwrap http_proxy_to_wsgi oscomputeversionapp

[app:oscomputeversionapp]
paste.app_factory = nova.api.openstack.compute.versions:Versions.factory

##########
# Shared #
##########

[filter:cors]
# 这个中间件允许WSGI应用程序为多个配置的域提供CORS报头.
paste.filter_factory = oslo_middleware.cors:filter_factory # CORS中间件 
oslo_config_project = nova

[filter:keystonecontext]
paste.filter_factory = nova.api.auth:NovaKeystoneContext.factory

[filter:authtoken]
paste.filter_factory = keystonemiddleware.auth_token:filter_factory

 

转载于:https://my.oschina.net/jennerlo/blog/3006641

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值