




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 合作預(yù)算合同范本
- 售后回購融資合同范例
- 二人合伙養(yǎng)狗合同范本
- 賣房定金違約合同范本
- 個人店面裝修合同范本
- 1內(nèi)9折回購合同范本
- 會展安裝設(shè)計合同范本
- 單位院子改造合同范本
- 單位刮大白合同范本
- 公司車輛洗車合同范例
- 預(yù)防校園欺凌主題班會課件(共36張課件)
- 水是生命之源幻燈
- 采場頂板(幫壁)分級管理制度
- 瀝青路面車轍病害及抗車轍劑解決方案
- 金屬風(fēng)管支架重量計算表
- 從業(yè)務(wù)骨干到管理者(課堂PPT)
- 高標(biāo)準(zhǔn)基本農(nóng)田土地整治項目工程施工費預(yù)算表
- 河南省普通高校招生考生體格檢查表
- 新三板知識測評考題答案
- 英文版驗資報告
- 試坑單環(huán)注水試驗記錄表
評論
0/150
提交評論