BP 在这儿:
https://blueprints.launchpad.net/nova/+spec/unified-object-model
要解决的问题:
1.新的object model 自身可序列化
2.DB中的object没有版本号,尽管schema本身有,这就导致在旧代码和新schema之间通过rpc传递primitive
DB object时会有问题,新的object model里接口和数据格式都有版本。
3.Conductor 如nova-conductor做DB隔离时,新的object model 可以隐藏对象操作是直接或者通过RPC
def instance_get_by_uuid(context, uuid, columns_to_join=None):
def instance_get_by_uuid
nova compute 访问DB时,可以直接调用DB API,也可以通过RPC调用conduct,object提供了统一接口,隐藏底层实现。
如何在你的程序中实现versionedobject:
首先需要注册object,object数据库包好了object的数据和实现方法,你要做的仅仅需要从NovaObject继承,定义__metaclass__。
要让object真正有用还需要:
1. 定义里面的field和filed类型
2. 为非primitivefield提供序列化和反序列化方法
3. 提供查询该object的类方法
4. 提供save()方法把你的更改写回到DB中
主意,这里并不需要你提供RPC api,versioned object已经为你做好了。
fields = {'foo': int,
'bar': str,
'baz': my_other_type_fn,
}
其中baz不是primitive field,需要提供序列化和反序列化方法:
def _attr_baz_from_primitive(self, value):
returnsomehow_deserialize_this(value) # Do something smart
def _attr_baz_to_primitive(self):
returnsomehow_serialize_this(self.baz) # Do something smart
如何查询/获取object,假设foo是该object的键值:
@remotable_classmethod
def get_by_foo(cls, context, foo):
# Query the underlying database
data =query_database_by_foo(foo)
# Create an instance of ourobject
obj = cls()
obj.foo = data['foo']
obj.bar = data['bar']
obj.baz = data['baz']
# Reset the dirty flags so thecaller sees this as clean
obj.obj_reset_changes()
return obj
不认你是调用本地DB或者通过RPC调用conduct,都可以用统一的方法:
obj = MyObj.get_by_foo(context, 123)
print obj.foo # Prints 123
print obj.bar # Prints the value of bar
# etc...
http://www.danplanet.com/blog/2013/07/12/a-brief-overview-of-novas-new-object-model-part-1/