OpenStack 中的neutron-server启动过程

neutron-server是neutron的核心组件之中的一个。负责直接接收外部请求,然后调用后端对应plugin进行处理。

其核心启动过程代码主要在neutron.server包中。

__init__.py文件里包含一个main()函数,是WSGIserver開始的模块,而且通过调用serve_wsgi来创建一个NeutronApiService的实例。然后通过eventlet的greenpool来执行WSGI的应用程序,响应来自client的请求。

主要过程为:

eventlet.monkey_patch()

绿化各个模块为支持协程(通过打补丁的方式让本地导入的库都支持协程)。

config.parse(sys.argv[1:])

if not cfg.CONF.config_file:

sys.exit(_("ERROR: Unable to find configuration file via the default"

" search paths (~/.neutron/, ~/, /etc/neutron/, /etc/) and"

" the ‘--config-file‘ option!"))

通过解析命令行传入的參数。获取配置文件所在。

pool = eventlet.GreenPool()

创建基于协程的线程池。

neutron_api = service.serve_wsgi(service.NeutronApiService)

api_thread = pool.spawn(neutron_api.wait)

serve_wsgi方法创建NeutronApiService实例(作为一个WsgiService),并调用其的start()来启动socketserver端。

#neutron.service

def serve_wsgi(cls):

try:

service = cls.create()

service.start()

except Exception:

with excutils.save_and_reraise_exception():

LOG.exception(_(‘Unrecoverable error: please check log ‘

‘for details.‘))

return service

neutron.service.NeutronApiService类继承自neutron.service.WsgiService。其create方法返回一个appname默觉得“neutron”的WsgiService对象;start方法则调用_run_wsgi方法。

def start(self):

self.wsgi_app = _run_wsgi(self.app_name)

_run_wsgi方法主要是从api-paste.ini文件里读取应用(最后是利用neutron.api.v2.router:APIRouter.factory来构造应用)。然后为应用创建一个wsgi的服务端,并启动应用。主要代码为。

def _run_wsgi(app_name):

app = config.load_paste_app(app_name)

if not app:

LOG.error(_(‘No known API applications configured.‘))

return

server = wsgi.Server("Neutron")

server.start(app, cfg.CONF.bind_port, cfg.CONF.bind_host,

workers=cfg.CONF.api_workers)

# Dump all option values here after all options are parsed

cfg.CONF.log_opt_values(LOG, std_logging.DEBUG)

LOG.info(_("Neutron service started, listening on %(host)s:%(port)s"),

{‘host‘: cfg.CONF.bind_host,

‘port‘: cfg.CONF.bind_port})

return server

至此,neutron server启动完毕。之后。须要创建rpc服务端。

try:

neutron_rpc = service.serve_rpc()

except NotImplementedError:

LOG.info(_("RPC was already started in parent process by plugin."))

else:

rpc_thread = pool.spawn(neutron_rpc.wait)

rpc_thread.link(lambda gt: api_thread.kill())

api_thread.link(lambda gt: rpc_thread.kill())

这些代码创建plugin的rpc服务端,并将api和rpc的生存绑定到一起,一个死掉,则另外一个也死掉。

pool.waitall()

最后是后台不断等待。

下图总结了neutron-server的核心启动过程。

时间: 2024-12-03 15:55:03

OpenStack 中的neutron-server启动过程的相关文章

Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6629298 在前面一篇文章浅谈Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路中, 介绍了在Android系统中Binder进程间通信机制中的Server角色是如何获得Service Manager远程接口的,即defaultServiceManager函数的实现.S

Openstack liberty中nova-compute服务的启动过程

前段时间撰文分析了"云主机的启动过程"源码,读者应该注意到了nova-scheduler,nova-compute等组件是通过发起rpc.cast, rpc.call调用完成交互的.那今天我打算介绍下nova-compute服务的启动过程,并重点分析下其与AMQP(rabbitmq)链接的建立过程. 在CentOS 7中启动nova-compute服务,执行路径是这样的: systemctl start openstack-nova-compute.service -> /usr

openstack学习笔记一 虚拟机启动过程代码跟踪

