OpenStack新手開發(fā)指南_第1頁
OpenStack新手開發(fā)指南_第2頁
OpenStack新手開發(fā)指南_第3頁
OpenStack新手開發(fā)指南_第4頁
OpenStack新手開發(fā)指南_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

本文格式為Word版,下載可任意編輯——OpenStack新手開發(fā)指南OpenStack新手開發(fā)指南

目錄

1、nova源碼架構(gòu)介紹21.1、源碼的獲取21.2、開發(fā)環(huán)境的搭建21.3、nova模塊調(diào)用介紹61.4、nova源碼模塊功能介紹72、數(shù)據(jù)庫表結(jié)構(gòu)的擴(kuò)展82.1、nova表結(jié)構(gòu)的擴(kuò)展8

2.2、keystone表結(jié)構(gòu)的擴(kuò)展103、resetful接口服務(wù)的擴(kuò)展12

3.1、nova數(shù)據(jù)庫調(diào)用接口服務(wù)的擴(kuò)展123.2、compute接口的擴(kuò)展17

3.3、keystone接口服務(wù)的擴(kuò)展20

3.4、基于openstack服務(wù)、配置架構(gòu)自定義服務(wù)模塊214、dashboard源碼介紹254.1horizon代碼模塊介紹264.2中文化的功能實現(xiàn)264.3頁面按鈕的添加27

4.4列表中下拉菜單的添加294.5列表中文字鏈接的添加29

1、nova源碼架構(gòu)介紹1.1、源碼的獲取

openstack的源碼可以從安裝好的openstack環(huán)境上直接copy下來使用,也可以從官網(wǎng)下載(紅帽地址:/repos/openstack/),ubuntu環(huán)境下openstack的源碼目錄為:/usr/share/pyshared/,這里面的源碼安裝好后會被外鏈到

/usr/lib/python2.7/dist-packages/,這是python2.7以后的版本的做法,所有的python項目都會采取這種存儲方式;centos環(huán)境下openstack一般會安裝python2.6的環(huán)境,所以openstack的源碼存儲在/usr/lib/python2.6/site-packages/。

1.2、開發(fā)環(huán)境的搭建

