This commit is contained in:
wm 2016-07-08 22:30:02 +08:00
parent fe163ae6ad
commit 92e5814d5c
22 changed files with 4147 additions and 3823 deletions

View File

@ -1 +1 @@
2 1

View File

@ -6,10 +6,11 @@ var select = require('xpath.js');
//var dataDetailPath = "/home/server_data/data-detail.xml" //var dataDetailPath = "/home/server_data/data-detail.xml"
//var dataPath = "/home/server_data/data.xml" //var dataPath = "/home/server_data/data.xml"
//var versionPath = "/home/server_data/version.txt" //var versionPath = "/home/server_data/version.txt"
var allDataPath = process.env.ALL_DATA || '/home/all_data';
var dataDetailPath = "/home/server_data/data-detail.xml" var dataDetailPath = allDataPath + "/collecting_data/data-detail.xml"
var dataPath = "/home/server_data/data.xml" var dataPath = allDataPath + "/collecting_data/data.xml"
var versionPath = "/home/server_data/version.txt" var versionPath = allDataPath+ "/collecting_data/version.txt"
//<2F><><EFBFBD><EFBFBD>fileId<49><64><EFBFBD><EFBFBD>ȡ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>ŵ<EFBFBD>λ<EFBFBD><CEBB> //<2F><><EFBFBD><EFBFBD>fileId<49><64><EFBFBD><EFBFBD>ȡ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>ŵ<EFBFBD>λ<EFBFBD><CEBB>
function getVersionPath(fileId){ function getVersionPath(fileId){

View File

@ -203,8 +203,9 @@ declare module Kubernetes {
function currentUserName(): any; function currentUserName(): any;
function createNamespace(ns: any, client?: any): void; function createNamespace(ns: any, client?: any): void;
function createRC(obj: any, onCompleteFn?: any): void; function createRC(obj: any, onCompleteFn?: any): void;
function connectOracle($http: any, $timeout: any, url: any, connectParam: any, rcName: any, delayTime: any): void; function connectOracle($http: any, $timeout: any, url: any, operation: any, rcName: any, delayTime: any): void;
function getOracleStatus(labels: any): number; function getOracleStatus(labels: any): number;
function getExtractStatus(labels: any): number;
function getOracleName(name: string): string; function getOracleName(name: string): string;
function extractDataToOracle($http: any, selectedReplicationControllers: any, targetReplicationController: any): void; function extractDataToOracle($http: any, selectedReplicationControllers: any, targetReplicationController: any): void;
function checkoutOracleRCIsRunning(rc: any): boolean; function checkoutOracleRCIsRunning(rc: any): boolean;

42
defs.d.ts vendored
View File

@ -1,7 +1,28 @@
/// <reference path="d.ts/includes.d.ts"/> /// <reference path="d.ts/includes.d.ts"/>
/// <reference path="d.ts/kubernetes/ts/kubernetesInterfaces.d.ts"/> /// <reference path="d.ts/kubernetes/ts/kubernetesInterfaces.d.ts"/>
/// <reference path="d.ts/kubernetes/ts/kubernetesHelpers.d.ts"/> /// <reference path="d.ts/kubernetes/ts/kubernetesHelpers.d.ts"/>
/// <reference path="d.ts/developer/ts/developerEnrichers.d.ts"/>
/// <reference path="d.ts/developer/ts/developerHelpers.d.ts"/>
/// <reference path="d.ts/developer/ts/developerNavigation.d.ts"/>
/// <reference path="d.ts/developer/ts/FileMode.d.ts"/>
/// <reference path="d.ts/developer/ts/developerPlugin.d.ts"/>
/// <reference path="d.ts/developer/ts/environmentPanel.d.ts"/>
/// <reference path="d.ts/developer/ts/home.d.ts"/>
/// <reference path="d.ts/developer/ts/jenkinsJob.d.ts"/>
/// <reference path="d.ts/developer/ts/jenkinsJobs.d.ts"/>
/// <reference path="d.ts/kubernetes/ts/kubernetesPlugin.d.ts"/> /// <reference path="d.ts/kubernetes/ts/kubernetesPlugin.d.ts"/>
/// <reference path="d.ts/kubernetes/ts/kubernetesModel.d.ts"/>
/// <reference path="d.ts/developer/ts/jenkinsLog.d.ts"/>
/// <reference path="d.ts/developer/ts/jenkinsMetrics.d.ts"/>
/// <reference path="d.ts/developer/ts/navbar.d.ts"/>
/// <reference path="d.ts/developer/ts/pipeline.d.ts"/>
/// <reference path="d.ts/developer/ts/pipelineDirective.d.ts"/>
/// <reference path="d.ts/developer/ts/pipelines.d.ts"/>
/// <reference path="d.ts/developer/ts/project.d.ts"/>
/// <reference path="d.ts/developer/ts/projectSelector.d.ts"/>
/// <reference path="d.ts/developer/ts/projects.d.ts"/>
/// <reference path="d.ts/developer/ts/workspace.d.ts"/>
/// <reference path="d.ts/developer/ts/workspaces.d.ts"/>
/// <reference path="d.ts/kubernetes/ts/apps.d.ts"/> /// <reference path="d.ts/kubernetes/ts/apps.d.ts"/>
/// <reference path="d.ts/kubernetes/ts/breadcrumbs.d.ts"/> /// <reference path="d.ts/kubernetes/ts/breadcrumbs.d.ts"/>
/// <reference path="d.ts/kubernetes/ts/build.d.ts"/> /// <reference path="d.ts/kubernetes/ts/build.d.ts"/>
@ -15,7 +36,6 @@
/// <reference path="d.ts/kubernetes/ts/deploymentConfig.d.ts"/> /// <reference path="d.ts/kubernetes/ts/deploymentConfig.d.ts"/>
/// <reference path="d.ts/kubernetes/ts/deploymentConfigs.d.ts"/> /// <reference path="d.ts/kubernetes/ts/deploymentConfigs.d.ts"/>
/// <reference path="d.ts/kubernetes/ts/events.d.ts"/> /// <reference path="d.ts/kubernetes/ts/events.d.ts"/>
/// <reference path="d.ts/kubernetes/ts/kubernetesModel.d.ts"/>
/// <reference path="d.ts/kubernetes/ts/host.d.ts"/> /// <reference path="d.ts/kubernetes/ts/host.d.ts"/>
/// <reference path="d.ts/kubernetes/ts/utilHelpers.d.ts"/> /// <reference path="d.ts/kubernetes/ts/utilHelpers.d.ts"/>
/// <reference path="d.ts/kubernetes/ts/hosts.d.ts"/> /// <reference path="d.ts/kubernetes/ts/hosts.d.ts"/>
@ -48,24 +68,4 @@
/// <reference path="d.ts/kubernetes/ts/sharedControllers.d.ts"/> /// <reference path="d.ts/kubernetes/ts/sharedControllers.d.ts"/>
/// <reference path="d.ts/kubernetes/ts/tabs.d.ts"/> /// <reference path="d.ts/kubernetes/ts/tabs.d.ts"/>
/// <reference path="d.ts/kubernetes/ts/templates.d.ts"/> /// <reference path="d.ts/kubernetes/ts/templates.d.ts"/>
/// <reference path="d.ts/developer/ts/developerEnrichers.d.ts"/>
/// <reference path="d.ts/developer/ts/developerHelpers.d.ts"/>
/// <reference path="d.ts/developer/ts/developerNavigation.d.ts"/>
/// <reference path="d.ts/developer/ts/FileMode.d.ts"/>
/// <reference path="d.ts/developer/ts/developerPlugin.d.ts"/>
/// <reference path="d.ts/developer/ts/environmentPanel.d.ts"/>
/// <reference path="d.ts/developer/ts/home.d.ts"/>
/// <reference path="d.ts/developer/ts/jenkinsJob.d.ts"/>
/// <reference path="d.ts/developer/ts/jenkinsJobs.d.ts"/>
/// <reference path="d.ts/developer/ts/jenkinsLog.d.ts"/>
/// <reference path="d.ts/developer/ts/jenkinsMetrics.d.ts"/>
/// <reference path="d.ts/developer/ts/navbar.d.ts"/>
/// <reference path="d.ts/developer/ts/pipeline.d.ts"/>
/// <reference path="d.ts/developer/ts/pipelineDirective.d.ts"/>
/// <reference path="d.ts/developer/ts/pipelines.d.ts"/>
/// <reference path="d.ts/developer/ts/project.d.ts"/>
/// <reference path="d.ts/developer/ts/projectSelector.d.ts"/>
/// <reference path="d.ts/developer/ts/projects.d.ts"/>
/// <reference path="d.ts/developer/ts/workspace.d.ts"/>
/// <reference path="d.ts/developer/ts/workspaces.d.ts"/>
/// <reference path="d.ts/navigation/ts/navigationPlugin.d.ts"/> /// <reference path="d.ts/navigation/ts/navigationPlugin.d.ts"/>

View File

@ -203,6 +203,9 @@ legend {
.k8s-badge-target { .k8s-badge-target {
background-color: Red; background-color: Red;
} }
.badge-remind {
background-color: Red;
}
.environment-row a { .environment-row a {
color: black; color: black;
@ -953,6 +956,9 @@ a:hover.data_file_btn {
.pod-log-lines * .white { .pod-log-lines * .white {
color: #ddd; color: #ddd;
} }
.top-bottom-middle {
line-height: 34px;
}
.terminal-window { .terminal-window {
position: fixed; position: fixed;

File diff suppressed because one or more lines are too long

View File

@ -18,18 +18,18 @@ var gulp = require('gulp'),
app = hawtio.app, app = hawtio.app,
shellprocess = require('child_process'), shellprocess = require('child_process'),
xmloperation = require('./app/xmloperation'), xmloperation = require('./app/xmloperation'),
rootdir = process.env.STORAGE_PATH || '/home/server_data/',
K8s = require('k8s'), K8s = require('k8s'),
crontab = require('node-crontab'), crontab = require('node-crontab'),
async = require('async'),
myjs=require('./app/my.js'); myjs=require('./app/my.js');
var oracledb = require('oracledb'); var oracledb = require('oracledb');
var plugins = gulpLoadPlugins({}); var plugins = gulpLoadPlugins({});
var pkg = require('./package.json'); var pkg = require('./package.json');
var time =0; var time =0;
var schedule = []; var schedule = [];
var allDataPath = process.env.ALL_DATA || '/home/all_data';
var rootdir = allDataPath + "/collecting_data/";
var kubectl = K8s.kubectl({ var kubectl = K8s.kubectl({
endpoint: process.env.KUBERNETES_MASTER, endpoint: process.env.KUBERNETES_MASTER,
binary: '/usr/bin/kubectl' binary: '/usr/bin/kubectl'
@ -313,7 +313,7 @@ gulp.task('connect', ['watch'], function() {
if(req.method=='POST') { if(req.method=='POST') {
var data = []; var data = [];
var parser = new xml2js.Parser(); var parser = new xml2js.Parser();
fs.readFile(rootdir + 'data.xml', function(err, xml) { fs.readFile(rootdir + '/data.xml', function(err, xml) {
parser.parseString(xml, function (err, result) { parser.parseString(xml, function (err, result) {
myjs.Recursion(result.node); myjs.Recursion(result.node);
data.push(result.node); data.push(result.node);
@ -324,9 +324,9 @@ gulp.task('connect', ['watch'], function() {
}); });
hawtio.use("/oracleAppPath",function(req,res){ hawtio.use("/oracleAppPath",function(req,res){
var dataPath = "/home/ubuntu/data/"; var dataPath = allDataPath + "/tabulate_data/";
var tmpPath = "/home/ubuntu/tmp/app"; var tmpPath = allDataPath + "/tmp_data/app";
var appSource="/home/app"; var appSource=allDataPath + "/template/app";
if(req.method="POST"){ if(req.method="POST"){
var timestamp=new Date(); var timestamp=new Date();
if((timestamp.getTime() - time) >= 2*60*1000){ if((timestamp.getTime() - time) >= 2*60*1000){
@ -337,7 +337,7 @@ gulp.task('connect', ['watch'], function() {
fs.mkdirSync(dataPath); fs.mkdirSync(dataPath);
//path.exists(tmpPath,function(exists){if(exists) console.log("exists");}); //path.exists(tmpPath,function(exists){if(exists) console.log("exists");});
fs.renameSync(tmpPath, dataPath+"app"); fs.renameSync(tmpPath, dataPath+"app");
console.log("move 'home/ubuntu/tmp/app' to " + dataPath); console.log("move '" + tmpPath + "' to " + dataPath);
xmloperation.savehuizong(timestamp.Format('yyyy-MM-dd hh:mm:ss'), '10', id, "汇总数据库("+ id +")", dataPath, dirName); xmloperation.savehuizong(timestamp.Format('yyyy-MM-dd hh:mm:ss'), '10', id, "汇总数据库("+ id +")", dataPath, dirName);
fs.writeFileSync('./app/version.txt', 2); fs.writeFileSync('./app/version.txt', 2);
res.send(200,{path: dataPath+"app/", name: dirName}); res.send(200,{path: dataPath+"app/", name: dirName});
@ -352,6 +352,18 @@ gulp.task('connect', ['watch'], function() {
//} //}
}); });
hawtio.use('/oracleExtractLog', function(req,res){
var path = allDataPath + "/tabulate_logs/" + req.query.rcName;
if(fs.existsSync(path)){
var log = fs.readFileSync(path, 'utf-8');
res.send(200,{logContent: log.toString()});
res.end();
}else{
res.send(200,{logContent: "当前没有日志可以查看!"});
res.end();
}
});
hawtio.use('/uploadfiles',function(req,res){ hawtio.use('/uploadfiles',function(req,res){
if(req.method==="POST"){ if(req.method==="POST"){
var relativePath = req.body.resumableRelativePath; var relativePath = req.body.resumableRelativePath;
@ -549,95 +561,271 @@ gulp.task('connect', ['watch'], function() {
});*/ });*/
hawtio.use('/connectToOracle',function(req,res){ hawtio.use('/connectToOracle',function(req,res){
var rcName = req.query.oracleName; var rcName = req.query.oracleName;
cancelOracleConectionTask(rcName); cancelOracleConectionTask(rcName);
kubectl.rc.get(rcName,function(err, rc){ kubectl.rc.get(rcName,function(err, rc){
//console.log(rc); //console.log(rc);
if(err){ if(err){
console.log(err); console.log(err);
return return
} }
if(rc && rc.status.replicas === 1 && rc.metadata.labels.hasOwnProperty("style") && rc.metadata.labels.style === "oracle"){ if(rc && rc.status.replicas === 1 && rc.metadata.labels.hasOwnProperty("style") && rc.metadata.labels.style === "oracle"){
var selector = rc.spec.selector; var selector = rc.spec.selector;
var task = { var task = {
taskName: rcName, taskName: rcName,
taskTime: 0, taskTime: 0,
taskCrontab: crontab.scheduleJob("*/1 * * * *", function(){ //This will call this function every 2 minutes taskCrontab: crontab.scheduleJob("*/1 * * * *", function(){ //This will call this function every 2 minutes
//console.log(rcName + "it's been 1 minutes!"); //console.log(rcName + "it's been 1 minutes!");
if(task.taskTime === 9){ if(task.taskTime === 9){
kubectl.rc.command("label --overwrite rc " + task.taskName + " status=1", function(err, data){ kubectl.rc.command("label --overwrite rc " + task.taskName + " status=1", function(err, data){
if(err) if(err)
console.log(err); console.log(err);
crontab.cancelJob(task.taskCrontab); crontab.cancelJob(task.taskCrontab);
cancelOracleConectionTask(task.rcName); cancelOracleConectionTask(task.rcName);
}); return;
} });
}
var selectorPods = [];
kubectl.pod.list(function(err, pods){
if(!err){
pods.items.forEach(function(item){
if(myjs.selectorMatches(selector, item.metadata.labels))
selectorPods.push(item);
});
if(selectorPods.length === 0)
return;
var host = selectorPods[0].status.hostIP
var port = selectorPods[0].spec.containers[0].ports[0].hostPort;
if(host && port){
oracledb.getConnection(
{
user : "system",
password : "oracle",
connectString : host + ":" + port + "/orcl"
},function(err, connection){
if (err) {
console.log("connection failed! message" + err.message);
return;
}
kubectl.rc.command("label --overwrite rc " + task.taskName + " status=2", function(err, data){
if(err){
console.log(err);
}
console.log("update replicationControllers " + rcName + " success");
if(connection !== null){
connection.close(function(err){
if (err){
console.error(err.message);
}
console.log(rcName + "connect success!");
crontab.cancelJob(task.taskCrontab);
cancelOracleConectionTask(task.rcName);
console.log(rcName + "connection closed!");
});
}
});
});
}
}
});
task.taskTime++;
})
}
schedule.push(task);
}
res.send(200,"Ok");
res.end();
});
});
var selectorPods = [];
kubectl.pod.list(function(err, pods){
if(!err){
pods.items.forEach(function(item){
if(myjs.selectorMatches(selector, item.metadata.labels))
selectorPods.push(item);
});
if(selectorPods.length === 0)
return;
var host = selectorPods[0].status.hostIP
var port = selectorPods[0].spec.containers[0].ports[0].hostPort;
if(host && port){
oracledb.getConnection(
{
user : "system",
password : "oracle",
connectString : host + ":" + port + "/orcl"
},function(err, connection){
if (err) {
console.log("connection failed! message" + err.message);
return;
}
console.log("connect success!");
kubectl.rc.command("label --overwrite rc " + task.taskName + " status=2", function(err, data){
if(err){
console.log(err);
}
console.log("update replicationControllers " + rcName + " success");
if(connection !== null){
connection.close(function(err){
if (err){
console.error(err.message);
}
crontab.cancelJob(task.taskCrontab);
cancelOracleConectionTask(task.rcName);
console.log("connection closed!");
});
}
});
});
}
}
});
task.taskTime++;
})
}
schedule.push(task);
}
res.send(200,"Ok");
res.end();
});
});
hawtio.use('/cancelOracleConection', function(req,res){ hawtio.use('/cancelOracleConection', function(req,res){
var rcName = req.query.oracleName; var rcName = req.query.oracleName;
cancelOracleConectionTask(rcName); var operation = req.query.operation;
res.send(200,"Ok"); if(operation !== 'stop')
res.end(); cancelOracleConectionTask(rcName);
else{
kubectl.rc.command("label --overwrite rc " + rcName + " status=0", function(err, data){
if(err)
console.error(err.message);
console.log("update replicationControllers " + rcName + " success");
cancelOracleConectionTask(rcName);
});
}
res.send(200,"Ok");
res.end();
}); });
hawtio.use('/extractOracleData', function(req,res){ hawtio.use('/extractOracleData', function(req,res){
var data = req.query.param; var data = req.query.param;
console.log(data); var poolOracle;
var collectOracle = [];
data.forEach(function(item){
var obj = JSON.parse(item);
if(obj.isTarget)
poolOracle = obj;
else{
var names = obj.OracleName.split("-");
kubectl.rc.command("label --overwrite rc " + obj.OracleName + " isExtract=1", function(err, data){
if(err)
console.error(err);
console.log("update replicationControllers " + obj.OracleName + " success");
});
obj["name"] = "J" + names[0] + "_" + names[1];
collectOracle.push(obj);
}
});
var poolOracleParam = poolOracle.connectHost + ":" +poolOracle.connectPort;
var logMessage = "";
oracledb.getConnection({
user : "system",
password : "oracle",
connectString : poolOracleParam + "/orcl"
}, function(err, connection){
if (err) {
console.error(err.message);
return;
}
var logPath = allDataPath + "/tabulate_logs/";
async.eachSeries(collectOracle, function(item, callback){
var strTUser = item.name + "_20152016";
var message = "-------------------------------------------采集库:" + item.name + "执行汇总-------------------------------------------";
console.log(message);
fs.appendFileSync(logPath + poolOracle.OracleName, message + "\n\n");
async.waterfall([
function(cb){
var dbLinkSql = "create public database link linkTo" + item.name + " connect to system IDENTIFIED BY oracle using "
+"'(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = "
+ item.connectHost + ")(PORT = " + item.connectPort + ")))(CONNECT_DATA = (SERVICE_NAME = orcl)))'";
fs.appendFileSync(logPath + poolOracle.OracleName, "SQL> " + dbLinkSql + "\n\n");
connection.execute(dbLinkSql, function(err, result){
if(err){
fs.appendFileSync(logPath + poolOracle.OracleName, err + "\n\n");
cb(null);
return;
}
fs.appendFileSync(logPath + poolOracle.OracleName, "数据库链接已创建。" + "\n\n");
cb(null);
});
},
function(cb){
connection.execute("select TABLESPACE_NAME from dba_tablespaces where TABLESPACE_NAME = 'TS_JSSJBS'", function(err, result){
if(err){
console.log(err);
return;
}
if(result.rows.length !== 0)
cb(null, false);
else
cb(null, true);
});
},
function(arg, cb){
if(!arg){
cb(null);
return;
}
var sql = "create tablespace TS_JSSJBS datafile '/opt/oracle/app/oradata/orcl/ts_jssjbs.dbf' size 512M autoextend on next 512M maxsize unlimited";
fs.appendFileSync(logPath + poolOracle.OracleName, "SQL> " + sql + ";\n\n");
connection.execute(sql, function(err, result){
if (err){
fs.appendFileSync(logPath + poolOracle.OracleName, err + "\n\n");
cb(null);
return;
}
fs.appendFileSync(logPath + poolOracle.OracleName, "表空间已创建。" + "\n\n");
cb(null);
});
},
function(cb){
var sql = "Create user " + strTUser + " default tablespace TS_JSSJBS identified by 1";
fs.appendFileSync(logPath + poolOracle.OracleName, "SQL> " + sql + ";\n\n");
connection.execute(sql, function(err, result){
if (err){
fs.appendFileSync(logPath + poolOracle.OracleName, err + "\n\n");
cb(null);
return;
}
fs.appendFileSync(logPath + poolOracle.OracleName, "用户已创建。" + "\n\n");
//console.log("create us");
cb(null);
});
},
function(cb){
var sql = "grant connect, resource, dba to " + strTUser;
fs.appendFileSync(logPath + poolOracle.OracleName, "SQL> " + sql + ";\n\n");
connection.execute(sql, function(err, result){
if(err)
fs.appendFileSync(logPath + poolOracle.OracleName, err + "\n\n");
fs.appendFileSync(logPath + poolOracle.OracleName, "授权成功。" + "\n\n");
//console.log("grant dba");
cb(null);
});
},
function(cb){
var sql = "SELECT 'create table " + strTUser + ".J'|| substr(t.OWNER||'_'||t.TABLE_NAME,0,29)||' as select * from '||t.OWNER||'.'||t.TABLE_NAME||"
+"'@linkTo" + item.name + ";' FROM dba_tables@linkTo" + item.name + " t WHERE t.TABLESPACE_NAME NOT IN ('SYSTEM','SYSAUX')"
+ " and t.owner||t.table_name not in (select owner||table_name from dba_tables@linkTo" + item.name + " where 'data_type'='CLOB')";
fs.appendFileSync(logPath + poolOracle.OracleName, "SQL> " + sql + ";\n\n");
connection.execute(sql, function(err, result){
if(err){
fs.appendFileSync(logPath + poolOracle.OracleName, err + "\n\n");
return;
}
preSql = [];
result.rows.forEach(function(row){
row.forEach(function(it){
preSql.push(it.replace(/;$/, ""));
fs.appendFileSync(logPath + poolOracle.OracleName, it + "\n");
});
});
fs.appendFileSync(logPath + poolOracle.OracleName, "\n");
cb(null, preSql);
});
},
function(arg, cb){
async.eachSeries(arg, function(sql, cback){
fs.appendFileSync(logPath + poolOracle.OracleName, "SQL> " + sql + ";\n\n");
connection.execute(sql, function(err, result){
if(err){
fs.appendFileSync(logPath + poolOracle.OracleName, err + "\n\n");
cback(null, !err);
return;
}
fs.appendFileSync(logPath + poolOracle.OracleName, "表已创建。" + "\n\n");
cback(null, !err);
});
}, function(err, result){
cb(null);
});
}
], function(err, result){
if(err)
console.error(err);
kubectl.rc.command("label --overwrite rc " + item.OracleName + " isExtract=2", function(err, data){
if(err)
console.err(err);
console.log("update replicationControllers " + item.OracleName + " success");
callback(null);
});
});
}, function(err, result){
if(err)
console.error(err);
connection.close(function(err){
if(err)
console.log(err);
});
});
});
res.send(200,"Ok");
res.end();
}); });
hawtio.listen(function(server) { hawtio.listen(function(server) {

BIN
node_modules.tar.gz Normal file

Binary file not shown.

View File

@ -29,6 +29,7 @@
"yargs": "^3.32.0" "yargs": "^3.32.0"
}, },
"dependencies": { "dependencies": {
"async": "^2.0.0-rc.6",
"connect-multiparty": "^2.0.0", "connect-multiparty": "^2.0.0",
"hawtio-node-backend": "^2.1.0", "hawtio-node-backend": "^2.1.0",
"k8s": "^0.2.7", "k8s": "^0.2.7",

View File

@ -364,7 +364,7 @@ module Developer {
} }
$scope.downLoadFiles = ()=>{ $scope.downLoadFiles = ()=>{
Kubernetes.connectOracle($http, $timeout, "192.168.0.103:64182", "320614-54-1", 500); //Kubernetes.connectOracle($http, $timeout, "192.168.0.103:64182", "320614-54-1", 500);
} }
$scope.isSelected= (node)=>{ $scope.isSelected= (node)=>{
@ -394,8 +394,8 @@ module Developer {
var Obj = createRCObj($scope.model.selecteditems[id]); var Obj = createRCObj($scope.model.selecteditems[id]);
if(!checkIsRunning(KubernetesModel.replicationControllers,Obj)){ if(!checkIsRunning(KubernetesModel.replicationControllers,Obj)){
Kubernetes.createRC(Obj, (rc) =>{ Kubernetes.createRC(Obj, (rc) =>{
console.log(rc.metadata.name); console.log(rc);
Kubernetes.connectOracle($http, $timeout, "/connectToOracle", "", rc.metadata.name, 0); Kubernetes.connectOracle($http, $timeout, "/connectToOracle", "create", rc.metadata.name, 0);
}); });
} }
} }

View File

@ -34,6 +34,22 @@
</a> </a>
</div> </div>
</script> </script>
<script type="text/ng-template" id="dataSummaryTemplate.html">
<div class="ngCellText" ng-init="entity=row.entity" >
<a ng-show="row.entity.$podCounters.podsLink" title="pods status">
<span ng-show="row.entity.$extractStatus === 0" class="badge badge-info" href=""> 未汇总</span>
<span ng-show="row.entity.$extractStatus === 1" class="badge badge-success" href=""> 正在汇总</span>
<span ng-show="row.entity.$extractStatus === 2" class="badge" href=""> 已完成</span>
<span ng-show="row.entity.$extractStatus === 3" class="badge badge-warning" href=""> 失败</span>
<div ng-show="row.entity.$extractStatus === 10">
<span class="badge badge-remind"> 汇总数据库</span>
<span ng-include = "'oracleLogTemplate.html'"></span>
</div>
</a>
</div>
</script>
<script type="text/ng-template" id="labelTemplate.html"> <script type="text/ng-template" id="labelTemplate.html">
<div class="ngCellText" ng-init="entity=row.entity" ng-controller="Kubernetes.Labels"> <div class="ngCellText" ng-init="entity=row.entity" ng-controller="Kubernetes.Labels">
<p ng-show="data"><strong>Labels</strong></p> <p ng-show="data"><strong>Labels</strong></p>
@ -135,6 +151,12 @@
</span> </span>
</script> </script>
<script type="text/ng-template" id="oracleLogTemplate.html">
<span ng-controller="Kubernetes.PodLogLinkController">
<i class="fa fa-file-text" title="打开{{entity.$oracleName}}的汇总日志" ng-click="openLogs(entity)"></i>
</span>
</script>
<script type="text/ng-template" id="connectParamTemplate.html"> <script type="text/ng-template" id="connectParamTemplate.html">
<div class="ngCellText" ng-init="entity=row.entity"> <div class="ngCellText" ng-init="entity=row.entity">
<p ng-show="row.entity.$pods.length"><strong>{{row.entity.$pods[0].$host}}:{{row.entity.$pods[0].spec.containers[0].ports[0].hostPort}}/orcl</strong></p> <p ng-show="row.entity.$pods.length"><strong>{{row.entity.$pods[0].$host}}:{{row.entity.$pods[0].spec.containers[0].ports[0].hostPort}}/orcl</strong></p>

View File

@ -4,12 +4,12 @@
<span class="fa fa-caret-down"></span> <span class="fa fa-caret-down"></span>
</div> </div>
<div class="terminal-title" ng-mousedown="mouseDown($event)" ng-mouseup="mouseUp($event)" ng-mousemove="mouseMove($event)"> <div class="terminal-title" ng-mousedown="mouseDown($event)" ng-mouseup="mouseUp($event)" ng-mousemove="mouseMove($event)">
<h5>{{containerName}} logs</h5> <h5 class="top-bottom-middle">{{containerName}}的汇总日志</h5>
<i class="fa fa-remove pull-right clickable" title="Close and exit this log" ng-click="close()"></i> <i class="fa fa-remove pull-right clickable" title="Close and exit this log" ng-click="close()"></i>
<i class="fa fa-square-o pull-right clickable" title="Maximize this log" ng-click="maximize($event)"></i> <i class="fa fa-square-o pull-right clickable" title="Maximize this log" ng-click="maximize($event)"></i>
<i class="fa fa-sort-desc pull-right clickable" ng-hide="maximized()" title="Minimize this log" ng-click="minimize($event)"></i> <i class="fa fa-sort-desc pull-right clickable" ng-hide="maximized()" title="Minimize this log" ng-click="minimize($event)"></i>
</div> </div>
<div class="terminal-body" scroll-glue ng-model="atBottom"> <!--<div class="terminal-body" scroll-glue ng-model="atBottom" style="overflow-y:hidden"> -->
<pod-log-display></pod-log-display> <textarea style="height:100%; width:100%" disabled="disabled">{{logs}}</textarea>
</div> <!--</div>-->
</div> </div>

View File

@ -115,7 +115,7 @@
</select> </select>
<span class="help-block" ng-show="filterReplicationControllers.length == 0"> <span class="help-block" ng-show="filterReplicationControllers.length == 0">
当前没有汇总数据库可以选择,请先创建,可以点击创建汇总数据库按钮进行创建! 当前没有汇总数据库可以选择,请先创建,可以点击创建汇总数据库按钮进行创建或从汇总页面中的服务器数据列表中启动已创建的汇总数据库
</span> </span>
</div> </div>
</div> </div>

View File

@ -29,3 +29,7 @@
color: #ddd; color: #ddd;
} }
} }
.top-bottom-middle{
line-height: 34px;
}

View File

@ -1739,23 +1739,23 @@ module Kubernetes {
var rcTemplate = RCTemplate.createRC(obj); var rcTemplate = RCTemplate.createRC(obj);
//console.log(rcTemplate); //console.log(rcTemplate);
client.put(rcTemplate, function(obj) { client.put(rcTemplate, function(obj) {
console.log("Created: ", obj); //console.log("Created: ", obj);
if (angular.isFunction(onCompleteFn)) { if (angular.isFunction(onCompleteFn)) {
onCompleteFn(obj); onCompleteFn(obj);
} }
}); });
} }
export function connectOracle($http, $timeout, url, connectParam, rcName, delayTime){ export function connectOracle($http, $timeout, url, operation, rcName, delayTime){
$timeout(() => { $timeout(() => {
$http({ $http({
url: url, url: url,
method:'POST', method:'POST',
params:{oracleName: rcName, param: connectParam} params:{oracleName: rcName, operation: operation}
}).success(function(data,header,config,status){ }).success(function(data,header,config,status){
console.log("success"); console.log("success");
}).error(function(data,header,config,status){ }).error(function(data,header,config,status){
log.warn("Failed to connect " + connectParam + " " + data + " " + status); //log.warn("Failed to connect " + connectParam + " " + data + " " + status);
}); });
}, delayTime); }, delayTime);
} }
@ -1780,6 +1780,14 @@ module Kubernetes {
return answer; return answer;
} }
export function getExtractStatus(labels){
if(labels.isTarget === 'false'){
return parseInt(labels.isExtract);
}else{
return 10;
}
}
export function getOracleName(name:string):string { export function getOracleName(name:string):string {
var results = name.split("-"); var results = name.split("-");
if(results.length === 2){ if(results.length === 2){
@ -1808,10 +1816,10 @@ module Kubernetes {
if(getName(rc) !== getName(targetReplicationController)){ if(getName(rc) !== getName(targetReplicationController)){
answer = answer && checkoutOracleRCIsRunning(rc); answer = answer && checkoutOracleRCIsRunning(rc);
oracleConnectParam.push({ oracleConnectParam.push({
OracleName: getName(rc), "OracleName": getName(rc),
connectHost: getHost(rc.$pods[0]), "connectHost": getHost(rc.$pods[0]),
connectPort: rc.$pods[0].spec.containers[0].ports[0].hostPort, "connectPort": rc.$pods[0].spec.containers[0].ports[0].hostPort,
isTarget: false "isTarget": false
}); });
} }
}); });
@ -1819,6 +1827,7 @@ module Kubernetes {
if(answer){ if(answer){
$http({ $http({
url: '/extractOracleData', url: '/extractOracleData',
dataType: 'json',
method:'POST', method:'POST',
params:{param: oracleConnectParam} params:{param: oracleConnectParam}
}).success(function(data,header,config,status){ }).success(function(data,header,config,status){

View File

@ -357,6 +357,8 @@ module Kubernetes {
replicationController.$oracleName = getOracleName(getName(replicationController)); replicationController.$oracleName = getOracleName(getName(replicationController));
//console.log(getName(replicationController)); //console.log(getName(replicationController));
replicationController.$oracleStatus = getOracleStatus(getLabels(replicationController)); replicationController.$oracleStatus = getOracleStatus(getLabels(replicationController));
replicationController.$extractStatus = getExtractStatus(getLabels(replicationController));
var selectedPods = replicationController.$pods; var selectedPods = replicationController.$pods;
replicationController.connectTo = selectedPods.map((pod) => { replicationController.connectTo = selectedPods.map((pod) => {

View File

@ -183,7 +183,7 @@ module Kubernetes {
}) })
.href(() => context) .href(() => context)
.title(() => '服务集群') .title(() => '服务集群')
.tabs(controllers, events) .tabs(controllers, pods, events)
.build(); .build();
HawtioNav.add(mainTab); HawtioNav.add(mainTab);

View File

@ -45,11 +45,11 @@ module Kubernetes {
}); });
}); });
_module.controller("Kubernetes.PodLogLinkController", ($scope, TerminalService, $templateCache) => { _module.controller("Kubernetes.PodLogLinkController", ($scope, $interval, TerminalService, $templateCache) => {
$scope.openLogs = (entity) => { $scope.openLogs = (entity) => {
log.debug("Open logs: ", entity); log.debug("Open logs: ", entity);
TerminalService.newTerminal(entity.metadata.selfLink, entity.metadata.name, $templateCache.get(UrlHelpers.join(templatePath, 'logShell.html'))); TerminalService.newTerminal($interval, entity.metadata.selfLink, entity.$oracleName, entity,$templateCache.get(UrlHelpers.join(templatePath, 'logShell.html')));
} }
}); });

View File

@ -61,6 +61,10 @@ module Kubernetes {
return 1; return 1;
} }
} }
},
{ field: '$extractStatus',
displayName: '数据汇总状态',
cellTemplate: $templateCache.get("dataSummaryTemplate.html")
} }
] ]
} }
@ -89,7 +93,7 @@ module Kubernetes {
log.debug("deleted: ", getName(next)); log.debug("deleted: ", getName(next));
if(next.metadata.labels.style === "oracle"){ if(next.metadata.labels.style === "oracle"){
console.log("delete " + next.metadata.name); console.log("delete " + next.metadata.name);
Kubernetes.connectOracle($http, $timeout, "/cancelOracleConection", "", getName(next), 0); Kubernetes.connectOracle($http, $timeout, "/cancelOracleConection", "delete", getName(next), 0);
} }
deleteSelected(selected, selected.shift()); deleteSelected(selected, selected.shift());
}, (error) => { }, (error) => {
@ -151,7 +155,7 @@ module Kubernetes {
}).error(function(data,header,config,status){ }).error(function(data,header,config,status){
console.log("error"); console.log("error");
}); });
Kubernetes.connectOracle($http, $timeout, "/connectToOracle", "", getName(rc), 0); Kubernetes.connectOracle($http, $timeout, "/connectToOracle", "create", getName(rc), 0);
}); });
}else if(xhr.status == 403){ }else if(xhr.status == 403){
alert("两次创建oracle服务时间间隔需要超过2分钟!"); alert("两次创建oracle服务时间间隔需要超过2分钟!");
@ -180,7 +184,7 @@ module Kubernetes {
Kubernetes.resizeController($http, KubernetesApiURL, next, 0, () => { Kubernetes.resizeController($http, KubernetesApiURL, next, 0, () => {
if(next.metadata.labels.style === "oracle"){ if(next.metadata.labels.style === "oracle"){
console.log("stop " + next.metadata.name); console.log("stop " + next.metadata.name);
Kubernetes.connectOracle($http, $timeout, "/cancelOracleConection", "", getName(next), 0); Kubernetes.connectOracle($http, $timeout, "/cancelOracleConection", "stop", getName(next), 0);
} }
stopSelected(selected, selected.shift()); stopSelected(selected, selected.shift());
}); });
@ -205,7 +209,7 @@ module Kubernetes {
if(next.$replicas === 0) if(next.$replicas === 0)
Kubernetes.resizeController($http, KubernetesApiURL, next, 1, () => { Kubernetes.resizeController($http, KubernetesApiURL, next, 1, () => {
console.log("restart " + next.metadata.name); console.log("restart " + next.metadata.name);
Kubernetes.connectOracle($http, $timeout, "/connectToOracle", "", getName(next), 0); Kubernetes.connectOracle($http, $timeout, "/connectToOracle", "reStart", getName(next), 0);
startSelected(selected, selected.shift()); startSelected(selected, selected.shift());
}); });
} }

View File

@ -97,9 +97,9 @@ module Kubernetes {
//服务状态过滤 //服务状态过滤
export var Status = controller('Status', ["$scope", "$http", "$interval", "$location", "KubernetesApiURL", ($scope, $http, $interval, $location, KubernetesApiURL) => { export var Status = controller('Status', ["$scope", "$http", "$interval", "$location", "KubernetesApiURL", ($scope, $http, $interval, $location, KubernetesApiURL) => {
// $scope.$watch('entity', (newValue, oldValue) => { /*$scope.$watch('entity', (newValue, oldValue) => {
// if(newValue) if(newValue)
// console.log(newValue); console.log(newValue);
// },true); },true);*/
}]); }]);
} }

View File

@ -22,7 +22,7 @@ module Kubernetes {
}; };
}); });
_module.service('TerminalService', ($rootScope, $document, $compile, $templateCache) => { _module.service('TerminalService', ($rootScope, $document, $compile, $interval, $templateCache) => {
var body = $document.find('body'); var body = $document.find('body');
function positionTerminals(terminals) { function positionTerminals(terminals) {
var total = _.keys(terminals).length; var total = _.keys(terminals).length;
@ -42,7 +42,8 @@ module Kubernetes {
positionTerminals(self.terminals); positionTerminals(self.terminals);
}, },
terminals: {}, terminals: {},
newTerminal: (podLink, containerName, template = defaultTemplate) => { httpTask: {},
newTerminal: ($interval, podLink, containerName, entity, template = defaultTemplate) => {
var terminalId = UrlHelpers.join(podLink, containerName); var terminalId = UrlHelpers.join(podLink, containerName);
if (terminalId in self.terminals) { if (terminalId in self.terminals) {
log.debug("Already a terminal with id: ", terminalId); log.debug("Already a terminal with id: ", terminalId);
@ -50,10 +51,19 @@ module Kubernetes {
return terminalId; return terminalId;
} }
var scope = $rootScope.$new(); var scope = $rootScope.$new();
getLogs(entity, scope);
scope.podLink = podLink; scope.podLink = podLink;
scope.containerName = containerName; scope.containerName = containerName;
scope.id = terminalId; scope.id = terminalId;
scope.docked = true; scope.docked = true;
if(terminalId in self.httpTask){
self.raiseTerminal(terminalId);
return terminalId;
}else{
self.httpTask[terminalId] = $interval(() =>{
getLogs(entity, scope);
},2000);
}
var el = $($compile(template)(scope)); var el = $($compile(template)(scope));
var term = { var term = {
scope: scope, scope: scope,
@ -66,6 +76,11 @@ module Kubernetes {
}, },
closeTerminal: (id) => { closeTerminal: (id) => {
var term = self.terminals[id]; var term = self.terminals[id];
var timer = self.httpTask[id];
if(timer){
$interval.cancel(timer);
delete self.httpTask[id];
}
if (term) { if (term) {
term.el.remove(); term.el.remove();
delete self.terminals[id]; delete self.terminals[id];
@ -284,5 +299,25 @@ module Kubernetes {
} }
}; };
}); });
function getLogs(rc, scope){
console.log(scope);
var xhr= new XMLHttpRequest();
xhr.onreadystatechange = () => {
if(xhr.readyState == 4){
if (xhr.status == 200){
var obj=JSON.parse(xhr.responseText);
var text = obj.logContent.replace(/\\n/gmi, '\r\n');
scope.logs = text;
//return ({text: "aaaaaa"});
}else{
//log = "当前没有可以查看的日志!";
}
}
}
xhr.open("POST", "/oracleExtractLog?rcName=" + getName(rc),false);
xhr.send(null);
}
} }

View File

@ -254,4 +254,7 @@ legend {
.k8s-badge-target { .k8s-badge-target {
background-color: Red; background-color: Red;
} }
.badge-remind{
background-color: Red;
}