OpenStack新手开发指南

  • 格式:docx
  • 大小:648.64 KB
  • 文档页数:26

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.1 horizon代码模块介绍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有添加了一个颜色模板的菜单,选择一下“Aptana Studio 2.x”就可以了,如下图。 第三步、导入openstack的项目,打开IED,在左边的面板空白处右键,左键点击“import”, 如下图:

从弹出的窗口从选择“Existing Folder As New Project”,导入一个文件夹作为一个工程,如下图所示:

然后选择一个openstack项目,比如我当前选择了nova文件夹,起一个工程名,只要自己好记就行,下边的单选框可以不用选,点击完成就行了,如下图: 导入进来的nova目录结构如下图: 1.3、nova模块调用介绍 nova-api :起到Cloud Controller的作用,主要为所有的API查询提供了一个接口(比如Openstack API ,EC2 API),引发多数业务流程的活动(如运行一个实例),并实施一些政策(主要是配额检查)。 nova-schedule :接受一个消息队列的虚拟实例请求,通过算法决定该请求应该在那台主机上运行,这个算法可以由我们指定。即起到调度器(Scheduler)的作用. nova-compute:是一个非常重要的守护进程,负责创建和终止虚拟机实例,即管理着虚拟

机实例的生命周期。该模块内部非常复杂,基本原理是简单的,就是接受来自队列的动作然后执行一些列的系统操作(如启动一个KVM实例),并且更新数据库的状态。 nova-network :该守护进程跟nova-compute and nova-volume 2个模块的功能是相似的。

接受来自队列的任务,然后执行相应的任务对网络进行操作(比如:安装网桥接口和改变iptable规则) Queue:为各个模块之间的通信提供起到一个集线器的作用,即数据交换中心。目前是采用RabbitMQ ,理论上是可以采用任何的基于python ampqlib的AMPQ message queue。 SQL database: 存储云基础设施构建时和运行时状态。包括可用的实例类型,正在使用的实例类型,可用的网络和项目。理论上,OpenStack Compute是支持所有基于 SQL-Alchemy的数据库,但目前广泛使用的数据库主要是Sqlite3,Mysql,PostgreSQL。 Glance:该项目独立于Openstack Compute,起到镜像的作用。在该项目中,主要包括三

个部分: glance-api, glance-registry and 镜像存储。Glance-api接受API调用,glance-registry存储和检索镜像的元数据。镜像存储Image blobs。存储可以选择不同的存

储方案,比如用Swift实现存储。 Dashboard:该项目是一个可选的项目,主要是为开发者等提供API。

1.4、nova源码模块功能介绍 2、数据库表结构的扩展 2.1、nova表结构的扩展 第一步、创建表的数据库结构,创建表结构的文件存在于目录nova.db.sqlalchemy.migrate_repo.versions,当执行nova-manage db sync命令时就会按照这个目录下文件开头的序列号顺序执行。添加表时只需要实现一个类似的文件,把名字的开头命名为最大序列值加1。比如我要创建一张表,表名为:domains,在这个versions下创建一个084_add_domains.py的文件,文件内容如下 #-*- coding: utf-8 -*- from sqlalchemy import Boolean, Column, DateTime, Integer from sqlalchemy import MetaData, String, Table from nova import log as logging LOG = logging.getLogger(__name__)

def upgrade(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() except Exception, e: LOG.exception('Exception while creating domains table, error' % str(e)) raise

#构造初始化信息 DOMAINDS = { 'NS': dict(name='test.com', rdata='ns0.test.com.', rdtype='NS', ttl=86400), 'SOA': dict(name='test.com', rdata='test.com. www.test.com. 200309181 28800 7200 86400 28800', rdtype='SOA', ttl=86400)} try: #逐行插入初始化信息 domain_insert = domains.insert() for name, values in DOMAINDS.iteritems(): domain_insert.execute({'name': values["name"], 'rdata': values["rdata"], 'rdtype': values["rdtype"], 'ttl': values["ttl"]}) except Exception, e: LOG.exception('Exception while seeding domains table, error: %s' % str(e)) raise