(二)、Openstack 之 oslo.config

来源:互联网 发布:spss mac 价格 编辑:程序博客网 时间:2024/05/19 12:29

最近在看NOVA源代码,发现经常用到Oslo.config这个组件。Oslo.config组件,主要是来负责CLI和CONF配置项的解析。

在老版本之前,这个功能都是是放在cfg模块中的,但是后来社区老大决定将OpenStack中的一些共性剥离出来,统一放在Oslo模块中。

估计以后如果要开发其他的OpenStack组件,都得用到这个模块了,所以今天重点来学习一下。

可能讲的比较粗浅,具体可以去oslo.config官方文档细细的研究。

下面说明一下用法:

在Oslo的cfg模块载入的时候(from Oslo.config import cfg),会自动运行模块中的载入代码CONF = ConfigOpts(),创建一个全局的配置项管理类。

和许多Conf配置模块一样,Oslo.conf在使用时,需要先声明配置项的名称、定义类型、帮助文字、缺省值等,然后再按照事先声明的配置项,对CLI或conf中的内容进行解析。

配置项声明结构示例如下(官方文档例子):

from oslo.config import cfgfrom oslo.config import typesPortType = types.Integer(1, 65535)common_opts = [    cfg.StrOpt('bind_host',               default='0.0.0.0',               help='IP address to listen on.'),    cfg.Opt('bind_port',            type=PortType(),            default=9292,            help='Port number to listen on.')]

除此之外还有很多其他的类型 integers, floats, booleans, lists, ‘multi strings’ 、‘key/value pairs’等等。 如下例子:
enabled_apis_opt = cfg.ListOpt('enabled_apis',                               default=['ec2', 'osapi_compute'],                               help='List of APIs to enable by default.')DEFAULT_EXTENSIONS = [    'nova.api.openstack.compute.contrib.standard_extensions']osapi_compute_extension_opt = cfg.MultiStrOpt('osapi_compute_extension',                                              default=DEFAULT_EXTENSIONS) 
config manager 会在运行的时候 注册 刚才设定的配置,
class ExtensionManager(object):    enabled_apis_opt = cfg.ListOpt(...)    def __init__(self, conf):        self.conf = conf        self.conf.register_opt(enabled_apis_opt) #注册options        ...    def _load_extensions(self):        for ext_factory in self.conf.osapi_compute_extension:            ....

类型的定义对应Opt的各个子类。

Oslo使用register_opt方法,将配置项定义向配置项管理类configOpts的注册是在程序的运行时刻,但是必须在配置项的引用前完成。

使用conf.register_cli_opts()方法,配置项还可以在管理类ConfigOpts中可选注册为CLI配置项,通过程序运行的CLI参数中获得配置项取值,并在错误打印时,自动输出给CLI配置项参数的帮助文档。

cli_opts = [    cfg.BoolOpt('verbose',                short='v',                default=False,                help='Print more verbose output.'),    cfg.BoolOpt('debug',                short='d',                default=False,                help='Print debugging output.'),]def add_common_opts(conf):    conf.register_cli_opts(cli_opts)

conf配置文件采用的是ini风格的格式:

glance-api.conf:
  [DEFAULT]  bind_port = 9292glance-common.conf:  [DEFAULT]  bind_host = 0.0.0.0


最后通过ConfigOpts类的__call()__方法,执行配置项的解析以及从CLI或配置文件读取配置项的值。


class ConfigOpts(object):    def __call__(self, ...):        opts = [            MultiStrOpt('config-file',                    ...),            StrOpt('config-dir',                   ...),        ]        self.register_cli_opts(opts)
0 0
原创粉丝点击