openstack源码阅读笔记2 配置与oslo_config

来源:互联网 发布:算法工程师需要学什么 编辑:程序博客网 时间:2024/09/21 09:00

Openstack提取了一些在多数项目中经常使用的功能,做成了共公的包,这些公共包同样在nova中的各个服务模块大量使用。这此公共包都以oslo开头。

在分析具体代码之前,必须先熟悉这些公共包,以下先对这些共公包结合nova做一下分析,以便在分析具体的服务模块代码时,不必再解释公共包的功能。

Oslo_config包用于解析命令行和配置文件中的配置选项。

 

Oslo_config包是对python标准库中argparse包的增强和包装,要理解oslo_config必须理解argparse包。

argparse分为三个步骤,定义选项,解释命令行,反回解释的结果对象。用户利用结果对象就可以查看选项的具体值,结果对象把它看成是一个普通的对象即可,这个对象的属性就是选项名称,值就是解释出来的具体值。

 

而oslo_config包是对argparse的增强,定义选项方面,用Opt类做了包装,更面向对象,并且用一个容器类(ConfigOpts)来包含选项。

解释选项值方面,除了能从命令行中解释出选项的值外,还能从配置文件中解释出选项的值。而解释出来的结果对象,直接存放在ConfigOpts中,并利用ConfigOpts是类dict的对象,使得可以直接像操作字典一样的操作选项值。所以在openstack中,可以直接用CONF.port这样来获取得port这个选项的值。

 

简单结合nova解释一下:

nova.conf包中,

导入了oslo_config包中的cfg模块,并定义了:

CONF = cfg.CONFapi.register_opts(CONF) #而nova.conf.api模块中def register_opts(conf):conf.register_opts(ALL_OPTS) #以上是定义选项。#在nova.cmd.api中from nova importconfigdef main():config.parse_args(sys.argv)#在nova.config中def parse_args(argv, default_config_files=None, configure_db=True,               init_rpc=True):    #省略部分   CONF(argv[1:],         project='nova',         version=version.version_string(),        default_config_files=default_config_files)#以上是解释选项,直接对命令行做解释,且带了配置文件进去。


CONF(…)直接调用CONFCONF是类ConfigOpts的实例,且类定义有__call__方法,CONF(…)就是调用__call__方法。解释完后,会把结果放在CONF._namespace中。

 

引用选项值,我们是直接用:

CONF.optname 或是CONF.groupname.optname

对于这样的引用,会调用类ConfigOpts中的__getattr__方法,最终就是对CONF._namespace中值的提取。

 

补充说明一下:

cfg.CONF是类cfg.ConfigOpts的一个实例。

cfg中有定义:

CONF=ConfigOpts()

从中可知,cfg.CONF是一个模块单例模式的一个应用。在nova运行的过程中,只会存在一个ConfigOpts实例。

再看ConfigOpts类,是一个继承了collections.Mapping的一个类,即你可以把它当成一个dict看待和操作。

 

 

以下是nova对于配置方面的代码结构

nova.conf包,定义了所有相关服务的选项,每个服务一个模块,如api的选项放在

api.py这个模块下,非常清楚,也集中管理。

nova.cmd包,是所有服务的入口点,必然的,会在这里对具体的配置项做解释,从命令行中,从配置文件中取得配置值,然后解释进CONF实例中,后面即可直接用CONF实例引用配置项的值.

 

配置方面相关的代码就是以上部分,非常容易仿照使用。

0 0
原创粉丝点击