跳转到: 导航, 搜索

Spec-wsgi-mapper

  • Launchpad 条目:NovaSpec:wsgi-mapper
  • 创建:
  • 贡献者:

总结

目前 paste.urlmap 用于组合部分 API 服务器结构。它在路由匹配方面存在局限性(参见 launchpad bug lp:705314),这些局限性应该得到解决。此外,OpenStack API 仍然在内部使用路由器,因为 urlmap 没有考虑到成员操作的 HTTP 动词。

发布说明

使用新的映射机制来替换 paste.urlmap,以便更好地控制 API 服务器的运行方式。

原理

让部署者拥有更多控制权是一件好事。随着我们越来越接近允许 API 扩展,我们需要建立一种机制,让服务提供商构建自定义 API 堆栈。paste.deploy 是一个好的开始,而拥有一个好的映射器可以让我们走得更远。

用户故事

如果我想仅对某些控制器 API(例如 /servers)运行中间件调试,目前我没有这个能力。使用新的映射器,这将成为可能。如果我想用我自己的设计替换一个标准控制器(例如,backup_schedules),这将为这种能力铺平道路。

前提条件

领结很酷。

设计

这将添加一个新的类 nova.wsgi.AppMapper,它将在 API 服务器的 paste 配置的 'use' 指令中被调用。paste.deploy 的配置将几乎相同,但有两个例外。

首先,URL 定义应该可以编译成正则表达式。这将允许更好的部分路由匹配。主机名已经通过正则表达式匹配。最后,我们需要指定应该接受特定控制器成员的正确动词。虽然这可以在控制器本身完成,但目前由 ApiMapper 配置,所以我选择将逻辑保留在路由机制中,而不是将该信息返回给控制器。这还需要考虑到当前正在使用的映射器的 parent_controller 属性。

实施这些更改后,我们可以撤销 ec2 元数据 URL 的补丁(如上述 bug 中所述),并将更多控制器配置移动到 paste 配置文件中。

实现

模仿 paste.urlmap。更改路由匹配的方式,以允许更灵活的部分路由匹配以及用于路由的正则表达式。添加用于成员操作的动词检查,并使用新的配置指令。删除 nova.api.openstack.APIRouter 并通过新的 AppMapper 进行配置。重构 nova.wsgi.Controller 以处理以前由 routes python 包处理的默认操作(index、show 等)的路由工作,我们将不再需要该包。

UI 变更

与其像这样映射

 /2007-10-10: ec2metadata

我们可以使用更简洁的方式

 /20*: ec2metadata

在删除 openstack urlmapper 时,我们将拥有如下配置

 /servers: osapiservers
 /server/(\d+)? as servers_controller: osapiservers
 /server/(\d+)/backup_schedules: osapibackups
 /server/(\d+)/backkup_schedule/(\d+)?:
 servers_controller: post:pause,unpause get:diagnostics,actions

代码变更

如上所述。

迁移

paste 配置文件中的更改将与源代码捆绑在一起。配置将保持向后兼容,但任何已部署应用程序中引用 openstack api 路由器的部分都必须更新。在大多数情况下,人们不会对默认设置进行更改,因此我们可以直接复制新的文件。

测试/演示计划

添加单元测试以检查 AppRouter

  • 正确处理显式路径匹配
  • 正确处理正则表达式路径匹配
  • 正确处理“as NAME”配置指令
  • 正确处理任何 NAME: extra_params 配置
  • 不认为 NAME 指令是显式路径
  • 将请求路由到正确的控制器
  • 确保使用正确的方法处理非标准方法(index、show 等),并将其传递给控制器
  • 确保当使用错误的动词时,会引发异常/错误
  • 在适当的时候修改 PATH_INFO 和 SCRIPT_NAME 变量(参见 paste.urlmap)

添加 Controller 的单元测试

  • 适当地处理标准操作
  • 适当地处理非标准操作

未解决的问题

我不知道我是否只是将操作和动词信息推送到控制器并在基础 Controller 类中处理它,或者实际在 AppRouter 中处理它

BoF 议程和讨论

TODO:使用此部分在 BoF 期间记录笔记;如果将其保留在批准的规范中,请使用它来总结讨论的内容并记录任何被拒绝的选项。