HealthCheckController.coffee 2.7 KB

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