




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、Horizon漢化與訂制一、環(huán)境簡介整個平臺名稱為Havstack:Control節(jié)點:包含全部服務(wù),keystone、mysql、vlan、rabbitmq、glance、openvswitch、neutron、kvm、cinder和horizon。Compute節(jié)點:僅包含計算所需服務(wù),vlan、nova、kvm、openvswitch和neutron-agent。二、Horizon漢化與完善1、Django國際化簡介Django國際化的本質(zhì)就是開發(fā)者對需要翻譯的字符串進行標記,并對字符串進行相應(yīng)的翻譯。當用戶訪問該Web時,jango內(nèi)部框架根據(jù)用戶使用偏好進行Web呈現(xiàn)。Django國
2、際化使用的翻譯模塊是Python自帶的gettext標準模塊。其中,主要的4個翻譯字符串的函數(shù)為:django.utils,translation.ugettext():指定一個翻譯字符串,一般都用于views.pydjango.utils,translation.gettext_noop():標記一個不需要立即翻譯的字符串。這個串會稍后從變量翻譯。使用這種方法的環(huán)境是,有字符串必須以原始語言的形式存儲(如儲存在數(shù)據(jù)庫中的字符串)而在最后需要被翻譯出來(如顯示給用戶時)。django.utils,translation.gettext_lazy():將字符串作為惰性參照存儲,而不是實際翻譯,一
3、般會用于models.py。翻譯工作將在字符串在字符串上下文中被用到時進行,比如在Django管理頁面提交模板時。在Django模型中總是無一例外的使用惰性翻譯。django.utils,translation.ungettext():函數(shù)包括三個參數(shù):單數(shù)形式的翻譯字符串,復(fù)數(shù)形式的翻譯字符串,和對象的個數(shù)(將以count變量傳遞給需要翻譯的語言)。2、Horizon漢化步驟由于Horizon漢化并不完全,而且很多地方翻譯不合理,同時Havstack在于創(chuàng)建桌面云,而OpenStack的主旨是創(chuàng)建服務(wù)器虛擬化,所以我們有必要對OpenStack中很多地方進行重新漢化。漢化步驟:將Contro
4、l節(jié)點:/usr/share/openstack-dashboard/openstack_dashboard/locale/zh_CN/LC_MESSAGES/目錄下的django.po和django.mo進行備份。直接編輯django.po文件,該文件內(nèi)容類似于#:views.py:12msgidMondaymsgstr星期一#為前綴的行起注釋作用,并指示出待翻譯的文件所在的具體位置。msgid是在源文件中出現(xiàn)的待翻譯字符串。msgstr是相應(yīng)語言的翻譯結(jié)果,注意語句前后都有引號。我們所需要修改的就是msgstr后面的內(nèi)容,最后保存即可。3)安裝軟件gettext。然后執(zhí)行指令:msgfmt
5、-statistics-verbose-odjango.modjango.po重新生成django.mo文件,該文件即為Horizon所用的信息文件。4)之后執(zhí)行命令:ln-s/usr/share/pyshared/horizon/locale/zh_CN/LC_MESSAGES/django.mo/usr/lib/python2.7/dist-packages/horizon/locale/zh_CN/LC_MESSAGES/django.mo生成django.mo文件的軟連接。5)最后重啟apache2服務(wù)即可在Horizon上看到修改的效果。serviceapache2restart三、
6、Horizon界面圖標修改需要修改的部分大致分為三個部分:登錄界面,主界面和狀態(tài)欄。登錄界面登錄界面圖標位于:/usr/share/openstack-dashboard/openstack_dashboard/static/dashboard/img/logo.png相應(yīng)的配置文檔為:/usr/share/openstack-dashboard/openstack_dashboard/static/dashboard/less/horizon.less有兩種修改方式,第一種為直接替換掉logo.png,第二種是修改horizon.less文件中的background:url(/static/
7、dashboard/img/logo.png)語句,將地址修改為新圖標的地址。主頁面主界面圖標位于:/usr/share/openstack-dashboard/openstack_dashboard/static/dashboard/img/logo-splash.png相應(yīng)的配置文檔為:/usr/share/openstack-dashboard/openstack_dashboard/static/dashboard/less/horizon.less有兩種修改方式,第一種為直接替換掉logo-splash.png,第二種是修改horizon.less文件中的background:#ff
8、furl(/static/dashboard/img/logo-splash.png)語句,將地址修改為新圖標的地址。狀態(tài)欄狀態(tài)欄需要修改狀態(tài)欄小標識以及顯示名稱。修改狀態(tài)欄圖標狀態(tài)欄圖標位于:/usr/share/openstack-dashboard/openstack_dashboard/static/dashboard/img/favicon.ico相應(yīng)的配置文檔為:/usr/share/openstack-dashboard/openstack_dashboard/templates/_stylesheets.html同樣可以直接替換favicon.ico圖標,或者修改_styles
9、heets.html文件中STATIC_URLdashboard/img/favicon.ico語句,將地址改為新圖標的地址。修改狀態(tài)欄顯示名稱修改文件:/usr/share/openstack-dashboard/openstack_dashboard/settings.py中的SITE_BRANDING=OpenStackDashboard將OpenStackDashboard換為其他名稱,例如GuoFU。四、對Horizon增加新功能當前Horizon并沒有涵蓋所有nova支持的功能,而且對于桌面云用戶來說還需增加諸多功能。以下通過增加實例啟動源選擇和添加掛載CD兩個功能來介紹部分Hor
10、izon工作流程。1、增加實例啟動源選擇增加該功能的意義在于對于以iso的格式為鏡像創(chuàng)建的實例,創(chuàng)建好的快照不能讓其它的實例作為鏡像正常啟動。根本原因在于nova底層的代碼對于創(chuàng)建快照時,所選擇的根磁盤或臨時磁盤存在問題。因此我們在創(chuàng)建實例時,就把以iso鏡像格式創(chuàng)建的實例標識出來,以避免后期創(chuàng)建快照時的失敗?;诖四康模覀冃枰獙orizon上啟動一個新實例時,“選擇啟動源中”中新增一個啟動源“從CD啟動”該選項用于選擇所有鏡像格式為iso的文件,并把默認的“從鏡像啟動中格式為iso的鏡像去除掉。在進行開發(fā)前,需要對Horizon簡要說明。Horizon的設(shè)計分為三層:Dashboardf
11、PanelGroupfPanel。Horizon中現(xiàn)有四個Dashboard:project:普通用戶登陸后看到的項目面板admin:管理登陸后可見,左側(cè)的管理員面板settings:右上角的設(shè)置面板,里面可設(shè)置語言,時區(qū),更改密碼router:(配置文件中將profile_support打開可見),cisonexus1000v的管理面板每一個dashboard都是django中的一個app,django中的app可以理解成對業(yè)務(wù)邏輯模塊化的一種手段,里面可以包含自己獨有的url設(shè)定、模板和業(yè)務(wù)邏輯代碼。每個dashboard下定義了一系列的PanelGroup,虛擬機管理對應(yīng)到界面上就是一個
12、PanelGroup(ManageCompute),里面有一系列的子panel(Overview,,Instances,Volumes等)。Swift,heat,neutron的管理面板各自都是一個PanelGroup,底下有各自的子panel。在Horizon的源碼中,包含兩個代碼文件夾:horizon這個包是一些在django基礎(chǔ)上寫的通用組件,表格(table)、標簽頁(tab)、表單(form)、導(dǎo)航(browser)和工作流(workflow),這些代碼和OpenStack的具體業(yè)務(wù)邏輯沒有什么關(guān)系,可以復(fù)用這個包中的代碼。horizon/base.py中實現(xiàn)了一套dashboard
13、/panel機制,使得Horizon面板上所有的dashboard都是“可插拔”的,所有的panel都是“動態(tài)加載”的。openstack_dashboard這個包中重要的代碼都在openstack_dashboard/dashboards/下,它是各個面板的具體實現(xiàn)代碼,其中包括各個面板的模板文件和后端service交互的業(yè)務(wù)邏輯代碼等。接下來完成添加實例啟動源選擇。在instances這個文件夾下,urls.py中url(rlaunch$,views.LaunchInstanceView.as_view(),name二launch)可以看出launch這個動作會進入views.py的Lau
14、nchInstanceView這個類,這了類的workflow_class=project_workflows.LaunchInstance則指向了workflow。啟動實例這個過程是通過workflow來實現(xiàn)的,其過程大體分為workflow、step和action,接下來通過以邊修改邊介紹的形式進行。核心代碼位于:dashboards/project/instances/workflows/create_instance.pyA)step修改啟動云主機這個表單共有四個step,分別是“詳情”、“訪問&控制”、“網(wǎng)絡(luò)和創(chuàng)建后,代碼中分別對應(yīng)于SetInstanceDetails、SetAcc
15、essControls、SetNetwork和PostCreationStep這4個類,它們都繼承于workflows.Step。其實在代碼中,還有一個step是SelectProjectUser,這個step通過之前的登錄來完成,故我們不去考慮。一個step是用于定義action中的數(shù)據(jù)并且封裝起來以供orkflow來使用。每個step中有以下部分:action_class:用于指出該step所對應(yīng)的action。depends_on:定義所依賴的字段,例如,(project_id,user_id),若沒有依賴,則不用寫。contributes:列出的內(nèi)容用于contribute函數(shù)返回到w
16、orkflow的共享內(nèi)容中去,例如,(source_type,source_id,availability_zone,name,count,flavor,device_name,delete_on_terminate)??梢钥吹?,“選擇啟動源”是在SetInstanceDetails這個類中,而添加啟動源應(yīng)該只在這個類中修改,因此之后我們只拿這個類來說明。我們添加新字段“Cd_id”用于標識用戶所選擇的iso鏡像,先將cd_id添加到contributes中。在contribute函數(shù)中,source_id會根據(jù)所選擇的不同類型生成,而新增的cd_id和image_id同類型,因此我們將cd_
17、id添加到ifdatasource_typeinimage_id,volume_image_id里面,111-11一Iimage_id,cd_id,volume_image_id。至此,對于step的修改就完成了。B)action修改對應(yīng)于每個step,都會有一個action,在此我們需要修改的是SetInstanceDetailsAction這個類,可以看到它是繼承于workflows.Action。一個action代表一個可以和系統(tǒng)進行的原子邏輯操作譬如在創(chuàng)建實例這個workflow中,action可以是給實例命名、選擇鏡像,最終創(chuàng)建實例。由于action是可以交互的,所以它必然包括一些表
18、單,這些表單都是繼承于DjangosForm類。在這個類的開始,我們可以看到很多的forms.ChoiceField,顯然這就是在“詳情”這個表單中諸多的選擇框,我們添加cd_id=forms.ChoiceField(label=_(CDName),required二False),在這里添加的位置還是很有玄機的,穩(wěn)妥的辦法就是添加到最后。有了選擇CD的框,當然還得有何時出現(xiàn)這個框以及這個框中的選項。在SetInstanceDetailsAction這個類的初始化函數(shù)中,_init_,我們可以找到source_type_choices這個字段,其后是一個列表,保存著image_id、volume
19、_id等,顯然要想讓cd_id可以通過“選擇啟動源”顯示出來,需要添加(cd_id,_(BootfromCD.)。在之后有個clean函數(shù),通過簡單閱讀可以得知它的目的在于判斷輸入的一些不合法并且讓若選擇了image_id,就不能讓該值提交的時候為空,由此我們仿照image_id的判斷,寫一個cd_id的。之后的函數(shù)都很有規(guī)律,populate_XXXX_choices,顯然我們找到了產(chǎn)生選項的函數(shù)。依照image_id的選項,我們寫一個populate_cd_id_choices,修改choice字段,choices=(image.id,)forimageinimages
20、ifimage.disk_format二二iso,實現(xiàn)從鏡像中選擇出格式為iso的。為了區(qū)分,將image_id中的choice改為choices=(image.id,)forimageinimagesifimage.disk_format!=iso。這樣,action就修改完畢。由于workflow是最后提交時觸發(fā),所以當前修改的代碼應(yīng)該已經(jīng)可以完成在頁面上的展示,但實際運行發(fā)現(xiàn)會無法顯示出選擇框。因為我們還需要修改js。該文件位于:/usr/share/pyshared/horizon/static/horizon/js/horizon.instances.js在一個s
21、witch語句按照image_id的添加cd_id的顯示即可。最后看一下$this.closest(.control-group).nextAll().hide()語句,它指明了哪些框初始就不顯示,而在動態(tài)選擇時顯示。取鏡像列表流程:語句為:images=utils.get_available_images(request,context.get(project_id),self._images_cache)跳轉(zhuǎn)到dashboards/project/images_and_snapshot/utils.py的get_available_images方法,返回該用戶可用的鏡像列表,由私有鏡像和共
22、有鏡像組成。兩類鏡像列表都是通過glance.image_list_detailed獲得。跳轉(zhuǎn)到openstack_dashboards/api/glance.py,方法image_list_detailed。最終通過glanceclient(request).images.list獲得,轉(zhuǎn)到代碼glanceclient/vl/images.py的list方法,顯示出用戶可用鏡像列表。C)workflow修改最后我們來看LaunchInstance這個類,它繼承于workflows.Workflow。workflow是step的集合,用以控制step順序,連接各個step并確??梢韵嗷フ{(diào)用內(nèi)容
23、數(shù)據(jù),并最終驗證數(shù)據(jù)的完整性和引發(fā)最后一個方法來完成整個workflow。其中有個default_steps字段,用以控制step順序流。這里需要增加source_type的類型選擇,當其等于cd_id時,使得cd_id=contextsource_id。最后可以看出,真正創(chuàng)建實例的語句是api.nova.server_create,調(diào)用api中的nova來實現(xiàn)實例的創(chuàng)建,若想最終成功區(qū)分iso鏡像,需要在nova里新增cd_id字段,并在workflow的api.nova.server_create中增力口cd_id。創(chuàng)建實例的流程:通過Horizon界面的創(chuàng)建實例,調(diào)用api中nova的s
24、erver_create,最終轉(zhuǎn)向nova/api/openstack/compute/servers.py里類Controller的create方法。create將會進行如下檢測:1)查看這種類型的instance是否達到最大值;2)如果不存在安全組,就創(chuàng)建一個;3)生成MAC地址和hostname;4)給scheduler發(fā)送一個消息去運行這個實例。scheduler收到消息后通過默認策略選擇一個目的host,并將消息發(fā)送到目的主機的nova-computer。收到消息后,computer做一系列工作,代碼在nova/compute/manager.py里的_build_instance方
25、法。并讓networker去準備一個ip,讓volume準備卷,然后初始化相應(yīng)的信息。nova-network為實例分配固定IP,代碼在nova/network/manager.py。nova-volume為實例分配卷,代碼在nova/volume/cinder.py。最后回到nova-computer,代碼在nova/virt/libvirt/driver.py,_create_domain_and_network和spawn方法。通過libvirtxml文件,然后根據(jù)xml文件生成instance;準備networkfilter,默認的fierwalldriver是iptables;創(chuàng)建d
26、omain,放入runningpool并啟動。2、掛載CD該功能為了實現(xiàn)將一個iso鏡像格式的文件掛載到實例中,類似于在實體電腦中插入光盤。該功能對于新建的實例讓若沒有驅(qū)動等問題,可以通過這個功能動態(tài)的加載,而不需要重新制作鏡像。該功能出現(xiàn)在顯示用戶所有實例列表頁面,每行實例最后都會有一個功能按鈕,譬如創(chuàng)建快照、分配浮動IP等。我們需要在這里增加一個動作,叫做“掛載CD”。文件目錄位于dashboards/project/instances/下。1)修改urls.py在urls.py文件中,為了使新增功能有入口,需要添加url(INSTANCES%loadCD,views.LoadCDView
27、.as_view(),name=loadCD)。修改views.py&創(chuàng)建html類似上個功能,我們轉(zhuǎn)向views.py。這里我們需要自己寫一個方法,名為LoadCDView,該方法可以模仿RebuildView方法,需將instance_id換為cd_id,并不需要密碼,去掉password這個內(nèi)容。View需要對應(yīng)template來顯示出來,同樣模仿rebuild.html,新建文件loadCD.html,并將loadCD.html的內(nèi)容改為相應(yīng)字段,同時需要類似_rebuild.html創(chuàng)建文件_loadCD.html,并在_loadCD.html中修改相應(yīng)字段cd_id,并去掉最后的p
28、assword內(nèi)容。修改forms.py之后,我們來看form_class=project_forms.LoadCDForm,可以看出需要在forms中添加LoadCDForm這個功能。轉(zhuǎn)向forms.py,仿照RebuildinstanceForm類創(chuàng)建類LoadCDForm,需要把相應(yīng)字段改為cd_id,并卻掉有關(guān)password的內(nèi)容。該方法用于提供選擇可用的iso鏡像文件最為CD來掛載。修改tables.py為使“掛載CD”可以顯示在功能欄里,需要修改tables.py。首先看類InstancesTable,其中的row_actions字段,這個字段用于管理功能欄中的按鈕,所以需要在里
29、面添加LoadCD,并在上面仿照類Rebuildinstance創(chuàng)建類LoadCD,將相應(yīng)字段改為cd_id。(instance.statusinACTIVE_STATESorinstance.status=SHUTOFF)andnotis_deleting(instance用于控制這個按鈕在合適顯示。至此,添加掛載CD功能就完成了。對于真正執(zhí)行命令,在forms.py的handle方法中,api.nova.server_rebuild(request,instance,image)這個重建實例的,我們需要在nova中提供loadCD,然后調(diào)用即可。五、加菜單和菜單漢化2012年12月19日1
30、4:55:54代碼位置頁面的信息:/usr/share/pyshare/horizonPython的源碼:/usr/lib/python2.7/site-packages/horizon用ll查看這個文件夾,指向上面頁面信息位置。在1的位置修改文件可以更新到2中,但是新加的文件夾和文件更新不過去,這也是一開始增加菜單沒有增加成功的原因。解決辦法:直接在:/usr/lib/python2.7/site-packages/horizon這個地方修改代碼增加菜單步驟horizon/dashboard/syspanel/dashboard.pyclassSystemPanels(horizon.Pan
31、elGroup):slug=syspanelname=_(SystemPanel)panels=(overview,instances,services,flavors,images,projects,users,hosts,quotas,)#hosts,)增加要增加的名稱。horizon/dashboard/syspanel創(chuàng)建文件夾hosts。vorsisi一嚴啜urim加hn岡同回剛觀里面包含文件5di少panel.py內(nèi)容如下:fromdjango.utils.translationimportugettext_lazyas_importhorizonfromhorizon.dashb
32、oards.syspanelimportdashboardclassHosts(horizon.Panel):name=_(Host)#name=_(Hosts)菜單漢化需要slug=hostsroles=(admin,)dashboard.Syspanel.register(Hosts)創(chuàng)建頁面:horizon/dashboard/syspanel/templates/syspanel/創(chuàng)建文件夾hosts創(chuàng)建文件:index.html漢化,漢化文件中主機是Host,所以設(shè)計到顯示菜單的地方修改為Host即可。主機主機上面的漢字“主機”在頁面中。%includehorizon/common/
33、_page_header.htmlwithtitle=_(Host)refresh_link=refresh_linksearchable=true%下面的漢字“主機”在tables.py中classMeta:name=hostverbose_name=_(Host)這里columns=(host,)六、加菜單和菜單漢化horizon/dashboard/novasettingssyspanel/base.html中加載左側(cè)菜單%blocksidebar%includehorizon/common/_sidebar.html%endblock%/horizon/templates/horizon/common/_sidebar.html內(nèi)容如下%loadhorizoni18n%transOpenStackDashboard%horizon
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 物流業(yè)無人機配送技術(shù)應(yīng)用方案
- 房地產(chǎn)業(yè)合伙經(jīng)營協(xié)議書
- 典當合同典當行借款合同
- 取土場施工方案
- 西寧抗風門施工方案
- 環(huán)境影響評價及保護方案手冊
- 四干渠電站施工方案
- 空心方樁施工方案
- 醫(yī)院智能化施工方案
- 電梯消防施工方案范本
- 小學(xué)高年級《紅樓春趣》劇本(寧波實驗學(xué)校)
- 安徽省縣域?qū)W前教育普及普惠督導(dǎo)評估指標體系
- 第二章-英國學(xué)前教育
- 國家職業(yè)技能鑒定考試-高級機修鉗工題庫
- 315國際消費者權(quán)益保護日知識講座課件
- 2023年二手房買賣合同正式版
- 2例不良事件根因分析
- YS/T 269-2008丁基鈉(鉀)黃藥
- GB/T 3808-2018擺錘式?jīng)_擊試驗機的檢驗
- (完整版)《汽車材料》課程標準
- GB 1523-2013綿羊毛
評論
0/150
提交評論