ironic db alembic

来源:互联网 发布:唐氏筛查自动计算软件 编辑:程序博客网 时间:2024/06/05 08:58

前面说nova的时候说过数据库的部分,nova用的是oslo.db中的类用来更新和迁移数据库,在nova/db/sqlalchemy/migrate_repo/versions中按序号由小到大编号,进行改动,

复写upgrade和downgrade来在不同版本的数据库之间进行变动。前面也说过ironic作为新的openstack模块,在快速搭建的过程中,用到了更多开源的东西,除了好用,最主

要的我认为还是快速,比较突出的一个是用了pecan的框架迅速架起了rest api的框子,同时对比较麻烦的数据库部分则用了alembic!没有和其他模块一样用oslo.db。


在nova等模块中db中的version是按照xxxx_yyy的形式出现的,其中xxxx表示的是改动的版本,nova的基准是215,之后每回有改动则依次递增。

在ironic中由于引入了alembic,一定程度上配置的部分多了,但变动似乎更简便了,可以参见mark link 1中简单的介绍,因此在ironic中,db的部分目录结构为:

/db

    /sqlalchemy

          alembic

                  versions         #放置各种版本的script文件

                         xxxxxxx.py   #生成的scripy文件

                  env.py          

                  script.py.mako  #scripy的模板

           alembic.ini   #alembic的配置文件,最主要的是指定了script目录

           api.py      #和其他模块一致

           migration.py   #和其他模块一致

           models.py    #DB的model,和nova等模块一样(backend还是sqlalchemy)


特别需要指出的是,nova中是自己编号数据库的更新版本,而在ironic中,使用了alemic后,版本之间的关系在script中,由:

revision = '21b331f883ef'
down_revision = '2581ebaf0cb2'

像这样的定义出现在alembic/versions/xxxx.py中,而在执行 “

ironic-dbsync --config-file /etc/ironic/ironic.conf create_schema

时发生的动作:

1. 找到script的位置(alembic.ini中指定);

2.根据传进来的revision版本,找到执行script的过程,不传时默认为“head”(最新版本),然后从current的version一直执行到dest(目标版本)的

所有脚本;


btw:openstack的ironic封装了alembic的调用,主要是目录alemic放入openstack之后目录结构变了,其他的改动不多。

在alembic框架下对数据库做修改也很简单:

1. 修改ironic/db/sqlalchemy/models.py,添加自己的table

2. 执行:ironic-dbsync --config-file /etc/ironic/ironic.conf revision --autogenerate -m "description of your action"
INFO  [alembic.migration] Context impl MySQLImpl.
INFO  [alembic.migration] Will assume non-transactional DDL.
INFO  [alembic.autogenerate.compare] Detected added table 'xxx' (这里xxx和yyy均为在models.py中添加的table)
INFO  [alembic.autogenerate.compare] Detected added table 'yyyy'
  Generating /usr/lib/python2.7/site-packages/ironic/db/sqlalchemy/alembic/versions/1800276bacaa_addxxxx.py ... done
注意的是:生成的script的描述是执行命令时"-m" 参数添加的注释所得
这时打开生成的script文件,比如我生成的1800276bacaa_addxxxx.py就能看到自动生成了upgrade和downgrade两个方法了,

生成的模板就是前面提到的“script.py.mako”。


3.执行: ironic-dbsync --config-file /etc/ironic/ironic.conf upgrade
INFO  [alembic.migration] Context impl MySQLImpl.
INFO  [alembic.migration] Will assume non-transactional DDL.
INFO  [alembic.migration] Running upgrade 2fb93ffd2af1 -> 1800276bacaa, add xxx

btw:这里我添加表之后upgrade,默认是升级到head,即最新的version,也可以自己制定


4. 进到mysql数据库,就发现表格已经创建,使用show create table xxx就能看到生成的表格是按照我们预想的得到的。

5. 在ironic/db/api.py以及ironic/db/sqlalchemy/api.py中添加抽象类和具体实现类,具体操作可以参照任意openstack模块的写法。


至此,修改ironic的db已经没有可以了。

mark link:

1. http://windrocblog.sinaapp.com/?p=940


0 0