HealthCheckController.coffee 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. Mocha = require "mocha"
  2. Base = require("mocha/lib/reporters/base")
  3. RedisWrapper = require("../../infrastructure/RedisWrapper")
  4. rclient = RedisWrapper.client("health_check")
  5. settings = require("settings-sharelatex")
  6. logger = require "logger-sharelatex"
  7. domain = require "domain"
  8. module.exports = HealthCheckController =
  9. check: (req, res, next = (error) ->) ->
  10. d = domain.create()
  11. d.on "error", (error) ->
  12. logger.err err: error, "error in mocha"
  13. d.run () ->
  14. mocha = new Mocha(reporter: Reporter(res), timeout: 10000)
  15. mocha.addFile("test/smoke/js/SmokeTests.js")
  16. mocha.run () ->
  17. # TODO: combine this with the smoke-test-sharelatex module
  18. # we need to clean up all references to the smokeTest module
  19. # so it can be garbage collected. The only reference should
  20. # be in its parent, when it is loaded by mocha.addFile.
  21. path = require.resolve(__dirname + "/../../../../test/smoke/js/SmokeTests.js")
  22. smokeTestModule = require.cache[path]
  23. if smokeTestModule?
  24. parent = smokeTestModule.parent
  25. while (idx = parent.children.indexOf(smokeTestModule)) != -1
  26. parent.children.splice(idx, 1)
  27. else
  28. logger.warn {path}, "smokeTestModule not defined"
  29. # remove the smokeTest from the module cache
  30. delete require.cache[path]
  31. checkRedis: (req, res, next)->
  32. rclient.healthCheck (error) ->
  33. if error?
  34. logger.err {err: error}, "failed redis health check"
  35. res.sendStatus 500
  36. else
  37. res.sendStatus 200
  38. Reporter = (res) ->
  39. (runner) ->
  40. Base.call(this, runner)
  41. tests = []
  42. passes = []
  43. failures = []
  44. runner.on 'test end', (test) -> tests.push(test)
  45. runner.on 'pass', (test) -> passes.push(test)
  46. runner.on 'fail', (test) -> failures.push(test)
  47. runner.on 'end', () =>
  48. clean = (test) ->
  49. title: test.fullTitle()
  50. duration: test.duration
  51. err: test.err
  52. timedOut: test.timedOut
  53. results = {
  54. stats: @stats
  55. failures: failures.map(clean)
  56. passes: passes.map(clean)
  57. }
  58. res.contentType("application/json")
  59. if failures.length > 0
  60. logger.err failures:failures, "health check failed"
  61. res.status(500).send(JSON.stringify(results, null, 2))
  62. else
  63. res.status(200).send(JSON.stringify(results, null, 2))