You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

183 rivejä
5.5 KiB

  1. # imports - standard imports
  2. import getpass
  3. import os
  4. import pathlib
  5. import re
  6. import subprocess
  7. import time
  8. import unittest
  9. # imports - module imports
  10. from bench.utils import exec_cmd, get_cmd_output, which
  11. from bench.config.production_setup import get_supervisor_confdir
  12. from bench.tests.test_base import TestBenchBase
  13. class TestSetupProduction(TestBenchBase):
  14. def test_setup_production(self):
  15. user = getpass.getuser()
  16. for bench_name in ("test-bench-1", "test-bench-2"):
  17. bench_path = os.path.join(os.path.abspath(self.benches_path), bench_name)
  18. self.init_bench(bench_name)
  19. exec_cmd(f"sudo bench setup production {user} --yes", cwd=bench_path)
  20. self.assert_nginx_config(bench_name)
  21. self.assert_supervisor_config(bench_name)
  22. self.assert_supervisor_process(bench_name)
  23. self.assert_nginx_process()
  24. exec_cmd(f"sudo bench setup sudoers {user}")
  25. self.assert_sudoers(user)
  26. for bench_name in self.benches:
  27. bench_path = os.path.join(os.path.abspath(self.benches_path), bench_name)
  28. exec_cmd("sudo bench disable-production", cwd=bench_path)
  29. def production(self):
  30. try:
  31. self.test_setup_production()
  32. except Exception:
  33. print(self.get_traceback())
  34. def assert_nginx_config(self, bench_name):
  35. conf_src = os.path.join(
  36. os.path.abspath(self.benches_path), bench_name, "config", "nginx.conf"
  37. )
  38. conf_dest = f"/etc/nginx/conf.d/{bench_name}.conf"
  39. self.assertTrue(self.file_exists(conf_src))
  40. self.assertTrue(self.file_exists(conf_dest))
  41. # symlink matches
  42. self.assertEqual(os.path.realpath(conf_dest), conf_src)
  43. # file content
  44. with open(conf_src) as f:
  45. f = f.read()
  46. for key in (
  47. f"upstream {bench_name}-xhiveframework",
  48. f"upstream {bench_name}-socketio-server",
  49. ):
  50. self.assertTrue(key in f)
  51. def assert_nginx_process(self):
  52. out = get_cmd_output("sudo nginx -t 2>&1")
  53. self.assertTrue(
  54. "nginx: configuration file /etc/nginx/nginx.conf test is successful" in out
  55. )
  56. def assert_sudoers(self, user):
  57. sudoers_file = "/etc/sudoers.d/xhiveframework"
  58. service = which("service")
  59. nginx = which("nginx")
  60. self.assertTrue(self.file_exists(sudoers_file))
  61. if os.environ.get("CI"):
  62. sudoers = subprocess.check_output(["sudo", "cat", sudoers_file]).decode("utf-8")
  63. else:
  64. sudoers = pathlib.Path(sudoers_file).read_text()
  65. self.assertTrue(f"{user} ALL = (root) NOPASSWD: {service} nginx *" in sudoers)
  66. self.assertTrue(f"{user} ALL = (root) NOPASSWD: {nginx}" in sudoers)
  67. def assert_supervisor_config(self, bench_name, use_rq=True):
  68. conf_src = os.path.join(
  69. os.path.abspath(self.benches_path), bench_name, "config", "supervisor.conf"
  70. )
  71. supervisor_conf_dir = get_supervisor_confdir()
  72. conf_dest = f"{supervisor_conf_dir}/{bench_name}.conf"
  73. self.assertTrue(self.file_exists(conf_src))
  74. self.assertTrue(self.file_exists(conf_dest))
  75. # symlink matches
  76. self.assertEqual(os.path.realpath(conf_dest), conf_src)
  77. # file content
  78. with open(conf_src) as f:
  79. f = f.read()
  80. tests = [
  81. f"program:{bench_name}-xhiveframework-web",
  82. f"program:{bench_name}-redis-cache",
  83. f"program:{bench_name}-redis-queue",
  84. f"group:{bench_name}-web",
  85. f"group:{bench_name}-workers",
  86. f"group:{bench_name}-redis",
  87. ]
  88. if not os.environ.get("CI"):
  89. tests.append(f"program:{bench_name}-node-socketio")
  90. if use_rq:
  91. tests.extend(
  92. [
  93. f"program:{bench_name}-xhiveframework-schedule",
  94. f"program:{bench_name}-xhiveframework-default-worker",
  95. f"program:{bench_name}-xhiveframework-short-worker",
  96. f"program:{bench_name}-xhiveframework-long-worker",
  97. ]
  98. )
  99. else:
  100. tests.extend(
  101. [
  102. f"program:{bench_name}-xhiveframework-workerbeat",
  103. f"program:{bench_name}-xhiveframework-worker",
  104. f"program:{bench_name}-xhiveframework-longjob-worker",
  105. f"program:{bench_name}-xhiveframework-async-worker",
  106. ]
  107. )
  108. for key in tests:
  109. self.assertTrue(key in f)
  110. def assert_supervisor_process(self, bench_name, use_rq=True, disable_production=False):
  111. out = get_cmd_output("supervisorctl status")
  112. while "STARTING" in out:
  113. print("Waiting for all processes to start...")
  114. time.sleep(10)
  115. out = get_cmd_output("supervisorctl status")
  116. tests = [
  117. r"{bench_name}-web:{bench_name}-xhiveframework-web[\s]+RUNNING",
  118. # Have commented for the time being. Needs to be uncommented later on. Bench is failing on travis because of this.
  119. # It works on one bench and fails on another.giving FATAL or BACKOFF (Exited too quickly (process log may have details))
  120. # "{bench_name}-web:{bench_name}-node-socketio[\s]+RUNNING",
  121. r"{bench_name}-redis:{bench_name}-redis-cache[\s]+RUNNING",
  122. r"{bench_name}-redis:{bench_name}-redis-queue[\s]+RUNNING",
  123. ]
  124. if use_rq:
  125. tests.extend(
  126. [
  127. r"{bench_name}-workers:{bench_name}-xhiveframework-schedule[\s]+RUNNING",
  128. r"{bench_name}-workers:{bench_name}-xhiveframework-default-worker-0[\s]+RUNNING",
  129. r"{bench_name}-workers:{bench_name}-xhiveframework-short-worker-0[\s]+RUNNING",
  130. r"{bench_name}-workers:{bench_name}-xhiveframework-long-worker-0[\s]+RUNNING",
  131. ]
  132. )
  133. else:
  134. tests.extend(
  135. [
  136. r"{bench_name}-workers:{bench_name}-xhiveframework-workerbeat[\s]+RUNNING",
  137. r"{bench_name}-workers:{bench_name}-xhiveframework-worker[\s]+RUNNING",
  138. r"{bench_name}-workers:{bench_name}-xhiveframework-longjob-worker[\s]+RUNNING",
  139. r"{bench_name}-workers:{bench_name}-xhiveframework-async-worker[\s]+RUNNING",
  140. ]
  141. )
  142. for key in tests:
  143. if disable_production:
  144. self.assertFalse(re.search(key, out))
  145. else:
  146. self.assertTrue(re.search(key, out))
  147. if __name__ == "__main__":
  148. unittest.main()