The cfg Module

cfg Module来自于OpenStack中的重要的基础组件oslo.config,通过cfg Module能够用来通过命令行或者是配置文件来配置一些options,对于每个选项使用Opt类或者其子类来定义。首先我们来看一个定义option的样例:

example1:
#!/usr/bin/env python
# encoding: utf-8 from oslo_config import cfg
from oslo_config import types # 定义了一个类型和范围
PortType = types.Integer(1,65535) # 定义一组选项
common_opts = [
    #定义了一个Str类型的选项,名字是bind_host。默认值是0.0.0.0,还有帮助信息
    #用的是Opt的子类来定义的,所以无需指定类类型,由于类型已经定下来了就是Str类型
cfg.StrOpt('bind_host',default='0.0.0.0',
help='IP address to listen on.'),
#使用Opt类来定义一个选项,由于用的是基类。类型能够是随意的,所以需要使用type字段明白其类型
#使用这样的方式的优点我认为就是能够定制类型的值范围
cfg.Opt('bind_port',
type=PortType,
default=9292,
help="Port number to listen on.")
]

Opt是父类,其下有非常多特定类型的子类。以下是cfg Module支持的一些类型

oslo_config.types.String
oslo_config.types.Boolean
oslo_config.types.Integer
oslo_config.types.Float
oslo_config.types.List
oslo_config.types.Dict
oslo_config.types.IPAddress

这些类型能够用于在传递给Opt类,定义选型的类型信息,cfg也给我们提供了一系列的特定类型的选项类。能够直接使用这些类来定义相应类型的选项

oslo_config.cfg.StrOpt
oslo_config.cfg.BoolOpt
oslo_config.cfg.IntOpt
oslo_config.cfg.PortOpt
oslo_config.cfg.FloatOpt
oslo_config.cfg.ListOpt
oslo_config.cfg.DictOpt
oslo_config.cfg.IPOpt

我相信一眼就能够看出猫腻,所以这里就不解释了。

cfg Module相同也支持具有多个值的选项。使用oslo_config.cfg.MultiOpt来定义,和oslo_config.cfg.Opt是相对的,前者是支持多个值的选项,后者是支持单个值的在使用MultiOpt类的时候通过设置item_type參数来设置选项的类型。为了方面MultiOpt相同也又很多能够创建特定类型的子类。请看以下这个样例:

example2:
#!/usr/bin/env python
# encoding: utf-8 from oslo_config import cfg
from oslo_config import types DEFAULT_EXTENSIONS = [
'nova.api.openstack.compute.contrib.standard_extensions'
] # cfg.MultiOpt的子类用来定义一个多值的选项。值的类型是str
osapi_compute_extension_opt = cfg.MultiStrOpt('osapi_compute_extension',default=DEFAULT_EXTENSIONS)

个人感觉这个和oslo_config.cfg.ListOpt功能差点儿相同。详细细节咱就不多说了。继续往下看吧。

Registering Options

上文中定义了非常多的选项。可是离真正使用还差一步,那就是注冊。以下的样例演示了怎样去注冊选项和使用选项

example3:
#!/usr/bin/env python
# encoding: utf-8 from oslo_config import cfg
from oslo_config import types PortType = 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.')
]
#注冊选项
def add_common_opts(conf):
conf.register_opts(common_opts)
#使用选项
def get_bind_host(conf):
return conf.bind_host def get_bind_port(conf):
return conf.bind_port #创建配置类
cf = cfg.CONF
#開始注冊
add_common_opts(cf)
print(get_bind_host(cf))

就是这么简单。看起来不错把,也没有想象中的那么复杂,毕竟仅仅是一个配置类,搞的太复杂谁还用啊,功能再强大我也不会用的。

基于命令行配置选项

上面说了那么多。通过Opt类平配置了选项,设置选项的类型,默认值。然后通过CONF类来注冊选项,最后通过CONF类使用注冊的选项,读者有没有认为非常鸡肋这不就是定义一个变量,赋值然后使用嘛,这哪是配置选项啊,文章的开头说了,cfg Module是能够通过命令行来传递配置选项的值,还能够通过配置文件了来传递配置选项的值的,好吧我承认。上面说了那么多事实上都是在讲基础,真正的还没開始呢,首先还是来分析下cfg Module怎样通过命令行来配置选项。看以下这个样例:

