Glance 源码分析(2) – 配置文件

问题导读
1、 glance-api 会读取哪些配置文件?
2、glance 中的配置文件通过什么来调用的?

3、 python paste 模块如何使用?

这里我们会分析 glance-api 读取以下两个配置文件

  • glance-api.conf: glance-api 的用户配置文件
  • glance-api-paste.ini: glance-api 的 WSGI 配置文件
glance-api.conf
该配置文件的读取是利用 oslo 模块来实现的, oslo 提供了 .ini 格式的配置 文件的解析, 被所有 OpenStack 模块用来解析配置文件.

oslo 的用法很简单, 下面举个简单的例子:



  • from oslo.config import cfg

  • default_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')
  • ]

  • app_opt = cfg.StrOpt('name',
  •                      default='blog',
  •                      help='name of this app')

  • # cfg.CONF 是在 oslo.cfg 模块中的一个全局变量, 首先我们需要得到一个它的引用
  • # 然后调用 register_opt() 注册我们需要解析的配置项, 或者使用 register_opts()
  • # 同时注册多个配置项
  • # 如果配置文件中可以找到配置项, 那么使用配置项中的值, 不然使用注册该配置项时指定
  • # 的默认值
  • CONF = cfg.CONF
  • CONF.register_opt(app_opt, group='app')
  • CONF.register_opts(default_opts)
  • CONF(default_config_files=['app.conf'])

  • # 使用的时候可以用 CONF.cfgname 来使用, 如果该 cfgname 不在 [DEFAULT] 段下,
  • # 那么使用 CONF.section.cfgname 来引用
  • print CONF.items()
  • print CONF.app.name
  • print CONF.bind_host
  • print CONF.bind_port
  • from oslo.config import cfg

  • default_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')
  • ]

  • app_opt = cfg.StrOpt('name',
  •                      default='blog',
  •                      help='name of this app')

  • # cfg.CONF 是在 oslo.cfg 模块中的一个全局变量, 首先我们需要得到一个它的引用
  • # 然后调用 register_opt() 注册我们需要解析的配置项, 或者使用 register_opts()
  • # 同时注册多个配置项
  • # 如果配置文件中可以找到配置项, 那么使用配置项中的值, 不然使用注册该配置项时指定
  • # 的默认值
  • CONF = cfg.CONF
  • CONF.register_opt(app_opt, group='app')
  • CONF.register_opts(default_opts)
  • CONF(default_config_files=['app.conf'])

  • # 使用的时候可以用 CONF.cfgname 来使用, 如果该 cfgname 不在 [DEFAULT] 段下,
  • # 那么使用 CONF.section.cfgname 来引用
  • print CONF.items()
  • print CONF.app.name
  • print CONF.bind_host
  • print CONF.bind_port

    1. # file: app.conf
    2. [DEFAULT]
    3. bind_port = 8080
    4. [app]
    5. name = test
  • from oslo.config import cfg

  • default_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')
  • ]

  • app_opt = cfg.StrOpt('name',
  •                      default='blog',
  •                      help='name of this app')

  • # cfg.CONF 是在 oslo.cfg 模块中的一个全局变量, 首先我们需要得到一个它的引用
  • # 然后调用 register_opt() 注册我们需要解析的配置项, 或者使用 register_opts()
  • # 同时注册多个配置项
  • # 如果配置文件中可以找到配置项, 那么使用配置项中的值, 不然使用注册该配置项时指定
  • # 的默认值
  • CONF = cfg.CONF
  • CONF.register_opt(app_opt, group='app')
  • CONF.register_opts(default_opts)
  • CONF(default_config_files=['app.conf'])

  • # 使用的时候可以用 CONF.cfgname 来使用, 如果该 cfgname 不在 [DEFAULT] 段下,
  • # 那么使用 CONF.section.cfgname 来引用
  • print CONF.items()
  • print CONF.app.name
  • print CONF.bind_host
  • print CONF.bind_port

  • 那么问题来了… 前面讲过, glance 中的配置文件通过 config.parse_args() 来调用的, 也就是所有的配置都是在 glance.common.config:parse_args() 中完成的, 通过上面的分析, 这个函数其实很简单, 这里就不深入探讨了. 总之, 以后, glance 的各个模块在想访问用户提供的配置的时候, 只需要使用类似以下的代码就可以了:
    1. from oslo.config import cfg
    2. CONF = cfg.CONF
    3. print CONF.enable_v2_api
  • from oslo.config import cfg

  • default_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')
  • ]

  • app_opt = cfg.StrOpt('name',
  •                      default='blog',
  •                      help='name of this app')

  • # cfg.CONF 是在 oslo.cfg 模块中的一个全局变量, 首先我们需要得到一个它的引用
  • # 然后调用 register_opt() 注册我们需要解析的配置项, 或者使用 register_opts()
  • # 同时注册多个配置项
  • # 如果配置文件中可以找到配置项, 那么使用配置项中的值, 不然使用注册该配置项时指定
  • # 的默认值
  • CONF = cfg.CONF
  • CONF.register_opt(app_opt, group='app')
  • CONF.register_opts(default_opts)
  • CONF(default_config_files=['app.conf'])

  • # 使用的时候可以用 CONF.cfgname 来使用, 如果该 cfgname 不在 [DEFAULT] 段下,
  • # 那么使用 CONF.section.cfgname 来引用
  • print CONF.items()
  • print CONF.app.name
  • print CONF.bind_host
  • print CONF.bind_port

  • glance-api-paste.ini
    该内容和 glance 无关, 只要搞懂了 python paste 模块的用法, 就很简单了. 关于 paste 模块的使用说明, 请参考 python paste.deploy 探索
  • from oslo.config import cfg

  • default_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')
  • ]

  • app_opt = cfg.StrOpt('name',
  •                      default='blog',
  •                      help='name of this app')

  • # cfg.CONF 是在 oslo.cfg 模块中的一个全局变量, 首先我们需要得到一个它的引用
  • # 然后调用 register_opt() 注册我们需要解析的配置项, 或者使用 register_opts()
  • # 同时注册多个配置项
  • # 如果配置文件中可以找到配置项, 那么使用配置项中的值, 不然使用注册该配置项时指定
  • # 的默认值
  • CONF = cfg.CONF
  • CONF.register_opt(app_opt, group='app')
  • CONF.register_opts(default_opts)
  • CONF(default_config_files=['app.conf'])

  • # 使用的时候可以用 CONF.cfgname 来使用, 如果该 cfgname 不在 [DEFAULT] 段下,
  • # 那么使用 CONF.section.cfgname 来引用
  • print CONF.items()
  • print CONF.app.name
  • print CONF.bind_host
  • print CONF.bind_port



  • from oslo.config import cfg

  • default_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')
  • ]

  • app_opt = cfg.StrOpt('name',
  •                      default='blog',
  •                      help='name of this app')

  • # cfg.CONF 是在 oslo.cfg 模块中的一个全局变量, 首先我们需要得到一个它的引用
  • # 然后调用 register_opt() 注册我们需要解析的配置项, 或者使用 register_opts()
  • # 同时注册多个配置项
  • # 如果配置文件中可以找到配置项, 那么使用配置项中的值, 不然使用注册该配置项时指定
  • # 的默认值
  • CONF = cfg.CONF
  • CONF.register_opt(app_opt, group='app')
  • CONF.register_opts(default_opts)
  • CONF(default_config_files=['app.conf'])

  • # 使用的时候可以用 CONF.cfgname 来使用, 如果该 cfgname 不在 [DEFAULT] 段下,
  • # 那么使用 CONF.section.cfgname 来引用
  • print CONF.items()
  • print CONF.app.name
  • print CONF.bind_host
  • print CONF.bind_port
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值