采用 nova.objects

https://blueprints.launchpad.net/oslo?searchtext=graduate-oslo-versionedobjects

nova.objects 包抽象了用于 RPC 的可版本化的内部对象。

与其将此代码移动到孵化器,我建议我们将其直接移动到一个新的库。该代码已经存在足够长的时间,API 相对稳定。

库名称

oslo.versionedobjects

内容

  • nova/exception.py(进行清理以删除多余的部分;不需要测试)

  • nova/objects/__init__.py

  • nova/objects/base.py

  • nova/objects/fields.py

  • nova/test.py

  • nova/tests/fixtures.py

  • nova/tests/unit/objects/__init__.py

  • nova/tests/unit/objects/test_fields.py

  • nova/tests/unit/objects/test_objects.py

  • nova/tests/unit/test_utils.py(进行清理以删除多余的部分)

  • nova/safe_utils.py(进行清理以删除多余的部分)

  • nova/utils.py(进行清理以删除多余的部分)

早期采用者

这些项目已经在使用了这段代码

  • nova

  • ironic

Ironic 中的差异很小,并且其版本通常略低于 nova,因为只有必要时才会复制新的内容。

公共 API

公共 API 在目前已经相对明确。主要元素包括

  • base.VersionedObject - 要为每个实现进行子类化的基本对象

  • base.remotable - 一个装饰器,用于将对象方法转换为可 RPC 化的内容

  • base.remotable_classmethod - 一个装饰器,用于将类方法转换为可 RPC 化的内容

  • base.ObjectListBase - 一个 mix-in,用于获得对象列表功能

  • base.VersionedObjectSerializer - 一个 oslo.messaging.NoOpSerializer,用于通过网络传输 VersionedObject 对象

以下内容比较特定于 nova,应保留在 Nova 树中(至少目前是这样)

  • base.obj_make_list()

  • base.serialize_args()

  • base.NovaPersistentObject

现在公开(或者,对于一个库来说过于公开)的内容,应该使其变为私有

  • base.make_class_properties()

  • base.get_attrname()

需要一些定义,目前比较晦涩且特定于 nova 的内容

  • base.VersionedObjectMetaclass.indirection_api 接口是 RPC 化的内容被远程化的方式。目前,这是 nova 的 conductor 类,但应该创建一个简单的基类来定义接口,供其他类进行子类化。在 nova 中,我们强制设置了它,但在这个库中,我们应该提供设置/清除 indirection 服务的接口。

注意

服务和 conductor 代码将从初始导入中排除,并且使用它的测试将被注释掉。在发布之前,修复这些测试将是一个高优先级事项。

最后,实现中有一个细节值得在将其编入库之前仔细考虑。现在,简单地继承 NovaObject 将通过元类在注册表中注册该实现。这很方便,因为作者无需立即使用他们的实现。但是,这可能有点“过于神奇”或“过于自动”。如果您想继承 NovaObject 但不注册它,目前没有办法做到。我们可以有一个注销函数,但随后无法避免被注册的短暂窗口。单元测试目前由于此原因而存在一些奇怪之处,用于它们的测试对象。

注册的替代方案是一个简单的类装饰器,您将其应用于希望注册的对象。

实现

负责人

主要负责人

Dan Smith

其他贡献者

Doug Hellmann

主要维护者

主要维护者

Dan Smith

其他贡献者

Chris Behrens

安全联系人

安全联系人

Dan Smith

里程碑

完成目标里程碑:kilo-2

