def main(event_loop=None): """Scriptworker entry point: get everything set up, then enter the main loop. Args: event_loop (asyncio.BaseEventLoop, optional): the event loop to use. If None, use ``asyncio.get_event_loop()``. Defaults to None. """ context, credentials = get_context_from_cmdln(sys.argv[1:]) log.info("Scriptworker starting up at {} UTC".format(arrow.utcnow().format())) cleanup(context) context.event_loop = event_loop or asyncio.get_event_loop() done = False async def _handle_sigterm(): log.info("SIGTERM received; shutting down") nonlocal done done = True if context.running_tasks is not None: await context.running_tasks.cancel() context.event_loop.add_signal_handler(signal.SIGTERM, lambda: asyncio.ensure_future(_handle_sigterm())) while not done: try: context.event_loop.run_until_complete(async_main(context, credentials)) except Exception: log.critical("Fatal exception", exc_info=1) raise
def main(event_loop=None): """Scriptworker entry point: get everything set up, then enter the main loop. Args: event_loop (asyncio.BaseEventLoop, optional): the event loop to use. If None, use ``asyncio.get_event_loop()``. Defaults to None. """ context, credentials = get_context_from_cmdln(sys.argv[1:]) log.info("Scriptworker starting up at {} UTC".format( arrow.utcnow().format())) cleanup(context) context.event_loop = event_loop or asyncio.get_event_loop() done = False async def _handle_sigterm(): log.info("SIGTERM received; shutting down") nonlocal done done = True if context.running_tasks is not None: await context.running_tasks.cancel() context.event_loop.add_signal_handler( signal.SIGTERM, lambda: asyncio.ensure_future(_handle_sigterm())) while not done: try: context.event_loop.run_until_complete( async_main(context, credentials)) except Exception: log.critical("Fatal exception", exc_info=1) raise
def main(event_loop=None): """Scriptworker entry point: get everything set up, then enter the main loop. Args: event_loop (asyncio.BaseEventLoop, optional): the event loop to use. If None, use ``asyncio.get_event_loop()``. Defaults to None. """ context, credentials = get_context_from_cmdln(sys.argv[1:]) log.info("Scriptworker starting up at {} UTC".format(arrow.utcnow().format())) cleanup(context) context.event_loop = event_loop or asyncio.get_event_loop() done = False def _handle_sigterm(signum, frame): nonlocal done log.info("SIGTERM received; shutting down after next task") done = True signal.signal(signal.SIGTERM, _handle_sigterm) while not done: try: context.event_loop.run_until_complete(async_main(context, credentials)) except Exception: log.critical("Fatal exception", exc_info=1) raise
def test_get_context_from_cmdln(t_config): path = os.path.join(os.path.dirname(__file__), "data", "good.json") c = deepcopy(dict(DEFAULT_CONFIG)) with open(path) as fh: c.update(json.load(fh)) expected_creds = frozendict(c['credentials']) del (c['credentials']) expected_config = frozendict(config.apply_product_config(c)) def noop(*args, **kwargs): pass context, credentials = config.get_context_from_cmdln([path]) assert credentials == expected_creds assert context.config == expected_config
def test_get_context_from_cmdln(t_config): path = os.path.join(os.path.dirname(__file__), "data", "good.json") c = deepcopy(dict(DEFAULT_CONFIG)) with open(path) as fh: c.update(json.load(fh)) expected_creds = frozendict(c['credentials']) del(c['credentials']) expected_config = frozendict(config.apply_product_config(c)) def noop(*args, **kwargs): pass context, credentials = config.get_context_from_cmdln([path]) assert credentials == expected_creds assert context.config == expected_config
def main(event_loop=None): """Scriptworker entry point: get everything set up, then enter the main loop. Args: event_loop (asyncio.BaseEventLoop, optional): the event loop to use. If None, use ``asyncio.get_event_loop()``. Defaults to None. """ context, credentials = get_context_from_cmdln(sys.argv[1:]) log.info("Scriptworker starting up at {} UTC".format( arrow.utcnow().format())) log.info("Worker FQDN: {}".format(socket.getfqdn())) log_worker_metric(context, "instanceBoot", timestamp=uptime.boottime()) cleanup(context) context.event_loop = event_loop or asyncio.get_event_loop() done = False async def _handle_sigterm(): log.info("SIGTERM received; shutting down") nonlocal done done = True if context.running_tasks is not None: await context.running_tasks.cancel() async def _handle_sigusr1(): """Stop accepting new tasks.""" log.info("SIGUSR1 received; no more tasks will be taken") nonlocal done done = True context.event_loop.add_signal_handler( signal.SIGTERM, lambda: asyncio.ensure_future(_handle_sigterm())) context.event_loop.add_signal_handler( signal.SIGUSR1, lambda: asyncio.ensure_future(_handle_sigusr1())) log_worker_metric(context, "workerReady") while not done: try: context.event_loop.run_until_complete( async_main(context, credentials)) except Exception: log.critical("Fatal exception", exc_info=1) raise else: log.info("Scriptworker stopped at {} UTC".format( arrow.utcnow().format())) log.info("Worker FQDN: {}".format(socket.getfqdn()))
def main(): """Scriptworker entry point: get everything set up, then enter the main loop.""" context, credentials = get_context_from_cmdln(sys.argv[1:]) log.info("Scriptworker starting up at {} UTC".format(arrow.utcnow().format())) cleanup(context) conn = aiohttp.TCPConnector(limit=context.config['aiohttp_max_connections']) loop = asyncio.get_event_loop() with aiohttp.ClientSession(connector=conn) as session: context.session = session context.credentials = credentials while True: try: loop.run_until_complete(async_main(context)) except Exception: log.critical("Fatal exception", exc_info=1) raise
def main(): """Scriptworker entry point: get everything set up, then enter the main loop """ context, credentials = get_context_from_cmdln(sys.argv[1:]) cleanup(context) conn = aiohttp.TCPConnector(limit=context.config["max_connections"]) loop = asyncio.get_event_loop() with aiohttp.ClientSession(connector=conn) as session: context.session = session context.credentials = credentials while True: try: loop.create_task(async_main(context)) loop.run_forever() except RuntimeError: pass
def test_get_context_from_cmdln_exception(args): with pytest.raises(SystemExit): config.get_context_from_cmdln(args)
def test_get_context_from_cmdln_exception(monkeypatch, tmp_path, args): monkeypatch.chdir(tmp_path) with pytest.raises(SystemExit): config.get_context_from_cmdln(args)