example4:
#!/usr/bin/env python
# encoding: utf-8 import sys
from oslo_config import cfg
from oslo_config import types
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) cf = cfg.CONF
add_common_opts(cf);
cf(sys.argv[1:]) #将命令行參数传递给CONF类,argv[0]是程序名,所以从1開始 if cf.debug:
print("开启调试")
else:
print("关闭调试")

完了,这个版本号最终不是鸡肋了,能够通过命令行參数来改变verbos和debug两个选项的值,使用一下把。先help一把,输出例如以下:

usage: example4.py [-h] [--config-dir DIR] [--config-file PATH] [--debug]
[--nodebug] [--noverbose] [--verbose] [--version] optional arguments:
-h, --help show this help message and exit
--config-dir DIR Path to a config directory to pull *.conf files from.
This file set is sorted, so as to provide a predictable
parse order if individual options are over-ridden. The
set is parsed after the file(s) specified via previous
--config-file, arguments hence over-ridden options in
the directory take precedence.
--config-file PATH Path to a config file to use. Multiple config files can
be specified, with values in later files taking
precedence. The default files used are: None.
--debug, -d Print debugging output.
--nodebug The inverse of --debug
--noverbose The inverse of --verbose
--verbose, -v Print more verbose output.
--version show program's version number and exit

尼玛好多东西啊。事实上仅仅有倒数几行是我们定义的选项,这里不解释了,cfg Module帮我们做了非常多设置,比方提供了–nodebug接下来看看怎么设置选项的值把,由于我这里是bool类型,所以直接使用选项–debug就是debug=True。–nodebug就是debug=False。假设什么參数也没有就是debug=False,简单吧。

基于配置文件配置选项

事实上也非常easy了,代码不变。依旧example4部分的代码,相信有的读者已经猜到了,由于上面在执行–help的时候出现了–config-file和–config-dir两个命令行參数这两个的功能就是用来从配置文件加载配置选项的,前者指定一个配置文件,后者则指定一个文件夹下的全部配置文件。这里提供一个配置文件,通过配置文件来执行一下example4中代码:

example4.conf
[DEFAULT]
debug=True
verbose=False
通过以下的命令类加载配置
python example4.py --config-file=example4.conf

简单吧,可是我认为还是有必要解释一下,DEFAULT是一个默认组。默认情况下Opt定义的选项都是属于这个组的。cfg Module给配置选项提供了组的概念。不同的组配置选项是能够反复的。那么让我们看看怎样使用配置组吧。

Option Groups

先来一段代码。看看怎样使用配置组

#!/usr/bin/env python
# encoding: utf-8
#定义了一个名为rabbit的组,记住组的名字也非常重要,后面会用到
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.PortOpt('port',
default=5672,
help='Port number to listen on.')
def register_rabbit_opts(conf):
    #通过CONF类来注冊了一个组。(CONF类啥都要先注冊后使用。注冊事实上就是在CONF类内部做解析呢)
conf.register_group(rabbit_group)
# options can be registered under a group in either of these ways:
#注冊选项的时候通过指定组来把选项加入到特定的组中,指定组能够有例如以下两种方式,一种就是直接使用OptGroup实例的方式
#第二种就是使用配置组的名字这里是rabbit
conf.register_opt(rabbit_host_opt, group=rabbit_group)
conf.register_opt(rabbit_port_opt, group='rabbit')
#没提供group就是默认组DEFAULT

之前仅仅有默认组的时候。在命令行使用–debug就会自己主动去DEFAULT组去找,那么如今加入了一个rabbit组,假设要找rabbit组中的host该怎么通过命令行来指定呢这也是非常方便的直接通过前缀来推断比如–rabbit-host指的就是rabbit组中的host选项。

配置文件句不多说了,定义一个[rabbit]就能够了,怎样在代码中訪问呢,也非常easy。直接使用conf.rabbit.host就能够了。

Special Handling Instructions

说了这么多,是不是感觉cfg Module有点强大,我也这么认为的,这个部分介绍下cfg Module关于选项提供的一些处理指令吧.

  • 设置必需要输入的选项值,假设用户没有提供就会抛出一个错误的异常

    通过在Opt类或者子类中加入required=True这个參数就能够实现了。

  • 设置选型值不计入日志文件里

    cfg Module提供了一个LOG类。能够用户输入的配置选项的值记录到日志文件里,可是对于一些敏感的配置选项值还是不要记录到日志中把。

    能够通过在Opt类或者子类中加入secret=True这个參数就能够实现了。

小结

