|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- # imports - standard imports
- import getpass
- import os
- import pathlib
- import re
- import subprocess
- import time
- import unittest
-
- # imports - module imports
- from bench.utils import exec_cmd, get_cmd_output, which
- from bench.config.production_setup import get_supervisor_confdir
- from bench.tests.test_base import TestBenchBase
-
-
- class TestSetupProduction(TestBenchBase):
- def test_setup_production(self):
- user = getpass.getuser()
-
- for bench_name in ("test-bench-1", "test-bench-2"):
- bench_path = os.path.join(os.path.abspath(self.benches_path), bench_name)
- self.init_bench(bench_name)
- exec_cmd(f"sudo bench setup production {user} --yes", cwd=bench_path)
- self.assert_nginx_config(bench_name)
- self.assert_supervisor_config(bench_name)
- self.assert_supervisor_process(bench_name)
-
- self.assert_nginx_process()
- exec_cmd(f"sudo bench setup sudoers {user}")
- self.assert_sudoers(user)
-
- for bench_name in self.benches:
- bench_path = os.path.join(os.path.abspath(self.benches_path), bench_name)
- exec_cmd("sudo bench disable-production", cwd=bench_path)
-
- def production(self):
- try:
- self.test_setup_production()
- except Exception:
- print(self.get_traceback())
-
- def assert_nginx_config(self, bench_name):
- conf_src = os.path.join(
- os.path.abspath(self.benches_path), bench_name, "config", "nginx.conf"
- )
- conf_dest = f"/etc/nginx/conf.d/{bench_name}.conf"
-
- self.assertTrue(self.file_exists(conf_src))
- self.assertTrue(self.file_exists(conf_dest))
-
- # symlink matches
- self.assertEqual(os.path.realpath(conf_dest), conf_src)
-
- # file content
- with open(conf_src) as f:
- f = f.read()
-
- for key in (
- f"upstream {bench_name}-xhiveframework",
- f"upstream {bench_name}-socketio-server",
- ):
- self.assertTrue(key in f)
-
- def assert_nginx_process(self):
- out = get_cmd_output("sudo nginx -t 2>&1")
- self.assertTrue(
- "nginx: configuration file /etc/nginx/nginx.conf test is successful" in out
- )
-
- def assert_sudoers(self, user):
- sudoers_file = "/etc/sudoers.d/xhiveframework"
- service = which("service")
- nginx = which("nginx")
-
- self.assertTrue(self.file_exists(sudoers_file))
-
- if os.environ.get("CI"):
- sudoers = subprocess.check_output(["sudo", "cat", sudoers_file]).decode("utf-8")
- else:
- sudoers = pathlib.Path(sudoers_file).read_text()
- self.assertTrue(f"{user} ALL = (root) NOPASSWD: {service} nginx *" in sudoers)
- self.assertTrue(f"{user} ALL = (root) NOPASSWD: {nginx}" in sudoers)
-
- def assert_supervisor_config(self, bench_name, use_rq=True):
- conf_src = os.path.join(
- os.path.abspath(self.benches_path), bench_name, "config", "supervisor.conf"
- )
-
- supervisor_conf_dir = get_supervisor_confdir()
- conf_dest = f"{supervisor_conf_dir}/{bench_name}.conf"
-
- self.assertTrue(self.file_exists(conf_src))
- self.assertTrue(self.file_exists(conf_dest))
-
- # symlink matches
- self.assertEqual(os.path.realpath(conf_dest), conf_src)
-
- # file content
- with open(conf_src) as f:
- f = f.read()
-
- tests = [
- f"program:{bench_name}-xhiveframework-web",
- f"program:{bench_name}-redis-cache",
- f"program:{bench_name}-redis-queue",
- f"group:{bench_name}-web",
- f"group:{bench_name}-workers",
- f"group:{bench_name}-redis",
- ]
-
- if not os.environ.get("CI"):
- tests.append(f"program:{bench_name}-node-socketio")
-
- if use_rq:
- tests.extend(
- [
- f"program:{bench_name}-xhiveframework-schedule",
- f"program:{bench_name}-xhiveframework-default-worker",
- f"program:{bench_name}-xhiveframework-short-worker",
- f"program:{bench_name}-xhiveframework-long-worker",
- ]
- )
-
- else:
- tests.extend(
- [
- f"program:{bench_name}-xhiveframework-workerbeat",
- f"program:{bench_name}-xhiveframework-worker",
- f"program:{bench_name}-xhiveframework-longjob-worker",
- f"program:{bench_name}-xhiveframework-async-worker",
- ]
- )
-
- for key in tests:
- self.assertTrue(key in f)
-
- def assert_supervisor_process(self, bench_name, use_rq=True, disable_production=False):
- out = get_cmd_output("supervisorctl status")
-
- while "STARTING" in out:
- print("Waiting for all processes to start...")
- time.sleep(10)
- out = get_cmd_output("supervisorctl status")
-
- tests = [
- r"{bench_name}-web:{bench_name}-xhiveframework-web[\s]+RUNNING",
- # Have commented for the time being. Needs to be uncommented later on. Bench is failing on travis because of this.
- # It works on one bench and fails on another.giving FATAL or BACKOFF (Exited too quickly (process log may have details))
- # "{bench_name}-web:{bench_name}-node-socketio[\s]+RUNNING",
- r"{bench_name}-redis:{bench_name}-redis-cache[\s]+RUNNING",
- r"{bench_name}-redis:{bench_name}-redis-queue[\s]+RUNNING",
- ]
-
- if use_rq:
- tests.extend(
- [
- r"{bench_name}-workers:{bench_name}-xhiveframework-schedule[\s]+RUNNING",
- r"{bench_name}-workers:{bench_name}-xhiveframework-default-worker-0[\s]+RUNNING",
- r"{bench_name}-workers:{bench_name}-xhiveframework-short-worker-0[\s]+RUNNING",
- r"{bench_name}-workers:{bench_name}-xhiveframework-long-worker-0[\s]+RUNNING",
- ]
- )
-
- else:
- tests.extend(
- [
- r"{bench_name}-workers:{bench_name}-xhiveframework-workerbeat[\s]+RUNNING",
- r"{bench_name}-workers:{bench_name}-xhiveframework-worker[\s]+RUNNING",
- r"{bench_name}-workers:{bench_name}-xhiveframework-longjob-worker[\s]+RUNNING",
- r"{bench_name}-workers:{bench_name}-xhiveframework-async-worker[\s]+RUNNING",
- ]
- )
-
- for key in tests:
- if disable_production:
- self.assertFalse(re.search(key, out))
- else:
- self.assertTrue(re.search(key, out))
-
-
- if __name__ == "__main__":
- unittest.main()
|