工作项

  • 创建初始仓库

  • 在孵化器中更新 MAINTAINERS,添加状态和名称

  • 删除孵化器中的 Oslo 日志调用

  • 运行 graduate.sh

  • 修复 graduate.sh 的输出

  • 使用 cookiecutter 模板创建一个新项目

  • 同步 nova 中的工具

  • 删除 novaisms

  • 完成将应该私有的内容移动到私有名称

  • 根据评审对注册表进行更改

  • 完成缺少适当文档的公共接口的文档编写

  • 发布 git 仓库

  • Oslo 团队审查新仓库

  • openstack-infra/project-config - gerrit/projects.yaml

  • openstack-infra/project-config - gerrit/acls/openstack/project-name.config

  • openstack-infra/project-config - jenkins/jobs/projects.yaml

  • openstack-infra/project-config - zuul/layout.yaml

  • openstack-infra/project-config - gerritbot/channels.yaml

  • 更新 Gerrit 组和 ACL

  • openstack-infra/devstack-gate - devstack-vm-gate-wrap.sh

  • openstack/requirements projects.txt

  • openstack/governance reference/programs.yaml

  • 更新 Oslo wiki 页面上的库列表

  • 创建 Launchpad 项目

  • 创建 Launchpad 错误跟踪器

  • 创建 Launchpad 蓝图跟踪器

  • 更改 Launchpad 项目的所有者

  • 让库做一些事情

  • 授予 openstackci 在 PyPI 上的 Owner 权限

  • 标记一个发布版本

  • 从 oslo-incubator 中删除已毕业的代码

  • 更新 oslo-incubator/update.py 以不重写对库的引用

  • openstack/requirements - global-requirements.txt

  • 记录迁移过程

  • openstack-dev/devstack - lib/oslo

  • openstack-dev/devstack - stackrc

  • 更新 docs.openstack.org 上的项目列表

  • 修复/更新依赖于 nova 服务代码的测试

采用说明

采用将包括与可能同时进入 Nova 的更改同步,直到 Nova 可以迁移到使用 oslo 库为止。

依赖项

无。

参考资料

导出脚本

#!/bin/bash

# Depends on refactored graduation scripts found
# in https://review.openstack.org/#/c/151027/

set -ex

(cd nova && git checkout master && git pull)
new_repo=oslo.versionedobjects-$(date +%Y-%m-%d-%H%M)
git clone nova $new_repo
cd $new_repo

tooldir=~/repos/openstack/oslo-incubator/tools

FILES="
    nova/exception.py
    nova/objects/__init__.py
    nova/objects/base.py
    nova/objects/fields.py
    nova/test.py
    nova/tests/fixtures.py
    nova/tests/unit/objects/__init__.py
    nova/tests/unit/objects/test_fields.py
    nova/tests/unit/objects/test_objects.py
    nova/tests/unit/test_utils.py
    nova/safe_utils.py
    nova/utils.py
"

$tooldir/filter_git_history.sh $FILES

git mv nova oslo_versionedobjects
git mv oslo_versionedobjects/objects/* oslo_versionedobjects/
rmdir oslo_versionedobjects/objects
git mv oslo_versionedobjects/tests/unit/objects/* oslo_versionedobjects/tests/
rmdir oslo_versionedobjects/tests/unit/objects
git mv oslo_versionedobjects/tests/unit/test_utils.py oslo_versionedobjects/tests/
rmdir oslo_versionedobjects/tests/unit

$tooldir/apply_cookiecutter.sh versionedobjects

cat - >requirements.txt <<EOF
six>=1.7.0
Babel>=1.3
netaddr>=0.7.12
oslo.concurrency>=1.4.1         # Apache-2.0
oslo.context>=0.1.0                     # Apache-2.0
oslo.messaging>=1.4.0,!=1.5.0
oslo.serialization>=1.2.0               # Apache-2.0
oslo.utils>=1.2.0                       # Apache-2.0
iso8601>=0.1.9
EOF

cat - >test-requirements.txt <<EOF
hacking>=0.5.6,<0.8
oslotest>=1.2.0  # Apache-2.0
mock>=1.0
testtools>=0.9.36,!=1.2.0
# These are needed for docs generation
oslosphinx>=2.2.0  # Apache-2.0
sphinx>=1.1.2,!=1.2.0,!=1.3b1,<1.3
EOF

echo
echo "Output in $(pwd)"

exit $?


# oslo-incubator modules:
# versionutils

注意

本作品采用知识共享署名 3.0 非移植许可协议授权。 http://creativecommons.org/licenses/by/3.0/legalcode