def run(options, design): options = parser.parse_args() logger.from_argparse(logger, options) logger.set_level(logging.FATAL, 'http') logger.set_level(logging.FATAL, 'transport') filename = options.design if not pathlib.Path(filename).exists(): parser.error('file, `%s` does not exists.' % filename) if not pathlib.Path(filename).is_file(): parser.error('file, `%s` is not valid file.' % filename) design = load_design(filename) log = logger.get_logger(__name__) log_state = logger.get_logger('consensus.state') log.info('design loaded:\n%s', pprint.pformat(convert_namedtuple_to_dict(design), width=1)) log.debug('trying to run %d / %d (faulty nodes / all nodes)', len(design.faulties), len(design.nodes)) run_func = run_default if options.case is not None: try: os.chdir(pathlib.Path(options.case).absolute()) sys.path.insert(0, '.') run_func = getattr(get_module('main'), 'run', None) except (FileNotFoundError, AttributeError): log.debug('failed to load case, %s', options.case) else: log.debug('loaded case from %s', options.case) blockchains = run_func(options, design) prev = None while True: time.sleep(1) now = set( map(lambda x: (x.consensus.node.name, x.consensus), blockchains)) if now == prev: continue prev = now log_current_state(now, design, log_state) return
if __name__ == '__main__': options = parser.parse_args() logger.from_argparse(logger, options) logger.set_level(logging.FATAL, 'http') logger.set_level(logging.FATAL, 'transport') if not pathlib.Path(options.design).exists(): parser.error('file, `%s` does not exists.' % options.design) if not pathlib.Path(options.design).is_file(): parser.error('file, `%s` is not valid file.' % options.design) design = load_design(options.design) log = logger.get_logger(__name__) log_state = logger.get_logger('consensus.state') log.debug('options: %s', options) log.info('design loaded:\n%s', pprint.pformat(convert_namedtuple_to_dict(design), width=1)) if options.action in ('run', ): run(options, design) elif options.action in ('check', ): check(options, design) sys.exit(0)