本文主要通过对虚拟机创建过程的代码跟踪.观察虚拟机启动任务状态的变化,来透彻理解openstack各组件之间的作用过程. 当从horizon界面发送一个创建虚拟机请求,horizon api 将会依据前端给定的数据信息.调用novaclient 生成一个创建虚拟机的http post 请求来创建vm服务. >/usr/lib/python2.6/site-packages/horizon/api/nova.py(334)server_create() > /usr/lib/python2.6/

Android FM学习中的模块 FM启动过程

最近的研究FM模,FM是一家值我正在学习模块.什么可以从上层中可以看出. 上层是FM按钮的操作和界面显示,因此调用到FM来实现广播收听的功能. 看看Fm启动流程:例如以下图: 先进入FMRadio.java类,onCreate初始化一些数据.画出FM界面.启动fm在onStart()方法里启动FMRadioService.java (调用bindToService(this, osc)方法). watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdGZzbG

Ocata Neutron代码分析(一)——Neutron API启动过程分析

首先,Neutron Server作为一种服务(neutron-server.service),可以到Neutron项目目录中的setup.cfg配置文件中找到对应的代码入口. [entry_points] console_scripts = neutron-db-manage = neutron.db.migration.cli:main neutron-debug = neutron.debug.shell:main neutron-dhcp-agent = neutron.cmd.even

你所不知道的SQL Server数据库启动过程(用户数据库加载过程的疑难杂症)

前言 本篇主要是上一篇文章的补充篇,上一篇我们介绍了SQL Server服务启动过程所遇到的一些问题和解决方法,可点击查看,我们此篇主要介绍的是SQL Server启动过程中关于用户数据库加载的流程,并且根据加载过程中所遇到的一系列问题提供解决方案. 其实SQL Server作为微软的一款优秀RDBMS,它启动的过程中,本身所带的那些系统库发生问题的情况相对还是很少的,我们在平常使用中,出问题的大部分集中于我们自己建立的用户数据库. 而且,相对于侧重面而言,其实我们更关注的是我们自己建立的用户数

你所不知道的SQL Server数据库启动过程,以及启动不起来的各种问题的分析及解决技巧(转)

目前SQL Server数据库作为微软一款优秀的RDBMS,其本身启动的时候是很少出问题的,我们在平时用的时候,很少关注起启动过程,或者很少了解其底层运行过程,大部分的过程只关注其内部的表.存储过程.视图.函数等一系列应用方式,而当有一天它运行的正常的时候突然启动不起来了,这时候就束手无策了,能做的或许只能是重装.配置.还原等,但这一个过程其实是一个非常耗时的过程,尤其当我们面对是庞大的生产库的时候,可能在这火烧眉毛的时刻,是不允许你再重搭建一套环境的. 所以作为一个合格的数据库使用者,我们要了

Fabric1.4源码中链码容器启动过程解析

想写点东西记录一下最近看的一些Fabric源码,本文使用的是fabric1.4的版本,所以对于其他版本的fabric,内容可能会有所不同. 其实我仅仅知道Go语言一些语法的使用,并不太熟悉Go语言,所以解析的内容可能会有误,欢迎大家批评指正. 本文想针对Fabric中链码容器的启动过程进行源码的解析.这里的链码指的是用户链码不是系统链码,顺便回顾一下系统链码: lscc(Life Cycle System ChainCode)生命周期系统链码 cscc(Configuration System

也谈OpenStack中的虚拟机HA

OpenStack是一个旨在为公共及私有云的建设与管理提供软件的开源项目.它的社区拥有超过130家企业及1350位开发者,这些机构与个人都将OpenStack作为基础设施即服务(IaaS)资源的通用前端.OpenStack项目的首要任务是简化云的部署过程并为其带来良好的可扩展性.做为云计算IAAS层事实标准,OpenStack广泛的应用与各行各业.到目前为止OpenStack社区并没有一个完整的虚拟机HA解决方案.起初社区认为虚拟机的HA不是云平台层次的特性,不应该在云平台层面来实现,虚拟机的H