启动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