Merge pull request #23 from wmantly/test

Test
This commit is contained in:
William Mantly 2017-10-09 02:18:50 -04:00 committed by GitHub
commit 0f0033a646
2 changed files with 99 additions and 49 deletions

View File

@ -64,10 +64,10 @@ var workers = (function(){
args.onStart = function(){};
},
onDone: function(args){
console.log("done with runners on", worker.name);
console.log("Seeded runners on", worker.name);
workers.currentCreating--;
}
});
workers.currentCreating--;
}
});
@ -112,7 +112,7 @@ var workers = (function(){
var worker = worker || workers.pop();
return doapi.dropletDestroy(worker.id, function(body) {
console.log('body of destroy', body);
console.log('Deleted worker', worker.name);
});
};
@ -120,24 +120,26 @@ var workers = (function(){
// Delete works that with
tag = tag || tagPrefix + workers.settings.version;
var currentIDs = workers.__workersId();
let currentIDs = workers.__workersId();
var deleteDroplets = function(droplets){
let deleteDroplets = function(droplets){
if(droplets.length === 0) return true;
var droplet = droplets.pop();
let droplet = droplets.pop();
if(~currentIDs.indexOf(droplet.id)) return deleteDroplets(droplets);
doapi.dropletDestroy(droplet.id, function(body){
setTimeout(deleteDroplets, 1000, droplets);
if(!droplets.length) console.log(`Finished deleting workers tagged ${tag}.`);
});
}
doapi.dropletsByTag(tag, function(data){
data = JSON.parse(data);
console.log('current worker ids', currentIDs);
console.log('do droplets', data['droplets'].length, data['droplets'].map(function(item){
return item.name+' | '+item.id;
}));
console.log(`Deleting ${data['droplets'].length} workers tagged ${tag}. Workers`,
data['droplets'].map(function(item){
return item.name+' | '+item.id;
})
);
deleteDroplets(data['droplets']);
});
@ -148,7 +150,7 @@ var workers = (function(){
// dont make runners on out dated workers
if(!args.worker || workers.settings.image > args.worker.image.id){
console.log('blocked outdated worker', workers.settings.image, args.worker.image.id)
console.log(`Blocked outdated worker(${args.worker.image.id}), current image ${workers.settings.image}.`)
return ;
}
@ -194,13 +196,13 @@ var workers = (function(){
let zombies = 0;
for(let worker of workers){
console.log("checking", worker.name, "if zombie");
console.log(`Checking if ${worker.name} is a zombie worker.`);
// if a runner has no available runners and no used runners, its a
// zombie. This should happen when a newer image ID has been added
// and old workers slowly lose there usefulness.
if(worker.availrunners.length === 0 && worker.usedrunners === 0){
workers.splice(workers.indexOf(worker), 1);
console.log('found zombie worker, destroying');
console.log(`Zombie! Worker ${worker.name}, destroying.`);
workers.destroy(worker);
zombies++;
}
@ -210,14 +212,14 @@ var workers = (function(){
};
workers.checkBalance = function(){
console.log('checking balance');
console.log(`Checking balance.`);
workers.checkForZombies();
// if there are workers being created, stop scale up and down check
if(workers.currentCreating) return ;
// scale up and down check
if(workers.currentCreating+workers.length < workers.settings.min) null;
else if(workers.currentCreating)
return console.log(`Killing balance, workers are being created.`);
// hold amount of workers with no used runners
var lastMinAval = 0;
@ -234,13 +236,23 @@ var workers = (function(){
if(lastMinAval > workers.settings.minAvail){
// Remove workers if there are more then the settings states
console.log('Last 3 runners not used, killing last runner', workers.length);
console.log(
`Last ${workers.settings.minAvail} workers not used, killing last worker`,
'lastMinAval:', lastMinAval,
'minAvail:', workers.settings.minAvail,
'workers:', workers.length
);
return workers.destroy();
} else if(lastMinAval < workers.settings.minAvail){
// creates workers if the settings file demands it
console.log('last 3 workers have no free runners, starting droplet');
console.log(
'last 3 workers have no free runners, starting worker',
'lastMinAval:', lastMinAval,
'minAvail:', workers.settings.minAvail,
'workers:', workers.length
);
return workers.create();
}
@ -295,6 +307,7 @@ var runnerFree = function(runner){
}
delete label2runner[runner.label];
console.log(`Runner freed ${runner.label}.`, runner.worker);
workers.startRunners({worker: runner.worker});
};
@ -312,16 +325,16 @@ var getAvailrunner = function(runner){
var run = function(req, res, runner, count){
count = count || 0;
console.log('run start', count);
console.log(`Runner starting attempt ${count}.`);
if(!runner){
console.log('no runner');
console.log(`No runner available!`);
res.status(503);
return res.json({error: 'No runners, try again soon.'});
}
if(count > 2){
console.log('to many reties on runner');
console.log(`Runner attempt failed, to many requests!`);
return res.status(400).json({error: 'Runner restarted to many times'});
}
@ -355,10 +368,9 @@ var run = function(req, res, runner, count){
});
};
console.log('========STARTING===========')
setInterval(workers.checkBalance, 15000);
workers.destroyByTag();
workers.checkBalance();
router.get('/stop/:name', function(req, res, next){
@ -447,7 +459,14 @@ router.post('/updateID', function(req, res, next){
router.get('/liststuff', function(req, res, next){
var obj = util.inspect(workers, {depth: 4});
res.send("<h1>Workers</h1><pre>"+obj+"</pre><h1>label2runner</h1><pre>"+util.inspect(label2runner)+'</pre><h1>DO calls</h1>'+doapi.calls);
res.send(`
<h1>Workers</h1>
<pre>${obj}</pre>
<h1>label2runner</h1>
<pre>${util.inspect(label2runner)}</pre>
<h1>DO calls</h1>
${doapi.calls}
`);
});
router.get('/ping/:runner', function(req, res, next){
@ -457,7 +476,7 @@ router.get('/ping/:runner', function(req, res, next){
});
router.post('/run/:runner?', function (req, res, next){
console.log('hit runner route');
console.log(`Request runner route!`);
var runner = getAvailrunner(label2runner[req.params.runner]);
return run(req, res, runner);
});

View File

@ -1,30 +1,61 @@
const request = require('request');
var till = 15;
var completed = 0;
var errors = 0;
var callRunner = (function(){
let started = 0;
let completed = 0;
let errors = 0;
let noRunner = 0;
for(let i=0; i<till; i++){
console.log('calling', i);
let httpOptions = {
url: 'http://codeland.bytedev.co:2000/api/run',
form: {
code: `python3 -c "print(1)"`,
once: true,
}
let func = function(code, callback) {
// code | `string` block of code to send runner or
// `number` sleep timeout in seconds
let sleepTime = 0;
let id = started++;
callback = callback || function(){};
if(/^\+?(0|[1-9]\d*)$/.test(code)){
sleepTime = code;
code = null;
}
console.log(id, ': Running...');
let httpOptions = {
url: 'http://codeland.bytedev.co:2000/api/run?once=true',
form: {
code: code || `python3 -c "
from time import sleep
sleep(${sleepTime})
"`,
}
};
return request.post(httpOptions, function(error, response, body){
completed++;
let res = ``;
if(response.statusCode == 503){
noRunner++;
}else if(error || response.statusCode !== 200){
errors++;
body = JSON.parse(body);
res = (Buffer.from(body.res, 'base64').toString('ascii'));
}
console.log(`${id} with results ${res}. Errors ${errors}. No runner ${noRunner}. Completed ${completed}`);
callback()
});
};
request.post(httpOptions, function(error, response, body){
completed++;
if(error || response.statusCode !== 200){
errors++;
}
body = JSON.parse(body);
return func;
})();
console.log(i, body);
if(completed===till){
console.log(errors);
}
});
}
let __do = function(till){
if(!till) return ;
callRunner(String(Math.random())[3]);
setTimeout(__do, 1500, --till);
};
__do(30)