@tony-yin
        
        2017-11-02T08:44:21.000000Z
        字数 7576
        阅读 1167
    Magicloud Sharing
license,一个节点对应一个license,一个集群多个节点不能共用一个licensehtml, js, css, Language, img, 还有与前端交互的所有后端controller层的python代码API Service代码,项目中后端主要功能实现都在这个文件夹下的py文件中cluster, disk, cpu等所有metricAPIbuild脚本,可以通过cat README了解使用方法build时候需要的脚本,大部分是为build debian服务scaler, controller, company等等,由于build脚本中有专门操作oem,所以更改这些文件夹中的内容,之后打包好的ISO也会呈现不同的样式,比如替换公司名称, logo等等ceph源码,都是binary,如果需要看源码,需要去github上面clone
/root/magicloud/license/src/make_key.py
[root@tony src]# cd /root/magicloud/license/src/[root@tony src]# lscreate_osd.py deb decode_key.cpp licobj.cpp licobj.hpp Makefile make_key.py mcvl.cpp[root@tony src]# ./make_key.py --helpUsage: make_key.py [options] <License ID> <Node ID>Options:-h, --help show this help message and exit-g With GW feature-r With RRS feature-p PRODUCT 0=VirtualStor Controller; 1=VirtualStor Scaler; 2=VirtualStorConverger-d DURATION Valid duration (days) of the license key
-g: 是否拥有网关的功能,如果没有之后就不可以启用网关-r: 是否拥有RRS的功能,即远程复制服务器(Remote Replication Server)-p: 选择产品类型,一般我们开发都是选择scaler-d: license有效期配置,如果不配置默认是永久开发过程中,可以默认所有feature都启用,选择产品类型为scaler,有效期永久
[root@tony src]# ./make_key.py -gr -p 1Usage: make_key.py [options] <License ID> <Node ID>make_key.py: error: expected <license ID> <node ID>
结果显示脚本还需要两个参数: license ID和node ID,这两个参数的作用就是区别不同集群的license和不同节点
ok, 正确姿势:
[root@tony src]# ./make_key.py -gr -p 1 1 1CLAUSR-97O64G-1G6C20-BD9U37-7TV5R6-AYHAY5-854L13[root@tony src]# ./make_key.py -gr -p 1 1 2CLB118-ZT105C-7QQETJ-44OQR4-7I45BE-100R2E-WUJTSQ[root@tony src]# ./make_key.py -gr -p 1 2 1CLAUST-88S83K-1GBT4R-CBES2T-58CCRU-E3PKOP-QUWAJ3[root@tony src]# ./make_key.py -gr -p 1 3 1CLAUSV-79WA2O-1E6LAV-GAPLQI-0VDO9L-Y5G1OP-Y9217W[root@tony src]# ./make_key.py -gr -p 1 3 2CLB11C-XV943K-4S44OE-AJAW0O-6Z3OK4-GYPW5G-14TWHD9[root@tony src]# ./make_key.py -gr -p 1 3 3CLB79U-OGLY4G-4YKY3L-NQBAP3-80KV7U-KFEU6S-1UCHVXJ
/root/magicloud/build/root/magicloud/README
[root@tony magicloud]# cat README1. Run 'BUILD_NUMBER=xxx ./build config' to configure the build environment2. Run 'BUILD_NUMBER=xxx ./build oem putian' to configure the build environment to build PtBus ISO3. Run 'BUILD_NUMBER=xxx ./build kernel' to build Linux kernel4. Run 'BUILD_NUMBER=xxx ./build debs' to build the debian packagesThis will build PtBus's deb packages and put them into 'output' directory.5. Run 'BUILD_NUMBER=xxx ./build iso' to build the Installation CDThis will build the ISO image and put it into 'output' directory.6. Run './build clean' to clean up the build environment
BUILD_NUMBER=666 ./build configBUILD_NUMBER=666 ./build oem putianBUILD_NUMBER=666 ./build kernelBUILD_NUMBER=666 ./build debsBUILD_NUMBER=666 ./build iso
编译过程中如果某一步出错了,希望重新编译那一步操作,那么需要把
jobnr文件删除,然后运行./build clean清理一下环境
Magicloud前端运用了gulp和webpack工具构建,技术栈涉猎jQuery,angular,bootstrap,flatUI
前端构建工具我们分别用了gulp和webpack,gulp主要负责前端JS,HTML,CSS的uglify工作;webpack主要负责启动服务或者代理工作
使用这两个工具,需要根据package.json文件安装相应的软件包
/root/magicloud/mcs3-ui/src
npm build
or
gulp default
具体请参考
/root/magicloud/mcs3-ui/src/gulpfile.js
/root/magicloud/mcs3-ui/src
npm start
or
webpack-dev-server
具体请参考
/root/magicloud/mcs3-ui/src/webpack.config.js,该文件可以由模板文件webpack.config.js.sample拷贝修改生成
/root/magicloud/mcs3-ui/src/web // common html/root/magicloud/mcs3-ui/src/web/component // component html
index.html作为页面入口,导入了需要的所有js和css的包
html文件数量较多,具体根据文件名找到对应文件查看源代码,就不一一赘述
/root/magicloud/mcs3-ui/src/web/js // common js/root/magicloud/mcs3-ui/src/web/component/js // component js
common.js: 一些公共方法的集合base_component.js: 所有component的基类translator: 语言翻译
js文件数量较多,具体根据文件名找到对应文件查看源代码,就不一一赘述
/root/magicloud/mcs3-ui/src/web/css
custom-ui.css: 这里面是定制化的style,我们改版的样式代码都在这里面
/root/magicloud/mcs3-ui/src/web/image
/root/magicloud/mcs3-ui/src/web/L10N
分为三类:api,notification,ui,然后又分三种语言:英文,中文简体,台湾繁体
/root/magicloud/mcs3-ui/src/cgi-src
Magicloud用了两种路由,一种是Restful API的方式,另一种是Ajax的方式
项目中Restful API是基于Angular $resource服务构建的,所以还得稍微介绍一下Angular resource。。。
$http服务提供的实现极为简单和低级,可以用来发送XHR请求,同时它还为你提供了很大的可控性和灵活性。但是,在大多数情况下,我们需要处理对象,以及封装了特定属性和方法的对象模型,例如一个person对象(带有详细信息),或者一个信用卡对象。 
$resource就是为这一功能而设计的。AngularJS中的resource(资源)允许我们用描述性的方式来定义对象模型,它可以描述以下内容:
/cgi-bin/mcs3/json/:api)GET, POST, PUT, DELETE)get、save、query、remove和delete方法),这些方法为对象模型包装了特定的功能和业务逻辑(例如信用卡对象的charge()方法)。(这五种默认的方法是为了CURD而生的,其中get和query稍有区别,前者返回所有entry,后者返回单个,最重要的是可以自定义扩展,这也是我们项目中的主要应用)isArray参数配置)headers参数配置)obj表示请求服务器指定url地址后返回的$resource对象,该对象中就包含了与服务端进行数据交互的全部API。 
参数url表示请求服务器的地址,其中允许占位符变量,该变量必须以:为前缀,例如:
var obj=$resource('url?action=:act');obj.$save{act:'save'}
那么,在执行save动作时,向服务端发送的实际地址就为url?action=save。
此外,可选参数paramsDefaults是一个对象,用于设置请求时的默认参数值,在发送请求时,该对象中的全部值将自动进行序列化,如遇占位符变量自动替换(也可以通过第三个参数替换),并将结果添加到url请求之后,代码如下:
var obj=`$resource`('url?action=:act',{act:'save',a:'1',b:'2'});
执行上述代码后,向服务器发送的实际地址是url?action=save&a=1&b=2。
另外一个可选参数actions的功能是扩展默认资源动作,例如,可以在该对象中自定义新的方法:
var boj=$resource('url?action=:act',{...},{a:{method:'get'}});
然后就可以在$resource对象中直接调用在可选参数actions中自定义的方法a,即obj.$a()
参考链接:
var url = "/cgi-bin/mcs3/json/:api"; // 请求url,:api为占位符...return $resource(url, {}, {host_nic_list : {method: "GET",params: { api : "host_nic_list" },// :api占位符替换字段为host_nic_list,所以最后的请求url为/cgi-bin/mcs3/json/host_nic_listtransformResponse: [check_api_error_and_transform, transform_host_nic_list]},...);


