天天看點

OpenStack源碼調試之路(3)——配置檔案(configure)一.keystone.conf.configure子產品二.sql.initialize子產品三.keystone.conf.set_config_defaults子產品四.CONF五.setup_logging

前排提示:源碼調試中會涉及很多OpenStack的工具庫(oslo開頭的),建議遇到之後想要了解這些工具庫的,請參考這個部落客的文章,裡面對每個工具庫都有介紹

目錄

一.keystone.conf.configure子產品

二.sql.initialize子產品

三.keystone.conf.set_config_defaults子產品

四.CONF

五.setup_logging

上一篇我們講到了initialize_application主要完成四個工作,現在我們進入第一個,也就是common.configure。這個子產品在/keystone/server/common.py中

def configure(version=None, config_files=None,
              pre_setup_logging_fn=lambda: None):
    keystone.conf.configure()#此函數在/keystone/conf/__init__.py中
    sql.initialize()
    keystone.conf.set_config_defaults()

    CONF(project='keystone', version=version,
         default_config_files=config_files)

    pre_setup_logging_fn()
    keystone.conf.setup_logging()

    if CONF.insecure_debug:
        LOG.warning(
            'insecure_debug is enabled so responses may include sensitive '
            'information.')
           

一.keystone.conf.configure子產品

首先執行的是keystone.conf.configure子產品,此子產品在/keystone/conf/__init__.py中,進入此腳本

def configure(conf=None):
	#CONF是一個oslo_config.cfg.ConfigOpts對象
    if conf is None:
        conf = CONF

    conf.register_cli_opt(
        cfg.BoolOpt('standard-threads', default=False,
                    help='Do not monkey-patch threading system modules.'))
    conf.register_cli_opt(
        cfg.StrOpt('pydev-debug-host',
                   help='Host to connect to for remote debugger.'))
    conf.register_cli_opt(
        cfg.PortOpt('pydev-debug-port',
                    help='Port to connect to for remote debugger.'))

    for module in conf_modules:
        module.register_opts(conf)

    # register any non-default auth methods here (used by extensions, etc)
    auth.setup_authentication()

    # add oslo.cache related config options
    cache.configure(conf)
           

所有的配置工作都是交由oslo_config這個包來完成的,這個包的目的就是作為一個通用工具,專門負責配置檔案和指令行給出的參數的處理,具體可以參考一下這篇文章。這個子產品源代碼也在/usr/lib/python2.7/dist-packages/下。

首先需要說明的就是CONF = cfg.CONF這個對象(所有的OpenStack配置都放于這個全局變量中,論壇中開始也讨論過為什麼要使用這個全局變量,後來就成了約定),簡單來說,它就是一個全局變量,裡面會記錄我們所有的配置資訊,首先代碼會根據指令行和配置檔案來設定這個變量,完成以後,就可以通過這個變量擷取到我們配置的值。

configure中,首先對指令行輸入的參數就行配置,主要由三個register_cli_opt完成,主要是運作線程和調試ip端口的配置。

完成之後便對一系列子產品就行配置,這些子產品都定義在keystone/conf下,每個子產品都代表了一個group,裡面定義了這個group包含的配置項,這部分不了解請把上面那篇關于oslo_config的文章看了就明白了。

之後再進行authentication配置,上面循環中對每個子產品依次注冊時已經有過auth的注冊,但都是注冊的預設認證方式,這裡相當于提供擴充,如果使用者需要使用自定義認證方式,就需要在這裡注冊,同時還需要注冊對應的插件,我們安裝的OpenStack沒有使用第三方認證,是以這裡相當于什麼也沒做。

最後一步執行cache.configure注冊與OpenStack緩存相關的東西,OpenStack的緩存由oslo_cache子產品負責。

這部分代碼如下圖所示:

OpenStack源碼調試之路(3)——配置檔案(configure)一.keystone.conf.configure子產品二.sql.initialize子產品三.keystone.conf.set_config_defaults子產品四.CONF五.setup_logging

二.sql.initialize子產品

接下來是sql.initialize子產品,從字面意思來看,應該是初始化資料庫了。initialize子產品位于/keystone/common/sql/core.py中,如果單從import處看,還真找不到,這就是為什麼一定要斷點調試的原因了。此子產品會調用oslo_db子產品來具體處理初始化操作,其中也是首先會注冊與配置資料庫相關的項,然後會涉及到一個叫osprofiler的子產品,這個子產品與OpenStack性能調優有關,就是用于采集系統的各種運作狀态,然後存入ceilometer、redis、mongodb、elasticsearch等後端,作為系統的監控資料,是以這裡就在資料庫配置項注冊時一起注冊了osprofiler相關配置項。這部分代碼結構如下圖所示:

OpenStack源碼調試之路(3)——配置檔案(configure)一.keystone.conf.configure子產品二.sql.initialize子產品三.keystone.conf.set_config_defaults子產品四.CONF五.setup_logging

三.keystone.conf.set_config_defaults子產品

keystone.conf.set_config_defaults子產品和前面提到的configure子產品位于同一腳本中,首先對日志配置項進行注冊和設定預設值,然後進行一些額外的設定,包括middleware相關的配置項設定,這裡隻設定預設值,不注冊,注冊要等到loadapp才做,不清楚為什麼會這樣,然後是profiler相關的,這和上面是一樣的,最後就是将是否開啟cache設定為True。這部分代碼如下所示:

OpenStack源碼調試之路(3)——配置檔案(configure)一.keystone.conf.configure子產品二.sql.initialize子產品三.keystone.conf.set_config_defaults子產品四.CONF五.setup_logging

四.CONF

此函數的功能就是根據傳入的配置檔案來設定剛才注冊的一堆配置項的值,這裡将會覆寫原先設定的預設值。

五.setup_logging

根據配置檔案,設定logging,具體會用到oslo工具中的日志工具。

至此,配置完成,整個代碼結構圖太複雜,放上來看不清,這裡放一個百度腦圖的架構圖:

http://naotu.baidu.com/file/7e182832e790d50c5b8052e6e80a2555?token=34c23af2f25c2bf7

好了,配置就講到這裡,總的來說,就是讀取配置檔案keystone.conf和指令行參數,作相應的配置。下篇我們跟蹤setup_backends,這應該是最關鍵的代碼,包括了怎麼加載application。

繼續閱讀