def tearDownClass(cls): if cls.nginx_proc is not None: log.info( "[%s] Stopping %s", cls.nginx_proc.log_prefix, cls.nginx_proc.__class__.__name__, ) terminate_process(cls.nginx_proc.pid, kill_children=True, slow_stop=True) log.info( "[%s] %s stopped", cls.nginx_proc.log_prefix, cls.nginx_proc.__class__.__name__, ) cls.nginx_proc = None if cls.uwsgi_proc is not None: log.info( "[%s] Stopping %s", cls.uwsgi_proc.log_prefix, cls.uwsgi_proc.__class__.__name__, ) terminate_process(cls.uwsgi_proc.pid, kill_children=True, slow_stop=True) log.info( "[%s] %s stopped", cls.uwsgi_proc.log_prefix, cls.uwsgi_proc.__class__.__name__, ) cls.uwsgi_proc = None shutil.rmtree(cls.root_dir, ignore_errors=True) cls.prep_states_ran = False super(WebserverMixin, cls).tearDownClass()
def tearDownClass(cls): if cls.sshd_proc is not None: log.info('[%s] Stopping %s', cls.sshd_proc.log_prefix, cls.sshd_proc.__class__.__name__) terminate_process(cls.sshd_proc.pid, kill_children=True, slow_stop=True) log.info('[%s] %s stopped', cls.sshd_proc.log_prefix, cls.sshd_proc.__class__.__name__) cls.sshd_proc = None if cls.prep_states_ran: ret = cls.cls_run_function('state.single', 'user.absent', name=cls.username, purge=True) try: if ret and 'minion' in ret: ret_data = next(six.itervalues(ret['minion'])) if not ret_data['result']: log.warning('Failed to delete test account %s', cls.username) except KeyError: log.warning('Failed to delete test account. Salt return:\n%s', pprint.pformat(ret)) shutil.rmtree(cls.sshd_config_dir, ignore_errors=True) ssh_dir = os.path.expanduser('~/.ssh') for filename in (cls.id_rsa_nopass, cls.id_rsa_nopass + '.pub', cls.id_rsa_withpass, cls.id_rsa_withpass + '.pub', cls.git_ssh): try: os.remove(os.path.join(ssh_dir, filename)) except OSError as exc: if exc.errno != errno.ENOENT: raise super(SSHDMixin, cls).tearDownClass()
def stop_daemon(): log.info('[%s] Stopping pytest %s(%s)', daemon_log_prefix, daemon_name, daemon_id) terminate_process(process.pid, kill_children=True, slow_stop=slow_stop) log.info('[%s] pytest %s(%s) stopped', daemon_log_prefix, daemon_name, daemon_id)
def tearDownClass(cls): if cls.sshd_proc is not None: log.info( "[%s] Stopping %s", cls.sshd_proc.log_prefix, cls.sshd_proc.__class__.__name__, ) terminate_process(cls.sshd_proc.pid, kill_children=True, slow_stop=True) log.info( "[%s] %s stopped", cls.sshd_proc.log_prefix, cls.sshd_proc.__class__.__name__, ) cls.sshd_proc = None if cls.prep_states_ran: ret = cls.cls_run_function("state.single", "user.absent", name=cls.username, purge=True) try: if ret and "minion" in ret: ret_data = next(six.itervalues(ret["minion"])) if not ret_data["result"]: log.warning("Failed to delete test account %s", cls.username) except KeyError: log.warning( "Failed to delete test account. Salt return:\n%s", pprint.pformat(ret), ) cls.prep_states_ran = False cls.known_hosts_setup = False shutil.rmtree(cls.sshd_config_dir, ignore_errors=True) ssh_dir = os.path.expanduser("~/.ssh") for filename in ( cls.id_rsa_nopass, cls.id_rsa_nopass + ".pub", cls.id_rsa_withpass, cls.id_rsa_withpass + ".pub", cls.git_ssh, ): try: os.remove(os.path.join(ssh_dir, filename)) except OSError as exc: if exc.errno != errno.ENOENT: raise super(SSHDMixin, cls).tearDownClass()
def start_daemon(daemon_name=None, daemon_id=None, daemon_log_prefix=None, daemon_cli_script_name=None, daemon_config=None, daemon_config_dir=None, daemon_class=None, bin_dir_path=None, fail_hard=False, start_timeout=10, slow_stop=False, environ=None, cwd=None): ''' Returns a running salt daemon ''' daemon_config['pytest_port'] = daemon_config['runtests_conn_check_port'] request = None if fail_hard: fail_method = RuntimeError else: fail_method = RuntimeWarning log.info('[%s] Starting pytest %s(%s)', daemon_name, daemon_log_prefix, daemon_id) attempts = 0 process = None while attempts <= 3: # pylint: disable=too-many-nested-blocks attempts += 1 process = daemon_class(request, daemon_config, daemon_config_dir, bin_dir_path, daemon_log_prefix, cli_script_name=daemon_cli_script_name, slow_stop=slow_stop, environ=environ, cwd=cwd) process.start() if process.is_alive(): try: connectable = process.wait_until_running(timeout=start_timeout) if connectable is False: connectable = process.wait_until_running( timeout=start_timeout / 2) if connectable is False: process.terminate() if attempts >= 3: fail_method( 'The pytest {0}({1}) has failed to confirm running status ' 'after {2} attempts'.format( daemon_name, daemon_id, attempts)) continue except Exception as exc: # pylint: disable=broad-except log.exception('[%s] %s', daemon_log_prefix, exc, exc_info=True) terminate_process(process.pid, kill_children=True, slow_stop=slow_stop) if attempts >= 3: raise fail_method(str(exc)) continue log.info( '[%s] The pytest %s(%s) is running and accepting commands ' 'after %d attempts', daemon_log_prefix, daemon_name, daemon_id, attempts) def stop_daemon(): log.info('[%s] Stopping pytest %s(%s)', daemon_log_prefix, daemon_name, daemon_id) terminate_process(process.pid, kill_children=True, slow_stop=slow_stop) log.info('[%s] pytest %s(%s) stopped', daemon_log_prefix, daemon_name, daemon_id) # request.addfinalizer(stop_daemon) break else: terminate_process(process.pid, kill_children=True, slow_stop=slow_stop) continue else: if process is not None: terminate_process(process.pid, kill_children=True, slow_stop=slow_stop) raise fail_method( 'The pytest {0}({1}) has failed to start after {2} attempts'. format(daemon_name, daemon_id, attempts - 1)) return process
def start_daemon( daemon_cli_script_name, daemon_config_dir, daemon_check_port, daemon_class, fail_hard=False, start_timeout=10, slow_stop=True, environ=None, cwd=None, max_attempts=3, **kwargs ): """ Returns a running process daemon """ log.info("[%s] Starting %s", daemon_class.log_prefix, daemon_class.__name__) attempts = 0 process = None while attempts <= max_attempts: # pylint: disable=too-many-nested-blocks attempts += 1 process = daemon_class( str(daemon_config_dir), daemon_check_port, cli_script_name=daemon_cli_script_name, slow_stop=slow_stop, environ=environ, cwd=cwd, **kwargs ) process.start() if process.is_alive(): try: connectable = process.wait_until_running(timeout=start_timeout) if connectable is False: connectable = process.wait_until_running(timeout=start_timeout / 2) if connectable is False: process.terminate() if attempts >= max_attempts: raise AssertionError( "The {} has failed to confirm running status " "after {} attempts".format( daemon_class.__name__, attempts ) ) continue except Exception as exc: # pylint: disable=broad-except log.exception("[%s] %s", daemon_class.log_prefix, exc, exc_info=True) terminate_process(process.pid, kill_children=True, slow_stop=slow_stop) if attempts >= max_attempts: raise AssertionError(str(exc)) continue # A little breathing before returning the process time.sleep(0.5) log.info( "[%s] The %s is running after %d attempts", daemon_class.log_prefix, daemon_class.__name__, attempts, ) break else: terminate_process(process.pid, kill_children=True, slow_stop=slow_stop) time.sleep(1) continue else: if process is not None: terminate_process(process.pid, kill_children=True, slow_stop=slow_stop) raise AssertionError( "The {} has failed to start after {} attempts".format( daemon_class.__name__, attempts - 1 ) ) return process
def start_daemon( daemon_name=None, daemon_id=None, daemon_log_prefix=None, daemon_cli_script_name=None, daemon_config=None, daemon_config_dir=None, daemon_class=None, bin_dir_path=None, fail_hard=False, start_timeout=10, slow_stop=False, environ=None, cwd=None, event_listener_config_dir=None, ): """ Returns a running salt daemon """ # Old config name daemon_config["pytest_port"] = daemon_config["runtests_conn_check_port"] # New config name daemon_config["pytest_engine_port"] = daemon_config[ "runtests_conn_check_port"] request = None if fail_hard: fail_method = RuntimeError else: fail_method = RuntimeWarning log.info("[%s] Starting pytest %s(%s)", daemon_name, daemon_log_prefix, daemon_id) attempts = 0 process = None while attempts <= 3: # pylint: disable=too-many-nested-blocks attempts += 1 try: process = daemon_class( request=request, config=daemon_config, config_dir=daemon_config_dir, bin_dir_path=bin_dir_path, log_prefix=daemon_log_prefix, cli_script_name=daemon_cli_script_name, slow_stop=slow_stop, environ=environ, cwd=cwd, event_listener_config_dir=event_listener_config_dir, ) except TypeError: process = daemon_class( request=request, config=daemon_config, config_dir=daemon_config_dir, bin_dir_path=bin_dir_path, log_prefix=daemon_log_prefix, cli_script_name=daemon_cli_script_name, slow_stop=slow_stop, environ=environ, cwd=cwd, ) process.start() if process.is_alive(): try: connectable = process.wait_until_running(timeout=start_timeout) if connectable is False: connectable = process.wait_until_running( timeout=start_timeout / 2) if connectable is False: process.terminate() if attempts >= 3: fail_method( "The pytest {0}({1}) has failed to confirm running status " "after {2} attempts".format( daemon_name, daemon_id, attempts)) continue except Exception as exc: # pylint: disable=broad-except log.exception("[%s] %s", daemon_log_prefix, exc, exc_info=True) terminate_process(process.pid, kill_children=True, slow_stop=slow_stop) if attempts >= 3: raise fail_method(str(exc)) continue log.info( "[%s] The pytest %s(%s) is running and accepting commands " "after %d attempts", daemon_log_prefix, daemon_name, daemon_id, attempts, ) break else: terminate_process(process.pid, kill_children=True, slow_stop=slow_stop) continue else: if process is not None: terminate_process(process.pid, kill_children=True, slow_stop=slow_stop) raise fail_method( "The pytest {0}({1}) has failed to start after {2} attempts". format(daemon_name, daemon_id, attempts - 1)) return process