add-resource-timestamp

https://blueprints.launchpad.net/Neutron/+spec/add-port-timestamp

Neutron 中的网络、子网和端口等资源模型应包含时间戳字段“created_at”和“updated_at”。这两个字段可以方便资源变更的监控任务,而目前这些任务耗时且效率低下。

问题描述

最终用户可能对监控 Neutron 资源或收集特定时间范围内一组资源的统计信息感兴趣,例如,查询在大型应用程序中过去 5 秒内已更改或刷新的端口。在 Neutron 中,我们没有与资源关联的时间戳字段,因此无法根据其运行时间查询它们。

提议的变更

我们建议在资源模型中添加 created_at 和 updated_at 字段。在 sqlalchemy 模型定义中,“default”参数设置为 timeutils.utcnow() 用于 created_at 和 updated_at,因此当创建资源时,sqlalchemy 会自动用资源创建的时间戳填充这两个字段;“onupdate”参数也设置为 timeutils.utcnow() 用于 updated_at,因此当资源更新时,updated_at 将被刷新。所有时间戳字段操作都在数据库端完成,因此插件端不需要额外的工作。

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

数据模型影响

向资源模型添加了两个新属性

属性名称

类型

默认值

必需

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 暴露给用户。如果插件支持,它们将在用户发出资源检索请求时返回。此外,资源列表 API 接受新的查询字符串参数 change_since。用户可以将 ISO 8601 格式的时间戳传递给列表 API uri,以检索自特定时间起操作的资源。

以端口为例,请求 uri 如下

GET /v2.0/ports?changed_since=2015-07-31T00:00:00

以及响应

{
    "ports": [
        {
            "status": "ACTIVE",
            "name": "",
            "allowed_address_pairs": [],
            "admin_state_up": true,
            "network_id": "70c1db1f-b701-45bd-96e0-a313ee3430b3",
            "tenant_id": "",
            "extra_dhcp_opts": [],
            "device_owner": "network:router_gateway",
            "mac_address": "fa:16:3e:58:42:ed",
            "fixed_ips": [
                {
                    "subnet_id": "008ba151-0b8c-4a67-98b5-0d2b87666062",
                    "ip_address": "172.24.4.2"
                }
            ],
            "id": "d80b1a3b-4fc1-49f3-952e-1e2ab7081d8b",
            "security_groups": [],
            "device_id": "9ae135f4-b6e0-4dad-9e91-3c223e385824"
            "created_at": 2015-07-31T11:50:05
            "updated_at": 2015-07-31T11:51:12
        }
    ]
}

安全影响

通知影响

其他最终用户影响

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

以端口为例,命令如下

neutron port-list --changed-since 2015-07-31T00:00:00

性能影响

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

IPv6 影响

其他部署者影响

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

开发人员影响

社区影响

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

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

备选方案

实现

负责人

主要负责人

caizhiyuan1@huawei.com

其他贡献者

待定

工作项

  • 更新数据库模式

  • 添加 API 过滤器

  • 添加相关测试

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

依赖项

测试

Tempest 测试

功能测试

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

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

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

API 测试

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

文档影响

用户文档

更新 Neutron API 参考。

开发人员文档

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

参考资料