配置项声明OpenStack源码探秘(二)——Oslo.config

在改章节中,我们主要分析配置项声明的内容,自我感觉有个不错的建议和大家分享下

    OpenStack源码探秘(一)——Nova-Scheduler

    OpenStack源码探秘(二)——Oslo.Config

    

    最近因为一直忙于找任务和办理入职离职等相关手续,好久没有更新博客了。笔者这次换任务最后去了一家互联网公司,酷讯旅游。也是想休会一下互联网公司的文明和理念,学习一些这个领域的知识。任务内容大多是互联网应用的后台系统研发,常用语言是Python。酷讯总体上来讲还是一家不错的公司,管理偏欧美风格,趋向于没有上下级的观点。希望在任务期间也能一如既往,可以留下些自己的印记。今后的业余时间,除了继续不定期的给大家带来OpenStack方面的知识分享,也会做一起互联网方向常用的Python开源项目,比如Tornado等,敬请期待。

    

    明天给大家分析OpenStack中担任CLI和CONF配置项剖析的组件——Oslo.config。E版本前,这个功能是放在cfg模块中的,后来社区中斟酌将OpenStack中共性的组件都剥离出来,同一放在Oslo模块中。今后开发新的OpenStack组件,估计都要用到Oslo模块。

    

    上面说明一下用法:

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

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

    配置项声明结构示例如下:

common_opts = [
    cfg.StrOpt('bind_host',
           default='0.0.0.0',
               help='IP address to listen on'),
    cfg.IntOpt('bind_port',
               default=9292,
               help='Port number to listen on')
]

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

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

    每日一道理
当浮华给予我们过多欺骗,现实中的虚假几乎让我们忘却了真的存在,是真情唤回了迷离的心,是真情带给了我们最纯、最真的感觉,它流露的是美的誓言,渗透的是永恒执著的真爱。
CONF = cfg.CONF
CONF.register_opts(common_opts)

port = CONF.bind_port

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

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

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

    [rabbit]
    host = localhost
    port = 5672
    use_ssl = False
    userid = guest
    password = guest
    virtual_host = /

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

def __call__(self,
             args=None,
             project=None,
             prog=None,
             version=None,
             usage=None,
             default_config_files=None):
    """Parse command line arguments and config files.

    上面是一个完全的示例

from oslo.config import cfg

opts = [
    cfg.StrOpt('bind_host', default='0.0.0.0'),
    cfg.IntOpt('bind_port', default=9292),
]

CONF = cfg.CONF
CONF.register_opts(opts)
CONF(default_config_files='glance.conf')
def start(server, app):
    server.start(app, CONF.bind_port, CONF.bind_host)

    OpenStack项目的配置项声明和很多其他开源Python项目一样,配置项声明是放在各个调用的模块里头的。也就是说哪里用到才到哪里声明。我认为这类方式是完全体现了Pthonic的一种声明方式,有别于其他方式,程序员在阅读程序的时候可以非常方便的在文件开头就能找到配置项的声明定义,而不用到某个指定的文件去查找,实现了KISS的准则。

    

    PS:新公司有个tornado的出产框架,配置项声明全都放在了一个单独的python文件中,有点儿PHP的风格~最近准备优化一下。

    

    

    

    

文章结束给大家分享下程序员的一些笑话语录: 女人篇
  有的女人就是Windows虽然很优秀,但是安全隐患太大。
  有的女人就是MFC她条件很好,然而不是谁都能玩的起。
  有的女人就是C#长的很漂亮,但是家务活不行。
  有的女人就是C++,她会默默的为你做很多的事情。
  有的女人就是汇编虽然很麻烦,但是有的时候还得求它。
  有的女人就是SQL,她会为你的发展带来莫大的帮助。

posted @ 2013-05-19 20:18  xinyuyuanm  阅读(1548)  评论(0编辑  收藏  举报