计量标签规则的源和目标过滤¶
本规范为 Neutron 计量标签规则添加源和目标过滤选项。
问题描述¶
Neutron 计量标签规则有一个名为“remote-ip-prefix”的参数,该参数允许运营商根据远程 IP 地址过滤流量。然而,自[1]以来,其含义被更改为完全相反,这造成了一些混淆。它不是匹配远程前缀(朝向外部接口),而是匹配本地前缀(朝向 OpenStack 租户网络)。
理想情况下,为了满足[1]中提出的用例(通过反转“remote-ip-prefix”的使用来实现),运营商应该能够基于 local-ip-prefix 和 remote-ip-prefix 创建规则。
提议的变更¶
正如在批准了本规范的 RFE [2] 的 Neutron 驱动程序计量中讨论的那样,我们将弃用 Neutron 计量 API 的 remote-ip-prefix 参数。
因此,我们将在此规范中在 Neutron 计量规则 API 中引入两个新参数。这两个新参数将分别称为“source_ip_prefix”和“destination_ip_prefix”(类似于 IPtables)。“remote_ip_prefix”的行为将保持不变,但我们将修复其文档并在未来的版本中将其标记为删除 [1]。
“source_ip_prefix”和“destination_ip_prefix”可以一起使用,或者只定义其中一个。但是,计量规则必须始终定义至少一个(source_ip_prefix 或 destination_ip_prefix)。另一方面,这两个新参数不允许与“remote_ip_prefix”一起使用。
API JSON¶
“v2.0/metering/metering-label-rules”端点的当前 JSON
{
"remote_ip_prefix": "192.168.0.14/32",
"direction": "egress",
"metering_label_id": "9ffd6512-9d2a-4dd2-9657-6a605126264d",
"id": "f1694467-d866-4d8e-a8dc-18da516caedc",
"excluded": false
}
添加新属性
{
"source_ip_prefix": "192.168.0.14/32",
"destination_ip_prefix": "0.0.0.0/0",
"direction": "egress",
"metering_label_id": "9ffd6512-9d2a-4dd2-9657-6a605126264d",
"id": "f1694467-d866-4d8e-a8dc-18da516caedc",
"excluded": false
}
数据库表更改¶
当前,表“meteringlabelrules”定义如下
+-------------------+--------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------------+--------------------------+------+-----+---------+-------+
| id | varchar(36) | NO | PRI | NULL | |
| direction | enum('ingress','egress') | YES | | NULL | |
| remote_ip_prefix | varchar(64) | YES | | NULL | |
| metering_label_id | varchar(36) | NO | MUL | NULL | |
| excluded | tinyint(1) | YES | | 0 | |
+-------------------+--------------------------+------+-----+---------+-------+
我们将向其中添加两个新字段。因此,它将如下所示
+-----------------------+--------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------------+--------------------------+------+-----+---------+-------+
| id | varchar(36) | NO | PRI | NULL | |
| direction | enum('ingress','egress') | YES | | NULL | |
| remote_ip_prefix | varchar(64) | YES | | NULL | |
| source_ip_prefix | varchar(64) | YES | | NULL | |
| destination_ip_prefix | varchar(64) | YES | | NULL | |
| metering_label_id | varchar(36) | NO | MUL | NULL | |
| excluded | tinyint(1) | YES | | 0 | |
+-----------------------+--------------------------+------+-----+---------+-------+
Neutron 计量代理程序变更¶
计量代理程序中的 IPtables 驱动程序需要正确处理新的参数“source_ip_prefix”和“destination_ip_prefix”。在构建 IPtable 规则时,如果定义了“destination_ip_prefix”参数,将使用选项“-d”(IPtables 选项)。另一方面,如果定义了“source_ip_prefix”参数,将使用选项“-s”(IPtables 选项)。
验证¶
为了简化验证,我们建议删除新字段的重叠 IP_prefixes 验证(对于远程 IP 前缀,将保持不变)。删除背后的原因是,如果运营商想以某种方式创建重叠的规则,我们不应该阻止他们(可能存在需要它的业务逻辑)。
我们将实施以下验证:* 源 IP 前缀必须是有效的 IPv4 CIDR * 目标 IP 前缀必须是有效的 IPv4 CIDR * 每个计量标签规则都需要至少提供源、目标或远程 IP 前缀。远程 IP 前缀已被标记为已弃用。因此,一旦将其删除,用户将不得不输入至少源或目标 IP 前缀。也可以同时使用两者(源和目标 IP 前缀)来构建规则。* 源和目标 IP 前缀不能与远程 IP 前缀一起使用。
API 影响¶
将引入两个新参数,但它们不是必需的。因此,使用它们的人不会立即受到影响。但是,当删除“remote_ip_prefix”时,人们可能会遇到问题。因此,一旦提供使用新方法构建规则的方法,人们将被鼓励使用它,而不是“remote_ip_prefix”计量规则库。
负责人¶
- 主要负责人
Rafael <rafael@apache.org>
其他贡献者
工作项¶
以下是计划发布的工作项。
弃用远程 IP 前缀 (Neutron-lib)
弃用远程 IP 前缀
修复文档
添加源和目标属性 (Neutron-lib) – 通过 [3] 执行
在 api/definitions/metering.py 中添加新属性
修复示例和文档的 JSON
弃用远程 IP 前缀 (Neutron)
弃用远程 IP 前缀
修复文档
当人们使用它时记录警告
更改 Neutron 和 Neutron 计量代理程序中的执行流程以使用新字段。(Neutron)
在 objects.metering.MeteringLabelRule 和 neutron/db/models/metering.MeteringLabelRule 中添加新的 DB 字段
neutron/db/migration/alembic_migrations/versions/victoria 中的 DB 脚本
实际实现以使用新属性,以及单元测试
使用新字段更新 API 的文档
弃用远程 IP 前缀 (OpenStack SDK)
弃用远程 IP 前缀
修复文档
当人们使用它时记录警告
弃用远程 IP 前缀 (OpenStack python 客户端)
弃用远程 IP 前缀
修复文档
当人们使用它时记录警告
添加新字段 (OpenStack SDK)
添加新字段
修复文档
添加新字段 (OpenStack python 客户端)
添加新字段
修复文档
在完成所有这些项目后,在未来的版本中,我们需要执行以下删除项目。
删除远程 IP 前缀 (Neutron-lib)
修复示例和文档的 JSON
删除远程 IP 前缀 (Neutron)
修复文档
删除远程 IP 前缀 (OpenStack SDK)
修复文档
删除远程 IP 前缀 (OpenStack python 客户端)
修复文档
依赖项¶
无