Horizon汉化与修改.docx_第1页
Horizon汉化与修改.docx_第2页
Horizon汉化与修改.docx_第3页
Horizon汉化与修改.docx_第4页
Horizon汉化与修改.docx_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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 时,Django 内部框架根据用户使用偏好进行 Web 呈现。Django 国际化使用的翻译模块是 Python 自带的 gettext 标准模块。其中,主要的4个翻译字符串的函数为:django.utils.translation.ugettext() : 指定一个翻译字符串,一般都用于 views.py。django.utils.translation.gettext_noop() : 标记一个不需要立即翻译的字符串。 这个串会稍后从变量翻译。使用这种方法的环境是,有字符串必须以原始语言的形式存储(如储存在数据库中的字符串)而在最后需要被 翻译出来(如显示给用户时)。django.utils.translation.gettext_lazy() : 将字符串作为惰性参照存储,而不是实际翻译 , 一般会用于 models.py。 翻译工作将在字符串在字符串上下文中被用到时进行,比如在 Django 管理页面提交模板时。在 Django 模型中总是无一例外的使用惰性翻译。django.utils.translation.ungettext() : 函数包括三个参数: 单数形式的翻译字符串,复数形式的翻译字符串,和对象的个数(将以 count 变量传递给需要翻译的语言)。2、Horizon汉化步骤由于Horizon汉化并不完全,而且很多地方翻译不合理,同时Havstack在于创建桌面云,而OpenStack的主旨是创建服务器虚拟化,所以我们有必要对OpenStack中很多地方进行重新汉化。汉化步骤:1)将Control节点:/usr/share/openstack-dashboard/openstack_dashboard/locale/zh_CN/LC_MESSAGES/目录下的django.po和django.mo进行备份。2)直接编辑django.po文件,该文件内容类似于#: views.py:12msgid Mondaymsgstr 星期一#为前缀的行起注释作用,并指示出待翻译的文件所在的具体位置。msgid是在源文件中出现的待翻译字符串。msgstr 是相应语言的翻译结果,注意语句前后都有引号。我们所需要修改的就是msgstr后面的内容,最后保存即可。3)安装软件gettext。然后执行指令:msgfmt -statistics -verbose -o django.mo django.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上看到修改的效果。service apache2 restart三、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/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: #fff url(/static/dashboard/img/logo-splash.png)语句,将地址修改为新图标的地址。状态栏状态栏需要修改状态栏小标识以及显示名称。1)修改状态栏图标状态栏图标位于:/usr/share/openstack-dashboard/openstack_dashboard/static/dashboard/img/favicon.ico相应的配置文档为:/usr/share/openstack-dashboard/openstack_dashboard/templates/_stylesheets.html同样可以直接替换favicon.ico图标,或者修改_stylesheets.html文件中 STATIC_URL dashboard/img/favicon.ico语句,将地址改为新图标的地址。2)修改状态栏显示名称修改文件:/usr/share/openstack-dashboard/openstack_dashboard/settings.py 中的SITE_BRANDING = OpenStack Dashboard 将OpenStack Dashboard换为其他名称,例如GuoFU。四、对Horizon增加新功能当前Horizon并没有涵盖所有nova支持的功能,而且对于桌面云用户来说还需增加诸多功能。以下通过增加实例启动源选择和添加挂载CD两个功能来介绍部分Horizon工作流程。1、增加实例启动源选择增加该功能的意义在于对于以iso的格式为镜像创建的实例,创建好的快照不能让其它的实例作为镜像正常启动。根本原因在于nova底层的代码对于创建快照时,所选择的根磁盘或临时磁盘存在问题。因此我们在创建实例时,就把以iso镜像格式创建的实例标识出来,以避免后期创建快照时的失败。基于此目的,我们需要将Horizon上启动一个新实例时,“选择启动源中”中新增一个启动源“从CD启动”,该选项用于选择所有镜像格式为iso的文件,并把默认的“从镜像启动”中格式为iso的镜像去除掉。在进行开发前,需要对Horizon简要说明。Horizon的设计分为三层:Dashboard PanelGroup Panel。Horizon中现有四个Dashboard:a) project :普通用户登陆后看到的项目面板b) admin :管理登陆后可见,左侧的管理员面板c) settings :右上角的设置面板,里面可设置语言,时区,更改密码d) router :(配置文件中将profile_support打开可见),ciso nexus 1000v的管理面板每一个dashboard都是django中的一个app,django中的app可以理解成对业务逻辑模块化的一种手段,里面可以包含自己独有的url设定、模板和业务逻辑代码。每个dashboard下定义了一系列的PanelGroup,虚拟机管理对应到界面上就是一个PanelGroup(Manage Compute),里面有一系列的子panel(Overview,,Instances,,Volumes等)。Swift,heat,neutron的管理面板各自都是一个PanelGroup,底下有各自的子panel。在Horizon的源码中,包含两个代码文件夹:1)horizon这个包是一些在django基础上写的通用组件,表格(table)、标签页(tab)、表单(form)、导航(browser)和工作流(workflow),这些代码和OpenStack的具体业务逻辑没有什么关系,可以复用这个包中的代码。horizon/base.py中实现了一套dashboard/panel机制,使得Horizon面板上所有的dashboard都是“可插拔”的,所有的panel都是“动态加载”的。2)openstack_dashboard这个包中重要的代码都在openstack_dashboard/dashboards/下,它是各个面板的具体实现代码,其中包括各个面板的模板文件和后端service交互的业务逻辑代码等。接下来完成添加实例启动源选择。在instances这个文件夹下,urls.py中url(rlaunch$, views.LaunchInstanceView.as_view(), name=launch)可以看出launch这个动作会进入views.py的LaunchInstanceView这个类,这了类的workflow_class = project_workflows.LaunchInstance则指向了workflow。启动实例这个过程是通过workflow来实现的,其过程大体分为workflow、step和action,接下来通过以边修改边介绍的形式进行。核心代码位于:dashboards/project/instances/workflows/create_instance.pyA)step修改启动云主机这个表单共有四个step,分别是“详情”、“访问&控制”、“网络”和“创建后”,代码中分别对应于SetInstanceDetails、SetAccessControls、SetNetwork和PostCreationStep这4个类,它们都继承于workflows.Step。其实在代码中,还有一个step是SelectProjectUser,这个step通过之前的登录来完成,故我们不去考虑。一个step是用于定义action中的数据并且封装起来以供workflow来使用。每个step中有以下部分:a) action_class :用于指出该step所对应的action。b) depends_on :定义所依赖的字段,例如,(project_id, user_id),若没有依赖,则不用写。c) contributes : 列出的内容用于contribute函数返回到workflow的共享内容中去,例如,(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_id添加到if datasource_type in image_id, volume_image_id 里面,image_id,cd_id, volume_image_id。至此,对于step的修改就完成了。B)action修改对应于每个step,都会有一个action,在此我们需要修改的是SetInstanceDetailsAction这个类,可以看到它是继承于workflows.Action。一个action代表一个可以和系统进行的原子逻辑操作。譬如在创建实例这个workflow中,action可以是给实例命名、选择镜像,最终创建实例。由于action是可以交互的,所以它必然包括一些表单,这些表单都是继承于Djangos Form类。在这个类的开始,我们可以看到很多的forms.ChoiceField,显然这就是在“详情”这个表单中诸多的选择框,我们添加cd_id = forms.ChoiceField(label=_(CD Name), required=False),在这里添加的位置还是很有玄机的,稳妥的办法就是添加到最后。有了选择CD的框,当然还得有何时出现这个框以及这个框中的选项。在SetInstanceDetailsAction这个类的初始化函数中,_init_,我们可以找到source_type_choices这个字段,其后是一个列表,保存着image_id、volume_id等,显然要想让cd_id可以通过“选择启动源”显示出来,需要添加(cd_id, _(Boot from CD.)。在之后有个clean函数,通过简单阅读可以得知它的目的在于判断输入的一些不合法并且让若选择了image_id,就不能让该值提交的时候为空,由此我们仿照image_id的判断,写一个cd_id的。之后的函数都很有规律,populate_XXXX_choices,显然我们找到了产生选项的函数。依照image_id的选项,我们写一个populate_cd_id_choices,修改choice字段,choices = (image.id, ) for image in images if image.disk_format = iso,实现从镜像中选择出格式为iso的。为了区分,将image_id中的choice改为choices = (image.id, ) for image in images if image.disk_format != iso。这样,action就修改完毕。由于workflow是最后提交时触发,所以当前修改的代码应该已经可以完成在页面上的展示,但实际运行发现会无法显示出选择框。因为我们还需要修改js。该文件位于:/usr/share/pyshared/horizon/static/horizon/js/horizon.instances.js在一个switch语句按照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方法,返回该用户可用的镜像列表,由私有镜像和共有镜像组成。两类镜像列表都是通过glance.image_list_detailed获得。跳转到openstack_dashboards/api/glance.py,方法image_list_detailed。最终通过glanceclient(request).images.list获得,转到代码glanceclient/v1/images.py的list方法,显示出用户可用镜像列表。C)workflow修改最后我们来看LaunchInstance这个类,它继承于workflows.Workflow。workflow是step的集合,用以控制step顺序,连接各个step并确保可以相互调用内容数据,并最终验证数据的完整性和引发最后一个方法来完成整个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的server_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方法。并让 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方法。通过libvirt xml文件,然后根据xml文件生成instance;准备network filter,默认的fierwall driver是iptables;创建domain,放入running pool并启动。2、挂载CD该功能为了实现将一个iso镜像格式的文件挂载到实例中,类似于在实体电脑中插入光盘。该功能对于新建的实例让若没有驱动等问题,可以通过这个功能动态的加载,而不需要重新制作镜像。该功能出现在显示用户所有实例列表页面,每行实例最后都会有一个功能按钮,譬如创建快照、分配浮动IP等。我们需要在这里增加一个动作,叫做“挂载CD”。文件目录位于dashboards/project/instances/下。1)修改urls.py在urls.py文件中,为了使新增功能有入口,需要添加url(INSTANCES % loadCD, views.LoadCDView.as_view(), nam

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论