make action's node.js runtime version configurable (#158)
diff --git a/Dockerfile b/Dockerfile
index 87d6a86..f823a5f 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -14,8 +14,8 @@
apt-get install -y nodejs
# only package.json
-ADD package.json /alarmsTrigger/
-RUN cd /alarmsTrigger; npm install
+ADD package.json /
+RUN cd / && npm install --production
# App
ADD provider/. /alarmsTrigger/
diff --git a/action/alarmWebAction.js b/action/alarmWebAction.js
index 0963ce4..8383578 100644
--- a/action/alarmWebAction.js
+++ b/action/alarmWebAction.js
@@ -1,21 +1,25 @@
-var CronJob = require('cron').CronJob;
-var moment = require('moment');
-
+const CronJob = require('cron').CronJob;
+const moment = require('moment');
const common = require('./lib/common');
const Database = require('./lib/Database');
function main(params) {
- if (!params.authKey) {
- return common.sendError(400, 'no authKey parameter was provided');
- }
if (!params.triggerName) {
return common.sendError(400, 'no trigger name parameter was provided');
}
var triggerParts = common.parseQName(params.triggerName);
- var triggerID = `${params.authKey}/${triggerParts.namespace}/${triggerParts.name}`;
- var triggerURL = `https://${params.apihost}/api/v1/namespaces/${triggerParts.namespace}/triggers/${triggerParts.name}`;
+ var triggerData = {
+ apikey: params.authKey,
+ name: triggerParts.name,
+ namespace: triggerParts.namespace,
+ additionalData: common.constructObject(params.additionalData),
+ };
+ var triggerID = `${triggerData.namespace}/${triggerData.name}`;
+ if (triggerData.apikey) {
+ triggerID = `${triggerData.apikey}/${triggerID}`;
+ }
var workers = params.workers instanceof Array ? params.workers : [];
var deleteAfterFireArray = ['false', 'true', 'rules'];
@@ -28,9 +32,6 @@
}
var newTrigger = {
- apikey: params.authKey,
- name: triggerParts.name,
- namespace: triggerParts.namespace,
payload: params.trigger_payload || {},
maxTriggers: params.maxTriggers || -1,
status: {
@@ -38,6 +39,7 @@
'dateChanged': Date.now()
}
};
+ Object.assign(newTrigger, triggerData);
if (params.fireOnce) {
if (!params.date) {
@@ -127,7 +129,7 @@
}
return new Promise(function (resolve, reject) {
- common.verifyTriggerAuth(triggerURL, params.authKey, false)
+ common.verifyTriggerAuth(triggerData, false)
.then(() => {
db = new Database(params.DB_URL, params.DB_NAME);
return db.getWorkerID(workers);
@@ -152,7 +154,7 @@
}
else if (params.__ow_method === "get") {
return new Promise(function (resolve, reject) {
- common.verifyTriggerAuth(triggerURL, params.authKey, false)
+ common.verifyTriggerAuth(triggerData, false)
.then(() => {
db = new Database(params.DB_URL, params.DB_NAME);
return db.getTrigger(triggerID);
@@ -201,7 +203,7 @@
return new Promise(function (resolve, reject) {
var updatedParams = {};
- common.verifyTriggerAuth(triggerURL, params.authKey, false)
+ common.verifyTriggerAuth(triggerData, false)
.then(() => {
db = new Database(params.DB_URL, params.DB_NAME);
return db.getTrigger(triggerID);
@@ -212,7 +214,7 @@
}
if (params.trigger_payload) {
- updatedParams.payload = common.constructPayload(params.trigger_payload);
+ updatedParams.payload = common.constructObject(params.trigger_payload, true);
}
if (trigger.date) {
@@ -311,7 +313,7 @@
else if (params.__ow_method === "delete") {
return new Promise(function (resolve, reject) {
- common.verifyTriggerAuth(triggerURL, params.authKey, true)
+ common.verifyTriggerAuth(triggerData, true)
.then(() => {
db = new Database(params.DB_URL, params.DB_NAME);
return db.getTrigger(triggerID);
@@ -361,10 +363,7 @@
function hasSecondsGranularity(cron) {
var fields = (cron + '').trim().split(/\s+/);
-
return fields.length > 5 && fields[fields.length - 6] !== '0';
}
exports.main = main;
-
-
diff --git a/action/lib/common.js b/action/lib/common.js
index b2c613e..9480fb5 100644
--- a/action/lib/common.js
+++ b/action/lib/common.js
@@ -1,4 +1,6 @@
const request = require('request');
+const openwhisk = require('openwhisk');
+const config = require('./config');
function requestHelper(url, input, method) {
@@ -45,33 +47,33 @@
delete webparams.apihost;
webparams.triggerName = triggerName;
+ config.addAdditionalData(webparams);
return webparams;
}
-function verifyTriggerAuth(triggerURL, authKey, isDelete) {
- var auth = authKey.split(':');
+function verifyTriggerAuth(triggerData, isDelete) {
+ var owConfig = config.getOpenWhiskConfig(triggerData);
+ var ow = openwhisk(owConfig);
return new Promise(function(resolve, reject) {
-
- request({
- method: 'get',
- url: triggerURL,
- auth: {
- user: auth[0],
- pass: auth[1]
- },
- rejectUnauthorized: false
- }, function(err, response) {
- if (err) {
- reject(sendError(400, 'Trigger authentication request failed.', err.message));
- }
- else if(response.statusCode >= 400 && !(isDelete && response.statusCode === 404)) {
- reject(sendError(response.statusCode, 'Trigger authentication request failed.'));
- }
- else {
- resolve();
- }
+ ow.triggers.get(triggerData.name)
+ .then(() => {
+ resolve();
+ })
+ .catch(err => {
+ if (err.statusCode) {
+ var statusCode = err.statusCode;
+ if (!(isDelete && statusCode === 404)) {
+ reject(sendError(statusCode, 'Trigger authentication request failed.'));
+ }
+ else {
+ resolve();
+ }
+ }
+ else {
+ reject(sendError(400, 'Trigger authentication request failed.', err.message));
+ }
});
});
}
@@ -104,18 +106,27 @@
};
}
-function constructPayload(payload) {
-
- var updatedPayload;
- if (payload) {
- if (typeof payload === 'string') {
- updatedPayload = {payload: payload};
+function constructObject(data, isPayload) {
+ var jsonObject;
+ if (data) {
+ if (typeof data === 'string') {
+ if (isPayload) {
+ jsonObject = {payload: data};
+ }
+ else {
+ try {
+ jsonObject = JSON.parse(data);
+ }
+ catch (e) {
+ console.log('error parsing ' + data);
+ }
+ }
}
- if (typeof payload === 'object') {
- updatedPayload = payload;
+ if (typeof data === 'object') {
+ jsonObject = data;
}
}
- return updatedPayload;
+ return jsonObject;
}
@@ -125,5 +136,5 @@
'verifyTriggerAuth': verifyTriggerAuth,
'parseQName': parseQName,
'sendError': sendError,
- 'constructPayload': constructPayload
+ 'constructObject': constructObject
};
diff --git a/action/lib/config.js b/action/lib/config.js
new file mode 100644
index 0000000..550f42a
--- /dev/null
+++ b/action/lib/config.js
@@ -0,0 +1,13 @@
+function getOpenWhiskConfig(triggerData) {
+ return {ignore_certs: true, namespace: triggerData.namespace, api_key: triggerData.apikey};
+}
+
+function addAdditionalData(params) {
+ //insert code here to store additional trigger data in the database
+ //for example, params.additionalData = {dateCreated: Date.now()};
+}
+
+module.exports = {
+ 'addAdditionalData': addAdditionalData,
+ 'getOpenWhiskConfig': getOpenWhiskConfig
+};
diff --git a/installCatalog.sh b/installCatalog.sh
index 9261716..ca6c150 100755
--- a/installCatalog.sh
+++ b/installCatalog.sh
@@ -23,6 +23,7 @@
APIHOST="$5"
WORKERS="$6"
LIMIT_CRON_FIELDS="${LIMIT_CRON_FIELDS}"
+ACTION_RUNTIME_VERSION=${ACTION_RUNTIME_VERSION:="nodejs:6"}
# If the auth key file exists, read the key in the file. Otherwise, take the
# first argument as the key itself.
@@ -64,18 +65,18 @@
cp -f alarmFeed_package.json package.json
zip -r alarmFeed.zip lib package.json alarm.js
-$WSK_CLI -i --apihost "$EDGEHOST" action update --kind nodejs:6 --auth "$AUTH" alarms/alarm "$PACKAGE_HOME/action/alarmFeed.zip" \
+$WSK_CLI -i --apihost "$EDGEHOST" action update --kind "$ACTION_RUNTIME_VERSION" --auth "$AUTH" alarms/alarm "$PACKAGE_HOME/action/alarmFeed.zip" \
-a description 'Fire trigger when alarm occurs' \
-a parameters '[ {"name":"cron", "required":true}, {"name":"startDate", "required":false}, {"name":"stopDate", "required":false} ]' \
-a feed true
-$WSK_CLI -i --apihost "$EDGEHOST" action update --kind nodejs:6 --auth "$AUTH" alarms/once "$PACKAGE_HOME/action/alarmFeed.zip" \
+$WSK_CLI -i --apihost "$EDGEHOST" action update --kind "$ACTION_RUNTIME_VERSION" --auth "$AUTH" alarms/once "$PACKAGE_HOME/action/alarmFeed.zip" \
-a description 'Fire trigger once when alarm occurs' \
-a parameters '[ {"name":"date", "required":true}, {"name":"deleteAfterFire", "required":false} ]' \
-a feed true \
-p fireOnce true
-$WSK_CLI -i --apihost "$EDGEHOST" action update --kind nodejs:6 --auth "$AUTH" alarms/interval "$PACKAGE_HOME/action/alarmFeed.zip" \
+$WSK_CLI -i --apihost "$EDGEHOST" action update --kind "$ACTION_RUNTIME_VERSION" --auth "$AUTH" alarms/interval "$PACKAGE_HOME/action/alarmFeed.zip" \
-a description 'Fire trigger at specified interval' \
-a parameters '[ {"name":"minutes", "required":true}, {"name":"startDate", "required":false}, {"name":"stopDate", "required":false} ]' \
-a feed true \
@@ -106,7 +107,7 @@
zip -r alarmWebAction.zip lib package.json alarmWebAction.js node_modules
-$WSK_CLI -i --apihost "$EDGEHOST" action update --kind nodejs:6 --auth "$AUTH" alarmsWeb/alarmWebAction "$PACKAGE_HOME/action/alarmWebAction.zip" \
+$WSK_CLI -i --apihost "$EDGEHOST" action update --kind "$ACTION_RUNTIME_VERSION" --auth "$AUTH" alarmsWeb/alarmWebAction "$PACKAGE_HOME/action/alarmWebAction.zip" \
-a description 'Create/Delete a trigger in alarms provider Database' \
--web true
diff --git a/package.json b/package.json
index 7b89d74..e922b06 100755
--- a/package.json
+++ b/package.json
@@ -16,9 +16,9 @@
"json-stringify-safe": "^5.0.1",
"http-status-codes": "^1.0.5",
"request-promise": "^1.0.2",
- "redis":"^2.7.1",
+ "redis": "^2.7.1",
"bluebird": "^3.5.0",
"systeminformation": "^3.19.0",
"long-timeout": "^0.1.1"
}
-}
\ No newline at end of file
+}
diff --git a/provider/lib/authHandler.js b/provider/lib/authHandler.js
new file mode 100644
index 0000000..9e25242
--- /dev/null
+++ b/provider/lib/authHandler.js
@@ -0,0 +1,13 @@
+function handleAuth(triggerData) {
+
+ var auth = triggerData.apikey.split(':');
+ return Promise.resolve({
+ user: auth[0],
+ pass: auth[1]
+ });
+
+}
+
+module.exports = {
+ 'handleAuth': handleAuth
+};
diff --git a/provider/lib/health.js b/provider/lib/health.js
index 98246a6..e0210ca 100644
--- a/provider/lib/health.js
+++ b/provider/lib/health.js
@@ -1,6 +1,5 @@
var si = require('systeminformation');
var v8 = require('v8');
-var request = require('request');
var _ = require('lodash');
module.exports = function(logger, utils) {
@@ -46,8 +45,6 @@
this.monitor = function(apikey) {
var method = 'monitor';
- var auth = apikey.split(':');
-
if (triggerName) {
monitorStatus = Object.assign({}, utils.monitorStatus);
utils.monitorStatus = {};
@@ -64,11 +61,12 @@
utils.sanitizer.deleteTriggerFromDB(existingID, 0);
//delete the trigger
- var dataTrigger = {
+ var triggerData = {
+ apikey: apikey,
uri: utils.uriHost + '/api/v1/namespaces/_/triggers/' + triggerName,
triggerID: existingID
};
- utils.sanitizer.deleteTrigger(dataTrigger, auth, 0)
+ utils.sanitizer.deleteTrigger(triggerData, 0)
.then((info) => {
logger.info(method, existingID, info);
})
@@ -90,7 +88,7 @@
var triggerURL = utils.uriHost + '/api/v1/namespaces/_/triggers/' + triggerName;
var triggerID = `${apikey}/_/${triggerName}`;
- createTrigger(triggerURL, auth)
+ createTrigger(triggerURL, apikey)
.then((info) => {
logger.info(method, triggerID, info);
var newTrigger = createAlarmTrigger(triggerID, apikey, alarmType);
@@ -132,17 +130,13 @@
return newTrigger;
}
- function createTrigger(triggerURL, auth) {
+ function createTrigger(triggerURL, apikey) {
var method = 'createTrigger';
return new Promise(function(resolve, reject) {
- request({
+ utils.authRequest({apikey: apikey}, {
method: 'put',
uri: triggerURL,
- auth: {
- user: auth[0],
- pass: auth[1]
- },
json: true,
body: {}
}, function (error, response) {
diff --git a/provider/lib/sanitizer.js b/provider/lib/sanitizer.js
index 31f8f79..982cfab 100644
--- a/provider/lib/sanitizer.js
+++ b/provider/lib/sanitizer.js
@@ -1,6 +1,6 @@
-var request = require('request');
-module.exports = function(logger, triggerDB, uriHost) {
+
+module.exports = function(logger, utils) {
var self = this;
@@ -8,9 +8,9 @@
var method = 'deleteTriggerFromDB';
//delete from database
- triggerDB.get(triggerID, function (err, existing) {
+ utils.db.get(triggerID, function (err, existing) {
if (!err) {
- triggerDB.destroy(existing._id, existing._rev, function (err) {
+ utils.db.destroy(existing._id, existing._rev, function (err) {
if (err) {
if (err.statusCode === 409 && retryCount < 5) {
setTimeout(function () {
@@ -32,19 +32,13 @@
});
};
- this.deleteTriggerAndRules = function(dataTrigger) {
+ this.deleteTriggerAndRules = function(triggerData) {
var method = 'deleteTriggerAndRules';
- var triggerIdentifier = dataTrigger.triggerID;
- var auth = dataTrigger.apikey.split(':');
-
- request({
+ var triggerIdentifier = triggerData.triggerID;
+ utils.authRequest(triggerData, {
method: 'get',
- uri: dataTrigger.uri,
- auth: {
- user: auth[0],
- pass: auth[1]
- },
+ uri: triggerData.uri
}, function(error, response, body) {
logger.info(method, triggerIdentifier, 'http get request, STATUS:', response ? response.statusCode : undefined);
@@ -53,7 +47,7 @@
}
else {
//delete the trigger
- self.deleteTrigger(dataTrigger, auth, 0)
+ self.deleteTrigger(triggerData, 0)
.then((info) => {
logger.info(method, triggerIdentifier, info);
if (body) {
@@ -61,8 +55,8 @@
var jsonBody = JSON.parse(body);
for (var rule in jsonBody.rules) {
var qualifiedName = rule.split('/');
- var uri = uriHost + '/api/v1/namespaces/' + qualifiedName[0] + '/rules/' + qualifiedName[1];
- self.deleteRule(rule, uri, auth, 0);
+ var uri = utils.uriHost + '/api/v1/namespaces/' + qualifiedName[0] + '/rules/' + qualifiedName[1];
+ self.deleteRule(triggerData, rule, uri, 0);
}
}
catch (err) {
@@ -77,26 +71,22 @@
});
};
- this.deleteTrigger = function(dataTrigger, auth, retryCount) {
+ this.deleteTrigger = function(triggerData, retryCount) {
var method = 'deleteTrigger';
return new Promise(function(resolve, reject) {
- var triggerIdentifier = dataTrigger.triggerID;
- request({
+ var triggerIdentifier = triggerData.triggerID;
+ utils.authRequest(triggerData, {
method: 'delete',
- uri: dataTrigger.uri,
- auth: {
- user: auth[0],
- pass: auth[1]
- },
+ uri: triggerData.uri
}, function (error, response) {
logger.info(method, triggerIdentifier, 'http delete request, STATUS:', response ? response.statusCode : undefined);
if (error || response.statusCode >= 400) {
if (!error && response.statusCode === 409 && retryCount < 5) {
logger.info(method, 'attempting to delete trigger again', triggerIdentifier, 'Retry Count:', (retryCount + 1));
setTimeout(function () {
- self.deleteTrigger(dataTrigger, auth, (retryCount + 1))
+ self.deleteTrigger(triggerData, (retryCount + 1))
.then(info => {
resolve(info);
})
@@ -115,23 +105,19 @@
});
};
- this.deleteRule = function(rule, uri, auth, retryCount) {
+ this.deleteRule = function(triggerData, rule, uri, retryCount) {
var method = 'deleteRule';
- request({
+ utils.authRequest(triggerData, {
method: 'delete',
- uri: uri,
- auth: {
- user: auth[0],
- pass: auth[1]
- },
+ uri: uri
}, function(error, response) {
logger.info(method, rule, 'http delete rule request, STATUS:', response ? response.statusCode : undefined);
if (error || response.statusCode >= 400) {
if (!error && response.statusCode === 409 && retryCount < 5) {
logger.info(method, 'attempting to delete rule again', rule, 'Retry Count:', (retryCount + 1));
setTimeout(function () {
- self.deleteRule(rule, uri, auth, (retryCount + 1));
+ self.deleteRule(triggerData, rule, uri, (retryCount + 1));
}, 1000);
} else {
logger.error(method, rule, 'rule delete request failed');
@@ -147,7 +133,7 @@
var method = 'deleteTriggerFeed';
return new Promise(function(resolve, reject) {
- triggerDB.get(triggerID, function (err, existing) {
+ utils.db.get(triggerID, function (err, existing) {
if (!err) {
var updatedTrigger = existing;
var status = {
@@ -157,7 +143,7 @@
};
updatedTrigger.status = status;
- triggerDB.insert(updatedTrigger, triggerID, function (err) {
+ utils.db.insert(updatedTrigger, triggerID, function (err) {
if (err) {
reject(err);
}
diff --git a/provider/lib/utils.js b/provider/lib/utils.js
index 9aa7d95..e443d49 100644
--- a/provider/lib/utils.js
+++ b/provider/lib/utils.js
@@ -6,6 +6,7 @@
var CronAlarm = require('./cronAlarm.js');
var IntervalAlarm = require('./intervalAlarm.js');
var Sanitizer = require('./sanitizer');
+var authHandler = require('./authHandler');
module.exports = function(logger, triggerDB, redisClient) {
@@ -29,7 +30,7 @@
this.redisKey = redisKeyPrefix + '_' + this.worker;
this.redisField = constants.REDIS_FIELD;
this.uriHost ='https://' + this.routerHost;
- this.sanitizer = new Sanitizer(logger, triggerDB, this.uriHost);
+ this.sanitizer = new Sanitizer(logger, this);
this.monitorStatus = {};
function createTrigger(triggerIdentifier, newTrigger) {
@@ -63,45 +64,40 @@
return alarm.scheduleAlarm(triggerIdentifier, callback);
}
- function fireTrigger(dataTrigger) {
+ function fireTrigger(triggerData) {
var method = 'fireTrigger';
- var triggerIdentifier = dataTrigger.triggerID;
- var auth = dataTrigger.apikey.split(':');
+ var triggerIdentifier = triggerData.triggerID;
logger.info(method, 'Alarm fired for', triggerIdentifier, 'attempting to fire trigger');
- postTrigger(dataTrigger, auth, 0)
+ postTrigger(triggerData, 0)
.then(triggerId => {
logger.info(method, 'Trigger', triggerId, 'was successfully fired');
- handleFiredTrigger(dataTrigger);
+ handleFiredTrigger(triggerData);
})
.catch(err => {
logger.error(method, err);
- handleFiredTrigger(dataTrigger);
+ handleFiredTrigger(triggerData);
});
}
- function postTrigger(dataTrigger, auth, retryCount, throttleCount) {
+ function postTrigger(triggerData, retryCount, throttleCount) {
var method = 'postTrigger';
return new Promise(function(resolve, reject) {
// only manage trigger fires if they are not infinite
- if (dataTrigger.maxTriggers && dataTrigger.maxTriggers !== -1) {
- dataTrigger.triggersLeft--;
+ if (triggerData.maxTriggers && triggerData.maxTriggers !== -1) {
+ triggerData.triggersLeft--;
}
- request({
+ self.authRequest(triggerData, {
method: 'post',
- uri: dataTrigger.uri,
- auth: {
- user: auth[0],
- pass: auth[1]
- },
- json: dataTrigger.payload
+ uri: triggerData.uri,
+ json: triggerData.payload
}, function(error, response) {
try {
- var triggerIdentifier = dataTrigger.triggerID;
+ var triggerIdentifier = triggerData.triggerID;
logger.info(method, triggerIdentifier, 'http post request, STATUS:', response ? response.statusCode : undefined);
if (error || response.statusCode >= 400) {
@@ -109,8 +105,8 @@
var throttleCounter = throttleCount || 0;
// only manage trigger fires if they are not infinite
- if (dataTrigger.maxTriggers && dataTrigger.maxTriggers !== -1) {
- dataTrigger.triggersLeft++;
+ if (triggerData.maxTriggers && triggerData.maxTriggers !== -1) {
+ triggerData.triggersLeft++;
}
if (!error && shouldDisableTrigger(response.statusCode)) {
@@ -124,7 +120,7 @@
throttleCounter = response && response.statusCode === HttpStatus.TOO_MANY_REQUESTS ? throttleCounter + 1 : throttleCounter;
logger.info(method, 'attempting to fire trigger again', triggerIdentifier, 'Retry Count:', (retryCount + 1));
setTimeout(function () {
- postTrigger(dataTrigger, auth, (retryCount + 1), throttleCounter)
+ postTrigger(triggerData, (retryCount + 1), throttleCounter)
.then(triggerId => {
resolve(triggerId);
})
@@ -172,27 +168,27 @@
return monitor && self.monitorStatus.triggerName === triggerName;
}
- function handleFiredTrigger(dataTrigger) {
+ function handleFiredTrigger(triggerData) {
var method = 'handleFiredTrigger';
- if (isMonitoringTrigger(dataTrigger.monitor, dataTrigger.name)) {
+ if (isMonitoringTrigger(triggerData.monitor, triggerData.name)) {
self.monitorStatus.triggerFired = "success";
}
- var triggerIdentifier = dataTrigger.triggerID;
- if (dataTrigger.date) {
- if (dataTrigger.deleteAfterFire && dataTrigger.deleteAfterFire !== 'false') {
+ var triggerIdentifier = triggerData.triggerID;
+ if (triggerData.date) {
+ if (triggerData.deleteAfterFire && triggerData.deleteAfterFire !== 'false') {
//delete trigger feed from database
self.sanitizer.deleteTriggerFeed(triggerIdentifier);
//check if trigger and all associated rules should be deleted
- if (dataTrigger.deleteAfterFire === 'rules') {
- self.sanitizer.deleteTriggerAndRules(dataTrigger);
+ if (triggerData.deleteAfterFire === 'rules') {
+ self.sanitizer.deleteTriggerAndRules(triggerData);
}
else {
- var auth = dataTrigger.apikey.split(':');
- self.sanitizer.deleteTrigger(dataTrigger, auth, 0)
+ var auth = triggerData.apikey.split(':');
+ self.sanitizer.deleteTrigger(triggerData, 0)
.then(info => {
logger.info(method, triggerIdentifier, info);
})
@@ -206,18 +202,18 @@
logger.info(method, 'the fire once date has expired, disabled', triggerIdentifier);
}
}
- else if (dataTrigger.stopDate) {
+ else if (triggerData.stopDate) {
//check if the next scheduled trigger is after the stop date
- if (dataTrigger.cronHandle && dataTrigger.cronHandle.nextDate().isAfter(new Date(dataTrigger.stopDate))) {
+ if (triggerData.cronHandle && triggerData.cronHandle.nextDate().isAfter(new Date(triggerData.stopDate))) {
disableTrigger(triggerIdentifier, undefined, 'Automatically disabled after firing last scheduled cron trigger');
logger.info(method, 'last scheduled cron trigger before stop date, disabled', triggerIdentifier);
}
- else if (dataTrigger.minutes && (Date.now() + (dataTrigger.minutes * 1000 * 60) > new Date(dataTrigger.stopDate).getTime())) {
+ else if (triggerData.minutes && (Date.now() + (triggerData.minutes * 1000 * 60) > new Date(triggerData.stopDate).getTime())) {
disableTrigger(triggerIdentifier, undefined, 'Automatically disabled after firing last scheduled interval trigger');
logger.info(method, 'last scheduled interval trigger before stop date, disabled', triggerIdentifier);
}
}
- else if (dataTrigger.maxTriggers && dataTrigger.triggersLeft === 0) {
+ else if (triggerData.maxTriggers && triggerData.triggersLeft === 0) {
disableTrigger(triggerIdentifier, undefined, 'Automatically disabled after reaching max triggers');
logger.warn(method, 'no more triggers left, disabled', triggerIdentifier);
}
@@ -287,18 +283,13 @@
//check if trigger still exists in whisk db
var namespace = doc.namespace;
var name = doc.name;
- var apikey = doc.apikey;
var uri = self.uriHost + '/api/v1/namespaces/' + namespace + '/triggers/' + name;
- var auth = apikey.split(':');
logger.info(method, 'Checking if trigger', triggerIdentifier, 'still exists');
- request({
+ var cachedTrigger = self.triggers[triggerIdentifier] = {apikey: doc.apikey, additionalData: doc.additionalData};
+ self.authRequest(cachedTrigger, {
method: 'get',
- url: uri,
- auth: {
- user: auth[0],
- pass: auth[1]
- }
+ url: uri
}, function (error, response) {
//disable trigger in database if trigger is dead
if (!error && shouldDisableTrigger(response.statusCode)) {
@@ -308,8 +299,8 @@
}
else {
createTrigger(triggerIdentifier, doc)
- .then(cachedTrigger => {
- self.triggers[triggerIdentifier] = cachedTrigger;
+ .then(newTrigger => {
+ Object.assign(cachedTrigger, newTrigger);
logger.info(method, triggerIdentifier, 'created successfully');
if (cachedTrigger.intervalHandle && shouldFireTrigger(cachedTrigger)) {
try {
@@ -364,6 +355,7 @@
if ((!doc.status || doc.status.active === true) && (!doc.monitor || doc.monitor === self.host)) {
createTrigger(triggerIdentifier, doc)
.then(cachedTrigger => {
+ cachedTrigger.additionalData = doc.additionalData;
self.triggers[triggerIdentifier] = cachedTrigger;
logger.info(method, triggerIdentifier, 'created successfully');
@@ -505,4 +497,18 @@
}
}
+ this.authRequest = function(triggerData, options, cb) {
+ var method = 'authRequest';
+
+ authHandler.handleAuth(triggerData)
+ .then(auth => {
+ options.auth = auth;
+ request(options, cb);
+ })
+ .catch(err => {
+ logger.error(method, err);
+ request(options, cb);
+ });
+ };
+
};