Skip to content

Instantly share code, notes, and snippets.

@rikur
Last active December 4, 2015 10:57
Show Gist options
  • Save rikur/4b6409141e9bac903c19 to your computer and use it in GitHub Desktop.
Save rikur/4b6409141e9bac903c19 to your computer and use it in GitHub Desktop.
flynn-event-listener
var request = require('request')
var async = require('async')
var ssejson = require('ssejson')
var bunyan = require('bunyan');
var log = bunyan.createLogger({
name: "flynn-event-listener",
serializers: bunyan.stdSerializers,
level: process.env.DEBUG ? 'debug' : 'info'
});
function exit(message){
log.error(message);
process.exit(1);
}
// request wrapper to talk to the Flynn controller
var controllerRequest = request.defaults({strictSSL: false});
// check that we have all the required env vars
// use REMOTE_FLYNN if you want to run this locally
if(hostname = process.env['FLYNN_CONTROLLER_HOSTNAME']){
controllerRequest = controllerRequest.defaults({
headers: {
'Host': hostname, 'Accept': 'text/event-stream'
},
baseUrl: 'https://'+hostname
});
} else exit('No ENV[FLYNN_CONTROLLER_HOSTNAME] provided, exiting.');
if(key = process.env['FLYNN_CONTROLLER_AUTH_KEY']) controllerRequest = controllerRequest.defaults({qs: {'key': key}});
else exit('No ENV[FLYNN_CONTROLLER_AUTH_KEY] provided, exiting.');
var events = {
//flynn events
//app_deletion: function(data){},
//app: function(data){},
//app_release: function(data){},
//job: function(data){},
//scale: function(data){},
//release: function(data){},
//artifact: function(data){},
//provider: function(data){},
//resource: function(data){},
//resource_deletion: function(data){},
//key: function(data){},
//key_deletion: function(data){},
//route: function(data){},
//route_deletion: function(data){},
//domain_migration: function(data){}
//deployment: function(data){}
};
events.deployment = function(data){
if(data.status == 'complete'){
//sleep here for 30s
request('https://app.mydomain.com', function(err,resp,body){
log.info(body);
});
}
};
// events.app = function(data){
// async.auto({
// get_api_routes: function(callback){
// var api_routes = [];
// controllerRequest('/apps', function(err,resp,body){
// JSON.parse(body).forEach(function(app){
// if(app.meta && app.meta.register_to_api_as) api_routes.push({
// url: app.meta.register_to_api_as.replace('/',''),
// backend: app.name + '-web.discoverd:' + (app.meta.register_to_api_with_port ? app.meta.register_to_api_with_port : '8080')
// });
// });
// if(api_routes.length) callback(null, api_routes);
// else callback('No API routes to configure');
// });
// },
// build_nginx_config: ['get_api_routes', function(callback, results){
// var nginx_config = '';
// results.get_api_routes.forEach(function(route){
// var api_location = "/api/" + route.url;
// nginx_config += "location = " + api_location + " {\n\t" + "rewrite " + api_location + " / break; proxy_pass http://" + route.backend + ";\n}\n\t";
// });
// if(nginx_config == '' || cache.nginx_config == nginx_config)
// return log.info("No changes to NGINX config.");
// log.info("New NGINX config being deployed: \n" + nginx_config);
// cache.nginx_config = nginx_config;
// callback(null, nginx_config);
// }],
// create_nginx_release_config: ['build_nginx_config', function(callback, results){
// controllerRequest('/apps/ng-api/release', function(err,resp,body){
// if(err || resp.statusCode != 200) return callback('Failed to load the ng-api release from the cluster');
// var new_release = JSON.parse(body);
// delete new_release.id;
// delete new_release.created_at;
// if(new_release.env == null) new_release.env = {};
// new_release.env.NGINX_LOCATION_CONFIG = results.build_nginx_config;
// callback(null, new_release);
// });
// }],
// create_nginx_release: ['create_nginx_release_config', function(callback, results){
// controllerRequest.post({url: '/releases', json: results.create_nginx_release_config}, function(err,resp,body){
// if(err || resp.statusCode != 200) return callback('Failed to create a new ng-api release with the new config');
// log.info('New ng-api release created, deploying it..');
// callback(null, body.id);
// });
// }],
// deploy_nginx_release: ['create_nginx_release', function(callback, results){
// controllerRequest.post({ url: '/apps/ng-api/deploy', json: { id: results.create_nginx_release } }, function(err,resp,body){
// if(err || resp.statusCode != 200) return callback('Failed to deploy new ng-api release');
// log.info('New NGINX config has been deployed!');
// callback(null);
// });
// }]
// }, function(err, results) {
// if(err) log.error(err);
// log.debug(results);
// });
// };
controllerRequest('/events')
.pipe(ssejson.parse())
.on('data', function (data) {
log.debug(data);
var event_id = data.id, event_name = data.object_type, event_data = data.data;
var status = event_data.status ? '{' + event_data.status + '}' : '';
if(events.hasOwnProperty(event_name)){
log.info('event('+ event_id +')[' + event_name + ']' + status + ' received, executing callback..');
events[event_name](event_data);
}
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment