Exemple #1
0
def main(sysargs=None):
    # parsing the command line
    args, parser = _parse(sysargs)

    # loggers setting
    wslogger = logging.getLogger('ws4py')
    ch = logging.StreamHandler()
    ch.setLevel(logging.DEBUG)
    wslogger.addHandler(ch)
    set_logger()

    if args.version:
        print(__version__)
        sys.exit(0)

    if args.ping_broker or args.purge_broker or args.check_cluster:

        client = Client(args.broker)
        ping = client.ping()

        if args.purge_broker:
            runs = client.purge_broker()
            if len(runs) == 0:
                print('Nothing to purge.')
            else:
                print('We have %d run(s) right now:' % len(runs))
                print('Purged.')
            sys.exit(0)

        elif args.ping_broker:
            print('Broker running on pid %d' % ping['pid'])
            print('%d agents registered' % len(ping['agents']))
            print('endpoints:')
            for name, location in ping['endpoints'].items():
                print('  - %s: %s' % (name, location))

            runs = client.list_runs()
            if len(runs) == 0:
                print('Nothing is running right now.')
            else:
                print('We have %d run(s) right now:' % len(runs))
                for run_id, agents in runs.items():
                    print('  - %s with %d agent(s)' % (run_id, len(agents)))
            sys.exit(0)

        elif args.check_cluster:
            args.fqn = 'loads.examples.test_blog.TestWebSite.test_health'
            args.agents = len(ping['agents'])
            args.hits = '1'
            print('Running a healt check on all %d agents' % args.agents)

    # if we don't have an fqn or we're not attached, something's wrong
    if args.fqn is None and not args.attach:
        parser.print_usage()
        sys.exit(0)

    args = dict(args._get_kwargs())
    res = run(args)
    return res
Exemple #2
0
def main(sysargs=None):
    # parsing the command line
    args, parser = _parse(sysargs)

    # loggers setting
    wslogger = logging.getLogger('ws4py')
    ch = logging.StreamHandler()
    ch.setLevel(logging.DEBUG)
    wslogger.addHandler(ch)
    set_logger()

    if args.version:
        print(__version__)
        sys.exit(0)

    if args.ping_broker or args.purge_broker or args.check_cluster:

        client = Client(args.broker)
        ping = client.ping()

        if args.purge_broker:
            runs = client.purge_broker()
            if len(runs) == 0:
                print('Nothing to purge.')
            else:
                print('We have %d run(s) right now:' % len(runs))
                print('Purged.')
            sys.exit(0)

        elif args.ping_broker:
            print('Broker running on pid %d' % ping['pid'])
            print('%d agents registered' % len(ping['agents']))
            print('endpoints:')
            for name, location in ping['endpoints'].items():
                print('  - %s: %s' % (name, location))

            runs = client.list_runs()
            if len(runs) == 0:
                print('Nothing is running right now.')
            else:
                print('We have %d run(s) right now:' % len(runs))
                for run_id, agents in runs.items():
                    print('  - %s with %d agent(s)' % (run_id, len(agents)))
            sys.exit(0)

        elif args.check_cluster:
            args.fqn = 'loads.examples.test_blog.TestWebSite.test_health'
            args.agents = len(ping['agents'])
            args.hits = '1'
            print('Running a healt check on all %d agents' % args.agents)

    # if we don't have an fqn or we're not attached, something's wrong
    if args.fqn is None and not args.attach:
        parser.print_usage()
        sys.exit(0)

    args = dict(args._get_kwargs())
    res = run(args)
    return res
Exemple #3
0
def main(args=sys.argv):
    parser = argparse.ArgumentParser(description='Run an agent.')

    parser.add_argument('--broker', dest='broker',
                        default=DEFAULT_FRONTEND,
                        help="ZMQ socket to the broker.")

    parser.add_argument('--receiver', dest='receiver',
                        default=DEFAULT_AGENT_RECEIVER,
                        help="ZMQ socket to get results from workers.")

    parser.add_argument('--debug', action='store_true', default=False,
                        help="Debug mode")

    parser.add_argument('--logfile', dest='logfile', default='stdout',
                        help="File to log in to.")

    parser.add_argument('--params', dest='params', default=None,
                        help='The parameters to be used by the agent.')

    parser.add_argument('--timeout', dest='timeout', type=float,
                        default=DEFAULT_TIMEOUT_MOVF,
                        help=('The maximum time allowed before the thread '
                              'stacks is dump and the message result not sent '
                              'back.'))

    parser.add_argument('--max-age', dest='max_age', type=float,
                        default=DEFAULT_MAX_AGE,
                        help=('The maximum age for a worker in seconds. '
                              'After that delay, the worker will simply quit. '
                              'When set to -1, never quits.'))

    parser.add_argument('--max-age-delta', dest='max_age_delta', type=int,
                        default=DEFAULT_MAX_AGE_DELTA,
                        help='The maximum value in seconds added to max_age')

    args = parser.parse_args()
    set_logger(args.debug, logfile=args.logfile)
    sys.path.insert(0, os.getcwd())  # XXX

    if args.params is None:
        params = {}
    else:
        params = decode_params(args.params)

    logger.info('Connecting to %s' % args.broker)
    agent = Agent(broker=args.broker, receiver=args.receiver,
                  params=params, timeout=args.timeout, max_age=args.max_age,
                  max_age_delta=args.max_age_delta)

    try:
        agent.start()
    except KeyboardInterrupt:
        return 1
    finally:
        agent.stop()

    return 0
