版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Horizon汉化与订制一、环境简介整个平台名称为Havstack:Control节点:包含全部服务,keystone、mysql、vlan、rabbitmq、glance、openvswitch、neutron、kvm、cinder和horizon。Compute节点:仅包含计算所需服务,vlan、nova、kvm、openvswitch和neutron-agent。二、Horizon汉化与完善1、Django国际化简介Django国际化的本质就是开发者对需要翻译的字符串进行标记,并对字符串进行相应的翻译。当用户访问该Web时,jango内部框架根据用户使用偏好进行Web呈现。Django国
2、际化使用的翻译模块是Python自带的gettext标准模块。其中,主要的4个翻译字符串的函数为:django.utils,translation.ugettext():指定一个翻译字符串,一般都用于views.pydjango.utils,translation.gettext_noop():标记一个不需要立即翻译的字符串。这个串会稍后从变量翻译。使用这种方法的环境是,有字符串必须以原始语言的形式存储(如储存在数据库中的字符串)而在最后需要被翻译出来(如显示给用户时)。django.utils,translation.gettext_lazy():将字符串作为惰性参照存储,而不是实际翻译,一
3、般会用于models.py。翻译工作将在字符串在字符串上下文中被用到时进行,比如在Django管理页面提交模板时。在Django模型中总是无一例外的使用惰性翻译。django.utils,translation.ungettext():函数包括三个参数:单数形式的翻译字符串,复数形式的翻译字符串,和对象的个数(将以count变量传递给需要翻译的语言)。2、Horizon汉化步骤由于Horizon汉化并不完全,而且很多地方翻译不合理,同时Havstack在于创建桌面云,而OpenStack的主旨是创建服务器虚拟化,所以我们有必要对OpenStack中很多地方进行重新汉化。汉化步骤:将Contro
4、l节点:/usr/share/openstack-dashboard/openstack_dashboard/locale/zh_CN/LC_MESSAGES/目录下的django.po和django.mo进行备份。直接编辑django.po文件,该文件内容类似于#:views.py:12msgidMondaymsgstr星期一#为前缀的行起注释作用,并指示出待翻译的文件所在的具体位置。msgid是在源文件中出现的待翻译字符串。msgstr是相应语言的翻译结果,注意语句前后都有引号。我们所需要修改的就是msgstr后面的内容,最后保存即可。3)安装软件gettext。然后执行指令:msgfmt
5、-statistics-verbose-odjango.modjango.po重新生成django.mo文件,该文件即为Horizon所用的信息文件。4)之后执行命令: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服务即可在Horizon上看到修改的效果。serviceapache2restart三、
6、Horizon界面图标修改需要修改的部分大致分为三个部分:登录界面,主界面和状态栏。登录界面登录界面图标位于:/usr/share/openstack-dashboard/openstack_dashboard/static/dashboard/img/logo.png相应的配置文档为:/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相应的配置文档为:/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)语句,将地址修改为新图标的地址。状态栏状态栏需要修改状态栏小标识以及显示名称。修改状态栏图标状态栏图标位于:/usr/share/openstack-dashboard/openstack_dashboard/static/dashboard/img/favicon.ico相应的配置文档为:/usr/share/openstack-dashboard/openstack_dashboard/templates/_stylesheets.html同样可以直接替换favicon.ico图标,或者修改_styles
9、heets.html文件中STATIC_URLdashboard/img/favicon.ico语句,将地址改为新图标的地址。修改状态栏显示名称修改文件:/usr/share/openstack-dashboard/openstack_dashboard/settings.py中的SITE_BRANDING=OpenStackDashboard将OpenStackDashboard换为其他名称,例如GuoFU。四、对Horizon增加新功能当前Horizon并没有涵盖所有nova支持的功能,而且对于桌面云用户来说还需增加诸多功能。以下通过增加实例启动源选择和添加挂载CD两个功能来介绍部分Hor
10、izon工作流程。1、增加实例启动源选择增加该功能的意义在于对于以iso的格式为镜像创建的实例,创建好的快照不能让其它的实例作为镜像正常启动。根本原因在于nova底层的代码对于创建快照时,所选择的根磁盘或临时磁盘存在问题。因此我们在创建实例时,就把以iso镜像格式创建的实例标识出来,以避免后期创建快照时的失败。基于此目的,我们需要将Horizon上启动一个新实例时,“选择启动源中”中新增一个启动源“从CD启动”该选项用于选择所有镜像格式为iso的文件,并把默认的“从镜像启动中格式为iso的镜像去除掉。在进行开发前,需要对Horizon简要说明。Horizon的设计分为三层:Dashboardf
11、PanelGroupfPanel。Horizon中现有四个Dashboard:project:普通用户登陆后看到的项目面板admin:管理登陆后可见,左侧的管理员面板settings:右上角的设置面板,里面可设置语言,时区,更改密码router:(配置文件中将profile_support打开可见),cisonexus1000v的管理面板每一个dashboard都是django中的一个app,django中的app可以理解成对业务逻辑模块化的一种手段,里面可以包含自己独有的url设定、模板和业务逻辑代码。每个dashboard下定义了一系列的PanelGroup,虚拟机管理对应到界面上就是一个
12、PanelGroup(ManageCompute),里面有一系列的子panel(Overview,,Instances,Volumes等)。Swift,heat,neutron的管理面板各自都是一个PanelGroup,底下有各自的子panel。在Horizon的源码中,包含两个代码文件夹:horizon这个包是一些在django基础上写的通用组件,表格(table)、标签页(tab)、表单(form)、导航(browser)和工作流(workflow),这些代码和OpenStack的具体业务逻辑没有什么关系,可以复用这个包中的代码。horizon/base.py中实现了一套dashboard
13、/panel机制,使得Horizon面板上所有的dashboard都是“可插拔”的,所有的panel都是“动态加载”的。openstack_dashboard这个包中重要的代码都在openstack_dashboard/dashboards/下,它是各个面板的具体实现代码,其中包括各个面板的模板文件和后端service交互的业务逻辑代码等。接下来完成添加实例启动源选择。在instances这个文件夹下,urls.py中url(rlaunch$,views.LaunchInstanceView.as_view(),name二launch)可以看出launch这个动作会进入views.py的Lau
14、nchInstanceView这个类,这了类的workflow_class=project_workflows.LaunchInstance则指向了workflow。启动实例这个过程是通过workflow来实现的,其过程大体分为workflow、step和action,接下来通过以边修改边介绍的形式进行。核心代码位于:dashboards/project/instances/workflows/create_instance.pyA)step修改启动云主机这个表单共有四个step,分别是“详情”、“访问&控制”、“网络和创建后,代码中分别对应于SetInstanceDetails、SetAcc
15、essControls、SetNetwork和PostCreationStep这4个类,它们都继承于workflows.Step。其实在代码中,还有一个step是SelectProjectUser,这个step通过之前的登录来完成,故我们不去考虑。一个step是用于定义action中的数据并且封装起来以供orkflow来使用。每个step中有以下部分:action_class:用于指出该step所对应的action。depends_on:定义所依赖的字段,例如,(project_id,user_id),若没有依赖,则不用写。contributes:列出的内容用于contribute函数返回到w
16、orkflow的共享内容中去,例如,(source_type,source_id,availability_zone,name,count,flavor,device_name,delete_on_terminate)。可以看到,“选择启动源”是在SetInstanceDetails这个类中,而添加启动源应该只在这个类中修改,因此之后我们只拿这个类来说明。我们添加新字段“Cd_id”用于标识用户所选择的iso镜像,先将cd_id添加到contributes中。在contribute函数中,source_id会根据所选择的不同类型生成,而新增的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修改对应于每个step,都会有一个action,在此我们需要修改的是SetInstanceDetailsAction这个类,可以看到它是继承于workflows.Action。一个action代表一个可以和系统进行的原子逻辑操作譬如在创建实例这个workflow中,action可以是给实例命名、选择镜像,最终创建实例。由于action是可以交互的,所以它必然包括一些表
18、单,这些表单都是继承于DjangosForm类。在这个类的开始,我们可以看到很多的forms.ChoiceField,显然这就是在“详情”这个表单中诸多的选择框,我们添加cd_id=forms.ChoiceField(label=_(CDName),required二False),在这里添加的位置还是很有玄机的,稳妥的办法就是添加到最后。有了选择CD的框,当然还得有何时出现这个框以及这个框中的选项。在SetInstanceDetailsAction这个类的初始化函数中,_init_,我们可以找到source_type_choices这个字段,其后是一个列表,保存着image_id、volume
19、_id等,显然要想让cd_id可以通过“选择启动源”显示出来,需要添加(cd_id,_(BootfromCD.)。在之后有个clean函数,通过简单阅读可以得知它的目的在于判断输入的一些不合法并且让若选择了image_id,就不能让该值提交的时候为空,由此我们仿照image_id的判断,写一个cd_id的。之后的函数都很有规律,populate_XXXX_choices,显然我们找到了产生选项的函数。依照image_id的选项,我们写一个populate_cd_id_choices,修改choice字段,choices=(image.id,)forimageinimages
20、ifimage.disk_format二二iso,实现从镜像中选择出格式为iso的。为了区分,将image_id中的choice改为choices=(image.id,)forimageinimagesifimage.disk_format!=iso。这样,action就修改完毕。由于workflow是最后提交时触发,所以当前修改的代码应该已经可以完成在页面上的展示,但实际运行发现会无法显示出选择框。因为我们还需要修改js。该文件位于:/usr/share/pyshared/horizon/static/horizon/js/horizon.instances.js在一个s
21、witch语句按照image_id的添加cd_id的显示即可。最后看一下$this.closest(.control-group).nextAll().hide()语句,它指明了哪些框初始就不显示,而在动态选择时显示。取镜像列表流程:语句为:images=utils.get_available_images(request,context.get(project_id),self._images_cache)跳转到dashboards/project/images_and_snapshot/utils.py的get_available_images方法,返回该用户可用的镜像列表,由私有镜像和共
22、有镜像组成。两类镜像列表都是通过glance.image_list_detailed获得。跳转到openstack_dashboards/api/glance.py,方法image_list_detailed。最终通过glanceclient(request).images.list获得,转到代码glanceclient/vl/images.py的list方法,显示出用户可用镜像列表。C)workflow修改最后我们来看LaunchInstance这个类,它继承于workflows.Workflow。workflow是step的集合,用以控制step顺序,连接各个step并确保可以相互调用内容
23、数据,并最终验证数据的完整性和引发最后一个方法来完成整个workflow。其中有个default_steps字段,用以控制step顺序流。这里需要增加source_type的类型选择,当其等于cd_id时,使得cd_id=contextsource_id。最后可以看出,真正创建实例的语句是api.nova.server_create,调用api中的nova来实现实例的创建,若想最终成功区分iso镜像,需要在nova里新增cd_id字段,并在workflow的api.nova.server_create中增力口cd_id。创建实例的流程:通过Horizon界面的创建实例,调用api中nova的s
24、erver_create,最终转向nova/api/openstack/compute/servers.py里类Controller的create方法。create将会进行如下检测:1)查看这种类型的instance是否达到最大值;2)如果不存在安全组,就创建一个;3)生成MAC地址和hostname;4)给scheduler发送一个消息去运行这个实例。scheduler收到消息后通过默认策略选择一个目的host,并将消息发送到目的主机的nova-computer。收到消息后,computer做一系列工作,代码在nova/compute/manager.py里的_build_instance方
25、法。并让networker去准备一个ip,让volume准备卷,然后初始化相应的信息。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文件,然后根据xml文件生成instance;准备networkfilter,默认的fierwalldriver是iptables;创建d
26、omain,放入runningpool并启动。2、挂载CD该功能为了实现将一个iso镜像格式的文件挂载到实例中,类似于在实体电脑中插入光盘。该功能对于新建的实例让若没有驱动等问题,可以通过这个功能动态的加载,而不需要重新制作镜像。该功能出现在显示用户所有实例列表页面,每行实例最后都会有一个功能按钮,譬如创建快照、分配浮动IP等。我们需要在这里增加一个动作,叫做“挂载CD”。文件目录位于dashboards/project/instances/下。1)修改urls.py在urls.py文件中,为了使新增功能有入口,需要添加url(INSTANCES%loadCD,views.LoadCDView
27、.as_view(),name=loadCD)。修改views.py&创建html类似上个功能,我们转向views.py。这里我们需要自己写一个方法,名为LoadCDView,该方法可以模仿RebuildView方法,需将instance_id换为cd_id,并不需要密码,去掉password这个内容。View需要对应template来显示出来,同样模仿rebuild.html,新建文件loadCD.html,并将loadCD.html的内容改为相应字段,同时需要类似_rebuild.html创建文件_loadCD.html,并在_loadCD.html中修改相应字段cd_id,并去掉最后的p
28、assword内容。修改forms.py之后,我们来看form_class=project_forms.LoadCDForm,可以看出需要在forms中添加LoadCDForm这个功能。转向forms.py,仿照RebuildinstanceForm类创建类LoadCDForm,需要把相应字段改为cd_id,并却掉有关password的内容。该方法用于提供选择可用的iso镜像文件最为CD来挂载。修改tables.py为使“挂载CD”可以显示在功能栏里,需要修改tables.py。首先看类InstancesTable,其中的row_actions字段,这个字段用于管理功能栏中的按钮,所以需要在里
29、面添加LoadCD,并在上面仿照类Rebuildinstance创建类LoadCD,将相应字段改为cd_id。(instance.statusinACTIVE_STATESorinstance.status=SHUTOFF)andnotis_deleting(instance用于控制这个按钮在合适显示。至此,添加挂载CD功能就完成了。对于真正执行命令,在forms.py的handle方法中,api.nova.server_rebuild(request,instance,image)这个重建实例的,我们需要在nova中提供loadCD,然后调用即可。五、加菜单和菜单汉化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创建文件夹hosts。vorsisi一严啜urim加hn岡同回刚观里面包含文件5di少panel.py内容如下:fromdjango.utils.translationimportugettext_lazyas_importhorizonfromhorizon.dashb
32、oards.syspanelimportdashboardclassHosts(horizon.Panel):name=_(Host)#name=_(Hosts)菜单汉化需要slug=hostsroles=(admin,)dashboard.Syspanel.register(Hosts)创建页面:horizon/dashboard/syspanel/templates/syspanel/创建文件夹hosts创建文件:index.html汉化,汉化文件中主机是Host,所以设计到显示菜单的地方修改为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中加载左侧菜单%blocksidebar%includehorizon/common/_sidebar.html%endblock%/horizon/templates/horizon/common/_sidebar.html内容如下%loadhorizoni18n%transOpenStackDashboard%horizon
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 认识人民币小学数学教案
- 高中物理必修三教案6篇
- 幼师职业生涯规划书
- 食堂年终工作总结(19篇)
- 英文在职证明模版
- DB12-T 1061-2021 律师民事诉讼文书格式
- 2024-2025学年重庆乌江新高考协作体高三上学期二调生物试题及答案
- 上海市县(2024年-2025年小学五年级语文)人教版开学考试(下学期)试卷及答案
- 五年级数学(小数乘法)计算题专项练习及答案汇编
- 荆楚理工学院《软件测试》2022-2023学年期末试卷
- 2023年11月软考中级系统集成项目管理工程师下午真题(第二批)
- 云南太阳能资源分析
- 2024智慧园区系统建设规范
- 第5课 互联网接入 教学设计 2023-2024学年浙教版(2023)初中信息技术七年级上册
- 小学语文一年级上册课件第四单元01-10 ai ei ui
- 传感器技术-武汉大学
- 戏剧鉴赏学习通超星期末考试答案章节答案2024年
- 2024年中国船级社福建福州分社招聘60人历年高频500题难、易错点模拟试题附带答案详解
- 2024上半年四川内江市东兴区部分事业单位考聘112人高频500题难、易错点模拟试题附带答案详解
- 2024年大学英语四六级考试大纲词汇
- 2024-2030年公安行业市场深度调研及发展前景与趋势预测研究报告
评论
0/150
提交评论