delete dead triggers on init (#70)
diff --git a/provider/lib/utils.js b/provider/lib/utils.js
index c9f026d..bf758ab 100644
--- a/provider/lib/utils.js
+++ b/provider/lib/utils.js
@@ -214,23 +214,46 @@
logger.info(tid, that.module, method, 'Initializing all cloudant triggers from database.');
triggerDB.list({include_docs: true}, function(err, body) {
- if(!err) {
+ if (!err) {
body.rows.forEach(function(trigger) {
- var cloudantTrigger = that.initTrigger(trigger.doc, trigger.doc.id);
- if (cloudantTrigger.triggersLeft === -1) {
- logger.info(tid, method, 'found a trigger fire limit set to -1. setting it to fire infinitely many times');
- that.unlimitedTriggerFires = true;
- } else {
- that.unlimitedTriggerFires = false;
- }
+ //check if trigger still exists in whisk db
+ var triggerObj = that.parseQName(trigger.doc.id, ':');
+ var host = 'https://' + routerHost +':'+ 443;
+ var triggerURL = host + '/api/v1/namespaces/' + triggerObj.namespace + '/triggers/' + triggerObj.name;
+ var auth = trigger.doc.apikey.split(':');
- // check here for triggers left if none left end here, and don't create
- if (that.unlimitedTriggerFires || cloudantTrigger.triggersLeft > 0) {
- that.createTrigger(cloudantTrigger, that.retryCount);
- } else {
- logger.info(tid, method, 'found a trigger with no triggers left to fire off.');
- }
+ logger.info(tid, method, "Checking if trigger", trigger.doc.id, "still exists");
+ request({
+ method: 'get',
+ url: triggerURL,
+ auth: {
+ user: auth[0],
+ pass: auth[1]
+ }
+ }, function(error, response, body) {
+ //delete from database if trigger no longer exists (404)
+ if (!error && response.statusCode === 404) {
+ that.deleteTriggerFromDB(trigger.doc.id);
+ }
+ else {
+ var cloudantTrigger = that.initTrigger(trigger.doc, trigger.doc.id);
+
+ if (cloudantTrigger.triggersLeft === -1) {
+ logger.info(tid, method, 'found a trigger fire limit set to -1. setting it to fire infinitely many times');
+ that.unlimitedTriggerFires = true;
+ } else {
+ that.unlimitedTriggerFires = false;
+ }
+
+ // check here for triggers left if none left end here, and don't create
+ if (that.unlimitedTriggerFires || cloudantTrigger.triggersLeft > 0) {
+ that.createTrigger(cloudantTrigger, that.retryCount);
+ } else {
+ logger.info(tid, method, 'found a trigger with no triggers left to fire off.');
+ }
+ }
+ });
});
} else {
logger.error(tid, method, 'could not get latest state from database');
@@ -274,9 +297,9 @@
var method = 'deleteTriggerFromDB';
triggerDB.get(id, function(err, body) {
- if(!err) {
+ if (!err) {
triggerDB.destroy(body._id, body._rev, function(err, body) {
- if(err) {
+ if (err) {
logger.error(tid, method, 'there was an error while deleting', id, 'from database');
if (res) {
res.status(err.statusCode).json({ error: 'Cloudant data trigger ' + id + 'cannot be deleted.' } );
@@ -353,10 +376,10 @@
},
json: form
}, function(error, response, body) {
- if(dataTrigger) {
+ if (dataTrigger) {
logger.info(tid, method, 'done http request, STATUS', response ? response.statusCode : response);
logger.info(tid, method, 'done http request, body', body);
- if(error || response.statusCode >= 400) {
+ if (error || response.statusCode >= 400) {
dataTrigger.retriesLeft--;
// only manage trigger fires if they are not infinite
@@ -370,11 +393,11 @@
logger.info(tid, method, 'fired', id, 'with body', body, dataTrigger.triggersLeft, 'triggers left');
}
- if(dataTrigger.triggersLeft === 0 || dataTrigger.retriesLeft === 0) {
- if(dataTrigger.triggersLeft === 0) {
+ if (dataTrigger.triggersLeft === 0 || dataTrigger.retriesLeft === 0) {
+ if (dataTrigger.triggersLeft === 0) {
logger.info(tid, 'onTick', 'no more triggers left, deleting');
}
- if(dataTrigger.retriesLeft === 0) {
+ if (dataTrigger.retriesLeft === 0) {
logger.info(tid, 'onTick', 'too many retries, deleting');
}