Openstack学習ノートのNeutron-serverサービスローディングとスタートソース分析(三)


本文はOpenstackを勉強する過程で整理して総括するので、時間と個人の能力が有限なため、誤りの所は避けられないで、ご指摘を歓迎します。
Neutron-serverサービスのローディングとスタートソース分析(二)でモジュール機能の拡張とローディングを行いました。Neutron-serverサービスのローディングとスタートソース分析(一)に戻ります。run_wsgi関数
<span style="font-size:14px;">def _run_wsgi(app_name):
    app = config.load_paste_app(app_name)
    ifnot 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</span>
ap=config.load_paste_アプリはここでモジュール機能の拡張とロードを完了します。
<span style="font-size:14px;">server = wsgi.Server("Neutron")
    server.start(app, cfg.CONF.bind_port, cfg.CONF.bind_host,
                workers=cfg.CONF.api_workers)</span>
neutronのサービスを作成し、このserverを起動します。
ここに配置されたファイルのデフォルトのappi_ウォーカーは0です
<span style="font-size:14px;">def start(self, application, port, host='0.0.0.0', workers=0):
        """Run a WSGI server with the givenapplication."""
        self._host = host
        self._port = port
        backlog = CONF.backlog
 
        #  socket  
self._socket = self._get_socket(self._host,
                                       self._port,
                                        backlog=backlog)
 
        self._launch(application, workers)</span>
 
<span style="font-size:14px;">def _launch(self, application, workers=0):
        service = WorkerService(self, application)
        if workers <1:
            # workers  1          
            self._server = service
            service.start()
            systemd.notify_once()
        else:
            # API            
            #         0.01s
            self._server = common_service.ProcessLauncher(wait_interval=1.0)
            self._server.launch_service(service, workers=workers)</span>
実行完了_run_wsgi関数は、service.start()の実行を完了し、neutron_を完成させます。appi=service.serve_wsgiの仕事。
 
<span style="font-size:14px;">def main():
    ……
    try:
        pool = eventlet.GreenPool()
 
        neutron_api = service.serve_wsgi(service.NeutronApiService)
        api_thread = pool.spawn(neutron_api.wait)
 
        try:
           neutron_rpc = service.serve_rpc()</span>
 
      私たちはwsgiのサービスを開始しました。リソースのロードと拡張などの準備ができました。「すべてのものは東風だけが欠けています。」今はスレッドプールのspawnスレッドからneutron appiコマンドをモニターします。ここでneutron apiコマンドが来たら、最後にneutron.apper.v.2.baseのControllerにルーティングして処理します。
 
      メイン関数は最後にneutron_を実行します。rpc=service.serve_rpc()はpluginによって実現され、一つ以上のRpcworkerを開始し、要求を監督し、topicsにおけるメッセージ・キューを傍受する。これはneutronの内部コンポーネント間の通信を傍受するためのものと理解しています。
 
これでOpenstack neutronサービスの開始過程におけるリソースのロードと拡張のソースコードの簡単な解析が完了しました。