Initial control tower impl
This commit is contained in:
parent
06948c66d8
commit
6ea3da5a9e
4
control-tower/.gitignore
vendored
Normal file
4
control-tower/.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
node_modules
|
||||||
|
.DS_Store
|
||||||
|
npm-debug.log
|
||||||
|
.eslintcache
|
1
control-tower/README.md
Normal file
1
control-tower/README.md
Normal file
@ -0,0 +1 @@
|
|||||||
|
# command-tower
|
15
control-tower/bin/control-tower
Normal file
15
control-tower/bin/control-tower
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
const ControlTower = require('../');
|
||||||
|
|
||||||
|
const tower = new ControlTower();
|
||||||
|
tower.start((err) => {
|
||||||
|
if (err) {
|
||||||
|
console.error(err);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('Control Tower Started');
|
||||||
|
});
|
79
control-tower/lib/index.js
Normal file
79
control-tower/lib/index.js
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
const CMonClient = require('cmon-client');
|
||||||
|
const PortalData = require('portal-data');
|
||||||
|
const VAsync = require('vasync');
|
||||||
|
|
||||||
|
|
||||||
|
const internals = {};
|
||||||
|
|
||||||
|
|
||||||
|
module.exports = class {
|
||||||
|
constructor (options) {
|
||||||
|
options = options || {};
|
||||||
|
this._data = new PortalData(options.data);
|
||||||
|
this._cmon = new CMonClient(options.cmon);
|
||||||
|
this._deployments = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
start (cb) {
|
||||||
|
this._data.connect((err) => {
|
||||||
|
if (err) {
|
||||||
|
return cb(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
this._poll();
|
||||||
|
|
||||||
|
this._data.deploymentChanges((err, changes) => {
|
||||||
|
if (changes) {
|
||||||
|
this._refreshContainers(changes.id);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_refreshContainers (deploymentId) {
|
||||||
|
this._data.getServices(deploymentId).then((services) => {
|
||||||
|
this._deployments[deploymentId] = services.containers;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_listContainers () {
|
||||||
|
let containers = [];
|
||||||
|
const deploymentIds = Object.keys(this._deployments);
|
||||||
|
|
||||||
|
deploymentIds.forEach((deploymentId) => {
|
||||||
|
containers = containers.concat(this._deployments[deploymentId]);
|
||||||
|
});
|
||||||
|
|
||||||
|
return containers;
|
||||||
|
}
|
||||||
|
|
||||||
|
_poll () {
|
||||||
|
if (this._isPolling) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const finish = () => {
|
||||||
|
this._isPolling = false;
|
||||||
|
setTimeout(() => this._poll(), 1000);
|
||||||
|
};
|
||||||
|
|
||||||
|
this._isPolling = true;
|
||||||
|
VAsync.forEachParallel({
|
||||||
|
func: this._cmon.metrics,
|
||||||
|
inputs: this._listContainers()
|
||||||
|
}, (err, results) => {
|
||||||
|
if (err) {
|
||||||
|
console.error(err);
|
||||||
|
return finish();
|
||||||
|
}
|
||||||
|
|
||||||
|
this._saveMetrics(results, finish);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_saveMetrics (metrics, cb) {
|
||||||
|
cb();
|
||||||
|
}
|
||||||
|
}
|
28
control-tower/package.json
Normal file
28
control-tower/package.json
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
{
|
||||||
|
"name": "control-tower",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"description": "portal service metrics watcher",
|
||||||
|
"main": "lib",
|
||||||
|
"bin": {
|
||||||
|
"control-tower": "./bin/control-tower"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"lint": "belly-button",
|
||||||
|
"rethinkdb-up": "docker run -d -p 8080:8080 -p 28015:28015 -p 29015:29015 --name rethinkdb rethinkdb",
|
||||||
|
"rethinkdb-down": "docker rm -f rethinkdb",
|
||||||
|
"test": "npm run lint && lab -t 40"
|
||||||
|
},
|
||||||
|
"keywords": [],
|
||||||
|
"author": "wyatt",
|
||||||
|
"license": "MPL-2.0",
|
||||||
|
"devDependencies": {
|
||||||
|
"belly-button": "^3.1.0",
|
||||||
|
"code": "^4.0.0",
|
||||||
|
"lab": "^13.0.4"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"cmon-client": "^1.1.0",
|
||||||
|
"portal-data": "^1.0.0",
|
||||||
|
"vasync": "^1.6.4"
|
||||||
|
}
|
||||||
|
}
|
26
control-tower/test/index.js
Normal file
26
control-tower/test/index.js
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
const Code = require('code');
|
||||||
|
const Lab = require('lab');
|
||||||
|
const ControlTower = require('../');
|
||||||
|
|
||||||
|
|
||||||
|
// Test shortcuts
|
||||||
|
|
||||||
|
const lab = exports.lab = Lab.script();
|
||||||
|
const describe = lab.describe;
|
||||||
|
const it = lab.it;
|
||||||
|
const expect = Code.expect;
|
||||||
|
|
||||||
|
|
||||||
|
const internals = {
|
||||||
|
options: { data: { test: true, name: 'test' } }
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
describe('start()', () => {
|
||||||
|
it.skip('starts to listen for service changes and monitors metrics', (done) => {
|
||||||
|
const controlTower = new ControlTower(internals.options);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
Loading…
Reference in New Issue
Block a user