openstack新手开发指南.docx
《openstack新手开发指南.docx》由会员分享,可在线阅读,更多相关《openstack新手开发指南.docx(29页珍藏版)》请在冰豆网上搜索。
![openstack新手开发指南.docx](https://file1.bdocx.com/fileroot1/2022-11/20/5fe33af7-7f80-48e2-9fd9-f4033f7f56ec/5fe33af7-7f80-48e2-9fd9-f4033f7f56ec1.gif)
openstack新手开发指南
OpenStack开发指南
目录
1、nova源码架构介绍2
1.1、源码的获取2
1.2、开发环境的搭建2
1.3、nova模块调用介绍6
1.4、nova源码模块功能介绍7
2、数据库表结构的扩展8
2.1、nova表结构的扩展8
2.2、keystone表结构的扩展10
3、resetful接口服务的扩展12
3.1、nova数据库调用接口服务的扩展12
3.2、compute接口的扩展17
3.3、keystone接口服务的扩展20
3.4、基于openstack服务、配置架构自定义服务模块21
4、dashboard源码介绍25
4.1horizon代码模块介绍26
4.2中文化的功能实现26
4.3页面按钮的添加27
4.4列表中下拉菜单的添加29
4.5列表中文字链接的添加29
1、nova源码架构介绍
1.1、源码的获取
openstack的源码可以从安装好的openstack环境上直接copy下来使用,也可以从官网下载(红帽地址:
http:
//repos.fedorapeople.org/repos/openstack/),ubuntu环境下openstack的源码目录为:
/usr/share/pyshared/,这里面的源码安装好后会被外链到/usr/lib/python2.7/dist-packages/,这是python2.7以后的版本的做法,所有的python项目都会采取这种存储方式;centos环境下openstack一般会安装python2.6的环境,所以openstack的源码存储在/usr/lib/python2.6/site-packages/。
1.2、开发环境的搭建
第一步、从官网下载python安装包(http:
//www.python.org/getit/),如果是openstack的环境下开发,可以忽略这一步,因为安装openstack的时候已经自动安装了python环境。
第二步、然后安装开发python程序的IDE,python的程序一般使用PyDev作为开发工具,它可以被集成到eclipse和aptana等IDE中。
PyDev的下载地址:
http:
//pydev.org/download.html,aptana的下载地址:
http:
//aptana.org/,当前发布的是aptana3.0,默认已经集成了PyDev。
当前我使用的是aptana,由于3.0使用的面板背景色是黑色的,我又习惯使用2.0的风格怎么办那,3.0有添加了一个颜色模板的菜单,选择一下“AptanaStudio2.x”就可以了,如下图。
第三步、导入openstack的项目,打开IED,在左边的面板空白处右键,左键点击“import”,如下图:
从弹出的窗口从选择“ExistingFolderAsNewProject”,导入一个文件夹作为一个工程,如下图所示:
然后选择一个openstack项目,比如我当前选择了nova文件夹,起一个工程名,只要自己好记就行,下边的单选框可以不用选,点击完成就行了,如下图:
导入进来的nova目录结构如下图:
1.3、nova模块调用介绍
nova-api:
起到CloudController的作用,主要为所有的API查询提供了一个接口(比如OpenstackAPI,EC2API),引发多数业务流程的活动(如运行一个实例),并实施一些政策(主要是配额检查)。
nova-schedule:
接受一个消息队列的虚拟实例请求,通过算法决定该请求应该在那台主机上运行,这个算法可以由我们指定。
即起到调度器(Scheduler)的作用.
nova-compute:
是一个非常重要的守护进程,负责创建和终止虚拟机实例,即管理着虚拟机实例的生命周期。
该模块内部非常复杂,基本原理是简单的,就是接受来自队列的动作然后执行一些列的系统操作(如启动一个KVM实例),并且更新数据库的状态。
nova-network:
该守护进程跟nova-computeandnova-volume2个模块的功能是相似的。
接受来自队列的任务,然后执行相应的任务对网络进行操作(比如:
安装网桥接口和改变iptable规则)
Queue:
为各个模块之间的通信提供起到一个集线器的作用,即数据交换中心。
目前是采用RabbitMQ,理论上是可以采用任何的基于python ampqlib的AMPQmessagequeue。
SQLdatabase:
存储云基础设施构建时和运行时状态。
包括可用的实例类型,正在使用的实例类型,可用的网络和项目。
理论上,OpenStackCompute是支持所有基于SQL-Alchemy的数据库,但目前广泛使用的数据库主要是Sqlite3,Mysql,PostgreSQL。
Glance:
该项目独立于OpenstackCompute,起到镜像的作用。
在该项目中,主要包括三个部分:
glance-api,glance-registryand镜像存储。
Glance-api接受API调用,glance-registry存储和检索镜像的元数据。
镜像存储Imageblobs。
存储可以选择不同的存储方案,比如用Swift实现存储。
Dashboard:
该项目是一个可选的项目,主要是为开发者等提供API。
1.4、nova源码模块功能介绍
2、数据库表结构的扩展
2.1、nova表结构的扩展
第一步、创建表的数据库结构,创建表结构的文件存在于目录nova.db.sqlalchemy.migrate_repo.versions,当执行nova-managedbsync命令时就会按照这个目录下文件开头的序列号顺序执行。
添加表时只需要实现一个类似的文件,把名字的开头命名为最大序列值加1。
比如我要创建一张表,表名为:
domains,在这个versions下创建一个084_add_domains.py的文件,文件内容如下
#-*-coding:
utf-8-*-
fromsqlalchemyimportBoolean,Column,DateTime,Integer
fromsqlalchemyimportMetaData,String,Table
fromnovaimportlogaslogging
LOG=logging.getLogger(__name__)
defupgrade(migrate_engine):
'''创建表'''
meta=MetaData()
meta.bind=migrate_engine
#生成创建表sql语句
domains=Table('domains',meta,
Column('id',Integer(),primary_key=True,nullable=False),
Column('name',
String(length=255,convert_unicode=False,
assert_unicode=None,
unicode_error=None,_warn_on_bytestring=False)),
Column('ttl',Integer()),
Column('rdtype',
String(length=255,convert_unicode=False,
assert_unicode=None,
unicode_error=None,_warn_on_bytestring=False)),
Column('rdata',
String(length=255,convert_unicode=False,
assert_unicode=None,
unicode_error=None,_warn_on_bytestring=False)),
Column('project_id',
String(length=255,convert_unicode=False,
assert_unicode=None,
unicode_error=None,_warn_on_bytestring=False)),
Column('created_at',DateTime(timezone=False)),
Column('updated_at',DateTime(timezone=False)),
mysql_engine='InnoDB'
)
try:
domains.create()
exceptException,e:
LOG.exception('Exceptionwhilecreatingdomainstable,error'%str(e))
raise
#构造初始化信息
DOMAINDS={
'NS':
dict(name='',rdata='.',rdtype='NS',ttl=86400),
'SOA':
dict(name='',rdata='..2003091812880072008640028800',rdtype='SOA',ttl=86400)}
try:
#逐行插入初始化信息
domain_insert=domains.insert()
forname,valuesinDOMAINDS.iteritems():
domain_insert.execute({'name':
values["name"],
'rdata':
values["rdata"],
'rdtype':
values["rdtype"],
'ttl':
values["ttl"]})
exceptException,e:
LOG.exception('Exceptionwhileseedingdomainstable,error:
%s'%str(e))
raise
defdowngrade(migrate_engine):
'''删除表'''
meta=MetaData()
meta.bind=migrate_engine
domains=Table('domains',meta,autoload=True)
domains.drop()
第二步、生成表结构的模型,nova的表对象模型存在于nova.db.sqlalchemy.migrate_repo.models.py文件中,需要在这里面添加一个实现类,位置无所谓,但一般新添加的都放到文件的最末尾,这里我添加一个domains的模型类,代码如下:
classDomain(BASE,PhysicalBase):
"""虚拟机主机名"""
__tablename__="domains"
id=Column(Integer,primary_key=True)
name=Column(String(255))
ttl=Column(Integer)
rdtype=Column(String(255))
rdata=Column(String(255))
project_id=Column(String(255))
第三步、实现表查询,因为nova使用的事sqlalchemy,所以查询只需要按照它的规则构造就行,数据库查询的方法都在nova.db.sq