From 860b1acbff451d7b0b1b6b6d424b53c0eb30955f Mon Sep 17 00:00:00 2001 From: Nathan Black Date: Mon, 22 Jan 2018 17:36:51 -0800 Subject: [PATCH] Resolve hostnames defined in CADENCE_TCHANNEL_PEERS since tchannel does not accept hostnames (uber/tchannel-node#327) --- package.json | 1 + server/middleware/tchannel-client.js | 41 +++++++++++++++++++++++----- 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 988d0e79e..ebc5baf9b 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "friendly-querystring": "^0.2.0", "html-webpack-plugin": "^2.30.1", "html-webpack-template": "^6.1.0", + "is-ipv4-node": "^1.0.6", "koa": "^2.3.0", "koa-better-error-handler": "^1.3.0", "koa-bodyparser": "^4.2.0", diff --git a/server/middleware/tchannel-client.js b/server/middleware/tchannel-client.js index 4280dfeb4..23aa13896 100644 --- a/server/middleware/tchannel-client.js +++ b/server/middleware/tchannel-client.js @@ -5,7 +5,9 @@ const TChannel = require('tchannel'), path = require('path'), Long = require('long'), - moment = require('moment') + moment = require('moment'), + dns = require('dns'), + isIPv4 = require('is-ipv4-node') function transform(item) { if (!item || typeof item !== 'object') return item @@ -29,15 +31,40 @@ function transform(item) { return item } +const lookupAsync = host => new Promise(function (resolve, reject) { + dns.lookup(host, { family: 4 }, function (err, ip) { + if (err) { + reject(err) + } else { + resolve(ip) + } + }) +}) + +const peers = process.env.CADENCE_TCHANNEL_PEERS ? + process.env.CADENCE_TCHANNEL_PEERS.split(',') : + ['127.0.0.1:7933'] + +async function makeChannel(client) { + var ipPeers = await Promise.all(peers.map(peer => { + var [host, port] = peer.split(':') + if (!isIPv4(host)) { + return lookupAsync(host).then(ip => [ip, port].join(':')) + } else { + return peer + } + })) + + return client.makeSubChannel({ + serviceName: 'cadence-frontend', + peers: ipPeers + }) +} + module.exports = async function(ctx, next) { const client = TChannel(), - cadenceChannel = client.makeSubChannel({ - serviceName: 'cadence-frontend', - peers: process.env.CADENCE_TCHANNEL_PEERS ? - process.env.CADENCE_TCHANNEL_PEERS.split(',') : - ['127.0.0.1:7933'] - }), + cadenceChannel = await makeChannel(client), tchannelAsThrift = TChannelAsThrift({ channel: cadenceChannel, entryPoint: path.join(__dirname, '../idl/cadence.thrift')