def run(self, message_bus, timeout): """ send verb to all nodes, waits for max timeout returns True if all nodes behaved as expected and False otherwise - including in case of KeyboardInterrupt """ nodes = [ Node(cmc_name, message_bus) for cmc_name in self.selector.cmc_names() ] jobs = [ Job(self.get_and_show_verb(node, self.verb), critical=True) for node in nodes ] display = Display(nodes, message_bus) scheduler = Scheduler(Job(display.run(), forever=True, critical=True), *jobs, timeout=timeout, critical=False) try: if scheduler.run(): return True else: scheduler.debrief() print(f"rhubarbe-{self.verb} failed: {scheduler.why()}") return False except KeyboardInterrupt: print(f"rhubarbe-{self.verb} : keyboard interrupt - exiting") return False
def monitornodes(*argv): # pylint: disable=r0914 # xxx hacky - do a side effect in the logger module import rhubarbe.logger rhubarbe.logger.logger = rhubarbe.logger.monitor_logger from rhubarbe.logger import logger usage = """ Cyclic probe all selected nodes, and reports real-time status at a sidecar service over websockets """ config = Config() parser = ArgumentParser(usage=usage, formatter_class=ArgumentDefaultsHelpFormatter) parser.add_argument('-c', "--cycle", default=config.value('monitor', 'cycle_nodes'), type=float, help="Delay to wait between 2 probes of each node") parser.add_argument("-u", "--sidecar-url", dest="sidecar_url", default=Config().value('sidecar', 'url'), help="url for the sidecar server") parser.add_argument("-w", "--wlan", dest="report_wlan", default=False, action='store_true', help="ask for probing of wlan traffic rates") parser.add_argument("-v", "--verbose", action='store_true', default=False) add_selector_arguments(parser) args = parser.parse_args(argv) selector = selected_selector(args) message_bus = asyncio.Queue() # xxx having to feed a Display instance with nodes # at creation time is a nuisance display = Display([], message_bus) logger.info({'selected_nodes': selector}) monitornodes = MonitorNodes(selector.cmc_names(), message_bus=message_bus, cycle=args.cycle, sidecar_url=args.sidecar_url, report_wlan=args.report_wlan, verbose=args.verbose) async def async_main(): # run both the core and the log loop in parallel await asyncio.gather(monitornodes.run_forever(), display.run()) MonitorLoop("monitornodes").run(async_main(), logger) return 0