Пример #1
0
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)
Пример #2
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 = {