在nova.db这一块E\F\G\H这几个版本差异不大,但是从G版开始加入了conductor,不允许compute直接访问数据库,所以在compute的代码里调用数据库需要通过conductor。
如果要增加一个新的功能,而且这个功能需要操作数据库,在操作数据库这个方面一般分为两个步骤:一、db模块中的内容编写,主要包括数据表的创建、功能及api的编写;二、compute模块中,对db提供的api调用方法的编写。
推荐优先学习sqlalchemy模块
openstack环境版本:H版(G版类似,F\E版的区别会有说明)
一、db模块中的内容编写
1.描述数据表
nova数据库的创建:
第一次同步nova数据库时的操作:
这个指定的代码在nova.db.sqlalchemy.migration.py中:
因为version=None,所以走到upgrade里,它最后会找到nova.db.sqlalchemy.migrate_repo.versions.133_folsom.py这个文件里面的upgrade方法,代码很长,这里仅截取创建数据表相关的部分:
首先,写一个数据表的结构(以下这个就是nova.instances的表结构):
如果要增加一个新的功能,而且这个功能需要操作数据库,在操作数据库这个方面一般分为两个步骤:一、db模块中的内容编写,主要包括数据表的创建、功能及api的编写;二、compute模块中,对db提供的api调用方法的编写。
推荐优先学习sqlalchemy模块
openstack环境版本:H版(G版类似,F\E版的区别会有说明)
一、db模块中的内容编写
1.描述数据表
nova数据库的创建:
第一次同步nova数据库时的操作:
nova-manage db sync
这个指定的代码在nova.db.sqlalchemy.migration.py中:
def db_sync(version=None): if version is not None: try: version = int(version) except ValueError: raise exception.NovaException(_("version should be an integer")) current_version = db_version() repository = _find_migrate_repo() if version is None or version > current_version: return versioning_api.upgrade(get_engine(), repository, version) else: return versioning_api.downgrade(get_engine(), repository, version)
因为version=None,所以走到upgrade里,它最后会找到nova.db.sqlalchemy.migrate_repo.versions.133_folsom.py这个文件里面的upgrade方法,代码很长,这里仅截取创建数据表相关的部分:
首先,写一个数据表的结构(以下这个就是nova.instances的表结构):
instances = Table('instances', meta, Column('created_at', DateTime), Column('updated_at', DateTime), Column('deleted_at', DateTime), Column('deleted', Boolean), Column('id', Integer, primary_key=True, nullable=False), Column('internal_id', Integer), Column('user_id', String(length=255)), Column('project_id', String(length=255)), Column('image_ref', String(length=255)), Column('kernel_id', String(length=255)), Column('ramdisk_id', String(length=255)), Column('server_name', String(length=255)), Column('launch_index', Integer), Column('key_name', String(length=255)), Column('key_data', MediumText()), Column('power_state', Integer), Column('vm_state', String(length=255)), Column('memory_mb', Integer), Column('vcpus', Integer), Column('hostname', String(length=255)), Column('host', String(length=255)), Column('user_data', MediumText()), Column('reservation_id', String(length=255)), Column('scheduled_at', DateTime), Column('launched_at', DateTime), Column('terminated_at', DateTime), Column('display_name', String(length=255)), Column('display_description', String(length=255)), Column('availability_zone', String(length=255)), Column('locked', Boolean), Column('os_type', String(length=255)), Column('launched_on', MediumText()), Column('instance_type_id', Integer), Column('vm_mode', String(length=255)), Column('uuid', String(length=36)), Column('architecture', String(length=255)), Column('root_device_name