跳转到主要内容

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

  • 遵守以下指南

开发指南

  1. 以最可分享的形式提供解决方案

  2. 将可重用功能添加到Wafflehaus整体(参见resource_filter)

  3. 不要在代码中配置;从外部文件配置

  4. 不要依赖于特定的OpenStack项目

  5. 如果您必须依赖于特定的OpenStack项目,请查找相应的wafflehaus 子项目

  6. 每个包都应该有一个README.rst

  7. 在文档中提供您中间件的示例用例

  8. 不要引发异常,返回它们

  9. 如果您能够做到,不要假设存在其他Waffle;如果做不到,请记录下来

  10. 可读的代码比巧妙的代码更受欢迎

返回异常

之所以返回异常而不是引发异常,是因为与eventlet的交互。当引发异常时,它会导致eventlet停止,以便处理异常。

这会与faultwrapper产生某些交互,因为它只捕获引发的异常。如果您依赖于faultwrapper,则可以引发异常,或者如果您正在使用可以访问它的子项目,您可以执行以下操作

from nova.api.openstack import wsgi

return wsgi.Fault(your_exception)

在这种情况下,Waffle位于wafflehaus.nova子项目中(因为它使用了nova库)。

子项目

在某些情况下,不可能完全忽略对项目的依赖。在这些情况下,有针对这些依赖的子项目

如果子项目未在此列出,它可能仍然存在。此外,可以随时创建新的子项目。

由以下支持