mirror of
https://github.com/yldio/copilot.git
synced 2024-11-28 14:10:04 +02:00
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