用法

将 oslo.versionedobjects 整合到您的项目中可以按照以下步骤进行

  1. 将 oslo.versionedobjects 添加到 requirements

  2. 创建 objects 子目录并在其中创建一个 base.py

  3. 使用项目命名空间创建基本对象

  4. 如果需要,创建其他基本对象

  5. 实现对象并将它们放在 objects/*.py 中

  6. 在 objects/fields.py 中实现额外的字段

  7. 创建对象注册表并注册所有对象

  8. 创建并附加对象序列化器

  9. 实现间接 API

将 oslo.versionedobjects 添加到 requirements

要在 OpenStack 项目中使用 oslo.versionedobjects,请记住将其添加到 requirements.txt

创建 objects 子目录并在其中创建一个 base.py

对象位于 <project>/objects 目录中,所有对象都应从此目录导入。

通过在 objects/base.py 中创建以下主要类来开始实现

使用项目命名空间创建基本对象

oslo_versionedobjects.base.VersionedObject

项目的 VersionedObject 基本类。您需要填充 OBJ_PROJECT_NAMESPACE 属性。OBJ_SERIAL_NAMESPACE 仅用于向后兼容,不应在新项目中设置。

如果需要,创建其他基本对象

类:oslo_versionedobjects.base.VersionedPersistentObject

可以创建一个用于持久对象的混合类,定义重复的字段,如 created_atupdated_at。字段在 fields 属性中定义(这是一个字典)。

如果对象先前作为字典传递(一种常见情况),可以使用 oslo_versionedobjects.base.VersionedObjectDictCompat 作为混合类来支持字典操作。

实现对象并将它们放在 objects/*.py 中

应为通过 RPC 作为 ID 或字典传递的所有资源/对象创建对象类,以便

  • 避免数据库(或其他资源)进行额外的调用

  • 传递对象而不是字典,这些对象带有版本标签

  • 在一个地方处理所有对象版本(obj_make_compatible 方法)

为了确保始终可以访问所有对象,您应该在 objects/ 目录中的 __init__.py 中导入它们。

在 objects/fields.py 中实现额外的字段

可以通过继承 oslo_versionedobjects.field.Field 并覆盖 from_primitiveto_primitive 方法来实现新的字段类型。

通过继承 oslo_versionedobjects.fields.AutoTypedField,您可以将多个字段堆叠在一起,确保即使是嵌套数据结构也能得到验证。

创建对象注册表并注册所有对象

oslo_versionedobjects.base.VersionedObjectRegistry

注册所有对象的地方。所有对象类都应使用 oslo_versionedobjects.base.ObjectRegistry.register 类装饰器进行注册。

创建并附加对象序列化器

oslo_versionedobjects.base.VersionedObjectSerializer

要通过 RPC 传输对象,请继承 oslo_versionedobjects.base.VersionedObjectSerializer,并将 OBJ_BASE_CLASS 属性设置为先前定义的 Object 类。

将序列化器连接到 oslo_messaging

serializer = RequestContextSerializer(objects_base.MagnumObjectSerializer())
target = messaging.Target(topic=topic, server=server)
self._server = messaging.get_rpc_server(transport, target, handlers, serializer=serializer)

实现间接 API

oslo_versionedobjects.base.VersionedObjectIndirectionAPI

oslo.versionedobjects 支持 remotable 方法调用。这些是对象方法和类方法的调用,可以根据配置在本地或远程执行。将 indirection_api 设置为对象的属性会将调用通过定义的 RPC API 转发到装饰的方法。indirection_api 的附加应在启动时通过配置处理。

间接 API 的第二个功能是回溯。当对象序列化器尝试反序列化具有未来版本的对象时,当前实例不支持该对象,它会调用 object_backport 方法,尝试将对象回溯到可以正常处理的版本。