cfg Module还有非常多细节在本篇文章还未涉及到,可是本文的初衷仅仅是由于作者我在分析OpenStack代码的时候由于对非常多基础库不熟悉。导致分析的时候遇到了非常多困难因此有了本文。希望本文带您入门,至少能够看懂OpenStack中惯关于配置选项的大部分代码,那么我认为本文的目的就达到了。

如要想知道很多其它关于oslo.config的知识请參考以下的链接。

oslo-config doc

OpenStack开发基础-oslo.config的更多相关文章

  1. openstack开发基础

  2. Openstack oslo.config【一】

    OpenStack的项目貌似越来越多了,在Grizzly版之前,每个项目都得实现一套处理配置文件的代码.在每个项目的源码中基本上都可以找到openstack/common/cfg.py,inipars ...

  3. OpenStack配置解析库oslo.config的使用方法

    OpenStack的oslo项目旨在独立出系统中可重用的基础功能,oslo.config就是其中一个被广泛使用的库,该项工作的主要目的就是解析OpenStack中命令行(CLI)或配置文件(.conf ...

  4. 开发人员必读openstack网络基础

    云计算中的网络非常复杂,需要对网络的基础理论有一定的认识和了解,转载网上针对openstack中涉及到网络概念的文章 开发人员必读openstack网络基础1:什么是L2.L3 开发人员必读opens ...

  5. oslo.config

    cfg Module来自于OpenStack中的重要的基础组件oslo.config,通过cfg Module可以用来通过命令行或者是配置文件来配置一些options, 对于每一个选项使用Opt类或者 ...

  6. ASP.Net开发基础温故知新学习笔记

    申明:本文是学习2014版ASP.Net视频教程的学习笔记,仅供本人复习之用,也没有发布到博客园首页. 一.一般处理程序基础 (1)表单提交注意点: ①GET通过URL,POST通过报文体: ②需在H ...

  7. 【SharePoint学习笔记】第1章 SharePoint Foundation开发基础

    SharePoint Foundation开发基础 第1章 SharePoint Foundation开发基础 SharePoint能做什么 企业信息门户 应用程序工具集(文档库.工作空间.工作流.维 ...

  8. SharePoint 2010 最佳实践学习总结------第1章 SharePoint Foundation开发基础

    ----前言 这段时间项目出在验收阶段,不是很忙,就潜心把SharePoint学一下,不求有多深刻,初衷只是先入门再说.后续会发布一系列的学习总结.主要学习的书籍为<SharePoint2010 ...

  9. 微信小程序开发基础

    前言: 微信小程序开入入门,如果你有html+css+javascript的基础,那么你就很快地上手掌握的.下面提供微信小程序官方地址:https://developers.weixin.qq.com ...

随机推荐

  1. java jdk 管理工具

    官网:http://www.jenv.be/ 安装: Linux / OS X $ git clone https://github.com/gcuisinier/jenv.git ~/.jenv M ...

  2. PCB MS SQL 行转列(动态拼SQL)

    一.原数据: SELECT inman,indate FROM [fp_db].[dbo].[ppezhpbb] WHERE indate > '2016-5-1' AND indate < ...

  3. Y - Anton and Letters

    Problem description Recently, Anton has found a set. The set consists of small English letters. Anto ...

  4. xhtml1-strict.dtd

    <!-- Extensible HTML version 1.0 Strict DTD This is the same as HTML 4 Strict except for changes ...

  5. VUE-搜索过滤器

    先看看效果 首先引入 <script src="https://cdn.jsdelivr.net/npm/vue"></script> HTML部分 < ...

  6. OPPO R11 R11plus系列 解锁BootLoader ROOT Xposed 你的手机你做主

    首先准备好所有要使用到的文件 下载链接:https://share.weiyun.com/5WgQHtx 步骤1. 首先安装驱动 解压后执行 Install.bat 部分电脑需要禁用驱动程序签名才可以 ...

  7. WEB笔记-CSS 实现多级导航效果

    代码如下 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...

  8. Deutsch lernen (09)

    1. die Rückmeldung, -en 反馈,回馈:(销假)报到 die Rückmeldung zur Arbeit 2. dringend a. 紧急的,急切的 Ich brauche d ...

  9. Embedded之Stack之二

    1 Function Programming languages make functions easy to maintain and write by giving each function i ...

  10. .net mvc DropDownListFor下拉列表使用(验证)方法

    @Html.DropDownListFor(model => model.SchoolId, new SelectList(ViewBag.SelectList, "SchoolTyp ...