blob: 1198cf6f4d42fa85d789de0b984ee902b7e0f6ec [file] [log] [blame]
'use strict';
/**
* Service which can be configured to listen for triggers from a provider.
* The Provider will store, invoke, and POST whisk events appropriately.
*/
var http = require('http');
var express = require('express');
var request = require('request');
var bodyParser = require('body-parser');
var logger = require('./Logger');
var ProviderUtils = require('./lib/utils.js');
var ProviderHealth = require('./lib/health.js');
var ProviderRAS = require('./lib/ras.js');
var ProviderUpdate = require('./lib/update.js');
var ProviderDelete = require('./lib/delete.js');
var constants = require('./lib/constants.js');
// Initialize the Express Application
var app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.set('port', process.env.PORT || 8080);
// TODO: Setup a proper Transaction ID
var tid = "??";
// Whisk API Router Host
var routerHost = process.env.ROUTER_HOST || 'localhost';
// Support includeDocs=true for triggers who existed before the removal of includeDocs
var supportIncludeDocs = process.env.SUPPORT_INCLUDE_DOCS || 'false';
// Maximum number of times to retry the invocation of an action
// before deleting the associated trigger
var retriesBeforeDelete = constants.RETRIES_BEFORE_DELETE;
// Allow invoking servers with self-signed certificates.
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
// If it does not already exist, create the triggers database. This is the database that will
// store the managed triggers.
//
var dbUsername = process.env.DB_USERNAME;
var dbPassword = process.env.DB_PASSWORD;
var dbHost = process.env.DB_HOST;
var dbPort = process.env.DB_PORT;
var dbProtocol = process.env.DB_PROTOCOL;
var dbPrefix = process.env.DB_PREFIX;
var databaseName = dbPrefix + constants.TRIGGER_DB_SUFFIX;
// Create the Provider Server
var server = http.createServer(app);
server.listen(app.get('port'), function(){
logger.info(tid, 'server.listen', 'Express server listening on port ' + app.get('port'));
});
function createDatabase (nanop) {
logger.info(tid, 'createDatabase', 'creating the trigger database');
if (nanop !== null) {
nanop.db.create(databaseName, function(err, body, header) {
if (!err) {
logger.info(tid, databaseName, ' database for triggers was created.');
} else {
logger.info(tid, databaseName, 'failed to create the trigger database. it might already exist ',err);
}
});
var chDb = nanop.db.use(databaseName);
return chDb;
} else {
logger.info(tid, databaseName, 'failed to create the trigger database. nano provider did not get created. check db URL: ' + dbHost);
return null;
}
}
function createTriggerDb () {
logger.info('url is ' + dbProtocol + '://' + dbUsername + ':' + dbPassword + '@' + dbHost);
var nanop = require('nano')(dbProtocol + '://' + dbUsername + ':' + dbPassword + '@' + dbHost);
return createDatabase (nanop);
}
// Initialize the Provider Server
function init(server) {
if (server !== null) {
var address = server.address();
if (address === null) {
logger.error(tid, 'init', 'Error initializing server. Perhaps port is already in use.');
process.exit(-1);
}
}
var nanoDb = createTriggerDb();
if (nanoDb === null) {
logger.error(tid, 'init', 'found an error creating database: ');
} else {
logger.info(tid, 'init', 'trigger storage database details: ', nanoDb);
var providerUtils = new ProviderUtils (tid, logger, app, retriesBeforeDelete, nanoDb, routerHost, supportIncludeDocs);
var providerRAS = new ProviderRAS (tid, logger, providerUtils);
var providerHealth = new ProviderHealth (tid, logger, providerUtils);
var providerUpdate = new ProviderUpdate (tid, logger, providerUtils);
var providerDelete = new ProviderDelete (tid, logger, providerUtils);
// RAS Endpoint
app.get(providerRAS.endPoint, providerRAS.ras);
// Health Endpoint
app.get(providerHealth.endPoint, providerHealth.health);
// Endpoint for Update OR Create a Trigger
app.put(providerUpdate.endPoint, providerUtils.authorize, providerUpdate.update);
// Endpoint for Deleting an existing Trigger.
app.delete(providerDelete.endPoint, providerUtils.authorize, providerDelete.delete);
providerUtils.initAllTriggers();
}
}
init(server);