oslo_config中的DuplicateOptError坑
前言:
最近在重写公司的Cinder Driver,我们driver是按照OpenStack的要求,依赖一个叫oslo_config的一个包。这个包的作用就是让driver申明所依赖的选项(可以来自文件,也可以来自命令行),oslo_config负责读取文件,并加载。
具体的使用可以参考:
http://www.giantflyingsaucer.com/blog/?p=4822
或者:
http://docs.openstack.org/developer/oslo.config/cfg.html
安装oslo_config:
sudo pip install oslo_config
问题:
重写是把新的代码放到与原来代码的文件和目录里面,所以在一段时间内是,两份代码都会在Cinder的目录里面。新的driver所有option是不变的,于是我把原来的代码拷贝过来,然后小改了下,注意这里的小改,后面会debug我一天的时间!!!
首先,重构前的代码是这样的:
cfg.StrOpt('storage_vnx_pool_names',
deprecated_name='storage_vnx_pool_name',
help='Comma-separated list of storage pool names to be used.'),
改动的地方是把“to be used”去掉,其实保持不变,因为我觉得比较冗余...
改成了
cfg.StrOpt('storage_vnx_pool_names',
deprecated_name='storage_vnx_pool_name',
help='Comma-separated list of storage pool names.'),
然后我的悲剧就开始了:
跑UT的时候 一直报:
oslo_config.cfg.DuplicateOptError: duplicate option: storage_vnx_pool_names
问题分析:
经过不断的分析,发现oslo_config是重写了 __eq__和__ne__来判断两个选项是否一样,如下:
# oslo_config/cfg.py def _is_opt_registered(opts, opt):
"""Check whether an opt with the same name is already registered. The same opt may be registered multiple times, with only the first
registration having any effect. However, it is an error to attempt
to register a different opt with the same name. :param opts: the set of opts already registered
:param opt: the opt to be registered
:returns: True if the opt was previously registered, False otherwise
:raises: DuplicateOptError if a naming conflict is detected
"""
if opt.dest in opts:
if opts[opt.dest]['opt'] != opt:
raise DuplicateOptError(opt.name)
return True
else:
return False
红色就是抛出这个ERROR的地方
# oslo_config/cfg.py class Opt(object):
...
def __ne__(self, another):
return vars(self) != vars(another)
def __eq__(self, another):
return vars(self) == vars(another)
我写了一个测试(代码在github 上)vars是如何进行比较的,dump下的数据如下:
(Pdb) print vars(self)
{'deprecated_for_removal': False, 'short': None, 'name': 'enable', 'dest': 'enable', 'required': False, '_logged_deprecation': False, 'sample_default': None, 'deprecated_opts': [], 'positional': False, 'default': False, 'secret': False, 'deprecated_reason': None, 'mutable': False, 'type': Boolean, 'metavar': None, 'help': 'True enables, False disables'}
(Pdb) print vars(another)
{'deprecated_for_removal': False, 'short': None, 'name': 'enable', 'dest': 'enable', 'required': False, '_logged_deprecation': False, 'sample_default': None, 'deprecated_opts': [], 'positional': False, 'default': False, 'secret': False, 'deprecated_reason': None, 'mutable': False, 'type': Boolean, 'metavar': None, 'help': 'True enables, False disables.'}
注意红色的东西,下面的少了一个句号,于是会返回不相等. 我就是因为改了help里面的东西,所以oslo_config直接认为我在两个不同的option使用了同一个名字.
现在抛出这个错误的原因也很明确了,把两个地方的cfg.StrOpt改成完全一样的就可以了。
参考资料:
http://docs.openstack.org/developer/oslo.config/cfg.html
http://www.giantflyingsaucer.com/blog/?p=4822
oslo_config中的DuplicateOptError坑的更多相关文章
- 整理iOS9适配中出现的坑(图文)
原文: http://www.cnblogs.com/dsxniubility/p/4821184.html 整理iOS9适配中出现的坑(图文) 本文主要是说一些iOS9适配中出现的坑,如果只是要 ...
- Nancy总结(二)记一次Nancy 框架中遇到的坑
记一次Nancy 框架中遇到的坑 前几天,公司一个项目运行很久的Nancy框架的网站,遇到了一个很诡异的问题.Session 对象跳转到另外一个页面的时候,session对象被清空了,导致用户登录不上 ...
- 整理 iOS 9 适配中出现的坑(图文)(转)
作者:董铂然 本文主要是说一些iOS9适配中出现的坑,如果只是要单纯的了解iOS9新特性可以看瞄神的开发者所需要知道的 iOS 9 SDK 新特性.9月17日凌晨,苹果给用户推送了iOS9正式版,随着 ...
- 整理 iOS 9 适配中出现的坑
本文主要是说一些iOS9适配中出现的坑,如果只是要单纯的了解iOS9新特性可以看瞄神的开发者所需要知道的 iOS 9 SDK 新特性.9月17日凌晨,苹果给用户推送了iOS9正式版,随着有用户陆续升级 ...
- 整理 iOS 9 适配中出现的坑(图文)
作者:董铂然 授权本站转载. 本文主要是说一些iOS9适配中出现的坑,如果只是要单纯的了解iOS9新特性可以看瞄神的开发者所需要知道的 iOS 9 SDK 新特性.9月17日凌晨,苹果给用户推送了iO ...
- iOS内购(IAP)中的那些坑
公司的公共库原来并没有这部分的代码,以前做内购是用两个比较有名的github上的第三方库.一个叫MKStoreKit,另一个叫IAPManager,我看了一下写的都很辣鸡,使用起来很不方便,而且写的还 ...
- jquery 的 each 方法中 return 的坑
jquery 的 each 方法中 return 的坑 Chapter 0 在项目中使用 jquery 的 each 方法时想在 each 的循环中返回一个布尔类型的值于是掉进一个坑中... Chap ...
- rabbitmq在ios中实战采坑
1. rabbitmq在ios中实战采坑 1.1. 问题 ios使用rabbitmq连接,没过多久就断开,并报错.且用android做相同的步骤并不会报错,错误如下 Received connecti ...
- python中的这些坑,早看早避免。
python中的这些坑,早看早避免. 说一说python中遇到的坑,躲坑看这一篇就够了 传递参数时候不要使用列表 def foo(num,age=[]): age.append(num) print( ...
随机推荐
- 测试web网站兼容性的方法
随着操作系统,浏览器越来越多样性,导致软件兼容性测试在目前软件测试领域占有很重要的地位,无论是B/S架构还是C/S架构的软件都需要进行兼容性测试,为了充分保证产品的平台无关性,使用户充分感受到软件的友 ...
- JS插件库
http://www.cnblogs.com/xiaoyao2011/category/327551.html
- Flex移动应用程序开发的技巧和窍门(一)
这是一个由多个部分组成的系列文章的第一部分,它包含了Flex移动开发的若干技巧.如果你过去习惯于桌面和Web编程,你会发现,开发移动应用程序将面临一系列新的挑战. 除了重新思考你的对数据存储和处理的策 ...
- WinMerge文件编码设置
http://blog.sina.com.cn/s/blog_7575fab10101o0na.html 系统默认是System codepage,我们要选用Custom codepage.值得注意的 ...
- Excel里函数中的万金油,你确定不要点进来看看?
Excel里函数中的万金油,你确定不要点进来看看? 来源:EXCELHome Excel里有个号称"万能"的函数组合,这个函数组合就是INDEX+SMALL+IF,很多应用场合都能 ...
- json-lib之复杂数据类型的转换
在json字符串转java bean时,一般的对象,可以直接转,如:一个学生类,属性有姓名.年龄等 public class Student{ private String sname; privat ...
- 《JAVASCRIPT高级程序设计》事件委托和模拟事件
由于事件处理程序可以为现代web应用提供交互能力,因此许多开发人员不分青红皂白向页面中添加大量的处理程序:这在某些语言中不会导致问题,但是在javascript,事件处理程序数量直接关系到页面的整体运 ...
- [html5] 学习笔记-Canvas标签的使用
Canvas通过JavaScript来绘制2D图形.Canvas是逐像素渲染的.在Canvas中,一旦图形被绘制完成,它就不会继续得到浏览器的关注.如果其位置发生变化,那么整个场景也需要重新绘制,包括 ...
- Vue框架Element的事件传递broadcast和dispatch方法分析
前言 最近在学习饿了么的Vue前端框架Element,发现其源码中大量使用了$broadcast和$dispatch方法,而Element使用的是Vue2.0版本,众所周知在Vue 1.0升级到2.0 ...
- 特性Attribute 的使用
[IdentityAuthorize] public ActionResult Index() { return View("~/V ...