diff --git a/routes/api.js b/routes/api.js index b9a23ac..a69366c 100644 --- a/routes/api.js +++ b/routes/api.js @@ -18,43 +18,7 @@ var tagPrefix = settings.tagPrefix || 'clwV'; var workers = require('./worker_manager.js'); - -// var runnerTimeout = function(runner, time){ -// time = time || 60000; // 1 minutes - -// if(runner.hasOwnProperty('timeout')){ -// clearTimeout(runner.timeout); -// } - -// return runner.timeout = setTimeout(runnerFree, time, runner); -// }; - -// var runnerFree = function(runner){ -// lxc.stop(runner.name, runner.worker.ip); -// runner.worker.usedrunners--; -// if(runner.hasOwnProperty('timeout')){ -// clearTimeout(runner.timeout); -// } -// delete label2runner[runner.label]; - -// console.log(`Runner freed ${runner.label}.`, runner.worker); -// workers.startRunners({worker: runner.worker}); -// }; - -// var getAvailrunner = function(runner){ -// for(let worker of workers){ -// if(worker.availrunners.length === 0) continue; -// if(runner && runner.worker.index <= worker.index) break; -// // if(runner) runnerFree(runner); -// if(runner) runner.free(); - -// return worker.getRunner(); -// } - -// if(runner) return runner; -// }; - -var run = function(req, res, runner, count){ +var attemptRun = function(req, res, runner, count){ count = count || 0; console.log(`Runner starting attempt ${count}.`); @@ -64,6 +28,7 @@ var run = function(req, res, runner, count){ return res.json({error: 'No runners, try again soon.'}); } + // TODO: Configurable if(count > 2){ console.log(`Runner attempt failed, to many requests!`); return res.status(400).json({error: 'Runner restarted to many times'}); @@ -81,7 +46,10 @@ var run = function(req, res, runner, count){ return request.post(httpOptions, function(error, response, body){ // console.log('runner response:', arguments) - if(error || response.statusCode !== 200) return run(req, res, workers.getAvailableRunner(), ++count); + if(error || response.statusCode !== 200) { + return attemptRun(req, res, workers.getAvailableRunner(), ++count); + } + body = JSON.parse(body); if(req.query.once){ @@ -91,7 +59,7 @@ var run = function(req, res, runner, count){ return runner.free(); } - label2runner[runner.label] = runner; + workers.setRunner(runner); body['ip'] = runner.label; body['rname'] = runner.name; body['wname'] = runner.worker.name; @@ -103,10 +71,11 @@ var run = function(req, res, runner, count){ }; console.log('========STARTING===========') +// TODO: Make this a function setInterval(workers.checkBalance, 15000); workers.destroyByTag(); - +// Why is this a GET? router.get('/stop/:name', function(req, res, next){ return lxc.stop(req.params.name, function(data){ console.log('stop', arguments); @@ -117,79 +86,13 @@ router.get('/stop/:name', function(req, res, next){ } }); }); + +// Why is this a GET? router.get('/destroyByTag', function(req, res, next) { workers.destroyByTag(); res.send('?'); }); -router.post('/updateID', function(req, res, next){ - var newWorkers = { - workers: [], - image: req.query.image, - target: req.query.target || workers.length, - size: req.query.size || workers.settings.size, - version: workers.settings.version+1, - min: req.query.min || workers.settings, - minAvail: req.query.minAvail || workers.settings - }; - - doapi.tagCreate(tagPrefix+newWorkers.version); - workers.destroyByTag(tagPrefix+newWorkers.version); - - for(var i=0; i= args.newWorkers.target){ - console.log('upgrade complete!') - workers.settings.image = args.newWorkers.image; - workers.settings.size = args.newWorkers.size; - workers.settings.min = args.newWorkers.min; - workers.settings.minAvail = args.newWorkers.minAvail; - - workers.forEach(function(worker){ - worker.availrunners.forEach(function(runner){ - lxc.stop(runner.name, runner.worker.ip); - }); - worker.availrunners = []; - }); - - workers.add(args.newWorkers.workers); - workers.settingsSave(); - workers.checkBalance(); - } - } - - }); - } - }); - } - res.json({status: "maybe?"}); -}); router.get('/liststuff', function(req, res, next){ var obj = util.inspect(workers, {depth: 4}); @@ -197,14 +100,14 @@ router.get('/liststuff', function(req, res, next){

Workers

${obj}

label2runner

-
${util.inspect(label2runner)}
+
${util.inspect(workers.runnerMap)}

DO calls