第一步、從官網(wǎng)下載python安裝包(http://./getit/),假使是openstack的環(huán)境下開發(fā),可以忽略這一步,由于安裝openstack的時候已經(jīng)自動安裝了python環(huán)境。其次步、然后安裝開發(fā)python程序的IDE,python的程序一般使用PyDev作為開發(fā)工具,它可以被集成到eclipse和aptana等IDE中。PyDev的下載地址:

/download.html,aptana的下載地址:/,當(dāng)前發(fā)布的是aptana3.0,默認(rèn)已經(jīng)集成了PyDev。當(dāng)前我使用的是aptana,由于3.0使用的面板背風(fēng)景是黑色的,我又習(xí)慣使用2.0的風(fēng)格怎么辦那,3.0有添加了一個顏色模板的菜單,選擇一下“AptanaStudio2.x〞就可以了,如下圖。

第三步、導(dǎo)入openstack的項目,開啟IED,在左邊的面板空白處右鍵,左鍵點擊“import〞,如下圖:

從彈出的窗口從選擇“ExistingFolderAsNewProject〞,導(dǎo)入一個文件夾作為一個工程,如下圖所示:

然后選擇一個openstack項目,譬如我當(dāng)前選擇了nova文件夾,起一個工程名,只要自己好記就行,下邊的單項選擇框可以不用選,點擊完成就行了,如下圖:

導(dǎo)入進(jìn)來的nova目錄結(jié)構(gòu)如下圖:

1.3、nova模塊調(diào)用介紹

nova-api:起到CloudController的作用,主要為所有的API查詢提供了一個接口(譬如OpenstackAPI,EC2API),引發(fā)多數(shù)業(yè)務(wù)流程的活動(如運行一個實例),并實施一些政策(主要是配額檢查)。

nova-schedule:接受一個消息隊列的虛擬實例請求,通過算法決定該請求應(yīng)當(dāng)在那臺主機(jī)上運行,這個算法可以由我們指定。即起到調(diào)度器(Scheduler)的作用.

nova-compute:是一個十分重要的守護(hù)進(jìn)程,負(fù)責(zé)創(chuàng)立和終止虛擬機(jī)實例,即管理著虛擬機(jī)實例的生命周期。該模塊內(nèi)部十分繁雜,基本原理是簡單的,就是接受來自隊列的動作然后執(zhí)行一些列的系統(tǒng)操作(如啟動一個KVM實例),并且更新數(shù)據(jù)庫的狀態(tài)。nova-network:該守護(hù)進(jìn)程跟nova-computeandnova-volume2個模塊的功能是相像的。接受來自隊列的任務(wù),然后執(zhí)行相應(yīng)的任務(wù)對網(wǎng)絡(luò)進(jìn)行操作(譬如:安裝網(wǎng)橋接口和改變iptable規(guī)則)

Queue:為各個模塊之間的通信提供起到一個集線器的作用,即數(shù)據(jù)交換中心。目前是采用RabbitMQ,理論上是可以采用任何的基于pythonampqlib的AMPQmessagequeue。SQLdatabase:存儲云基礎(chǔ)設(shè)施構(gòu)建時和運行時狀態(tài)。包括可用的實例類型,正在使用的實例類型,可用的網(wǎng)絡(luò)和項目。理論上,OpenStackCompute是支持所有基于SQL-Alchemy的數(shù)據(jù)庫,但目前廣泛使用的數(shù)據(jù)庫主要是Sqlite3,Mysql,PostgreSQL。

Glance:該項目獨立于OpenstackCompute,起到鏡像的作用。在該項目中,主要包括三個部分:glance-api,glance-registryand鏡像存儲。Glance-api接受API調(diào)用,

glance-registry存儲和檢索鏡像的元數(shù)據(jù)。鏡像存儲Imageblobs。存儲可以選擇不同的存儲方案,譬如用Swift實現(xiàn)存儲。

Dashboard:該項目是一個可選的項目,主要是為開發(fā)者等提供API。

1.4、nova源碼模塊功能介紹

elem.set('created')

classMinimalMachinesTemplate(xmlutil.TemplateBuilder):defconstruct(self):

root=xmlutil.TemplateElement('machines')

elem=xmlutil.SubTemplateElement(root,'machine',selector='machines')make_machine(elem)

xmlutil.make_links(root,'machines_links')

returnxmlutil.MasterTemplate(root,1,nsmap=machine_nsmap)

classMachinesTemplate(xmlutil.TemplateBuilder):defconstruct(self):

root=xmlutil.TemplateElement('machines')

elem=xmlutil.SubTemplateElement(root,'machine',selector='machines')make_machine(elem,detailed=True)

returnxmlutil.MasterTemplate(root,1,nsmap=machine_nsmap)

classController(wsgi.Controller):

_view_builder_class=views_machines.ViewBuilder

def__init__(self,**kwargs):

super(Controller,self).__init__(**kwargs)

@wsgi.serializers(xml=MinimalMachinesTemplate)defindex(self,req):

\獲取machines所有實例名字信息\context=req.environ['nova.context']

try:

all_machines=db.machine_get_all(context)exceptexception.Invalidase:

raisewebob.exc.HTTPBadRequest(explanation=str(e))returnself._view_builder.index(req,all_machines)

@wsgi.serializers(xml=MachinesTemplate)defdetail(self,req):

\獲取machine所有列表的詳細(xì)字段信息\

context=req.environ['nova.context']try:

all_machines=db.machine_get_all(context)exceptexception.Invalidase:

raisewebob.exc.HTTPBadRequest(explanation=str(e))

returnself._view_builder.detail(req,all_machines)

defcreate_resource():

returnwsgi.Resource(Controller())

MinimalMachinesTemplate、MachinesTemplate兩個類用來進(jìn)行接口數(shù)據(jù)輸出時json格式的轉(zhuǎn)化,先使用xml定義json的模板。Index方法將在默認(rèn)調(diào)用時顯示,detail顯示詳細(xì)的數(shù)據(jù)參數(shù),調(diào)用時在url的最終添加/detail就行。

req.environ['nova.context']用來獲取請求頭中的用戶信息,只有符合權(quán)限的用戶才能調(diào)用相應(yīng)接口,返回對應(yīng)用戶的數(shù)據(jù)信息。

machine_get_all是nova.db.api.py中的方法,從文件最上邊的模塊導(dǎo)入中可以看到。views_machines.ViewBuilder用來在接口返回時向模板填充數(shù)據(jù)

其次步,實現(xiàn)接口調(diào)用后的展示部分,在pute.views下添加machines.py文件,代碼如下:#-*-coding:utf-8-*-

importos.path

fromnova.api.openstackimportcommonfromnovaimportflagsfromnovaimportutils

FLAGS=flags.FLAGS

classViewBuilder(common.ViewBuilder):

_collection_name=\

defbasic(self,request,machine):return{

\\\\\},}

