neutron-server加载neutron_lbaas service plugins

 

Table of Contents

0. systemctl status neutron-server:获取neutron-server 脚本入口... 2

1. /usr/bin/neutron-server:Main 函数入口... 2

2. cmd/eventlet/server/__init__.py:main函数实现... 3

3. server/wsgi_eventlet.py:wsgi_eventlet.eventlet_wsgi_server 函数实现... 3

4. service.py:serve_wsgi的实现... 4

4. service.py:NeutronApiService实现... 4

5. common/config.py:config.load_paste_app实现... 6

6. ../oslo_service/wsgi.py:wsgi.Loader.load_app的实现... 6

7. /usr/share/neutron/neutron-dist.conf:paste.deploy形式加载neutron的应用... 8

8. api/v2/router.py:APIRouter.factory实现... 10

9. pecan_wsgi/app.py:v2_factory实现... 10

10. manager.py:NeutronManager实现... 11

单步调试断点设置... 15

 

 

理解此加载过程需要预先具备以下几点知识:

 

* wsgi基本概念

* paste.deploy应用加载方式

* python pecan应用框架

 

0. systemctl status neutron-server:获取neutron-server 脚本入口

 

systemctl status neutron-server 中获取neutron-server脚本入口

 

● neutron-server.service - OpenStack Neutron Server

   Loaded: loaded (/usr/lib/systemd/system/neutron-server.service; enabled; vendor preset: disabled)

   Active: active (running) since Mon 2021-02-15 21:59:30 PST; 4h 18min ago

 Main PID: 19888 (neutron-server)

    Tasks: 11

   Memory: 1.0G

   CGroup: /system.slice/neutron-server.service

           ├─19888 /usr/bin/python2 /usr/bin/neutron-server --config-file /usr/share/neutron/neutron-dist.conf --config-dir /usr/sh...

。。。

Hint: Some lines were ellipsized, use -l to show in full

 

1. /usr/bin/neutron-server:Main 函数入口

 

    #!/usr/bin/python2

    # PBR Generated from u'console_scripts'

 

    import sys

 

    from neutron.cmd.eventlet.server import main

 

    if __name__ == "__main__":

        sys.exit(main())

 

以下调试均在/usr/lib/python2.7/site-packages/neutron目录下。

 

2. cmd/eventlet/server/__init__.py:main函数实现

 

    from neutron import server

    from neutron.server import rpc_eventlet

    from neutron.server import wsgi_eventlet

 

    def main():

        server.boot_server(wsgi_eventlet.eventlet_wsgi_server)

 

boot_server: 在做了两件事:

 

    初始化配置文件, 此时暂时不展开。

    执行传入的参数(函数)。

 

3. server/wsgi_eventlet.py:wsgi_eventlet.eventlet_wsgi_server 函数实现

 

    def eventlet_wsgi_server():

        neutron_api = service.serve_wsgi(service.NeutronApiService)

        start_api_and_rpc_workers(neutron_api)

 

eventlet_wsgi_server函数中先是准备好wsgi服务相关要素,然后通过eventlet的方式启动。

 

此处我们主要探究wsgi服务准备部分:

 

    neutron_api = service.serve_wsgi(service.NeutronApiService)

 

4. service.py:serve_wsgi的实现

 

    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.')

 

        registry.notify(resources.PROCESS, events.BEFORE_SPAWN, service)

        return service

 

调用传入的Service构造函数

启动服务:start

 

4. service.py:NeutronApiService实现

 

    class NeutronApiService(WsgiService):

        """Class for neutron-api service."""

        def __init__(self, app_name):

            profiler.setup('neutron-server', cfg.CONF.host)

            super(NeutronApiService, self).__init__(app_name)

 

        @classmethod

        def create(cls, app_name='neutron'):

            # Setup logging early

            config.setup_logging()

            service = cls(app_name)

            return service

 

NeutronApiService继承自WsgiService

 

    class WsgiService(object):

        """Base class for WSGI based services.

 

        For each api you define, you must also define these flags:

        :<api>_listen: The address on which to listen

        :<api>_listen_port: The port on which to listen

 

        """

 

        def __init__(self, app_name):

            self.app_name = app_name

            self.wsgi_app = None

 

        def start(self):

            self.wsgi_app = _run_wsgi(self.app_name)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值