yog-ral
Version:
node-ral with mcpack and nshead
148 lines (134 loc) • 4.5 kB
JavaScript
/*
* fis
* http://fis.baidu.com/
* 2014/8/20
*/
;
var ConfigNormalizer = require('node-ral').ConfigNormalizer;
var CTX = require('node-ral/lib/ctx');
var util = require('util');
var logger = require('node-ral').Logger('BNSNormalizer');
var bns;
var bnsCache = {};
function lazyFetchFromBNSCache(bnsName) {
bns = bns || require('@baidu/bns');
// 初期调用时使用同步获取服务器配置
if (bns.get_instance_by_service_async && bnsCache[bnsName]) {
bns.get_instance_by_service_async(bnsName).then(ret => {
logger.trace('cache updated by get_service_conf_async ' + bnsName);
bnsCache[bnsName] = ret;
}).catch(err => {
logger.warning("BNS " + bnsName + " aysnc update failed: " + err);
});
return bnsCache[bnsName];
}
var ret = bns.get_instance_by_service(bnsName);
if (ret.error === -1) {
throw new Error('bns fetch failed bns=' + bnsName);
}
bnsCache[bnsName] = ret;
return bnsCache[bnsName];
}
function BNSNormalizer() {
ConfigNormalizer.call(this);
}
util.inherits(BNSNormalizer, ConfigNormalizer);
BNSNormalizer.prototype._prepareIDCMap = function (config) {
// 准备 idc_map 映射表,不支持backup
var reMap;
if (config.idc_map) {
reMap = {};
var currentIDCMap = config.idc_map[CTX.currentIDC] || config.idc_map['default'] || {};
if (currentIDCMap.prefer) {
var prefers;
if (currentIDCMap.prefer instanceof Array === false) {
prefers = [currentIDCMap.prefer];
}
else {
prefers = currentIDCMap.prefer;
}
prefers.forEach(function (prefer) {
if (prefer === 'self' && CTX.currentIDC) {
prefer = CTX.currentIDC;
}
reMap[prefer] = true;
});
}
}
return reMap;
};
BNSNormalizer.prototype._remapIDC = function (serverInfo, idcMap, defaultIDC, hybird) {
if (defaultIDC) {
return defaultIDC;
}
// try get idc from bns
var serverIDC;
// server idc should override bns idc config
// if (serverInfo.tag) {
// serverInfo.tag.split(',').forEach(function (item) {
// var pair = item.split(':');
// if (pair.length === 2 && pair[0] === 'idc') {
// serverIDC = pair[1];
// }
// });
// }
if (!hybird && serverInfo.service_name) {
var serviceIDC = serverInfo.service_name.split('.').pop();
// 根据 idcMap 重新设置服务的IDC
if (idcMap && (idcMap[serviceIDC] || idcMap.all)) {
serverIDC = CTX.currentIDC;
}
else {
serverIDC = serviceIDC;
}
}
return serverIDC;
};
BNSNormalizer.prototype.normalizeConfig = function (config) {
var normalizedServer = [];
var me = this;
var idcMap = this._prepareIDCMap(config);
for (var i = config.server.length - 1; i >= 0; i--) {
var server = config.server[i];
if (server.bns) {
var bnsServerList = [];
var instanceRet = lazyFetchFromBNSCache(server.bns);
instanceRet.forEach(function (serverInfo) {
if (serverInfo.status === 0) {
var serverIDC = me._remapIDC(serverInfo, idcMap, server.idc, config.hybird) || 'all';
bnsServerList.push({
host: serverInfo.ip || serverInfo.host,
hostname: serverInfo.host,
port: serverInfo.port,
idc: serverIDC
});
}
});
normalizedServer = normalizedServer.concat(bnsServerList);
logger.trace(server.bns + ' bns config is updated');
}
else {
normalizedServer.push(server);
}
}
if (normalizedServer.length !== 0) {
config.server = normalizedServer;
}
else {
logger.warning(server.bns + ' bns config update failed, got no server');
}
return config;
};
BNSNormalizer.prototype.getName = function () {
return 'bns';
};
BNSNormalizer.prototype.needUpdate = function (config) {
if (config.server) {
for (var i = 0; i < config.server.length; i++) {
if (config.server[i].bns) {
return true;
}
}
}
};
module.exports = BNSNormalizer;