defshow(self,request,machine):machine2dict={

\

'name':machine.get(\domain_name\

'floating_ip':machine.get(\

\\\}

returndict(machine=machine2dict)

defdetail(self,request,machines):

list_func=self.show

returnself._list_view(list_func,request,machines)

defindex(self,request,machines):list_func=self.basic

returnself._list_view(list_func,request,machines)

def_list_view(self,list_func,request,machines):

machine_list=[list_func(request,machine)[\machines_links=self._get_collection_links(request,machines)machines_dict=dict(machines=machine_list)

ifmachines_links:

machines_dict[\

returnmachines_dict

def_get_links(self,request,identifier):

\return[{

\

\},{

\

\

@staticmethod

def_format_time(date_string):

\ifdate_stringisnotNone:

returndate_string.strftime('%Y-%m-%d%H:%M:%S')

這個文件就屬于web框架中MVC中的頁面展示部分

第三步、實現(xiàn)訪問地址和控制器的路由配置,在pute.__init__.py文件中,添加如下代碼:

fromputeimportmachines

self.resources['machines']=machines.create_resource()mapper.resource(\controller=self.resources['machines'],collection={'detail':'GET'})

第四步、重啟nova-api,執(zhí)行/etc/init.d/nova-apirestart

第五步、調(diào)試接口是否可以正常使用,執(zhí)行命令:curl-XGET-H

\01:8774/v1.1/...178cd1079d/machines,將會調(diào)用pute.machines.py的index方法

curl-XGET-H

\01:8774/v1.1/...79d/machines/detail將會調(diào)用pute.machines.py的detail方法,正常狀況下將會返回數(shù)據(jù)庫中的信息

第六步、編寫python-novaclient客戶端程序,寫好的api接口怎么讓horizon使用哪,這就需要python的客戶端幫忙了,這部分的代碼相對比較簡單。找到novaclient所在的目錄,python2.6可以在/usr/lib/python2.6/site-packages/novaclient中找到源碼,在novaclient.v1.1目錄下添加machines.py文件,代碼如下:#-*-coding:utf-8-*-

fromnovaclientimportbase

classMachine(base.Resource):HUMAN_ID=True

def__repr__(self):

return\

classMachineManager(base.ManagerWithFind):\

Manage:class:`machine`resources.\

resource_class=Machine

deflist(self,detailed=True):ifdetailedisTrue:

returnself._list(\else:

returnself._list(\

然后在novaclient.v1.1.client.py中導(dǎo)入machines文件,fromnovaclient.v1_1importmachines的__init__構(gòu)造函數(shù)中添加:self.machines=machines.MachineManager(self)第七步,horizon的接口調(diào)用都會在進(jìn)行一次封裝,在horizon.api.nova.py中添加代碼如下:defmachine_list(request):

returnnovaclient(request).machines.list()

現(xiàn)在為止一個完整的nova接口就算完成了,剩下的就是horizon代碼里面的調(diào)用,這個下邊會將。

3.2、compute接口的擴(kuò)展

Compute的接口實現(xiàn)是openstack當(dāng)中層級最多的,由于他是屬于多節(jié)點的調(diào)用,用到了rabbitMQ任務(wù)調(diào)度模塊,底層又調(diào)用了libvirt接口,所以實現(xiàn)起來可能有點麻煩,但是理清了各個文件的職能,那就只剩下往里面填充代碼了,下邊是一個虛擬機(jī)操作的一個接口調(diào)用流程圖:

\\'%(snapshot_name,snapshot_description,instance['uuid'])LOG.info('snapshotxml:%s'%xmldesc)

#創(chuàng)立虛擬機(jī)快照

snapshot_dom=virt_dom.snapshotCreateXML(xmldesc.encode('utf-8','ignore'),0)

ifsnapshot_domisNone:

LOG.error('createinstance%ssnapshot%siserror'%(instance['name'],snapshot_name))else:

LOG.info('createsnapshot%sissuccessful'%snapshot_name)exceptException,e:

LOG.error('createsnapshotiserror:%s'%str(e))

raiseexception.CreateSnapshotFailed(snapshot_name=snapshot_name)

其次步,在pute.manager.py中構(gòu)造調(diào)用底層實現(xiàn)的參數(shù),manager.py這個文件在每個compute節(jié)點都會運行,所以假使多節(jié)點的環(huán)境,進(jìn)行代碼更新時要全部更新,實現(xiàn)代碼如下:

@exception.wrap_exception(notifier=notifier,publisher_id=publisher_id())@checks_instance_lock@wrap_instance_fault

defcreate_vm_snapshot(self,context,instance_uuid,snapshot_name,description):\context=context.elevated()

instance_ref=self.db.instance_get_by_uuid(context,instance_uuid)

current_vm_state=instance_ref['vm_state']self._instance_update(context,

instance_ref['id'],

task_state=task_states.SNAPSHOTTING,vm_state=vm_states.SNAPSHOTTING)

LOG.audit(_(\self._notify_about_instance_usage(instance_ref,\

try:

self.driver.create_vm_snapshot(context,instance_ref,snapshot_name,description)finally:

self._instance_update(context,instance_ref['id'],task_state=None,vm_state=current_vm_state)

self._notify_about_instance_usage(instance_ref,\

第三步、完成快照功能的接口封裝,在pute.api.py的API類中實現(xiàn)方法的封裝,代碼如下:

defcreate_vm_snapshot(self,context,instance,snapshot_name,description):params={'snapshot_name':snapshot_name,'description':description}

self._cast_compute_message('create_vm_snapshot',context,instance,params=params)以下的工作就是pute層以上的工作了,3.1章節(jié)已經(jīng)講過,這里就不在描述。nova其它模塊的接口實現(xiàn)流程類似,實現(xiàn)方式也是類似的,可以參考compute接口去實現(xiàn)。

3.3、keystone接口服務(wù)的擴(kuò)展Keystone接口擴(kuò)展相對簡單,一是由于底層主要是調(diào)用數(shù)據(jù)庫,二是它不涉及多節(jié)點架構(gòu)。在2.2章節(jié)keystone表結(jié)構(gòu)擴(kuò)展時,創(chuàng)立了一個tenant_key的表,下面就實現(xiàn)一個獲取表數(shù)據(jù)實例的接口。

第一步、實現(xiàn)一個表查詢接口,在keystone.identity.core.py的Driver類中添加一個抽象接口,代碼如下:

defget_tenant_key(self,tenant_id):raiseexception.NotImplemented()

傳遞一個tenant_id參數(shù)用來獲取一個對象實例

其次步、在keystone.identity.backends.sql.py的Identity類中添加sql對象查詢實現(xiàn),代碼如下:

defget_tenant_key(self,tenant_id):session=self.get_session()

tenant_key_ref=session.query(TenantKey).filter_by(tenant_id=tenant_id).first()ifnottenant_key_ref:return

returntenant_key_ref.to_dict()

第三步、實現(xiàn)服務(wù)接口的調(diào)用封裝,在keystone.identity.core.py的TenantController類中添加一個方法,代碼如下:

defget_tenant_key(self,context,tenant_id):self.assert_admin(context)

tenant_key=self.identity_api.get_tenant_key(context,tenant_id)return{'tenant_key':tenant_key}第四步、添加接口路由匹配規(guī)則,在keystone.identity.core.py的AdminRouter,add_routes方法中,添加如下代碼:

mapper.connect('/tenant_keys/{tenant_id}',controller=tenant_controller,action='get_tenant_key',

conditions=dict(method=['GET']))

第五步、驗證接口的可用性,執(zhí)行命令curl-XGET-H

\

\01:35357/v2.0/tenant_keys/8a9b447e1f4e466ab3cc5557110e0fed,假使可以正常返回數(shù)據(jù)庫中對應(yīng)的數(shù)據(jù),服務(wù)端的接口就算可以用了,剩下的工作和novaclient的做法類似,可以參考novaclient的實現(xiàn)來擴(kuò)展keystoneclient的接口。

3.4、基于openstack服務(wù)、配置架構(gòu)自定義服務(wù)模塊

使用openstack中已有的代碼,稍加改動就可以實現(xiàn)一個服務(wù)架構(gòu)模塊。這部分改動比較凌亂,下面講的不能完全涵蓋要做的工作,剩下的都是些python相關(guān)的代碼調(diào)整,需要有一定的python基礎(chǔ)的人自己解決。

做這個工作之前,我研究了nova、keystone、swift、glance的服務(wù)代碼,發(fā)現(xiàn)nova部分要整合多個模塊(nova-compute、nova-network、nova-volume等),架構(gòu)比較繁雜,keystone、swift和本身的業(yè)務(wù)集成太緊湊,耦合度太強(qiáng),不好分開。Glance的服務(wù)模塊相對簡單分開,本身glance提供的接口也不太多,代碼的研究也很簡單。這幾個模塊的服務(wù)提供機(jī)制,最底層都是一樣的基于一個wsgi.py模塊,里面的內(nèi)容稍微有點差異,多的是在上層的封裝上有些不同,下面我們講怎么基于glance的服務(wù)提供代碼,構(gòu)造自己的服務(wù)模塊架構(gòu)。第一步、拷貝glance相關(guān)代碼到自己的模塊根目錄中,創(chuàng)立一個根目錄,我這里叫“monitor〞,自己的監(jiān)控模塊,拷貝glance.__init__.py、glance.vcsversion.py、glance.version.py、glance.api、mon到monitor文件夾下。

其次步、刪除不相關(guān)的文件,上一步拷貝的monitor.api、mon中有些文件是不需要的,也有些是glance用到的,都要清除掉。刪除monitor.api.middleware、monitor.api.cached_images.py、monitor.api.policy.py、monitor.api.v1.filters.py、monitor.api.v1.images.py、monitor.api.v1.members.py、mon.animation.py、mon.crypt.py、mon.policy.py。

第三步、修改源碼中的包引用代碼,把fromglance改為frommonitor,刪除不存在的包引用,刪除相關(guān)的代碼調(diào)用。

第四步、拷貝相關(guān)配置、啟動腳本,拷貝/etc/glance/glance-api.conf內(nèi)容到

monitor.etc.monitor.monitor-api.conf,刪除不相關(guān)的配置,修改bind_port的端口為9009(根據(jù)自己機(jī)器上的端口劃分分派),下面是必需的配置項:[DEFAULT]

#Showmoreverboselogoutput(setsINFOlogleveloutput)verbose=True

#Showdebuggingoutputinlogs(setsDEBUGlogleveloutput)debug=True

#AddresstobindtheAPIserverbind_host=

#PortthebindtheAPIserver

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論