Last active
December 4, 2015 10:57
-
-
Save rikur/4b6409141e9bac903c19 to your computer and use it in GitHub Desktop.
flynn-event-listener
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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