This commit is contained in:
William Mantly 2016-05-29 13:43:04 -04:00
parent 42ea77720a
commit 37fae2e413

View File

@ -17,7 +17,10 @@ var isCheckingWorkers = false;
var dopletNewID = 0;
var checkDroplet = function(id, time){
var workers = (function(){
var workers = [];
workers.checkDroplet = function(id, time){
time = time || 5000;
doapi.dropletInfo(id, function(data){
var worker = JSON.parse(data)['droplet'];
@ -25,42 +28,96 @@ var checkDroplet = function(id, time){
console.log('Droplet is now active, starting runners in 20 seconds')
setTimeout(function(worker){
console.log('Ready to start runners!')
startRunners(workers[workers.push(makeWorkerObj(worker))-1])
workers.startRunners(workers[workers.push(makeWorkerObj(worker))-1])
isCheckingWorkers = false;
}, 20000, worker);
return true;
}else{
console.log('Worker not ready, check again in ', time, 'MS');
setTimeout(function(){
checkDroplet(id)
workers.checkDroplet(id);
}, time);
}
});
};
};
var workerCreate = function(){
workers.create = function(){
doapi.dropletCreate({
name: 'clw'+workerSnapID+'-'+(Math.random()*100).toString().replace('.',''),
image: '17575764'
}, function(data){
data = JSON.parse(data);
setTimeout(function(dopletNewID){
checkDroplet(dopletNewID)
workers.checkDroplet(dopletNewID);
}, 60000, data.droplet.id);
doapi.dropletSetTag('clworker', data.droplet.id, function(d){
console.log(d)
});
doapi.dropletSetTag('clworker', data.droplet.id, function(){});
});
};
};
var workerDestroy = function(worker){
workers.destroy = function(worker){
worker = worker || workers.pop();
doapi.dropletDestroy(worker.id, function(){});
checkWorkersBalance();
};
workers.checkBalance();
};
var checkWorkersBalance = function(){
workers.makeWorkerObj = function(worker){
worker.networks.v4.forEach(function(value){
worker[value.type+'IP'] = value.ip_address;
});
worker.availrunners = [];
worker.ip = worker.privateIP;
worker.usedrunner = 0;
worker.index = workers.length,
worker.getRunner = function(){
if(this.availrunners.length === 0) return false;
console.log('geting runner from ', worker.name, ' aval length ', this.availrunners.length);
var runner = this.availrunners.pop();
this.usedrunner++;
label2runner[runner.label] = runner;
return runner;
}
return worker;
};
workers.destroyOld = function(){
doapi.dropletsByTag('clworker', function(data){
data = JSON.parse(data);
data['droplets'].forEach(function(worker){
console.log('found old droplet, killing it');
doapi.dropletDestroy(worker.id, function(){});
});
workers.checkBalance();
});
};
workers.startRunners = function(worker, stopPercent){
console.log('starting runners on', worker.name)
stopPercent = stopPercent || 80;
ramPercentUsed(worker.ip, function(usedMemPercent){
if(usedMemPercent < stopPercent ){
var name = 'crunner-'+(Math.random()*100).toString().replace('.','');
return lxc.startEphemeral(name, 'crunner0', worker.ip, function(data){
if( !data.ip ) return setTimeout(startRunners(worker),0);
console.log('started runner')
worker.availrunners.push({
ip: data.ip,
name: name,
worker: worker,
label: worker.name + ':' + name
});
return setTimeout(startRunners(worker, stopPercent), 0);
});
}else{
setTimeout(workers.checkBalance, 10000);
console.log('using', usedMemPercent, 'percent memory, stopping runner creation!', worker.availrunners.length, 'created on ', worker.name);
}
});
};
workers.checkBalance = function(){
if(isCheckingWorkers) return false;
isCheckingWorkers = true;
var changed = false;
@ -68,21 +125,21 @@ var checkWorkersBalance = function(){
if(workers.length < 2){
console.log('less then 2 workers, starting a droplet');
for(var i=2; i--;) workerCreate();
for(var i=2; i--;) workers.workerCreate();
return ;
}
if(workers[workers.length-1].usedrunner !== 0){
console.log('last droplet has no free runners, starting droplet');
return workerCreate();
return workers.workerCreate();
}
if(workers.length > 2 && workers[workers.length-1].usedrunner === 0 && workers[workers.length-2].usedrunner === 0){
console.log('Last 2 runners not used, killing last runner');
workerDestroy();
workers.workerDestroy();
}
for(let worker of workers){
if(worker.availrunners.length === 0 && worker.usedrunner === 0){
workerDestroy(worker);
workers.workerDestroy(worker);
changed = true;
}
}
@ -90,11 +147,13 @@ var checkWorkersBalance = function(){
console.log('stopping workers balancing check');
isCheckingWorkers = false;
if(changed) setTimeout(function(){
checkWorkersBalance();
workers.checkBalance();
}, 3000);
};
};
// var start
return workers;
})();
var ramPercentUsed = function(ip, callback){
@ -113,7 +172,7 @@ var runnerFree = function(runner){
}
delete label2runner[runner.label];
startRunners(runner.worker);
workers.startRunners(runner.worker);
};
var lxcTimeout = function(runner, time){
@ -152,37 +211,6 @@ var run = function(req, res, runner){
});
};
var makeWorkerObj = function(worker){
worker.networks.v4.forEach(function(value){
worker[value.type+'IP'] = value.ip_address;
});
worker.availrunners = [];
worker.ip = worker.privateIP;
worker.usedrunner = 0;
worker.index = workers.length,
worker.getRunner = function(){
if(this.availrunners.length === 0) return false;
console.log('geting runner from ', worker.name, ' aval length ', this.availrunners.length);
var runner = this.availrunners.pop();
this.usedrunner++;
label2runner[runner.label] = runner;
return runner;
}
return worker;
};
var initWorkers = function(){
doapi.dropletsByTag('clworker', function(data){
data = JSON.parse(data);
data['droplets'].forEach(function(worker){
console.log('found old droplet, killing it');
doapi.dropletDestroy(worker.id, function(){});
});
checkWorkersBalance();
});
};
var getAvailrunner = function(runner){
for(let worker of workers){
console.log('checking ', worker.name, ' with ', worker.availrunners.length, ' free workers');
@ -195,31 +223,6 @@ var getAvailrunner = function(runner){
return false;
};
var startRunners = function(worker, stopPercent){
console.log('starting runners on', worker.name)
stopPercent = stopPercent || 80;
ramPercentUsed(worker.ip, function(usedMemPercent){
if(usedMemPercent < stopPercent ){
var name = 'crunner-'+(Math.random()*100).toString().replace('.','');
return lxc.startEphemeral(name, 'crunner0', worker.ip, function(data){
if( !data.ip ) return setTimeout(startRunners(worker),0);
console.log('started runner')
worker.availrunners.push({
ip: data.ip,
name: name,
worker: worker,
label: worker.name + ':' + name
});
return setTimeout(startRunners(worker, stopPercent), 0);
});
}else{
setTimeout(checkWorkersBalance, 10000);
console.log('using', usedMemPercent, 'percent memory, stopping runner creation!', worker.availrunners.length, 'created on ', worker.name);
}
});
};
initWorkers();
// router.get('/start/:name', function(req, res, next){