Add CLI for loading/saving partition map
This commit is contained in:
parent
7117cd0a5e
commit
654d57b53e
82
src/partition/partitioncli.js
Normal file
82
src/partition/partitioncli.js
Normal file
|
@ -0,0 +1,82 @@
|
||||||
|
import { PartitionModule } from './partitionmodule';
|
||||||
|
import { PartitionMap } from './partitionmap';
|
||||||
|
import fs from 'fs';
|
||||||
|
|
||||||
|
const partitionModule = new PartitionModule();
|
||||||
|
partitionModule.cliMode = true;
|
||||||
|
|
||||||
|
function savePartitionMap(filename) {
|
||||||
|
const reloader = partitionModule.getPartitionMapReloader();
|
||||||
|
reloader.once('partitionMapChange', map => {
|
||||||
|
var toml = 'pool = [\n';
|
||||||
|
map.getPool().forEach((poolEntry, i) => {
|
||||||
|
toml += ` '${poolEntry}'`;
|
||||||
|
if (i < map.getPool().length - 1) {
|
||||||
|
toml += ',';
|
||||||
|
}
|
||||||
|
|
||||||
|
toml += '\n';
|
||||||
|
});
|
||||||
|
toml += ']\n\n';
|
||||||
|
|
||||||
|
const partitions = map.getPartitions();
|
||||||
|
Object.keys(partitions).forEach(identity => {
|
||||||
|
partitions[identity].servers.forEach(serverDef => {
|
||||||
|
toml += `[[partitions.${identity}.servers]]\n`;
|
||||||
|
toml += `url = '${serverDef.url}'\n`;
|
||||||
|
toml += `secure = ${serverDef.secure}\n`;
|
||||||
|
toml += '\n';
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
toml += '[overrides]\n';
|
||||||
|
const overrides = map.getOverrides();
|
||||||
|
Object.keys(overrides).forEach(channel => {
|
||||||
|
toml += `${channel} = '${overrides[channel]}'\n`;
|
||||||
|
});
|
||||||
|
|
||||||
|
fs.writeFileSync(filename, toml);
|
||||||
|
console.log(`Wrote partition map to ${filename}`);
|
||||||
|
process.exit(0);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function loadPartitionMap(filename) {
|
||||||
|
var newMap;
|
||||||
|
|
||||||
|
try {
|
||||||
|
newMap = PartitionMap.fromFile(filename);
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`Failed to load partition map from ${filename}: ${error}`);
|
||||||
|
console.error(error.stack);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
const client = partitionModule.getRedisClientProvider().get();
|
||||||
|
client.once('ready', () => {
|
||||||
|
client.multi()
|
||||||
|
.set('partitionMap', JSON.stringify(newMap))
|
||||||
|
.publish('partitionMap', new Date().toISOString())
|
||||||
|
.execAsync()
|
||||||
|
.then(result => {
|
||||||
|
console.log(`Result: ${result}`);
|
||||||
|
console.log(`Published new partition map from ${filename}`);
|
||||||
|
process.exit(0);
|
||||||
|
}).catch(error => {
|
||||||
|
console.error(`Failed to publish partition map: ${error}`);
|
||||||
|
console.error(error.stack);
|
||||||
|
process.exit(1);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (process.argv[2] === 'save') {
|
||||||
|
savePartitionMap(process.argv[3]);
|
||||||
|
} else if (process.argv[2] === 'load') {
|
||||||
|
loadPartitionMap(process.argv[3]);
|
||||||
|
} else {
|
||||||
|
console.error('Usage: ' + process.argv[0] + ' ' + process.argv[1] + ' <load|save> <filename>');
|
||||||
|
console.error(' "save" downloads the partition map and saves it to the specified file');
|
||||||
|
console.error(' "load" loads the partition map from the specified file and publishes it');
|
||||||
|
process.exit(1);
|
||||||
|
}
|
|
@ -15,6 +15,7 @@ const PARTITION_CONFIG_PATH = path.resolve(__dirname, '..', '..', 'conf',
|
||||||
class PartitionModule {
|
class PartitionModule {
|
||||||
constructor() {
|
constructor() {
|
||||||
this.initConfig();
|
this.initConfig();
|
||||||
|
this.cliMode = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
onReady() {
|
onReady() {
|
||||||
|
@ -63,7 +64,9 @@ class PartitionModule {
|
||||||
reloader.getPartitionMap());
|
reloader.getPartitionMap());
|
||||||
reloader.on('partitionMapChange', newMap => {
|
reloader.on('partitionMapChange', newMap => {
|
||||||
this.partitionDecider.setPartitionMap(newMap);
|
this.partitionDecider.setPartitionMap(newMap);
|
||||||
|
if (!this.cliMode) {
|
||||||
require('../server').getServer().handlePartitionMapChange();
|
require('../server').getServer().handlePartitionMapChange();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue