diff --git a/lib/http-routes/api/cluster.js b/lib/http-routes/api/cluster.js new file mode 100644 index 00000000..cee1b23f --- /dev/null +++ b/lib/http-routes/api/cluster.js @@ -0,0 +1,24 @@ +const router = require('express').Router(); +const {srf} = require('../../..'); + +router.post('/drain', async(req, res) => { + const {logger} = req.app.locals; + const {setDryUpCalls} = srf.locals; + + logger.info('Received drain request via HTTP API'); + setDryUpCalls(); + + res.sendStatus(201); +}); + +router.post('/undrain', async(req, res) => { + const {logger} = req.app.locals; + const {clearDryUpCalls} = srf.locals; + + logger.info('Received undrain request via HTTP API'); + clearDryUpCalls(); + + res.sendStatus(201); +}); + +module.exports = router; diff --git a/lib/http-routes/api/index.js b/lib/http-routes/api/index.js index 8a4164d0..a38811ad 100644 --- a/lib/http-routes/api/index.js +++ b/lib/http-routes/api/index.js @@ -8,5 +8,6 @@ api.use('/enqueue', require('./enqueue')); api.use('/messaging', require('./messaging')); // inbound SMS api.use('/createMessage', require('./create-message')); // outbound SMS (REST) +api.use('/cluster', require('./cluster')); module.exports = api; diff --git a/lib/utils/install-srf-locals.js b/lib/utils/install-srf-locals.js index 80d2897c..71570c36 100644 --- a/lib/utils/install-srf-locals.js +++ b/lib/utils/install-srf-locals.js @@ -71,7 +71,7 @@ function installSrfLocals(srf, logger, { logger.debug('installing srf locals'); assert(!srf.locals.dbHelpers); const {tracer} = srf.locals.otel; - const {getSBC, lifecycleEmitter} = require('./sbc-pinger')(logger); + const {getSBC, lifecycleEmitter, setDryUpCalls, clearDryUpCalls} = require('./sbc-pinger')(logger); const StatsCollector = require('@jambonz/stats-collector'); const stats = srf.locals.stats = new StatsCollector(logger); @@ -285,6 +285,8 @@ function installSrfLocals(srf, logger, { }, parentLogger: logger, getSBC, + setDryUpCalls, + clearDryUpCalls, getSmpp: () => { return SMPP_URL; }, diff --git a/lib/utils/sbc-pinger.js b/lib/utils/sbc-pinger.js index 729dcb5c..599a3f1d 100644 --- a/lib/utils/sbc-pinger.js +++ b/lib/utils/sbc-pinger.js @@ -166,9 +166,23 @@ module.exports = (logger) => { }, 1000); } + const setDryUpCalls = () => { + logger.info('setting dryUpCalls flag'); + dryUpCalls = true; + }; + + const clearDryUpCalls = () => { + if (lifecycleEmitter.operationalState !== LifeCycleEvents.ScaleIn) { + logger.info('clearing dryUpCalls flag'); + dryUpCalls = false; + } + }; + return { lifecycleEmitter, - getSBC: () => sbcs[idxSbc++ % sbcs.length] + getSBC: () => sbcs[idxSbc++ % sbcs.length], + setDryUpCalls, + clearDryUpCalls, }; };