目前项目中主要使用了三种语言,分别是英文,中文简体和台湾繁体,以后的开发中,我们将舍弃台湾繁体,仅兼容英文和中文简体
语言类型指的是根据项目中语言的应用场景进行的分类,分为api,notification和ui三种方式
即声明语言字符串和语言变量的map绑定关系
在html中,通过在任意标签中声明data-translate这个属性,调用前文声明的变量,例如footer:
<footer class="mc-footer" data-translate="COMPANY">
PS:具体实现需要查看上文提到的
translator.js,里面做了一系列的封装工作
Log在手,天下我有
logging模块中主要由四个部分组成:


apache的相关信息udev等ceph.log,ceph.aduit.log,ceph-osd.log,ceph-mon.log等等,ceph内部相关的日志rpc异步处理信息(应用较多)task和更新task的两个APIganglia相关的信息,比如ganglia向每台主机分发信息等monitor相关的信息,比如后端监控各种metrics,集群信息,磁盘,内存,IOPS等等config file
/root/magicloud/mcs3-deploy/src/mcs3/log.py
然后你可以在MCLog.init_handler()方法中添加或者修改handler,filter和formatter,log level就在handler里面设置
上面提到了许多mcs3admin.log,mcrpc.log等众多日志,这些日志存在的意义就是让不同进程的业务日志打印到不同文件中,达到日志业务分离的目的,每天系统会针对每个日志进行压缩备份,生成空的日志文件,定期清除备份归档文件
log的文件指定和初始化都是在众多守护进程的文件代码中,例如下面的mcarpc daemon:

模块查找
debian打包路径查看python交互式命令行使用help命令查看module(这个不局限于某个项目,针对python)
>>> help('mcs3.utils')
daemon相关的代码后,需要重启守护进程才会生效py文件并不是都是以py结尾/etc/ceph/ceph.conf达到重新创建集群的目的恩。。用过的都说好
CLI方式批量创建OSD和启用OSD,Profile装饰器优雅使用)