${doapi.calls} `); }); router.get('/ping/:runner', function(req, res, next){ - var runner = label2runner[req.params.runner]; + var runner = workers.getRunner(req.params.runner); // runnerTimeout(runner); runner.setTimeout(); res.json({res:''}); @@ -213,7 +116,7 @@ router.get('/ping/:runner', function(req, res, next){ router.post('/run/:runner?', function (req, res, next){ console.log(`Request runner route!`); var runner = workers.getAvailrunner(workers.getRunner(req.params.runner)); - return run(req, res, runner); + return attemptRun(req, res, runner); }); module.exports = router; diff --git a/routes/worker_manager.js b/routes/worker_manager.js index df7d727..15acdce 100644 --- a/routes/worker_manager.js +++ b/routes/worker_manager.js @@ -8,16 +8,6 @@ var settings = require('./workers.json'); var tagPrefix = settings.tagPrefix || 'clwV'; -var ramPercentUsed = function(ip, callback){ - // checks the percent of ram used on a worker. - - return lxc.exec( - "python3 -c \"a=`head /proc/meminfo|grep MemAvail|grep -Po '\\d+'`;t=`head /proc/meminfo|grep MemTotal|grep -Po '\\d+'`;print(round(((t-a)/t)*100, 2))\"", - ip, - callback - ); -}; - var Runner = (function(){ var proto = {}; @@ -86,6 +76,16 @@ var Worker = (function(){ return runner; }; + + + proto.ramPercentUsed = function(callback){ + // checks the percent of ram used on a worker. + return lxc.exec( + "python3 -c \"a=`head /proc/meminfo|grep MemAvail|grep -Po '\\d+'`;t=`head /proc/meminfo|grep MemTotal|grep -Po '\\d+'`;print(round(((t-a)/t)*100, 2))\"", + this.ip, + callback + ); + }; })(); @@ -96,7 +96,7 @@ var workers = (function(){ // base array that will be the workers objects. var workers = []; - var runnerMap = {}; + workers.runnerMap = {}; workers.setRunner = function(runner){ runnerMap[runner.label] = runner; @@ -136,23 +136,28 @@ var workers = (function(){ // about 3 minutes to create a worker. workers.currentCreating = 0; - workers.create = function(){ + workers.create = function(config){ // manages the creation of a work from first call to all runners seeded // dont create more workers then the settings file allows if(workers.currentCreating > workers.settings.max ) return false; workers.currentCreating++; + config = config || workers.settings; + doapi.dropletToActive({ - name: 'clw'+workers.settings.version+'-'+(Math.random()*100).toString().slice(-4), - image: workers.settings.image, - size: workers.settings.size, + name: 'clw'+config.version+'-'+(Math.random()*100).toString().slice(-4), + image: config.image, + size: config.size, onCreate: function(data){ - doapi.dropletSetTag(tagPrefix+workers.settings.version, data.droplet.id); + doapi.dropletSetTag( + tagPrefix + config.version, + data.droplet.id + ); }, - onActive: function(worker, args){ + onActive: function(data, args){ workers.startRunners({ - worker: workers.makeWorkerObj(worker), + worker: Worker.create(data), onStart: function(runner, args){ workers.push(args.worker); doapi.domianAddRecord({ @@ -171,32 +176,7 @@ var workers = (function(){ } }); }; - - workers.makeWorkerObj = function(worker){ - // Create object for each worker. - - worker.networks.v4.forEach(function(value){ - worker[value.type+'IP'] = value.ip_address; - }); - - worker.availrunners = []; - worker.ip = worker.publicIP; - worker.usedrunners = 0; - worker.index = workers.length; - - worker.getRunner = function(){ - if(this.availrunners.length === 0) return false; - // console.log('getting runner from ', worker.name, ' avail length ', this.availrunners.length); - var runner = this.availrunners.pop(); - this.usedrunners++; - runnerTimeout(runner); - - return runner; - }; - - return worker; - }; - + workers.__workersId = function(argument){ // create array of all current worker Digital Ocean ID return workers.map(function(item){ @@ -257,7 +237,7 @@ var workers = (function(){ args.onStart = args.onStart || function(){}; args.onDone = args.onDone || function(){}; - ramPercentUsed(args.worker.ip, function(usedMemPercent){ + args.worker.ramPercentUsed(function(usedMemPercent){ if(usedMemPercent > args.stopPercent ){ console.log('using', String(usedMemPercent).trim(), 'percent memory, stopping runner creation!', args.worker.availrunners.length, @@ -270,7 +250,9 @@ var workers = (function(){ var name = 'crunner-'+(Math.random()*100).toString().slice(-4); // console.log('Free ram check passed!') lxc.startEphemeral(name, 'crunner0', args.worker.ip, function(data){ - if(!data.ip) return setTimeout(workers.startRunners, 0, args); + if(!data.ip){ + return setTimeout(workers.startRunners, 0, args); + } // console.log('started runner on', args.worker.name) var runner = Runner.create({ @@ -280,6 +262,7 @@ var workers = (function(){ label: args.worker.name + ':' + name, }); + args.onStart(runner, args); args.worker.availrunners.push(runner); @@ -372,7 +355,7 @@ var workers = (function(){ }; // make sure Digital Ocean has a tag for the current worker version - doapi.tagCreate(tagPrefix+workers.settings.version); + doapi.tagCreate(tagPrefix + workers.settings.version); return workers;