ringpop-admin
Advanced tools
Comparing version 0.9.3 to 0.9.5
@@ -25,4 +25,3 @@ #!/usr/bin/env node | ||
var createTable = require('./lib/table.js'); | ||
var ClusterManager = require('./lib/cluster-manager.js'); | ||
var AdminClient = require('./lib/admin-client.js'); | ||
var ClusterManager = require('./lib/cluster.js'); | ||
var program = require('commander'); | ||
@@ -45,3 +44,3 @@ | ||
var clusterManager = new ClusterManager({ | ||
program: program, | ||
useTChannelV1: program.useTChannelV1, | ||
coordAddr: address | ||
@@ -48,0 +47,0 @@ }); |
@@ -24,4 +24,3 @@ #!/usr/bin/env node | ||
var ClusterManager = require('./lib/cluster-manager.js'); | ||
var AdminClient = require('./lib/admin-client.js'); | ||
var ClusterManager = require('./lib/cluster.js'); | ||
var program = require('commander'); | ||
@@ -52,3 +51,3 @@ | ||
var clusterManager = new ClusterManager({ | ||
program: program, | ||
useTChannelV1: program.tchannelV1, | ||
coordAddr: coord | ||
@@ -55,0 +54,0 @@ }); |
@@ -29,3 +29,2 @@ #!/usr/bin/env node | ||
var program = require('commander'); | ||
var safeParse = require('./lib/util.js').safeParse; | ||
@@ -51,4 +50,6 @@ function main() { | ||
var node = new AdminClient(hostPort); | ||
node.stats(program.tchannelV1 ? 'v1' : 'v2', function onSend(err, stats) { | ||
var node = new AdminClient({ | ||
useTChannelV1: program.tchannelV1 | ||
}); | ||
node.stats(hostPort, function onSend(err, stats) { | ||
var members = stats.membership.members; | ||
@@ -55,0 +56,0 @@ |
@@ -25,4 +25,3 @@ #!/usr/bin/env node | ||
var fs = require('fs'); | ||
var ClusterManager = require('./lib/cluster-manager.js'); | ||
var AdminClient = require('./lib/admin-client.js'); | ||
var ClusterManager = require('./lib/cluster.js'); | ||
var program = require('commander'); | ||
@@ -51,3 +50,3 @@ | ||
var clusterManager = new ClusterManager({ | ||
program: program, | ||
useTChannelV1: program.tchannelV1, | ||
coordAddr: coord | ||
@@ -54,0 +53,0 @@ }); |
@@ -26,3 +26,2 @@ #!/usr/bin/env node | ||
var assertNoError = require('./lib/util.js').assertNoError; | ||
var ClusterManager = require('./lib/cluster-manager.js'); | ||
var program = require('commander'); | ||
@@ -44,5 +43,6 @@ | ||
var tchannelVersion = program.tchannelV1 ? 'v1' : 'v2'; | ||
var client = new AdminClient(address); | ||
client.join(tchannelVersion, function onLeave(err) { | ||
var client = new AdminClient({ | ||
useTChannelV1: program.tchannelV1 | ||
}); | ||
client.join(address, function onLeave(err) { | ||
assertNoError(err); | ||
@@ -49,0 +49,0 @@ process.exit(); |
@@ -26,3 +26,2 @@ #!/usr/bin/env node | ||
var assertNoError = require('./lib/util.js').assertNoError; | ||
var ClusterManager = require('./lib/cluster-manager.js'); | ||
var program = require('commander'); | ||
@@ -44,5 +43,6 @@ | ||
var tchannelVersion = program.tchannelV1 ? 'v1' : 'v2'; | ||
var client = new AdminClient(address); | ||
client.leave(tchannelVersion, function onLeave(err) { | ||
var client = new AdminClient({ | ||
useTChannelV1: program.tchannelV1 | ||
}); | ||
client.leave(address, function onLeave(err) { | ||
assertNoError(err); | ||
@@ -49,0 +49,0 @@ process.exit(); |
@@ -29,4 +29,4 @@ // Copyright (c) 2015 Uber Technologies, Inc. | ||
function AdminClient(address) { | ||
this.address = address; | ||
function AdminClient(opts) { | ||
this.useTChannelV1 = opts.useTChannelV1; | ||
} | ||
@@ -44,12 +44,12 @@ | ||
AdminClient.prototype.join = function join(version, callback) { | ||
this.request(version, '/admin/join', null, null, callback); | ||
AdminClient.prototype.join = function join(host, callback) { | ||
this.request(host, '/admin/join', null, null, callback); | ||
}; | ||
AdminClient.prototype.leave = function leave(version, callback) { | ||
this.request(version, '/admin/leave', null, null, callback); | ||
AdminClient.prototype.leave = function leave(host, callback) { | ||
this.request(host, '/admin/leave', null, null, callback); | ||
}; | ||
AdminClient.prototype.lookup = function lookup(version, key, callback) { | ||
this.request(version, '/admin/lookup', null, JSON.stringify({ | ||
AdminClient.prototype.lookup = function lookup(host, key, callback) { | ||
this.request(host, '/admin/lookup', null, JSON.stringify({ | ||
key: key | ||
@@ -59,8 +59,14 @@ }), callback); | ||
AdminClient.prototype.stats = function stats(version, callback) { | ||
this.request(version, '/admin/stats', null, null, callback); | ||
AdminClient.prototype.reuse = function stats(host, body, callback) { | ||
this.request(host, '/admin/member/reuse', null, JSON.stringify(body), | ||
callback); | ||
}; | ||
AdminClient.prototype.request = function request(version, endpoint, head, body, callback) { | ||
if (version === 'v1') { | ||
AdminClient.prototype.stats = function stats(host, callback) { | ||
this.request(host, '/admin/stats', null, null, callback); | ||
}; | ||
/* jshint maxparams: 5 */ | ||
AdminClient.prototype.request = function request(host, endpoint, head, body, callback) { | ||
if (this.useTChannelV1) { | ||
try { | ||
@@ -75,8 +81,9 @@ TChannelV1 = require('tchannelv1'); | ||
this.requestV1(this.address, endpoint, null, body, callback); | ||
this.requestV1(host, endpoint, null, body, callback); | ||
} else { | ||
this.requestV2(this.address, endpoint, null, body, callback); | ||
this.requestV2(host, endpoint, null, body, callback); | ||
} | ||
}; | ||
/* jshint maxparams: 5 */ | ||
AdminClient.prototype.requestV1 = function requestV1(host, endpoint, head, body, callback) { | ||
@@ -102,9 +109,6 @@ if (!tchannelV1) { | ||
/* jshint maxparams: 5 */ | ||
AdminClient.prototype.requestV2 = function requestV2(host, endpoint, head, body, callback) { | ||
if (!tchannelV2) { | ||
var tchannel = new TChannelV2({ | ||
host: '127.0.0.1', | ||
port: 31999 | ||
}); | ||
var tchannel = new TChannelV2(); | ||
tchannelV2 = tchannel.makeSubChannel({ | ||
@@ -111,0 +115,0 @@ serviceName: 'ringpop' |
@@ -22,45 +22,197 @@ // Copyright (c) 2015 Uber Technologies, Inc. | ||
function Cluster() { | ||
this.membershipChecksum = null; | ||
this.membership = null; | ||
this.nodes = []; | ||
this.nodeCount = 0; | ||
var fs = require('fs'); | ||
var async = require('async'); | ||
var AdminClient = require('./admin-client.js'); | ||
var Partition = require('./partition.js'); | ||
var Stats = require('./stats.js'); | ||
function Cluster(opts) { | ||
opts = opts || { | ||
dumpTo: 'ringpop-admin-stats.dump' | ||
}; | ||
this.useTChannelV1 = opts.useTChannelV1; | ||
this.coordAddr = opts.coordAddr; | ||
this.adminClient = new AdminClient({ | ||
useTChannelV1: this.useTChannelV1 | ||
}); | ||
this.fetchLimit = opts.fetchLimit || 50; | ||
this.partitions = {}; | ||
this.lastDownloadTime = null; | ||
this.lastFetchTime = null; | ||
this.dumpTo = opts.dumpTo; | ||
} | ||
Cluster.prototype.addNode = function addNode(node) { | ||
this.nodes.push(node); | ||
Cluster.prototype.getPartitionAt = function getPartitionAt(index) { | ||
return this.getPartitions()[index]; | ||
}; | ||
Cluster.prototype.getHostAddrs = function getHostAddrs() { | ||
var hosts = this.getMemberAddrs().reduce(function reduce(acc, addr) { | ||
var parts = addr.split(':'); | ||
acc[parts[0]] = true; | ||
return acc; | ||
}, {}); | ||
Cluster.prototype.getPartitions = function getPartitions() { | ||
var self = this; | ||
return Object.keys(hosts); | ||
return Object.keys(this.partitions).map(function mapCluster(membershipChecksum) { | ||
return self.partitions[membershipChecksum]; | ||
}); | ||
}; | ||
Cluster.prototype.getHostCount = function getHostCount() { | ||
return this.getHostAddrs().length; | ||
Cluster.prototype.getClusterAt = function getClusterAt() { | ||
var partitions = this.getPartitions(); | ||
partitions.sort(function sortBy(a, b) { | ||
if (a.membershipChecksum < b.membershipChecksum) { | ||
return -1; | ||
} else if (a.membershipChecksum > b.membershipChecksum) { | ||
return 1; | ||
} else { | ||
return 0; | ||
} | ||
}); | ||
return partitions[0]; | ||
}; | ||
Cluster.prototype.getMemberAddrs = function getMemberAddrs() { | ||
return this.membership.map(function map(member) { | ||
return member.address; | ||
Cluster.prototype.getClusterChecksums = function getClusterChecksums() { | ||
return Object.keys(this.partitions); | ||
}; | ||
Cluster.prototype.getPartitionCount = function getPartitionCount() { | ||
return Object.keys(this.partitions).length; | ||
}; | ||
Cluster.prototype.fetchStats = function fetchStats(callback) { | ||
var self = this; | ||
// Reset with every fetch | ||
this.partitions = {}; | ||
this.lastFetchTime = new Date().toISOString(); | ||
var downloadTime = Date.now(); | ||
this.adminClient.stats(this.coordAddr, function onSend(err, stats) { | ||
if (err) { | ||
callback(err); | ||
return; | ||
} | ||
if (!stats) { | ||
callback(new Error('stats could not be gathered')); | ||
return; | ||
} | ||
if (!stats.membership) { | ||
callback(new Error('stats did not contain membership')); | ||
return; | ||
} | ||
if (!stats.membership.members) { | ||
callback(new Error('membership did not contain members')); | ||
return; | ||
} | ||
async.mapLimit(stats.membership.members, self.fetchLimit, mapMember, onComplete); | ||
function mapMember(member, next) { | ||
self.adminClient.stats(member.address, function(err, stats) { | ||
var statsObj = new Stats(); | ||
statsObj.address = member.address; | ||
if (err) { | ||
next(null, statsObj); | ||
return; | ||
} | ||
statsObj.membershipChecksum = stats.membership.checksum; | ||
statsObj.members = stats.membership.members; | ||
next(null, statsObj); | ||
}); | ||
} | ||
function onComplete(err, allStats) { | ||
self.lastDownloadTime = Date.now() - downloadTime; | ||
self.allStats = allStats; | ||
self.allStats.forEach(function eachStats(stats) { | ||
self.parseStats(stats); | ||
}); | ||
callback(); | ||
} | ||
}); | ||
}; | ||
Cluster.prototype.getNodeCount = function getNodeCount() { | ||
return this.nodes.length; | ||
Cluster.prototype.lookup = function lookup(key, callback) { | ||
var self = this; | ||
this.fetchStats(function onStats(err) { | ||
if (err) { | ||
callback(err); | ||
return; | ||
} | ||
self.adminClient.lookup(self.coordAddr, key, callback); | ||
}); | ||
}; | ||
Cluster.prototype.getSortedMembers = function getSortedMembers() { | ||
var membersCopy = this.membership.slice(0); | ||
Cluster.prototype.parseStats = function parseStats(stats) { | ||
if (!stats.membershipChecksum) { | ||
return; | ||
} | ||
membersCopy.sort(); | ||
var cluster = this.partitions[stats.membershipChecksum]; | ||
return membersCopy; | ||
if (!cluster) { | ||
cluster = new Partition(); | ||
cluster.membershipChecksum = stats.membershipChecksum; | ||
cluster.membership = stats.members; | ||
this.partitions[cluster.membershipChecksum] = cluster; | ||
} | ||
cluster.nodeCount++; | ||
cluster.addNode(stats.node); | ||
}; | ||
Cluster.prototype.reuse = function reuse(opts, callback) { | ||
var self = this; | ||
var results = []; | ||
this.adminClient.stats(opts.coordinator, function onStats(err, stats) { | ||
if (err) { | ||
callback(err); | ||
return; | ||
} | ||
var members = stats.membership.members; | ||
async.eachLimit(members, opts.limit, iterator, onDone); | ||
}); | ||
function iterator(member, callback) { | ||
self.adminClient.reuse(member.address, { | ||
memberAddr: opts.member | ||
}, function onReuse(err) { | ||
results.push({ | ||
member: member.address, | ||
err: err | ||
}); | ||
callback(); | ||
}); | ||
} | ||
function onDone() { | ||
callback(null, results); | ||
} | ||
}; | ||
Cluster.prototype.dumpStats = function dumpStats() { | ||
fs.appendFile( | ||
this.dumpTo, | ||
JSON.stringify({ | ||
timestamp: Date.now(), | ||
clusters: this.partitions | ||
}) + '\n', | ||
function() {} // NOOP, no way to display it right now. | ||
); | ||
}; | ||
module.exports = Cluster; |
@@ -24,4 +24,3 @@ #!/usr/bin/env node | ||
var ClusterManager = require('./lib/cluster-manager.js'); | ||
var AdminClient = require('./lib/admin-client.js'); | ||
var ClusterManager = require('./lib/cluster.js'); | ||
var program = require('commander'); | ||
@@ -51,3 +50,3 @@ | ||
var clusterManager = new ClusterManager({ | ||
program: program, | ||
useTChannelV1: program.tchannelV1, | ||
coordAddr: coord | ||
@@ -54,0 +53,0 @@ }); |
@@ -24,4 +24,3 @@ #!/usr/bin/env node | ||
var ClusterManager = require('./lib/cluster-manager.js'); | ||
var AdminClient = require('./lib/admin-client.js'); | ||
var ClusterManager = require('./lib/cluster.js'); | ||
var program = require('commander'); | ||
@@ -50,3 +49,3 @@ | ||
var clusterManager = new ClusterManager({ | ||
program: program, | ||
useTChannelV1: program.tchannelV1, | ||
coordAddr: coord | ||
@@ -73,3 +72,1 @@ }); | ||
} | ||
@@ -8,3 +8,3 @@ { | ||
"repository": "git://github.com/uber/ringpop-admin.git", | ||
"version": "0.9.3", | ||
"version": "0.9.5", | ||
"bin": { | ||
@@ -11,0 +11,0 @@ "ringpop-admin": "./ringpop-admin.js", |
@@ -25,23 +25,10 @@ #!/usr/bin/env node | ||
var createTable = require('./lib/table.js'); | ||
var ClusterManager = require('./lib/cluster-manager.js'); | ||
var AdminClient = require('./lib/admin-client.js'); | ||
var program = require('commander'); | ||
var ClusterManager = require('./lib/cluster.js'); | ||
var parseStatusCommand = require('./parser.js').parseStatusCommand; | ||
function main() { | ||
program | ||
.description('Status of members in ring') | ||
.option('--tchannel-v1') | ||
.usage('[options] <hostport>'); | ||
program.parse(process.argv); | ||
var coord = program.args[0]; | ||
if (!coord) { | ||
console.error('Error: hostport is required'); | ||
process.exit(1); | ||
} | ||
var command = parseStatusCommand(); | ||
var clusterManager = new ClusterManager({ | ||
program: program, | ||
coordAddr: coord | ||
useTChannelV1: command.useTChannelV1, | ||
coordAddr: command.coordinator | ||
}); | ||
@@ -54,3 +41,2 @@ clusterManager.fetchStats(function onStats(err) { | ||
var partitionCount = clusterManager.getPartitionCount(); | ||
if (clusterManager.getPartitionCount() > 1) { | ||
@@ -57,0 +43,0 @@ console.error('Error: cluster is partitioned. An accurate status cannot be provided.'); |
23
top.js
@@ -25,9 +25,6 @@ #!/usr/bin/env node | ||
var CliColor = require('cli-color'); | ||
var CliTable = require('cli-table'); | ||
var program = require('commander'); | ||
var createTable = require('./lib/table.js'); | ||
var ClusterManager = require('./lib/cluster-manager.js'); | ||
var AdminClient = require('./lib/admin-client.js'); | ||
var PartitionBar = require('./lib/partition-bar.js'); | ||
var ClusterManager = require('./lib/cluster.js'); | ||
@@ -41,3 +38,2 @@ var currentRows; | ||
var selectedRow = 0; | ||
var tchannelVersion; | ||
var viewportTop; | ||
@@ -52,2 +48,6 @@ var viewportBottom; | ||
function PartitionBar() { | ||
this.selectedPartition = 0; | ||
} | ||
function main() { | ||
@@ -91,3 +91,3 @@ program | ||
dumpTo: program.dumpFile, | ||
program: program | ||
useTChannelV1: program.tchannelV1 | ||
}); | ||
@@ -137,7 +137,2 @@ var partitionBar = new PartitionBar(); | ||
function printAndExit(msg) { | ||
console.log(msg); | ||
process.exit(1); | ||
} | ||
function printPartitionBar(clusterManager, partitionBar) { | ||
@@ -168,4 +163,2 @@ var bar = ''; | ||
var partitionTable = createTable(columns); | ||
var partition = clusterManager.getPartitionAt(partitionBar.selectedPartition - 1); | ||
@@ -240,3 +233,3 @@ | ||
function printPreamble(clusterManager, partitionBar) { | ||
function printPreamble(clusterManager) { | ||
var cluster = clusterManager.getClusterAt(0); | ||
@@ -335,3 +328,3 @@ | ||
function toggleRefresh(callback) { | ||
function toggleRefresh() { | ||
if (isPaused) { | ||
@@ -338,0 +331,0 @@ resumeRefresh(); |
Sorry, the diff of this file is not supported yet
64701
25
1607