orcinus
Version:
Container orchestration tools
141 lines (130 loc) • 4.55 kB
JavaScript
var process = require('process');
var yml = require('yamljs');
var fileExt = require('file-extension');
var fs = require('fs');
var jwtDecode = require('jwt-decode');
var colors = require('colors');
var parseImg = require('docker-parse-image');
module.exports = {
parser : (file)=>{
// Favor yaml over json
if (fileExt(file) === 'yml') {
return yml.load(file);
}
return require(file);
},
obj : (val)=>{
return Object.keys(val);
},
checkObj : (obj,key)=>{
return obj.hasOwnProperty(key)
},
getUserHome : ()=>{
return process.env[(process.platform == 'win32') ? 'USERPROFILE' : 'HOME'];
},
exit : (code) => {
code = code || 0;
if (global.test) { // Prevent actual exit on unit testing
throw new Error();
}
process.exit(code)
},
decode : (req,res) => {
var token = req.body.token || req.query.token || req.headers['x-access-token'];
if(token){
var decoded = jwtDecode(token);
return decoded;
}
else{
res.json({error:"Token invalid!"});
}
},
authParser : (manifestAuth,image)=>{
var Auth;
if(typeof(manifestAuth) === 'boolean'){
var home = process.env.HOME || process.env.HOMEPATH || process.env.USERPROFILE;
var dockerAuth = require(home+"/.docker/config.json");
var registryURL = parseImg(image).registry;
var regData = dockerAuth.auths[registryURL];
if(regData){
var regUser = new Buffer(regData.auth, 'base64');
regUser = regUser.toString().split(":");
var tmplAuth = auth = {
username: regUser[0],
password: regUser[1],
serveraddress: registryURL
}
Auth = tmplAuth
}
}
if(typeof(manifestAuth) === 'object'){
Auth = manifestAuth;
}
module.exports.debug("Auth check:")
module.exports.debug(Auth);
return Auth;
},
serviceManifest : (userID,req,res,callback) => {
var manifest = req.body;
var obj = JSON.parse(JSON.stringify(manifest))
delete obj.opt.services
obj.opt.services = {};
var Auth = {};
var stack = userID+"-"+manifest.opt.stack;
obj.opt.stack = stack
Object.keys(manifest.opt.services).reverse().forEach(function(v){
// init
var serviceName = stack+"-"+v;
// Authentication
var manifestAuth = manifest.opt.services[v].auth;
if(manifestAuth){
Auth[serviceName] = module.exports.authParser(manifestAuth,manifest.opt.services[v].image)
}
if(process.env.ORCINUS == "prod"){
manifest.opt.services[v].constraint = "node.role==worker";
}
// if endpoint key set (production)
if(manifest.opt.services[v].endpoint){
console.log("endpoint........")
var NETWORK = process.env.ORCINUS_NETWORK;
var DOMAIN = process.env.ORCINUS_DOMAIN;
manifest.opt.services[v].labels = { "traefik.port" : manifest.opt.services[v].endpoint };
delete manifest.opt.services[v].endpoint;
if(!manifest.opt.services[v].networks){
manifest.opt.services[v].networks = [NETWORK];
module.exports.debug("Network manifest not existing set : "+manifest.opt.services[v].networks);
}
else{
manifest.opt.services[v].networks.push(NETWORK);
module.exports.debug("Network manifest existing set : "+manifest.opt.services[v].networks);
}
// setup custom domain
var domainSVC = serviceName+"."+DOMAIN;
if(manifest.opt.domain){
manifest.opt.services[v].labels["traefik.frontend.rule"] = "Host:"+manifest.opt.domain;
domainSVC = manifest.opt.domain;
}
module.exports.debug("Set Domain to : "+domainSVC);
manifest.opt.services[v].labels["orcinus.domain"] = domainSVC;
manifest.opt.services[v].labels["traefik.docker.network"] = NETWORK;
}
var modifySVC = JSON.parse(JSON.stringify(manifest.opt.services[v]).replace(/{orcinus.userid}/g,userID).replace(/{orcinus.stack}/g,manifest.opt.stack));
module.exports.debug("manifest file : "+JSON.stringify(modifySVC));
obj.opt.services[serviceName] = modifySVC;
});
module.exports.debug("Auth all check:")
module.exports.debug(Auth);
callback(req,res,obj,Auth);
},
debug : (data) => {
if(process.env.ORCINUS == "dev"){
if(typeof(data) === 'object'){
var jsonData = JSON.stringify(data);
console.log(colors.yellow(jsonData));
}
else{
console.log(colors.yellow(data));
}
}
}
}