UNPKG

yog-ral

Version:

node-ral with mcpack and nshead

148 lines (134 loc) 4.5 kB
/* * fis * http://fis.baidu.com/ * 2014/8/20 */ 'use strict'; 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;