94 lines
2.5 KiB
JavaScript
94 lines
2.5 KiB
JavaScript
|
/*eslint-env node */
|
||
|
'use strict';
|
||
|
|
||
|
/**
|
||
|
Redbird ETCD Module
|
||
|
This module handles automatic proxy registration via etcd
|
||
|
*/
|
||
|
var Etcd = require('node-etcd');
|
||
|
|
||
|
function ETCDModule(redbird, options){
|
||
|
if (!(this instanceof ETCDModule)){
|
||
|
return new ETCDModule(redbird, options);
|
||
|
}
|
||
|
|
||
|
// Create Redbird Instance and Log
|
||
|
this.redbird = redbird;
|
||
|
var log = redbird.log;
|
||
|
var _this = this;
|
||
|
|
||
|
// Create node-etcd Instance
|
||
|
this.etcd = new Etcd(options.hosts,options.ssloptions);
|
||
|
this.etcd_dir = (typeof options.path !== 'undefined') ? options.path : "redbird";
|
||
|
|
||
|
// Create directory if not created
|
||
|
this.etcd.get(this.etcd_dir,function(err, body, header){
|
||
|
if (err && err.errorCode == 100){
|
||
|
_this.etcd.mkdir(_this.etcd_dir, function(err){
|
||
|
if (err){
|
||
|
log.error(err, 'etcd backend error');
|
||
|
}
|
||
|
else{
|
||
|
createWatcher();
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
else if(!err && body.node.dir){
|
||
|
createWatcher();
|
||
|
}
|
||
|
else{
|
||
|
log.error(err, 'etcd backend error');
|
||
|
}
|
||
|
});
|
||
|
|
||
|
// Helper function to check if values contain settings
|
||
|
function IsJsonString(str) {
|
||
|
try {
|
||
|
JSON.parse(str);
|
||
|
} catch (e) {
|
||
|
return false;
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
// Helper function to pretify etcd directory strings
|
||
|
function removeEtcDir(str) {
|
||
|
return str.replace(_this.etcd_dir, '').replace(/^\/+|\/+$/g, '');
|
||
|
}
|
||
|
|
||
|
function createWatcher(){
|
||
|
// Watch etcd directory
|
||
|
_this.watcher = _this.etcd.watcher(_this.etcd_dir, null, {recursive:true});
|
||
|
|
||
|
// On Add/Update
|
||
|
_this.watcher.on("change", function(body,headers){
|
||
|
if(body.node.key && body.node.value && !IsJsonString(body.node.value)){
|
||
|
_this.redbird.register(removeEtcDir(body.node.key),body.node.value);
|
||
|
}
|
||
|
else if(body.node.key && body.node.value && IsJsonString(body.node.value)){
|
||
|
var config = JSON.parse(body.node.value);
|
||
|
if (typeof config.docker !== 'undefined'){
|
||
|
require('../').docker(_this.redbird).register(body.node.key,body.node.value.docker,body.node.value);
|
||
|
}
|
||
|
else {
|
||
|
_this.redbird.register(removeEtcDir(body.node.key),config.hosts,config);
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
|
||
|
// On Delete
|
||
|
_this.watcher.on("delete", function(body,headers){
|
||
|
if(body.node.key){
|
||
|
_this.redbird.unregister(removeEtcDir(body.node.key));
|
||
|
}
|
||
|
});
|
||
|
|
||
|
// Handle Errors
|
||
|
_this.watcher.on("error", function(err){
|
||
|
log.error(err, 'etcd backend error');
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
module.exports = ETCDModule;
|