添加 Neutron 扩展资源时间戳

https://blueprints.launchpad.net/neutron/+spec/add-neutron-extension-resource-timestamp

Neutron 扩展资源模型,如路由器、浮动 IP、安全组和安全组规则,应包含时间戳字段“created_at”和“updated_at”。这些字段可以使监控变更资源的任务更容易。

问题描述

用户可能希望监控 Neutron 扩展资源或收集特定时间范围内一组资源的统计信息,例如,查询在过去几秒内已更改或刷新的路由器。在 Neutron 中,我们没有时间戳字段来支持此需求。

例如,当路由器接口被更新时,应向 l3 agent 发送通知信息,但如果消息丢失,它将无法知道路由器是否已被更新。在 Neutron 中,没有办法验证信息是否已到达或丢失。

提议的变更

我们建议将 created_at 和 updated_at 字段添加到资源 standardattr 模型中。在 sqlalchemy 模型定义中,“default”参数设置为 timeutils.utcnow() 用于 created_at 和 updated_at,因此当创建资源时,sqlalchemy 将自动用资源创建的时间戳填充这两个字段;“onupdate”参数也设置为 timeutils.utcnow() 用于 updated_at,因此当资源更新时,updated_at 将被刷新。所有时间戳字段操作都在数据库侧完成,因此插件侧不需要额外的工作。如果以下方法效果不佳,我们可以在扩展资源的创建时将时间戳字段添加到 sqlalchemy 模型中,并以相同的方式处理 updated_at。

基于这两个字段,引入了 changed_since 过滤器来检索资源。它接受一个时间戳,Neutron 将返回 updated_at 字段晚于该时间戳的资源。

数据模型影响

目前,HasStandardAttributes 模型已经包含了 created_at 和 updated_at。我们可以重用 timestamp_core 代码来实现。此更改不会影响包含标准属性的其他模型。

属性名称

类型

默认值

必需

CRUD

描述

created_at updated_at

DateTime DateTime

timeutils.utcnow() timeutils.utcnow()

Y Y

R R

创建资源的时间戳 更新资源的时间戳

如上所述,这两个字段由 Neutron 服务器中的 sqlalchemy 维护。用户在创建或更新资源时无需传递这两个值,因此仅提供 CRUD 中的读取操作。

REST API 影响

当用户发出资源检索请求时,将返回 Created_at 和 updated_at。

资源列表 API 将接受新的查询字符串参数 changed_since。用户可以将 ISO 8601 格式的时间戳传递到列表 API uri,以检索自特定时间起操作的资源。

以路由器为例,请求 uri 如下

GET /v2.0/routers?change_since=2015-07-31T00:00:00

以及响应

{
    "router": {
        "status": "ACTIVE",
        "external_gateway_info": {
            "network_id": "85d76829-6415-48ff-9c63-5c5ca8c61ac6",
            "external_fixed_ips": [
                {
                    "subnet_id": "255.255.255.0",
                    "ip": "192.168.10.2"
                }
            ]
        },
        "name": "router1",
        "admin_state_up": true,
        "tenant_id": "d6554fe62e2f41efbb6e026fad5c1542",
        "routes": [],
        "id": "a07eea83-7710-4860-931b-5fe220fae533",
        "created_at": "2015-07-31T11:50:05",
        "updated_at": "2015-07-31T11:51:12",
    }
}

安全影响

通知影响

其他最终用户影响

Neutron python 客户端可以添加帮助信息,以告知用户新的过滤器。Neutron python 客户端支持动态分配搜索字段,因此很容易支持此新过滤器。此外,Neutron python 客户端还需要在显示资源信息时添加这两个新字段。

性能影响

可以提高与监控系统或用户界面等其他系统同步资源状态的性能。与其在每个同步周期内检索所有资源以更新资源状态,这些系统可以使用 changed_since 过滤器仅检索在同步间隔内更新的资源。

IPv6 影响

其他部署者影响

需要配置并启动 NTP 服务以同步节点之间的时间,以便在 created_at 和 updated_at 中保存的时间戳在节点之间有效。

开发人员影响

社区影响

此更改将为监控 Neutron 资源带来便利。实际上,OpenStack 中的大多数项目,如 Nova [1] 都有时间戳字段来跟踪资源的运行时间。

绝对时间戳的一个问题是,由于攻击或故障导致的突然系统时间更改将使以前缓存的时间戳无效。寻求相对时间戳存储策略可能是一个更好的选择,但这超出了此蓝图的范围。

备选方案

实现

负责人

主要负责人

zhaobo6@huawei.com

工作项

  • 更新数据库模式

  • 添加 API 过滤器

  • 添加相关测试

  • 更新 neutron 客户端以支持新的过滤器

依赖项

测试

Tempest 测试

功能测试

  • 测试 created_at 和 updated_at 是否可以正确初始化。

  • 测试资源更新时 updated_at 是否可以正确写入。

  • 测试 changed_since 过滤器是否可以正确应用。

API 测试

测试新的过滤器是否可以正确解析和验证。

文档影响

用户文档

更新 Neutron API 参考。

开发人员文档

更新开发者文档以介绍新的过滤器。

参考资料