예제 #1
0
def generate_swagger() -> str:

    # Create an APISpec
    spec = APISpec(
        title="ARCOR2 Data Models",
        version=arcor2.api_version(),
        openapi_version="3.0.2",
        plugins=[FlaskPlugin(), DataclassesPlugin()],
    )

    # TODO avoid explicit naming of all sub-modules in rpc module
    for module in (arcor2.data.common, arcor2.data.object_type, rpc.common,
                   rpc.execution, rpc.objects, rpc.robot, rpc.scene,
                   rpc.project, rpc.services, rpc.storage, arcor2.data.events):
        for name, obj in inspect.getmembers(module):

            if not inspect.isclass(obj) or not issubclass(
                    obj, JsonSchemaMixin) or obj == JsonSchemaMixin:
                continue

            try:
                spec.components.schema(obj.__name__, schema=obj)
            except DuplicateComponentNameError:
                continue

    return spec.to_yaml()
예제 #2
0
async def system_info_cb(req: rpc.common.SystemInfoRequest,
                         ui: WsClient) -> rpc.common.SystemInfoResponse:

    resp = rpc.common.SystemInfoResponse()
    resp.data.version = arcor2.version()
    resp.data.api_version = arcor2.api_version()
    resp.data.supported_parameter_types = set(PARAM_PLUGINS.keys())
    resp.data.supported_rpc_requests = {key.request for key in RPC_DICT.keys()}
    return resp
예제 #3
0
def main():

    assert sys.version_info >= (3, 8)

    parser = argparse.ArgumentParser()

    parser.add_argument("-v",
                        "--verbose",
                        help="Increase verbosity.",
                        action="store_const",
                        const=True,
                        default=False)
    parser.add_argument("-d",
                        "--debug",
                        help="Set logging level to debug.",
                        action="store_const",
                        const=LogLevel.DEBUG,
                        default=LogLevel.INFO)
    parser.add_argument('--version',
                        action='version',
                        version=arcor2.version(),
                        help="Shows ARCOR2 version and exits.")
    parser.add_argument('--api_version',
                        action='version',
                        version=arcor2.api_version(),
                        help="Shows API version and exits.")
    parser.add_argument("-a",
                        "--asyncio_debug",
                        help="Turn on asyncio debug mode.",
                        action="store_const",
                        const=True,
                        default=False)

    args = parser.parse_args()
    glob.logger.level = args.debug
    glob.VERBOSE = args.verbose

    loop = asyncio.get_event_loop()
    loop.set_debug(enabled=args.asyncio_debug)

    compile_json_schemas()

    if os.path.exists(settings.URDF_PATH):
        shutil.rmtree(settings.URDF_PATH)
    os.makedirs(settings.URDF_PATH)

    run(aio_main(), loop=loop, stop_on_unhandled_errors=True)
예제 #4
0
async def _initialize_server() -> None:

    exe_version = await exe.manager_request(
        rpc.common.VersionRequest(uuid.uuid4().int))
    assert isinstance(exe_version, rpc.common.VersionResponse)
    """
    Following check is especially useful when running server/execution in Docker containers.
    Then it might easily happen that one tries to use different versions together.
    """
    try:
        hlp.check_compatibility(arcor2.api_version(), exe_version.data.version)
    except Arcor2Exception as e:
        raise Arcor2Exception(
            "ARServer/Execution API_VERSION mismatch.") from e

    while True:  # wait until Project service becomes available
        try:
            await storage.get_projects()
            break
        except storage.PersistentStorageException as e:
            print(e.message)
            await asyncio.sleep(1)

    # this has to be done sequentially as objects might depend on services so (all) services has to be known first
    await osa.get_service_types()
    await osa.get_object_types()
    await osa.get_object_actions()

    bound_handler = functools.partial(hlp.server,
                                      logger=glob.logger,
                                      register=register,
                                      unregister=unregister,
                                      rpc_dict=RPC_DICT,
                                      event_dict=EVENT_DICT,
                                      verbose=glob.VERBOSE)

    await glob.logger.info("Server initialized.")
    await asyncio.wait([websockets.serve(bound_handler, '0.0.0.0', glob.PORT)])
예제 #5
0
def main() -> None:

    assert sys.version_info >= (3, 8)

    parser = argparse.ArgumentParser()

    parser.add_argument("-v",
                        "--verbose",
                        help="Increase output verbosity",
                        action="store_const",
                        const=LogLevel.DEBUG,
                        default=LogLevel.INFO)
    parser.add_argument('--version',
                        action='version',
                        version=arcor2.version(),
                        help="Shows ARCOR2 version and exits.")
    parser.add_argument('--api_version',
                        action='version',
                        version=arcor2.api_version(),
                        help="Shows API version and exits.")
    parser.add_argument("-a",
                        "--asyncio_debug",
                        help="Turn on asyncio debug mode.",
                        action="store_const",
                        const=True,
                        default=False)

    args = parser.parse_args()
    logger.level = args.verbose

    loop = asyncio.get_event_loop()
    loop.set_debug(enabled=args.asyncio_debug)

    compile_json_schemas()

    run(aio_main(), loop=loop, stop_on_unhandled_errors=True)
예제 #6
0
async def _version_cb(req: rpc.common.VersionRequest,
                      ui: WsClient) -> rpc.common.VersionResponse:
    return rpc.common.VersionResponse(
        data=rpc.common.VersionData(arcor2.api_version()))