def start_charybdisfs(source: str, # noqa: C901 # ignore "is too complex" message target: str, debug: bool, rest_api: bool, rest_api_port: int, mount: bool, static_enospc: bool, static_enospc_probability: float) -> None: logging.basicConfig(stream=sys.stdout, level=logging.DEBUG if debug else logging.INFO, format=LOG_FORMAT) if not rest_api and not mount: raise click.UsageError(message="can't run --no-rest-api and --no-mount simultaneously") if debug: sys.addaudithook(sys_audit_hook) if static_enospc: static_enospc_probability = max(0, min(100, round(static_enospc_probability * 100))) LOGGER.info("Going to add ENOSPC fault for all syscalls with probability %s%%", static_enospc_probability) enospc_fault = ErrorFault(sys_call=SysCall.ALL, probability=static_enospc_probability, error_no=errno.ENOSPC) Configuration.add_fault(fault_id=generate_fault_id(), fault=enospc_fault) LOGGER.debug("Faults added: %s", Configuration.get_all_faults()) if rest_api: api_server_thread = \ threading.Thread(target=start_charybdisfs_api_server, kwargs={"port": rest_api_port, }, name="RestServerApi", daemon=True) api_server_thread.start() atexit.register(stop_charybdisfs_api_server) if mount: if source is None or target is None: raise click.BadArgumentUsage("both source and target parameters are required for CharybdisFS mount") fuse_options = set(pyfuse3.default_options) fuse_options.add("fsname=charybdisfs") if debug: fuse_options.add("debug") operations = CharybdisOperations(source=source) pyfuse3.init(operations, target, fuse_options) atexit.register(pyfuse3.close) try: if mount: trio.run(pyfuse3.main) else: api_server_thread.join() except KeyboardInterrupt: LOGGER.info("Interrupted by user...") sys.exit(0)
elif method in ( "POST", "CREATE", "PUT", ): if fault_id: raise cherrypy.HTTPError( message="Replacing of a fault is not supported") if (fault := create_fault_from_dict( data=cherrypy.request.json)) is None: raise cherrypy.HTTPError( message="Unable to create a fault from provided JSON data") try: fault_id = generate_fault_id() Configuration.add_fault(fault_id=fault_id, fault=fault) except ValueError as exc: raise cherrypy.HTTPError( message= f"Unable to add a fault {fault} with {fault_id=}: {exc}" ) from None return {"fault_id": fault_id} elif method == "DELETE": if Configuration.remove_fault(fault_id=fault_id): return {"fault_id": fault_id} raise cherrypy.NotFound() def start_charybdisfs_api_server(port: int = DEFAULT_PORT) -> None: conf = {