Exemple #4
0
def main(args=sys.argv):
    parser = argparse.ArgumentParser(description='Run an agent.')

    parser.add_argument('--broker', dest='broker',
                        default=DEFAULT_FRONTEND,
                        help="ZMQ socket to the broker.")

    parser.add_argument('--debug', action='store_true', default=False,
                        help="Debug mode")

    parser.add_argument('--logfile', dest='logfile', default='stdout',
                        help="File to log in to.")

    parser.add_argument('--params', dest='params', default=None,
                        help='The parameters to be used by the agent.')

    parser.add_argument('--timeout', dest='timeout', type=float,
                        default=DEFAULT_TIMEOUT_MOVF,
                        help=('The maximum time allowed before the thread '
                              'stacks is dump and the message result not sent '
                              'back.'))

    parser.add_argument('--max-age', dest='max_age', type=float,
                        default=DEFAULT_MAX_AGE,
                        help=('The maximum age for a worker in seconds. '
                              'After that delay, the worker will simply quit. '
                              'When set to -1, never quits.'))

    parser.add_argument('--max-age-delta', dest='max_age_delta', type=int,
                        default=DEFAULT_MAX_AGE_DELTA,
                        help='The maximum value in seconds added to max_age')

    args = parser.parse_args()
    set_logger(args.debug, logfile=args.logfile)
    sys.path.insert(0, os.getcwd())  # XXX

    if args.params is None:
        params = {}
    else:
        params = decode_params(args.params)

    logger.info('Connecting to %s' % args.broker)
    agent = Agent(broker=args.broker, params=params,
                  timeout=args.timeout, max_age=args.max_age,
                  max_age_delta=args.max_age_delta)

    try:
        agent.start()
    except KeyboardInterrupt:
        return 1
    finally:
        agent.stop()

    return 0
