blob: 5b5adc45115fec35c6b8df45e239696cd9e8c165 [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 ProviderCreate = require('./lib/create.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';
// This is the maximum times a single trigger is allow to fire.
// Trigger should not be allow to be created with a value higher than this value
// Trigger can be created with a value lower than this between 1 and this value
var triggerFireLimit = 10000;
// Maximum number of times to retry the invocation of an action
// before deleting the associated trigger
var retriesBeforeDelete = 5;
// 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) {
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, err);
}
});
var chDb = nanop.db.use(databaseName);
return chDb;
} else {
return null;
}
}
function createTriggerDb () {
var nanop = null;
// no need for a promise here, but leaving code inplace until we prove out the question of cookie usage
var promise = new Promise(function(resolve, reject) {
nanop = require('nano')(dbProtocol + '://' + dbUsername + ':' + dbPassword + '@' + dbHost);
logger.info('url is ' + dbProtocol + '://' + dbUsername + ':' + dbPassword + '@' + dbHost);
resolve(createDatabase (nanop));
});
return promise;
}
// 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 triggerDBPromise = createTriggerDb();
triggerDBPromise.then(function (nanoDb) {
logger.info(tid, 'init', 'trigger storage database details: ', nanoDb);
var providerUtils = new ProviderUtils (tid, logger, app, retriesBeforeDelete, nanoDb, triggerFireLimit, routerHost);
var providerRAS = new ProviderRAS (tid, logger, providerUtils);
var providerHealth = new ProviderHealth (tid, logger, providerUtils);
var providerUpdate = new ProviderUpdate (tid, logger, providerUtils);
var providerCreate = new ProviderCreate (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 Creating a new Trigger
app.post(providerCreate.endPoint, providerUtils.authorize, providerCreate.create);
// Endpoint for Deleting an existing Trigger.
app.delete(providerDelete.endPoint, providerUtils.authorize, providerDelete.delete);
providerUtils.initAllTriggers();
}, function(err) {
logger.info(tid, 'init', 'found an error creating database: ', err);
});
}
init(server);