OpenStack中间件集合
项目描述
Wafflehaus是一个OpenStack的WSGI中间件集合,它以零代码影响的方式添加功能。
每个中间件都被称为一个“瓦夫”。
无论云服务提供商规模大小,处理云的业务需求和与上游代码差异都是一个问题。通过将业务逻辑放入中间件,可以创建特殊情况而不更改上游代码。
不偏离上游的好处是
您不需要处理合并冲突
Wafflehaus的审查过程更短,尤其是如果您创建了分支
尽管您的需求可能不会对OpenStack整体产生好处,但它仍然适合Wafflehaus
除了上述好处之外,使用Wafflehaus的其他好处还包括
您将获得大量预定义的瓦夫,通常可以配置以支持您的特殊情况
Wafflehaus中的所有瓦夫都设计为可以在api-paste.ini文件中配置,因此可以按您希望的任何方式分发(puppet,chef,ansible)
这是一种相当民主且简单的方法来测试新的OpenStack功能和设计,因为如果许多人使用特定的瓦夫,它应该添加到相关项目的功能集中
最后,尽管Wafflehaus旨在与OpenStack一起工作,但它也可以在符合WSGI规范的服务前使用。
获取帮助
Wafflehaus官方支持渠道在freenode的#wafflehaus频道。
使用Wafflehaus
使用Wafflehaus很简单!稳定版本可在pypi上获取,但您也可以使用pip+git安装Wafflehaus。修改您的api-paste.ini以包含您选择的Waffle,并在定义您的应用的复合中添加Waffle。
使用dns_filter的示例
[composite:neutronapi_v2_0] use = call:neutron.auth:pipeline_factory noauth = dns_filter request_id catch_errors extensions neutronapiapp_v2_0 keystone = dns_filter request_id catch_errors authtoken keystonecontext extensions neutronapiapp_v2_0 # This is the waffle [filter:dns_filter] paste.filter_factory = wafflehaus.dns_filter.whitelist:filter_factory whitelist = mydomain.com # Uncomment the line below to activate the waffle # enabled = true
然后重新启动服务(或适用时SIGHUP)。如果您配置中有错误,您会在日志中非常早地看到它,修复它后,您就可以继续工作了。
注意:所有Waffle都未启用,直到显式设置为启用(通过enabled = true配置标志)。这允许您在没有担忧(除了配置是否正确之外)的情况下部署Waffle。
使用运行时重新配置
由于PasteDeploy的工作方式,在CI环境中测试Wafflehaus很困难。服务器需要重新启动才能加载新的配置(api-paste)。运行时重新配置允许您使用头信息更改配置。每个想要支持此功能的Waffle都需要重写WafflehausBase:_override方法,并需要调用基类的__call__。
最后,为了启用此功能,全局配置(nova.conf,neutron.conf)需要以下内容
[WAFFLEHAUS] runtime_reconfigurable = True
所有至少调用基类__call__的Waffle都支持使用以下头信息运行时启用/禁用和测试切换
X_WAFFLEHAUS_CLASSNAME_ENABLED
X_WAFFLEHAUS_CLASSNAME_TESTING
其中CLASSNAME是Waffle类名的upper()。
当前部署的怪癖
目前,所有子项目在其要求文件中都没有包含Wafflehaus。这是因为我们在部署Wafflehaus子项目时遇到了奇怪的怪癖。我们正在努力解决这个问题,但请注意:子项目确实需要安装Wafflehaus。
贡献
期望遵循典型的github-etiquette
遵守以下指南
开发指南
以最可分享的形式提供解决方案
将可重用功能添加到Wafflehaus整体(参见resource_filter)
不要在代码中配置;从外部文件配置
不要依赖于特定的OpenStack项目
如果您必须依赖于特定的OpenStack项目,请查找相应的wafflehaus 子项目
每个包都应该有一个README.rst
在文档中提供您中间件的示例用例
不要引发异常,返回它们
如果您能够做到,不要假设存在其他Waffle;如果做不到,请记录下来
可读的代码比巧妙的代码更受欢迎
返回异常
之所以返回异常而不是引发异常,是因为与eventlet的交互。当引发异常时,它会导致eventlet停止,以便处理异常。
这会与faultwrapper产生某些交互,因为它只捕获引发的异常。如果您依赖于faultwrapper,则可以引发异常,或者如果您正在使用可以访问它的子项目,您可以执行以下操作
from nova.api.openstack import wsgi
return wsgi.Fault(your_exception)
在这种情况下,Waffle位于wafflehaus.nova子项目中(因为它使用了nova库)。
子项目
在某些情况下,不可能完全忽略对项目的依赖。在这些情况下,有针对这些依赖的子项目
如果子项目未在此列出,它可能仍然存在。此外,可以随时创建新的子项目。
wafflehaus-0.3.6.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 0ecd23b24d74f00d8c55979cb5909448e99863f2f42862eb447ddbf96da15a7c |
|
MD5 | 3357e32c235ea5fa3928647b12490fbe |
|
BLAKE2b-256 | 3ad3504b4bdcf768e8fe467098df20c128d157030039572de873d6dc76ba35d2 |