function clientCheck(flightCheckOnStartUp, log, cb) {
    const clients = [
        data,
        metadata,
        vault,
        kms,
    ];
    const clientTasks = [];
    clients.forEach(client => {
        if (typeof client.checkHealth === 'function') {
            clientTasks.push(done => {
                client.checkHealth(log, done, flightCheckOnStartUp);
            });
        }
    });
    async.parallel(clientTasks, (err, results) => {
        let fail = false;
        // obj will be an object of the healthcheck results of
        // every backends. No errors were returned directly to
        // async.parallel in order to complete the check, so a
        // manual check makes S3 return 500 error if any backend failed
        // other than aws_s3 or azure
        const obj = results.reduce((obj, item) => Object.assign(obj, item), {});
        // fail only if *all* backend fail, so that we can still serve the ones which are working
        fail = Object.keys(obj).every(k =>
            // if there is an error from an external backend,
            // only return a 500 if it is on startup
            // (flightCheckOnStartUp set to true)
            obj[k].error && (flightCheckOnStartUp || !obj[k].external)
        );
        if (fail) {
            return cb(errors.InternalError, obj);
        }
        return cb(null, obj);
    });
}
Calls each client's healthcheck and translates responses to
InternalError message if appropriate
@param {boolean} flightCheckOnStartUp - whether client check is a flight
check on startup. If performing a flight check, behavior is:
 - return an error to halt start-up if there is any error in the client check
 - check all external backend locations
 - create a container for Azure location if one is missing
@param {object} log - werelogs logger instance
@param {function} cb - callback
@return {undefined}