To produce a set of Python libraries containing code shared by OpenStack projects. The APIs provided by these libraries should be high quality, stable, consistent, documented and generally applicable.
glance-common.conf:
[DEFAULT]
bind_host = 0.0.0.0
在config manager中,会默认的指定两个值,即--config-file --config-dir,config manager会在没有显示指定这两个参数的情况下去默认的文件夹中查找默认的文件。例如~/.${project}, ~/, /etc/${project},/etc/这几个目录下查找配置文件,如果程序是nova,则会查找默认路径下的nova.conf文件。
在代码中的注释指出,Option values in config files override those on the command line. 即config files中的选项值会覆盖命令行中的选项值。这貌似与潜意识中的相反呀,英文是原话。补充:2013-11-28,经过自己的测试和对源码的阅读,应该是Option values specified on command lines override those in config files,具体参考下一篇的分析。 多个配置文件会按顺序来解析,后面文件中的选项会覆盖前面出现过的选项。
option group
在配置文件中,我们已经看到很多配置选项已经被我们主动的进行了一个分组的划分,没有归属的选项则扔到了default组。同样,在代码中options可以显示的注册某个组中。注册的方式有两种,直接指定group,或者指定group的name,参考下面代码:
rabbit_group = cfg.OptGroup(name='rabbit',
title='RabbitMQ options'))
rabbit_host_opt = cfg.StrOpt('host',
default='localhost',
help='IP/hostname to listen on')
rabbit_port_opt = cfg.IntOpt('port',
default=5672,
help='Port number to listen on')
def register_rabbit_opts(conf):
conf.register_group(rabbit_group)
# options can be registered under a group in either of these ways:
conf.register_opt(rabbit_host_opt, group=rabbit_group)
conf.register_opt(rabbit_port_opt, group='rabbit')
我们需要先定义一个group,指定group的name和title属性,也得将group注册,最后可通过两种方式将options注册到该组中。
若一个group仅只有name属性,那么我们可以不用显示的注册group,例如下面的代码:
def register_rabbit_opts(conf):
# The group will automatically be created, equivalent calling::
# conf.register_group(OptGroup(name='rabbit'))
conf.register_opt(rabbit_port_opt, group='rabbit') option values
若要引用某个option的值,则直接通过访问config manager属性的方式即可。例如,访问default组或者其他的组,可以通过如下的方式:
这一部分只是按照源码中的注释来介绍了下oslo.config的使用,下一篇,将分析cfg.py的代码结构,因为也只有这一个关键的文件,代码在两千行左右,任务不是很重,所以争取将其看仔细,写明白。
在阅读oslo wiki的时候,发现了一个很有趣的问题,Why does oslo.config have a CONF object? Global object SUCK!,看来社区对这个Global Object有很大的争论,导致作者还特意在wiki上做个专门的介绍!我们在使用cfg时,一般都是通过 CONF = cfg.CONF方式来获取这个全局的实例。作者提到在Folsom Design Summit上,有人想remove our dependence on a global object like this,显然,很多争论,结果的结果是,大家达成了一个初步共识,还是坚持使用这种global object的方式。作者还提到了一句话:The idea is that having all projects use the same apporach is more important than the objections to the approach. 不明觉历的模样!这还是强调了OpenStack的projects使用同样的方法更好!具体的回答大家可以点击后面的wiki链接,自己细读。