Skip to content

Commit

Permalink
增加支持多master 连接
Browse files Browse the repository at this point in the history
  • Loading branch information
shudingbo committed Feb 27, 2020
1 parent c023f0f commit 797a3b7
Show file tree
Hide file tree
Showing 11 changed files with 183 additions and 33 deletions.
13 changes: 12 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,12 +42,20 @@ exports.pomelo = {
// {app_root}/config/config.default.js
exports.pomelo = {
client: {
master: {
master: [{
alias:'myTestMaster',
host: '127.0.0.1',
port: 3005,
username: 'admin',
password: 'admin',
},
{
host: '192.168.0.12',
port: 3005,
username: 'admin',
password: 'admin',
},
],
},
};

Expand Down Expand Up @@ -128,6 +136,9 @@ consts.COMANDS_ALL = [
```

## 更改记录
### 0.0.7
1. 增加多个Master连接功能;

### 0.0.5
1. 使用 sex-pomelo-admin 1.0.7;
1. 实现确保多个命令并行执行时,返回数据顺序正确;
Expand Down
1 change: 0 additions & 1 deletion agent.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
const scA = require('./lib/pomeloAgent');

module.exports = agent => {

agent.messenger.on('egg-pomelo', (...args) => {
agent.pomelo.runCmd(...args);
});
Expand Down
3 changes: 2 additions & 1 deletion config/config.default.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,13 @@ module.exports = () => {

config.pomelo = {
client: {
master: {
master: [{
host: '127.0.0.1',
port: 3005,
username: 'admin',
password: 'admin',
},
],
},
};

Expand Down
13 changes: 11 additions & 2 deletions index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,17 @@ export class PomeloManagerApp {
app: Application
logger: EggLogger

/** 执行命令 */
runAction( cmd:String, context:String ): CmdRet
/** 执行命令
* @param {string} cmd - command,example: show servers
* @param {string} context - run context, all or serverId
* @param {string} masterName which master
*/
runAction( cmd:String, context:String, masterName:String ): CmdRet

/** 执行管理命令
* @param {string} cmd - command,example: show servers
*/
runMgrCmd(cmd:String):CmdRet

/** 执行脚本字符串 */
execStr( script:String, context:String ): CmdRet
Expand Down
5 changes: 3 additions & 2 deletions lib/commandBase.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ class CommandBase {
this.ctxPid = ctx.pid;
}

this.ctx = ctx;
this.argv = argv;
this.msg = msg;
this.cmdReqId = ctx.cmdIdx;
Expand Down Expand Up @@ -65,15 +66,15 @@ class CommandBase {
* @param {object} data 数据
*/
sendOk(data) {
this.cmdMgr.agent.sendMsgOK(this.ctxPid, this.cmdReqId, data);
this.cmdMgr.agent.sendMsgOK(this.ctx, data);
}

/** 发送错误信息
*
* @param {string} err 错误信息
*/
sendErr(err) {
this.cmdMgr.agent.sendMsgErr(this.ctxPid, this.cmdReqId, err);
this.cmdMgr.agent.sendMsgErr(this.ctx, err);
}

/** 发送帮助命令
Expand Down
2 changes: 1 addition & 1 deletion lib/consts.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ consts.WELCOME_INFO = [ '\nWelcome to Pomelo interactive client.',

consts.HELP_INFO_1 = [
'\nFor information about Pomelo products and services, visit:',
' http://pomelo.netease.com/',
' https://github.com/sex-pomelo/sex-pomelo',
'\nList of all Pomelo commands:\n',
];

Expand Down
5 changes: 2 additions & 3 deletions lib/pomeloAgent.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
'use strict';


const sc = require('./pomeloManagerAgent'); // -- you code here require is 'sdb_schedule'
const cliMgr = require('./pomeloCliMgr'); // -- you code here require is 'sdb_schedule'


module.exports = agent => {
Expand All @@ -11,11 +11,10 @@ module.exports = agent => {
async function createClient(config, agent) {
// test config
// agent.coreLogger.info('[egg-pomelo] connecting %s@%s:%s/%s', config.user, config.server, config.port, config.database);

/** @type {sc} */
let cli = null;
if (cli === null) {
cli = new sc(config, agent);
cli = new cliMgr(config, agent);
}

// 做启动应用前的检查
Expand Down
98 changes: 98 additions & 0 deletions lib/pomeloCliMgr.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
'use strict';

const sc = require('./pomeloManagerAgent');

class pomeloCliMgr {

constructor(config, agent) {
this.agent = agent;
this.clis = {};
this.defCli = null;

let master = config.master;
if ((master instanceof Array) === false) {
master = [ config.master ];
}

for (const it of master) {
let name = `${it.host}-${it.port}`;
if (typeof (it.alias) === 'string') {
name = it.alias;
}

const cli = new sc(it, agent);

this.clis[name] = {
config: it,
ins: cli,
};

this.defCli = cli;
}
}

runCmd(evtInfo) {
if (typeof (evtInfo.mgrCmd) === 'string') {
this.runMgrCmd(evtInfo);
} else {
let ins = this.defCli;
if (typeof (evtInfo.masterName) === 'string') {
const cli = this.clis[evtInfo.masterName];
if (cli !== undefined) {
ins = cli.ins;
}
}

ins.runCmd(evtInfo);
}
}

runMgrCmd(cmdInfo) {
switch (cmdInfo.mgrCmd) {
case 'getMasters':
{
const data = [];
for (const it in this.clis) {
data.push(this.clis[it].config);
}
this.sendMsgOK(cmdInfo, data);

} break;
default:
this.sendMsgErr(cmdInfo, `Unsupport MgrCmd: ${cmdInfo.mgrCmd}`);
break;
}
}

/** 发送信息
* @param {object} cmdCtx cmd run context
* @param {object} data - return data
*/
sendMsgOK(cmdCtx, data) {
const ret = {
cmdIdx: cmdCtx.cmdIdx,
status: true,
data,
};

this.agent.messenger.sendTo(cmdCtx.pid, 'egg-pomelo', ret);
}

/** 发送错误信息
* @param {object} cmdCtx cmd run context
* @param {string} err err message
*/
sendMsgErr(cmdCtx, err) {
const ret = {
cmdIdx: cmdCtx.cmdIdx,
status: false,
message: err,
};

this.agent.messenger.sendTo(cmdCtx.pid, 'egg-pomelo', ret);
}
}


module.exports = pomeloCliMgr;

38 changes: 20 additions & 18 deletions lib/pomeloManagerAgent.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ class PomeloManagerAgent {
}

createClient(config, agent) {
const { host, port, username, password } = config.master;
const { host, port, username, password } = config;

let client = null;
client = new adminClient({
Expand All @@ -36,8 +36,9 @@ class PomeloManagerAgent {
if (err) {
agent.coreLogger.warn('[pomelo-ag] ', err);
} else {
agent.coreLogger.info('[pomelo-ag] connect to master!');
self.logger.info('[pomelo-ag] connect to master!');
const msg = `[pomelo-ag] connect to master ${host}:${port}!`;
agent.coreLogger.info(msg);
self.logger.info(msg);
}
}, false);

Expand Down Expand Up @@ -66,19 +67,19 @@ class PomeloManagerAgent {
*/
runCmd(evtInfo) {
if (this.drv.isConnected() === false) {
this.sendMsgErr(evtInfo.pid, evtInfo.cmdIdx, 'Not connected to pomelo-master');
this.sendMsgErr(evtInfo, 'Not connected to pomelo-master');
return;
}

const { username } = this.config.master;
const { username } = this.config;
const { key } = evtInfo;
this.logger.debug('[pomelo-ag] run Cmd:', evtInfo);
switch (key) {
case 'help':
case '?':
{
const szInfo = util.help();
this.sendMsgOK(evtInfo.pid, evtInfo.cmdIdx, { message: szInfo });
this.sendMsgOK(evtInfo, { message: szInfo });
} break;
default:
this.command.handle(key, {
Expand All @@ -94,41 +95,42 @@ class PomeloManagerAgent {
}

/** 发送信息
* @param {number} pid app worker's pid
* @param {number} cmdIdx command idx
* @param {object} cmdCtx cmd run context
* @param {object} data - return data
*/
sendMsgOK(pid, cmdIdx, data) {
if (arguments.length !== 3) {
sendMsgOK(cmdCtx, data) {
if (arguments.length !== 2) {
const err = new Error('sendMsgOK err length!');
this.logger.warn('[pomelo-ag] sendMsgOK ...', err.stack);
}
const ret = {
cmdIdx,
cmdIdx: cmdCtx.cmdIdx,
status: true,
masterName: (typeof (cmdCtx.masterName) === 'string') ? cmdCtx.masterName : null,
data,
};

this.agent.messenger.sendTo(pid, 'egg-pomelo', ret);
this.agent.messenger.sendTo(cmdCtx.pid, 'egg-pomelo', ret);
}

/** 发送错误信息
* @param {number} pid app worker's pid
* @param {number} cmdIdx command idx
* @param {object} cmdCtx cmd run context
* @param {string} err err message
*/
sendMsgErr(pid, cmdIdx, err) {
if (arguments.length !== 3) {
sendMsgErr(cmdCtx, err) {
if (arguments.length !== 2) {
const err = new Error('sendMsgErr err length!');
this.logger.warn('[pomelo-ag] sendMsgErr ...', err.stack);
}

const ret = {
cmdIdx,
cmdIdx: cmdCtx.cmdIdx,
status: false,
masterName: (typeof (cmdCtx.masterName) === 'string') ? cmdCtx.masterName : null,
message: err,
};
this.agent.messenger.sendTo(pid, 'egg-pomelo', ret);

this.agent.messenger.sendTo(cmdCtx.pid, 'egg-pomelo', ret);
}

}
Expand Down
36 changes: 33 additions & 3 deletions lib/pomeloManagerApp.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,24 +27,29 @@ class PomeloManagerApp {
this.cmdIdx = 0; // 命令序列
}

/** 运行命令
/** 运行pomelo-cli 命令
* run pomelo-cli command
*
* @param {string} cmd 命令对象
* @param {string} context 上下文(服务器名称)
* @param {string} masterName 连接的那一台Master
*
* @return {{status:boolean},{data:object}} data 返回数据
*/
async runAction(cmd, context = 'all') {
async runAction(cmd, context = 'all', masterName = '') {
this.logger.debug('run action:', cmd, context);
const info = {
key: cmd,
pid: process.pid,
context,
};

info.pid = process.pid;
info.cmdIdx = this.cmdIdx++;
info.context = context;
if (typeof (masterName) === 'string' && masterName.length > 0) {
info.masterName = masterName;
}

this.app.messenger.sendToAgent('egg-pomelo', info);

return new Promise((resolve, reject) => {
Expand All @@ -54,6 +59,31 @@ class PomeloManagerApp {
});
}

/** 运行pomelo-cli 命令
* run pomelo-cli command
*
* @param {string} cmd 命令对象
*
* @return {{status:boolean},{data:object}} data 返回数据
*/
async runMgrCmd(cmd) {
this.logger.debug('run mgrcmd:', cmd);
const info = {
mgrCmd: cmd,
pid: process.pid,
};

info.cmdIdx = this.cmdIdx++;
this.app.messenger.sendToAgent('egg-pomelo', info);

return new Promise((resolve, reject) => {
this.emitter.once(`evtRet:${info.cmdIdx}`, evtInfo => {
resolve(evtInfo);
});
});
}


/** 在指定的node 上执行脚本字符串
*
* @param {string} script 脚本内容
Expand Down
Loading

0 comments on commit 797a3b7

Please sign in to comment.