A brief overview of Nova’s new object model

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

nova/db/sqlalchemy/api.py

def instance_get_by_uuid(context, uuid, columns_to_join=None):

 

nova/conductor/api.py:

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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值