Exemple #5
0
def add_user():
    """Command-line utility to add a user to the auth files
    """
    set_logger()
    parser = argparse.ArgumentParser(description='Adds users')
    parser.add_argument('config', help='configuration file', nargs='?')
    parser.add_argument('--overwrite', help='overwrite existing user',
                        action='store_true', default=False)

    args = parser.parse_args()
    config = load_conf(args.config)

    username = raw_input('username: '******'password: '******'p' for PBKDF2
    hash = b64encode('p' + salt + h)

    # now adding the user
    conf_dir = config.get('auth_conf', 'auth_conf')

    with open(os.path.join(conf_dir, 'users.json')) as f:
        users = json.loads(f.read())

    with open(os.path.join(conf_dir, 'roles.json')) as f:
        roles = json.loads(f.read())

    if username in users and not args.overwrite:
        print('User %r exists. Use --overwrite' % username)
        sys.exit(0)

    users[username] = {'email_addr': '', 'role': 'user', 'hash': hash,
                       'desc': ''}

    with open(os.path.join(conf_dir, 'users.json'), 'w') as f:
        f.write(json.dumps(users))

    if username not in roles['user']:
        roles['user'].append(username)
        with open(os.path.join(conf_dir, 'roles.json'), 'w') as f:
            f.write(json.dumps(roles))

    print('User %r added.' % username)
    sys.exit(1)
Exemple #6
0
    def __init__(self, args):
        self.args = args
        self.fqn = args.get('fqn')
        self.test = None
        self.slave = args.get('slave', False)
        if self.slave:
            set_logger(True, logfile=args.get('logfile', DEFAULT_LOGFILE))

        self.run_id = None
        self.project_name = args.get('project_name', 'N/A')
        self._test_result = None
        self.outputs = []
        self.stop = False

        (self.total, self.hits, self.duration, self.users,
         self.agents) = _compute_arguments(args)

        self.args['hits'] = self.hits
        self.args['users'] = self.users
        self.args['agents'] = self.agents
        self.args['total'] = self.total
Exemple #7
0
    def __init__(self, args):
        self.args = args
        self.fqn = args.get('fqn')
        self.test = None
        self.slave = args.get('slave', False)
        if self.slave:
            set_logger(True, logfile=args.get('logfile', DEFAULT_LOGFILE))

        self.run_id = None
        self.project_name = args.get('project_name', 'N/A')
        self._test_result = None
        self.outputs = []
        self.stop = False

        (self.total, self.hits,
         self.duration, self.users, self.agents) = _compute_arguments(args)

        self.args['hits'] = self.hits
        self.args['users'] = self.users
        self.args['agents'] = self.agents
        self.args['total'] = self.total
Exemple #8
0
    def test_set_logger(self):
        before = len(logger.handlers)
        set_logger()
        self.assertTrue(len(logger.handlers), before + 1)

        fd, logfile = mkstemp()
        os.close(fd)
        set_logger(debug=True)
        set_logger(logfile=logfile)
        os.remove(logfile)
Exemple #9
0
    def test_set_logger(self):
        before = len(logger.handlers)
        set_logger()
        self.assertTrue(len(logger.handlers), before + 1)

        fd, logfile = mkstemp()
        os.close(fd)
        set_logger(debug=True)
        set_logger(logfile=logfile)
        os.remove(logfile)
Exemple #10
0
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this file,
# You can obtain one at http://mozilla.org/MPL/2.0/.
import time
import sys

from loads.util import logger, set_logger
from loads.case import TestCase

set_logger(True, logfile='stdout')


def _p(msg):
    sys.stdout.write(msg + '\n')
    logger.debug(msg)
    sys.stdout.flush()


def fail(job):
    _p('Starting loads.tests.jobs.fail')
    try:
        raise ValueError(job.data)
    finally:
        _p('Ending loads.tests.jobs.fail')


def timeout(job):
    _p('Starting loads.tests.jobs.timeout')
    time.sleep(2.)
    try:
        return job.data
Exemple #11
0
def main(args=sys.argv):
    parser = argparse.ArgumentParser(description='Loads broker.')

    parser.add_argument('--frontend', dest='frontend',
                        default=DEFAULT_FRONTEND,
                        help="ZMQ socket to receive jobs.")

    parser.add_argument('--backend', dest='backend',
                        default=DEFAULT_BACKEND,
                        help="ZMQ socket for agents.")

    parser.add_argument('--heartbeat', dest='heartbeat',
                        default=None,
                        help="ZMQ socket for the heartbeat.")

    parser.add_argument('--register', dest='register',
                        default=DEFAULT_REG,
                        help="ZMQ socket for the registration.")

    parser.add_argument('--receiver', dest='receiver',
                        default=DEFAULT_BROKER_RECEIVER,
                        help="ZMQ socket to receive events from the runners")

    parser.add_argument('--publisher', dest='publisher',
                        default=DEFAULT_PUBLISHER,
                        help="ZMQ socket for the registration.")

    parser.add_argument('--io-threads', type=int,
                        default=DEFAULT_IOTHREADS,
                        help="Number of I/O threads")

    parser.add_argument('--debug', action='store_true', default=False,
                        help="Debug mode")

    parser.add_argument('--check', action='store_true', default=False,
                        help=("Use this option to check if there's a running "
                              " broker. Returns the PID if a broker is up."))

    parser.add_argument('--logfile', dest='logfile', default='stdout',
                        help="File to log in to.")

    parser.add_argument('--db', dest='db', default='python',
                        help="Database backend.")

    # add db args
    for backend, options in get_backends():
        for option, default, help, type_ in options:
            option = 'db_%s_%s' % (backend, option)
            kargs = {'dest': option, 'default': default}

            if type_ is bool:
                kargs['action'] = 'store_true'
            else:
                kargs['type'] = type_

            option = option.replace('_', '-')
            parser.add_argument('--%s' % option, **kargs)

    args = parser.parse_args()
    set_logger(args.debug, logfile=args.logfile)

    if args.check:
        pid = verify_broker(args.frontend)
        if pid is None:
            logger.info('There seem to be no broker on this endpoint')
        else:
            logger.info('A broker is running. PID: %s' % pid)
        return 0

    # grabbing the db options
    dboptions = {}
    prefix = 'db_%s_' % args.db

    for key, value in args._get_kwargs():

        if not key.startswith(prefix):
            continue
        dboptions[key[len(prefix):]] = value

    logger.info('Starting the broker')
    try:
        broker = Broker(frontend=args.frontend, backend=args.backend,
                        heartbeat=args.heartbeat, register=args.register,
                        receiver=args.receiver, publisher=args.publisher,
                        io_threads=args.io_threads, db=args.db,
                        dboptions=dboptions)
    except DuplicateBrokerError, e:
        logger.info('There is already a broker running on PID %s' % e)
        logger.info('Exiting')
        return 1
Exemple #12
0
def main(sysargs=None):
    if sysargs is None:
        sysargs = sys.argv[1:]

    parser = argparse.ArgumentParser(description='Runs a load test.')
    parser.add_argument('fqn',
                        help='Fully Qualified Name of the test',
                        nargs='?')

    parser.add_argument('--config',
                        help='Configuration file to read',
                        type=str,
                        default=None)

    parser.add_argument('-u',
                        '--users',
                        help='Number of virtual users',
                        type=str,
                        default='1')

    parser.add_argument('--test-dir',
                        help='Directory to run the test from',
                        type=str,
                        default=None)

    parser.add_argument('--python-dep',
                        help='Python (PyPI) dependencies '
                        'to install',
                        action='append',
                        default=[])

    parser.add_argument('--include-file',
                        help='File(s) to include (needed for the test) '
                        '- glob-style',
                        action='append',
                        default=[])

    # loads works with hits or duration
    group = parser.add_mutually_exclusive_group()
    group.add_argument('--hits',
                       help='Number of hits per user',
                       type=str,
                       default=None)
    group.add_argument('-d',
                       '--duration',
                       help='Duration of the test (s)',
                       type=int,
                       default=None)

    parser.add_argument('--version',
                        action='store_true',
                        default=False,
                        help='Displays Loads version and exits.')

    parser.add_argument('--test-runner',
                        default=None,
                        help='The path to binary to use as the test runner '
                        'when in distributed mode. The default is '
                        'this (python) runner')

    parser.add_argument('--server-url',
                        default=None,
                        help='The URL of the server you want to test. It '
                        'will override any value your provided in '
                        'the tests for the WebTest client.')

    parser.add_argument('--observer',
                        action='append',
                        help='Callable that will receive the final results. '
                        'Only in distributed mode (runs on the broker)')

    parser.add_argument('--no-patching',
                        help='Deactivate Gevent monkey patching.',
                        action='store_true',
                        default=False)

    #
    # distributed options
    #
    parser.add_argument('-a',
                        '--agents',
                        help='Number of agents to use.',
                        type=int)

    parser.add_argument('--zmq-receiver',
                        default=None,
                        help=('ZMQ socket where the runners send the events to'
                              ' (opened on the agent side).'))

    parser.add_argument('--zmq-publisher',
                        default=DEFAULT_PUBLISHER,
                        help='ZMQ socket where the test results messages '
                        'are published.')

    parser.add_argument('--ping-broker',
                        action='store_true',
                        default=False,
                        help='Pings the broker to get info, display it and '
                        'exits.')

    parser.add_argument('--check-cluster',
                        action='store_true',
                        default=False,
                        help='Runs a test on all agents then exits.')

    parser.add_argument('--purge-broker',
                        action='store_true',
                        default=False,
                        help='Stops all runs on the broker and exits.')

    parser.add_argument('-b',
                        '--broker',
                        help='Broker endpoint',
                        default=DEFAULT_FRONTEND)

    outputs = [st.name for st in output_list()]
    outputs.sort()

    parser.add_argument('--quiet',
                        action='store_true',
                        default=False,
                        help='Do not print any log messages.')
    parser.add_argument('--output',
                        action='append',
                        default=['stdout'],
                        help='The output which will get the results',
                        choices=outputs)

    parser.add_argument('--attach',
                        help='Reattach to a distributed run',
                        action='store_true',
                        default=False)

    parser.add_argument('--detach',
                        help='Detach immediatly the current '
                        'distributed run',
                        action='store_true',
                        default=False)

    # Adds the per-output and per-runner options.
    add_options(RUNNERS, parser, fmt='--{name}-{option}')
    add_options(output_list(), parser, fmt='--output-{name}-{option}')

    args = parser.parse_args(sysargs)

    if args.config is not None:
        # second pass !
        config = Config(args.config)
        config_args = config.scan_args(parser, strip_prefixes=['loads'])
        if 'fqn' in config['loads']:
            config_args += [config['loads']['fqn']]
        args = parser.parse_args(args=sysargs + config_args)

    if args.quiet and 'stdout' in args.output:
        args.output.remove('stdout')

    # loggers setting
    wslogger = logging.getLogger('ws4py')
    ch = logging.StreamHandler()
    ch.setLevel(logging.DEBUG)
    wslogger.addHandler(ch)
    set_logger()

    if args.version:
        print(__version__)
        sys.exit(0)

    if args.ping_broker:
        client = Client(args.broker)
        res = client.ping()
        print('Broker running on pid %d' % res['pid'])
        print('%d agents registered' % len(res['agents']))
        print('endpoints:')
        for name, location in res['endpoints'].items():
            print('  - %s: %s' % (name, location))

        runs = client.list_runs()
        if len(runs) == 0:
            print('Nothing is running right now.')
        else:
            print('We have %d run(s) right now:' % len(runs))
            for run_id, agents in runs.items():
                print('  - %s with %d agent(s)' % (run_id, len(agents)))
        sys.exit(0)

    if args.purge_broker:
        client = Client(args.broker)
        runs = client.list_runs()
        if len(runs) == 0:
            print('Nothing to purge.')
        else:
            print('We have %d run(s) right now:' % len(runs))

            for run_id, workers in runs.items():
                print('Purging %s...' % run_id)
                client.stop_run(run_id)

            print('Purged.')

        sys.exit(0)

    if args.check_cluster:
        args.fqn = 'loads.examples.test_blog.TestWebSite.test_health'
        client = Client(args.broker)
        res = client.ping()
        args.agents = len(res['agents'])
        args.hits = '1'
        print('Running a healt check on all %d agents' % args.agents)

    if args.fqn is None and not args.attach:
        parser.print_usage()
        sys.exit(0)

    args = dict(args._get_kwargs())
    res = run(args)
    return res
Exemple #13
0
def main(sysargs=None):
    # parsing the command line
    args, parser = _parse(sysargs)

    # loggers setting
    wslogger = logging.getLogger('ws4py')
    ch = logging.StreamHandler()
    ch.setLevel(logging.DEBUG)
    wslogger.addHandler(ch)
    set_logger()

    if args.version:
        print(__version__)
        sys.exit(0)

    if args.ssh:
        if args.broker == DEFAULT_FRONTEND:
            args.broker = DEFAULT_SSH_FRONTEND

        # control that we have pexpect
        try:
            import pexpect  # NOQA
        except ImportError:
            print("To use --ssh you need pexpect")
            print("Try: pip install pexpect")
            sys.exit(0)

    if args.ping_broker or args.purge_broker or args.check_cluster:

        client = Client(args.broker, ssh=args.ssh)
        ping = client.ping()

        if args.purge_broker:
            runs = client.purge_broker()
            if len(runs) == 0:
                print('Nothing to purge.')
            else:
                print('We have %d run(s) right now:' % len(runs))
                print('Purged.')
            sys.exit(0)

        elif args.ping_broker:
            print('Broker running on pid %d' % ping['pid'])

            agents = ping['agents']
            print('%d agents registered' % len(agents))
            agents = agents.items()
            agents.sort()
            for agent_id, agent_info in agents:
                print('  - %s on %s' %
                      (agent_info['pid'], agent_info['hostname']))

            print('endpoints:')
            endpoints = ping['endpoints'].items()
            endpoints.sort()
            for name, location in endpoints:
                print('  - %s: %s' % (name, location))

            runs = client.list_runs()
            if len(runs) == 0:
                print('Nothing is running right now.')
            else:
                print('We have %d run(s) right now:' % len(runs))
                for run_id, agents in runs.items():
                    print('  - %s with %d agent(s)' % (run_id, len(agents)))
            sys.exit(0)

        elif args.check_cluster:
            total_agents = len(ping['agents'])
            if total_agents == 0:
                print('No agents currently registered.')
                sys.exit(0)

            runs = client.list_runs().items()
            busy_agents = sum([len(agents) for run_id, agents in runs])
            avail = total_agents - busy_agents
            if avail == 0:
                # no agents are available.
                print('All agents are busy.')
                sys.exit(0)

            args.fqn = 'loads.examples.test_blog.TestWebSite.test_health'
            args.agents = avail
            args.hits = '1'
            print('Running a health check on all %d agents' % args.agents)

    # if we don't have an fqn or we're not attached, something's wrong
    if args.fqn is None and not args.attach:
        parser.print_usage()
        sys.exit(0)

    args = dict(args._get_kwargs())
    res = run(args)
    return res
Exemple #14
0
def main(args=sys.argv):

    parser = argparse.ArgumentParser(description='Run some watchers.')

    parser.add_argument('--backend', dest='backend',
                        default=DEFAULT_BACKEND,
                        help="ZMQ socket to the broker.")

    parser.add_argument('--register', dest='register',
                        default=DEFAULT_REG,
                        help="ZMQ socket for the registration.")

    parser.add_argument('target', help="Fully qualified name of the callable.")

    parser.add_argument('--debug', action='store_true', default=False,
                        help="Debug mode")

    parser.add_argument('--logfile', dest='logfile', default='stdout',
                        help="File to log in to.")

    parser.add_argument('--heartbeat', dest='heartbeat',
                        default=DEFAULT_HEARTBEAT,
                        help="ZMQ socket for the heartbeat.")

    parser.add_argument('--params', dest='params', default=None,
                        help='The parameters to be used in the worker.')

    parser.add_argument('--timeout', dest='timeout', type=float,
                        default=DEFAULT_TIMEOUT_MOVF,
                        help=('The maximum time allowed before the thread '
                              'stacks is dump and the message result not sent '
                              'back.'))

    parser.add_argument('--max-age', dest='max_age', type=float,
                        default=DEFAULT_MAX_AGE,
                        help=('The maximum age for a worker in seconds. '
                              'After that delay, the worker will simply quit. '
                              'When set to -1, never quits.'))

    parser.add_argument('--max-age-delta', dest='max_age_delta', type=int,
                        default=DEFAULT_MAX_AGE_DELTA,
                        help='The maximum value in seconds added to max_age')

    args = parser.parse_args()
    set_logger(args.debug, logfile=args.logfile)
    sys.path.insert(0, os.getcwd())  # XXX
    target = resolve_name(args.target)
    if args.params is None:
        params = {}
    else:
        params = decode_params(args.params)

    logger.info('Worker registers at %s' % args.backend)
    logger.info('The heartbeat socket is at %r' % args.heartbeat)
    worker = Worker(target, backend=args.backend, heartbeat=args.heartbeat,
                    register=args.register,
                    params=params, timeout=args.timeout, max_age=args.max_age,
                    max_age_delta=args.max_age_delta)

    try:
        worker.start()
    except KeyboardInterrupt:
        return 1
    finally:
        worker.stop()

    return 0
Exemple #15
0
def main(sysargs=None):
    # parsing the command line
    args, parser = _parse(sysargs)

    # loggers setting
    wslogger = logging.getLogger('ws4py')
    ch = logging.StreamHandler()
    ch.setLevel(logging.DEBUG)
    wslogger.addHandler(ch)
    set_logger()

    if args.version:
        print(__version__)
        sys.exit(0)

    if args.ssh:
        if args.broker == DEFAULT_FRONTEND:
            args.broker = DEFAULT_SSH_FRONTEND

        # control that we have pexpect
        try:
            import pexpect    # NOQA
        except ImportError:
            print("To use --ssh you need pexpect")
            print("Try: pip install pexpect")
            sys.exit(0)

    if args.ping_broker or args.purge_broker or args.check_cluster:

        client = Client(args.broker, ssh=args.ssh)
        ping = client.ping()

        if args.purge_broker:
            runs = client.purge_broker()
            if len(runs) == 0:
                print('Nothing to purge.')
            else:
                print('We have %d run(s) right now:' % len(runs))
                print('Purged.')
            sys.exit(0)

        elif args.ping_broker:
            print('Broker running on pid %d' % ping['pid'])

            agents = ping['agents']
            print('%d agents registered' % len(agents))
            agents = agents.items()
            agents.sort()
            for agent_id, agent_info in agents:
                print('  - %s on %s' % (agent_info['pid'],
                                        agent_info['hostname']))

            print('endpoints:')
            endpoints = ping['endpoints'].items()
            endpoints.sort()
            for name, location in endpoints:
                print('  - %s: %s' % (name, location))

            runs = client.list_runs()
            if len(runs) == 0:
                print('Nothing is running right now.')
            else:
                print('We have %d run(s) right now:' % len(runs))
                for run_id, agents in runs.items():
                    print('  - %s with %d agent(s)' % (run_id, len(agents)))
            sys.exit(0)

        elif args.check_cluster:
            total_agents = len(ping['agents'])
            if total_agents == 0:
                print('No agents currently registered.')
                sys.exit(0)

            runs = client.list_runs().items()
            busy_agents = sum([len(agents) for run_id, agents in runs])
            avail = total_agents - busy_agents
            if avail == 0:
                # no agents are available.
                print('All agents are busy.')
                sys.exit(0)

            args.fqn = 'loads.examples.test_blog.TestWebSite.test_health'
            args.agents = avail
            args.hits = '1'
            print('Running a health check on all %d agents' % args.agents)

    # if we don't have an fqn or we're not attached, something's wrong
    if args.fqn is None and not args.attach:
        parser.print_usage()
        sys.exit(0)

    args = dict(args._get_kwargs())
    res = run(args)
    return res
Exemple #16
0
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this file,
# You can obtain one at http://mozilla.org/MPL/2.0/.
import time
import sys

from loads.util import logger, set_logger
from loads.case import TestCase


set_logger(True, logfile='stdout')


def _p(msg):
    sys.stdout.write(msg + '\n')
    logger.debug(msg)
    sys.stdout.flush()


def fail(job):
    _p('Starting loads.tests.jobs.fail')
    try:
        raise ValueError(job.data)
    finally:
        _p('Ending loads.tests.jobs.fail')


def timeout(job):
    _p('Starting loads.tests.jobs.timeout')
    time.sleep(2.)
    try:
Exemple #17
0
def main(sysargs=None):
    if sysargs is None:
        sysargs = sys.argv[1:]

    parser = argparse.ArgumentParser(description='Runs a load test.')
    parser.add_argument('fqn', help='Fully Qualified Name of the test',
                        nargs='?')

    parser.add_argument('--config', help='Configuration file to read',
                        type=str, default=None)

    parser.add_argument('-u', '--users', help='Number of virtual users',
                        type=str, default='1')

    parser.add_argument('--test-dir', help='Directory to run the test from',
                        type=str, default=None)

    parser.add_argument('--python-dep', help='Python (PyPI) dependencies '
                                             'to install',
                        action='append', default=[])

    parser.add_argument('--include-file',
                        help='File(s) to include (needed for the test) '
                             '- glob-style',
                        action='append', default=[])

    # loads works with hits or duration
    group = parser.add_mutually_exclusive_group()
    group.add_argument('--hits', help='Number of hits per user',
                       type=str, default=None)
    group.add_argument('-d', '--duration', help='Duration of the test (s)',
                       type=int, default=None)

    parser.add_argument('--version', action='store_true', default=False,
                        help='Displays Loads version and exits.')

    parser.add_argument('--test-runner', default=None,
                        help='The path to binary to use as the test runner '
                             'when in distributed mode. The default is '
                             'this (python) runner')

    parser.add_argument('--server-url', default=None,
                        help='The URL of the server you want to test. It '
                             'will override any value your provided in '
                             'the tests for the WebTest client.')

    parser.add_argument('--observer', action='append',
                        help='Callable that will receive the final results. '
                             'Only in distributed mode (runs on the broker)')

    parser.add_argument('--no-patching',
                        help='Deactivate Gevent monkey patching.',
                        action='store_true', default=False)

    #
    # distributed options
    #
    parser.add_argument('-a', '--agents', help='Number of agents to use.',
                        type=int)

    parser.add_argument('--zmq-receiver', default=None,
                        help=('ZMQ socket where the runners send the events to'
                              ' (opened on the agent side).'))

    parser.add_argument('--zmq-publisher', default=DEFAULT_PUBLISHER,
                        help='ZMQ socket where the test results messages '
                             'are published.')

    parser.add_argument('--ping-broker', action='store_true', default=False,
                        help='Pings the broker to get info, display it and '
                             'exits.')

    parser.add_argument('--check-cluster', action='store_true', default=False,
                        help='Runs a test on all agents then exits.')

    parser.add_argument('--purge-broker', action='store_true', default=False,
                        help='Stops all runs on the broker and exits.')

    parser.add_argument('-b', '--broker', help='Broker endpoint',
                        default=DEFAULT_FRONTEND)

    outputs = [st.name for st in output_list()]
    outputs.sort()

    parser.add_argument('--quiet', action='store_true', default=False,
                        help='Do not print any log messages.')
    parser.add_argument('--output', action='append', default=['stdout'],
                        help='The output which will get the results',
                        choices=outputs)

    parser.add_argument('--attach', help='Reattach to a distributed run',
                        action='store_true', default=False)

    parser.add_argument('--detach', help='Detach immediatly the current '
                                         'distributed run',
                        action='store_true', default=False)

    # Adds the per-output and per-runner options.
    add_options(RUNNERS, parser, fmt='--{name}-{option}')
    add_options(output_list(), parser, fmt='--output-{name}-{option}')

    args = parser.parse_args(sysargs)

    if args.config is not None:
        # second pass !
        config = Config(args.config)
        config_args = config.scan_args(parser, strip_prefixes=['loads'])
        if 'fqn' in config['loads']:
            config_args += [config['loads']['fqn']]
        args = parser.parse_args(args=sysargs + config_args)

    if args.quiet and 'stdout' in args.output:
        args.output.remove('stdout')

    # loggers setting
    wslogger = logging.getLogger('ws4py')
    ch = logging.StreamHandler()
    ch.setLevel(logging.DEBUG)
    wslogger.addHandler(ch)
    set_logger()

    if args.version:
        print(__version__)
        sys.exit(0)

    if args.ping_broker:
        client = Client(args.broker)
        res = client.ping()
        print('Broker running on pid %d' % res['pid'])
        print('%d agents registered' % len(res['agents']))
        print('endpoints:')
        for name, location in res['endpoints'].items():
            print('  - %s: %s' % (name, location))

        runs = client.list_runs()
        if len(runs) == 0:
            print('Nothing is running right now.')
        else:
            print('We have %d run(s) right now:' % len(runs))
            for run_id, agents in runs.items():
                print('  - %s with %d agent(s)' % (run_id, len(agents)))
        sys.exit(0)

    if args.purge_broker:
        client = Client(args.broker)
        runs = client.list_runs()
        if len(runs) == 0:
            print('Nothing to purge.')
        else:
            print('We have %d run(s) right now:' % len(runs))

            for run_id, workers in runs.items():
                print('Purging %s...' % run_id)
                client.stop_run(run_id)

            print('Purged.')

        sys.exit(0)

    if args.check_cluster:
        args.fqn = 'loads.examples.test_blog.TestWebSite.test_health'
        client = Client(args.broker)
        res = client.ping()
        args.agents = len(res['agents'])
        args.hits = '1'
        print('Running a healt check on all %d agents' % args.agents)

    if args.fqn is None and not args.attach:
        parser.print_usage()
        sys.exit(0)

    args = dict(args._get_kwargs())
    res = run(args)
    return res
Exemple #18
0
def main(args=sys.argv):
    parser = argparse.ArgumentParser(description='Loads broker.')

    parser.add_argument('--frontend',
                        dest='frontend',
                        default=DEFAULT_FRONTEND,
                        help="ZMQ socket to receive jobs.")

    parser.add_argument('--backend',
                        dest='backend',
                        default=DEFAULT_BACKEND,
                        help="ZMQ socket for agents.")

    parser.add_argument('--heartbeat',
                        dest='heartbeat',
                        default=None,
                        help="ZMQ socket for the heartbeat.")

    parser.add_argument('--register',
                        dest='register',
                        default=DEFAULT_REG,
                        help="ZMQ socket for the registration.")

    parser.add_argument('--receiver',
                        dest='receiver',
                        default=DEFAULT_BROKER_RECEIVER,
                        help="ZMQ socket to receive events from the runners")

    parser.add_argument('--publisher',
                        dest='publisher',
                        default=DEFAULT_PUBLISHER,
                        help="ZMQ socket for the registration.")

    parser.add_argument('--io-threads',
                        type=int,
                        default=DEFAULT_IOTHREADS,
                        help="Number of I/O threads")

    parser.add_argument('--debug',
                        action='store_true',
                        default=False,
                        help="Debug mode")

    parser.add_argument('--check',
                        action='store_true',
                        default=False,
                        help=("Use this option to check if there's a running "
                              " broker. Returns the PID if a broker is up."))

    parser.add_argument('--logfile',
                        dest='logfile',
                        default='stdout',
                        help="File to log in to.")

    parser.add_argument('--db',
                        dest='db',
                        default='python',
                        help="Database backend.")

    parser.add_argument('--web-root',
                        help='Root url of the web dashboard.',
                        type=str,
                        default=None)

    # add db args
    for backend, options in get_backends():
        for option, default, help, type_ in options:
            option = 'db_%s_%s' % (backend, option)
            kargs = {'dest': option, 'default': default}

            if type_ is bool:
                kargs['action'] = 'store_true'
            else:
                kargs['type'] = type_

            option = option.replace('_', '-')
            parser.add_argument('--%s' % option, **kargs)

    args = parser.parse_args()
    set_logger(args.debug, logfile=args.logfile)

    if args.check:
        pid = verify_broker(args.frontend)
        if pid is None:
            logger.info('There seem to be no broker on this endpoint')
        else:
            logger.info('A broker is running. PID: %s' % pid)
        return 0

    # grabbing the db options
    dboptions = {}
    prefix = 'db_%s_' % args.db

    for key, value in args._get_kwargs():

        if not key.startswith(prefix):
            continue
        dboptions[key[len(prefix):]] = value

    logger.info('Starting the broker')
    try:
        broker = Broker(frontend=args.frontend,
                        backend=args.backend,
                        heartbeat=args.heartbeat,
                        register=args.register,
                        receiver=args.receiver,
                        publisher=args.publisher,
                        io_threads=args.io_threads,
                        db=args.db,
                        dboptions=dboptions,
                        web_root=args.web_root)
    except DuplicateBrokerError, e:
        logger.info('There is already a broker running on PID %s' % e)
        logger.info('Exiting')
        return 1
Exemple #19
0
def main(args=sys.argv):
    parser = argparse.ArgumentParser(description='Powerhose broker.')

    parser.add_argument('--frontend', dest='frontend',
                        default=DEFAULT_FRONTEND,
                        help="ZMQ socket to receive jobs.")

    parser.add_argument('--backend', dest='backend',
                        default=DEFAULT_BACKEND,
                        help="ZMQ socket for workers.")

    parser.add_argument('--heartbeat', dest='heartbeat',
                        default=DEFAULT_HEARTBEAT,
                        help="ZMQ socket for the heartbeat.")

    parser.add_argument('--register', dest='register',
                        default=DEFAULT_REG,
                        help="ZMQ socket for the registration.")

    parser.add_argument('--io-threads', type=int,
                        default=DEFAULT_IOTHREADS,
                        help="Number of I/O threads")

    parser.add_argument('--debug', action='store_true', default=False,
                        help="Debug mode")

    parser.add_argument('--check', action='store_true', default=False,
                        help=("Use this option to check if there's a running "
                              " broker. Returns the PID if a broker is up."))

    parser.add_argument('--purge-ghosts', action='store_true', default=False,
                        help="Use this option to purge ghost brokers.")

    parser.add_argument('--logfile', dest='logfile', default='stdout',
                        help="File to log in to .")

    args = parser.parse_args()
    set_logger(args.debug, logfile=args.logfile)

    if args.purge_ghosts:
        broker_pids, ghosts = kill_ghost_brokers(args.frontend)
        if broker_pids is None:
            logger.info('No running broker.')
        else:
            logger.info('The active broker runs at PID: %s' % broker_pids)

        if len(ghosts) == 0:
            logger.info('No ghosts where killed.')
        else:
            logger.info('Ghost(s) killed: %s' \
                    % ', '.join([str(g) for g in ghosts]))
        return 0

    if args.check:
        pid = verify_broker(args.frontend)
        if pid is None:
            logger.info('There seem to be no broker on this endpoint')
        else:
            logger.info('A broker is running. PID: %s' % pid)
        return 0

    logger.info('Starting the broker')
    try:
        broker = Broker(frontend=args.frontend, backend=args.backend,
                        heartbeat=args.heartbeat, register=args.register,
                        io_threads=args.io_threads)
    except DuplicateBrokerError, e:
        logger.info('There is already a broker running on PID %s' % e)
        logger.info('Exiting')
        return 1
Exemple #20
0
def main(args=sys.argv):
    parser = argparse.ArgumentParser(description="Loads broker.")

    parser.add_argument("--frontend", dest="frontend", default=DEFAULT_FRONTEND, help="ZMQ socket to receive jobs.")

    parser.add_argument("--backend", dest="backend", default=DEFAULT_BACKEND, help="ZMQ socket for agents.")

    parser.add_argument("--heartbeat", dest="heartbeat", default=None, help="ZMQ socket for the heartbeat.")

    parser.add_argument("--register", dest="register", default=DEFAULT_REG, help="ZMQ socket for the registration.")

    parser.add_argument(
        "--receiver",
        dest="receiver",
        default=DEFAULT_BROKER_RECEIVER,
        help="ZMQ socket to receive events from the runners",
    )

    parser.add_argument(
        "--publisher", dest="publisher", default=DEFAULT_PUBLISHER, help="ZMQ socket for the registration."
    )

    parser.add_argument("--io-threads", type=int, default=DEFAULT_IOTHREADS, help="Number of I/O threads")

    parser.add_argument("--debug", action="store_true", default=False, help="Debug mode")

    parser.add_argument(
        "--check",
        action="store_true",
        default=False,
        help=("Use this option to check if there's a running " " broker. Returns the PID if a broker is up."),
    )

    parser.add_argument("--logfile", dest="logfile", default="stdout", help="File to log in to.")

    parser.add_argument("--db", dest="db", default="python", help="Database backend.")

    parser.add_argument("--web-root", help="Root url of the web dashboard.", type=str, default=None)

    # add db args
    for backend, options in get_backends():
        for option, default, help, type_ in options:
            option = "db_%s_%s" % (backend, option)
            kargs = {"dest": option, "default": default}

            if type_ is bool:
                kargs["action"] = "store_true"
            else:
                kargs["type"] = type_

            option = option.replace("_", "-")
            parser.add_argument("--%s" % option, **kargs)

    args = parser.parse_args()
    set_logger(args.debug, logfile=args.logfile)

    if args.check:
        pid = verify_broker(args.frontend)
        if pid is None:
            logger.info("There seem to be no broker on this endpoint")
        else:
            logger.info("A broker is running. PID: %s" % pid)
        return 0

    # grabbing the db options
    dboptions = {}
    prefix = "db_%s_" % args.db

    for key, value in args._get_kwargs():

        if not key.startswith(prefix):
            continue
        dboptions[key[len(prefix) :]] = value

    logger.info("Starting the broker")
    try:
        broker = Broker(
            frontend=args.frontend,
            backend=args.backend,
            heartbeat=args.heartbeat,
            register=args.register,
            receiver=args.receiver,
            publisher=args.publisher,
            io_threads=args.io_threads,
            db=args.db,
            dboptions=dboptions,
            web_root=args.web_root,
        )
    except DuplicateBrokerError, e:
        logger.info("There is already a broker running on PID %s" % e)
        logger.info("Exiting")
        return 1
Exemple #21
0
def main(sysargs=None):
    if sysargs is None:
        sysargs = sys.argv[1:]

    parser = argparse.ArgumentParser(description='Runs a load test.')
    parser.add_argument('fqn', help='Fully qualified name of the test',
                        nargs='?')

    parser.add_argument('--config', help='Configuration file to read',
                        type=str, default=None)

    parser.add_argument('-u', '--users', help='Number of virtual users',
                        type=str, default='1')

    # loads works with cycles or duration
    group = parser.add_mutually_exclusive_group()
    group.add_argument('-c', '--cycles', help='Number of cycles per users',
                       type=str, default=None)
    group.add_argument('-d', '--duration', help='Duration of the test (s)',
                       type=int, default=None)

    parser.add_argument('--version', action='store_true', default=False,
                        help='Displays Loads version and exits.')

    parser.add_argument('-a', '--agents', help='Number of agents to use',
                        type=int)

    parser.add_argument('-b', '--broker', help='Broker endpoint',
                        default=DEFAULT_FRONTEND)

    parser.add_argument('--test-runner', default=None,
                        help='The path to binary to use as the test runner '
                             'when in distributed mode. The default is '
                             'this runner')

    parser.add_argument('--server-url', default=None,
                        help='The URL of the server you want to test. It '
                             'will override any value your provided in '
                             'the tests for the WebTest client.')

    parser.add_argument('--zmq-receiver', default=DEFAULT_RECEIVER,
                        help='Socket where the agents send the results to.')

    parser.add_argument('--zmq-publisher', default=DEFAULT_PUBLISHER,
                        help='Socket where the results are published.')

    outputs = [st.name for st in output_list()]
    outputs.sort()

    parser.add_argument('--quiet', action='store_true', default=False)
    parser.add_argument('--output', action='append', default=['stdout'],
                        help='The output used to display the results',
                        choices=outputs)

    parser.add_argument('--aws-image-id', help='Amazon Server Id', type=str,
                        default='ami-be77e08e')
    parser.add_argument('--aws-access-key', help='Amazon Access Key',
                        type=str, default=os.environ.get('ACCESS_KEY'))
    parser.add_argument('--aws-secret-key', help='Amazon Secret Key',
                        type=str, default=os.environ.get('SECRET_KEY'))
    parser.add_argument('--aws-ssh-user', help='Amazon User',
                        type=str, default='ubuntu')
    parser.add_argument('--aws-ssh-key', help='Amazon SSH Key file',
                        type=str, default='ubuntu')
    parser.add_argument('--aws', help='Running on AWS?', action='store_true',
                        default=False)
    parser.add_argument('--aws-python-deps', help='Python deps to install',
                        action='append', default=[])
    parser.add_argument('--aws-system-deps', help='System deps to install',
                        action='append', default=[])
    parser.add_argument('--aws-test-dir', help='Test dir to embark',
                        default=None)

    # per-output options
    for output in output_list():
        for option, value in output.options.items():
            help, type_, default, cli = value
            if not cli:
                continue

            kw = {'help': help, 'type': type_}
            if default is not None:
                kw['default'] = default

            parser.add_argument('--output-%s-%s' % (output.name, option),
                                **kw)

    args = parser.parse_args(sysargs)

    if args.config is not None:
        # second pass !
        config = Config(args.config)
        config_args = config.scan_args(parser, strip_prefixes=['loads'])
        args = parser.parse_args(args=sysargs + config_args)

    if args.quiet and 'stdout' in args.output:
        args.output.remove('stdout')

    # loggers setting
    wslogger = logging.getLogger('ws4py')
    ch = logging.StreamHandler()
    ch.setLevel(logging.DEBUG)
    wslogger.addHandler(ch)
    set_logger()

    if args.version:
        print(__version__)
        sys.exit(0)

    if args.fqn is None:
        parser.print_usage()
        sys.exit(0)

    # deploy on amazon
    if args.aws:
        try_import('paramiko', 'boto')

        from loads.deploy import aws_deploy
        master, master_id = aws_deploy(args.aws_access_key,
                                       args.aws_secret_key,
                                       args.aws_ssh_user,
                                       args.aws_ssh_key,
                                       args.aws_image_id,
                                       args.aws_python_deps,
                                       args.aws_system_deps,
                                       args.aws_test_dir)
        # XXX
        args.broker = 'tcp://%s:5553' % master['host']
        args.zmq_publisher = 'tcp://%s:5554' % master['host']
    else:
        master_id = None

    try:
        args = dict(args._get_kwargs())
        res = run(args)
        return res
    finally:
        if master_id is not None:
            print 'Shutting down Amazon boxes'
            from loads.deploy import aws_shutdown
            aws_shutdown(args['aws_access_key'],
                         args['aws_secret_key'],
                         master_id)