用法¶
将 oslo.versionedobjects 整合到您的项目中可以按照以下步骤进行
将 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_at、updated_at。字段在 fields 属性中定义(这是一个字典)。
如果对象先前作为字典传递(一种常见情况),可以使用 oslo_versionedobjects.base.VersionedObjectDictCompat 作为混合类来支持字典操作。
实现对象并将它们放在 objects/*.py 中¶
应为通过 RPC 作为 ID 或字典传递的所有资源/对象创建对象类,以便
避免数据库(或其他资源)进行额外的调用
传递对象而不是字典,这些对象带有版本标签
在一个地方处理所有对象版本(obj_make_compatible 方法)
为了确保始终可以访问所有对象,您应该在 objects/ 目录中的 __init__.py 中导入它们。
在 objects/fields.py 中实现额外的字段¶
可以通过继承 oslo_versionedobjects.field.Field 并覆盖 from_primitive 和 to_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 方法,尝试将对象回溯到可以正常处理的版本。