2019-10-21 17:39:59 +02:00

96 lines
2.5 KiB
JavaScript

'use strict';
const BbPromise = require('bluebird');
const CloudWatchLogsSdk = require('aws-sdk/clients/cloudwatchlogs');
const logger = console;
const region = 'us-east-1';
const cloudWatchLogsSdk = new CloudWatchLogsSdk({ region });
const testServiceIdentifier = 'integ-test';
const serviceNameRegex = new RegExp(`${testServiceIdentifier}-d+`);
function getServiceName() {
const hrtime = process.hrtime();
return `${testServiceIdentifier}-${hrtime[1]}`;
}
function replaceEnv(values) {
const originals = {};
for (const key of Object.keys(values)) {
if (process.env[key]) {
originals[key] = process.env[key];
} else {
originals[key] = 'undefined';
}
if (values[key] === 'undefined') {
delete process.env[key];
} else {
process.env[key] = values[key];
}
}
return originals;
}
/**
* Cloudwatch logs when turned on, are usually take some time for being effective
* This function allows to confirm that new setting (turned on cloudwatch logs)
* is effective after stack deployment
*/
function confirmCloudWatchLogs(logGroupName, trigger, timeout = 60000) {
const startTime = Date.now();
return trigger()
.then(() => cloudWatchLogsSdk.filterLogEvents({ logGroupName }).promise())
.then(result => {
if (result.events.length) return result.events;
const duration = Date.now() - startTime;
if (duration > timeout) return [];
return confirmCloudWatchLogs(logGroupName, trigger, timeout - duration);
});
}
function persistentRequest(...args) {
const func = args[0];
const funcArgs = args.slice(1);
const MAX_TRIES = 5;
return new BbPromise((resolve, reject) => {
const doCall = numTry => {
return func.apply(this, funcArgs).then(resolve, e => {
if (
numTry < MAX_TRIES &&
((e.providerError && e.providerError.retryable) || e.statusCode === 429)
) {
logger.log(
[
`Recoverable error occurred (${e.message}), sleeping for 5 seconds.`,
`Try ${numTry + 1} of ${MAX_TRIES}`,
].join(' ')
);
setTimeout(doCall, 5000, numTry + 1);
} else {
reject(e);
}
});
};
return doCall(0);
});
}
function wait(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
module.exports = {
logger,
region,
confirmCloudWatchLogs,
testServiceIdentifier,
serviceNameRegex,
getServiceName,
replaceEnv,
persistentRequest,
wait,
};