def parse_args(args=None): parser = argparse.ArgumentParser( description="Lightbus management command.") subparsers = parser.add_subparsers(help="Commands", dest="subcommand") subparsers.required = True # Allow each command to set up its own arguments lightbus.commands.run.Command().setup(parser, subparsers) lightbus.commands.shell.Command().setup(parser, subparsers) lightbus.commands.dump_schema.Command().setup(parser, subparsers) lightbus.commands.dump_config_schema.Command().setup(parser, subparsers) lightbus.commands.inspect.Command().setup(parser, subparsers) lightbus.commands.version.Command().setup(parser, subparsers) # Create a temporary plugin registry in order to run the before_parse_args hook plugin_registry = PluginRegistry() plugin_registry.autoload_plugins(config=Config.load_dict({})) block( plugin_registry.execute_hook("before_parse_args", parser=parser, subparsers=subparsers), timeout=5, ) args = parser.parse_args(sys.argv[1:] if args is None else args) # Note that we don't have an after_parse_args plugin hook. Instead we use the receive_args # hook which is called once we have instantiated our plugins return args
def parse_args(args=None): parser = argparse.ArgumentParser( description="Lightbus management command.") parser.add_argument( "--service-name", "-s", help="Name of service in which this process resides. YOU SHOULD " "LIKELY SET THIS IN PRODUCTION. Can also be set using the " "LIGHTBUS_SERVICE_NAME environment. Will default to a random string.", ) parser.add_argument( "--process-name", "-p", help= "A unique name of this process within the service. Can also be set using the " "LIGHTBUS_PROCESS_NAME environment. Will default to a random string.", ) parser.add_argument("--config", dest="config_file", help="Config file to load, JSON or YAML", metavar="FILE") parser.add_argument( "--log-level", help="Set the log level. Overrides any value set in config. " "One of debug, info, warning, critical, exception.", metavar="LOG_LEVEL", ) subparsers = parser.add_subparsers(help="Commands", dest="subcommand") subparsers.required = True lightbus.commands.run.Command().setup(parser, subparsers) lightbus.commands.shell.Command().setup(parser, subparsers) lightbus.commands.dump_schema.Command().setup(parser, subparsers) lightbus.commands.dump_schema.Command().setup(parser, subparsers) lightbus.commands.dump_config_schema.Command().setup(parser, subparsers) lightbus.commands.inspect.Command().setup(parser, subparsers) # Create a temporary plugin registry in order to run the before_parse_args hook plugin_registry = PluginRegistry() plugin_registry.autoload_plugins(config=Config.load_dict({})) block( plugin_registry.execute_hook("before_parse_args", parser=parser, subparsers=subparsers), timeout=5, ) args = parser.parse_args(sys.argv[1:] if args is None else args) # Note that we don't have an after_parse_args plugin hook. Instead we use the receive_args # hook which is called once we have instantiated our plugins return args
def _handle(self, args, config, plugin_registry: PluginRegistry): self.setup_logging(override=getattr(args, "log_level", None), config=config) bus_module, bus = self.import_bus(args) # TODO: Move to lightbus.create()? if args.schema: if args.schema == "-": # if '-' read from stdin source = None else: source = args.schema bus.schema.load_local(source) restart_signals = (signal.SIGINT, signal.SIGTERM) # Handle incoming signals async def signal_handler(): # Stop handling signals now. If we receive the signal again # let the process quit naturally for signal_ in restart_signals: asyncio.get_event_loop().remove_signal_handler(signal_) logger.debug("Caught signal. Stopping main thread event loop") bus.client.shutdown_server(exit_code=0) for signal_ in restart_signals: asyncio.get_event_loop().add_signal_handler( signal_, lambda: asyncio.ensure_future(signal_handler())) try: block(plugin_registry.execute_hook("receive_args", args=args), timeout=5) if args.events_only: bus.client.run_forever(consume_rpcs=False) else: bus.client.run_forever() finally: # Cleanup signal handlers for signal_ in restart_signals: asyncio.get_event_loop().remove_signal_handler(signal_) if bus.client.exit_code: sys.exit(bus.client.exit_code)
def handle(self, args, config, plugin_registry: PluginRegistry, fake_it=False): command_utilities.setup_logging(args.log_level or "warning", config) try: # pylint: disable=unused-import,cyclic-import,import-outside-toplevel import bpython from bpython.curtsies import main as bpython_main except ImportError: # pragma: no cover print( "Lightbus shell requires bpython. Run `pip install bpython` to install bpython." ) sys.exit(1) return # noqa lightbus_logger = logging.getLogger("lightbus") lightbus_logger.setLevel(logging.WARNING) bus_module, bus = command_utilities.import_bus(args) block(bus.client.lazy_load_now()) objects = {k: v for k, v in lightbus.__dict__.items() if isclass(v)} objects.update(bus=bus) block(plugin_registry.execute_hook("receive_args", args=args), timeout=5) # Ability to not start up the repl is useful for testing if not fake_it: bpython_main( args=["-i", "-q"], locals_=objects, welcome_message= "Welcome to the Lightbus shell. Use `bus` to access your bus.", )
def _handle(self, args, config, plugin_registry: PluginRegistry): command_utilities.setup_logging(override=getattr( args, "log_level", None), config=config) bus_module, bus = command_utilities.import_bus(args) # Convert only & skip into a list of features to enable if args.only or args.skip: if args.only: features = args.only else: features = self.all_features for skip_feature in args.skip or []: if skip_feature in features: features.remove(skip_feature) elif os.environ.get("LIGHTBUS_FEATURES"): features = csv_type(os.environ.get("LIGHTBUS_FEATURES")) else: features = ALL_FEATURES bus.client.set_features(features) # TODO: Move to lightbus.create()? if args.schema: if args.schema == "-": # if '-' read from stdin source = None else: source = args.schema bus.schema.load_local(source) restart_signals = (signal.SIGINT, signal.SIGTERM) # Handle incoming signals async def signal_handler(): # Stop handling signals now. If we receive the signal again # let the process quit naturally for signal_ in restart_signals: asyncio.get_event_loop().remove_signal_handler(signal_) logger.debug("Caught signal. Stopping main thread event loop") bus.client.shutdown_server(exit_code=0) for signal_ in restart_signals: asyncio.get_event_loop().add_signal_handler( signal_, lambda: asyncio.ensure_future(signal_handler())) try: block(plugin_registry.execute_hook("receive_args", args=args), timeout=5) bus.client.run_forever() finally: # Cleanup signal handlers for signal_ in restart_signals: asyncio.get_event_loop().remove_signal_handler(signal_) if bus.client.exit_code: sys.exit(bus.client.exit_code)
def handle(self, args, config, plugin_registry: PluginRegistry): try: self._handle(args, config, plugin_registry) except Exception as e: block(plugin_registry.execute_hook("exception", e=e), timeout=5) raise