Exemplo n.º 1
0
 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()
Exemplo n.º 2
0
Arquivo: gitfs.py Projeto: zyuhu/salt
 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()
Exemplo n.º 3
0
 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)
Exemplo n.º 4
0
 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()
Exemplo n.º 5
0
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
Exemplo n.º 6
0
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
Exemplo n.º 7
0
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