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
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
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
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)
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
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)
# 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
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
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
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
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
# 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:
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
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
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
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)