这篇文章主要为大家展示了“ocata如何启动nova-api服务”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“ocata如何启动nova-api服务”这篇文章吧。
启动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_apistry:
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设置为noauth3。
use = call:nova.api.auth:pipeline_factory_v21
#在noauth3和keystone配置里不同的地方是noauth3和authtoken这两个认证filter,authtoken会先进行keystone登陆验证
noauth3 = cors http_proxy_to_wsgi compute_req_id faultwrap sizelimit osprofiler noauth3 osapi_compute_app_v21keystone = 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_v21noauth3 = cors http_proxy_to_wsgi compute_req_id faultwrap sizelimit osprofiler noauth3 legacy_v2_compatible osapi_compute_app_v21keystone = 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:noauth3]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
以上是“ocata如何启动nova-api服务”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注天达云行业资讯频道!