Example #1
0
def test_add_route_override_name(mock_api_app_config, mock_api_spec,
                                 mock_plugin_config):  # noqa: F811
    _init_api(mock_api_app_config,
              mock_api_spec,
              plugin=mock_plugin_config,
              init_server=True,
              init_apps=True,
              init_swagger=True)
    route = app_route_name(
        mock_api_app_config.app,
        event_name='mock-app-api-get',
        override_route_name='mock-app-api/test/mock-app-api')
    handler = api.add_route('get', route, _test_handler_get)
    assert isinstance(handler.args[0], SwaggerRoute)
    assert handler.args[0].path == route
    handler = api.add_route('post', route, _test_handler_post)
    assert isinstance(handler.args[0], SwaggerRoute)
    assert handler.args[0].path == route
    assert api.spec['paths']['/api/mock-app-api/test/mock-app-api'].keys() == {
        'get', 'post'
    }
    route = app_route_name(mock_api_app_config.app,
                           event_name='mock-app-noapi')
    handler = api.add_route('get', route, _test_handler_get)
    assert handler is _test_handler_get
Example #2
0
def _create_event_management_routes(
        app_engine: AppEngine, *, event_name: str,
        event_info: EventDescriptor) -> List[web.RouteDef]:
    """
    Create routes to start and stop processing of STREAM events
    """
    app = app_engine.app_config.app
    base_route = app_route_name(app_engine.app_config.app,
                                event_name=event_name,
                                prefix='mgmt',
                                override_route_name=event_info.route)
    logger.info(
        __name__,
        f"{event_info.type.value.upper()} path={base_route}/[start|stop]")

    handler: Optional[partial[Coroutine[Any, Any, Response]]] = None
    if event_info.type == EventType.STREAM:
        handler = partial(_handle_stream_start_invocation, app_engine,
                          event_name)
    elif event_info.type == EventType.SERVICE:
        handler = partial(_handle_service_start_invocation, app_engine,
                          event_name)
    assert handler is not None, f"No handler for event={event_name} type={event_info.type}"
    return [
        web.get(
            route_name('mgmt', app.name, app.version,
                       event_name.replace('.', '/'), 'start'), handler),
        web.get(
            route_name('mgmt', app.name, app.version,
                       event_name.replace('.', '/'), 'stop'),
            partial(_handle_event_stop_invocation, app_engine, event_name))
    ]
Example #3
0
def test_add_route_auto_name(mock_api_app_config, mock_api_spec,
                             mock_plugin_config):  # noqa: F811
    _init_api(mock_api_app_config,
              mock_api_spec,
              plugin=mock_plugin_config,
              init_server=True,
              init_apps=True,
              init_swagger=True)
    route = app_route_name(mock_api_app_config.app,
                           event_name='mock-app-api-get-list')
    handler = api.add_route('get', route, _test_handler_get)
    assert isinstance(handler.args[0], SwaggerRoute)
    route = app_route_name(mock_api_app_config.app,
                           event_name='mock-app-noapi')
    handler = api.add_route('get', route, _test_handler_get)
    assert handler is _test_handler_get
Example #4
0
def api_from_config(module, *, app_config: AppConfig, event_name: str,
                    plugin: Optional[AppConfig]) -> dict:
    """
    Uses api definition exactly as it comes from --api-file specified at runtime.

    Usage in app event implementation file::

        __api__ = api_from_config

    Notice that no arguments need to be provided (just the function) as the function will be invoked
    during server initialization.
    """
    assert spec is not None
    plugin_app = None if plugin is None else plugin.app
    override_route_name = app_config.events[event_name].route
    route = app_route_name(app_config.app,
                           event_name=event_name,
                           plugin=plugin_app,
                           override_route_name=override_route_name)
    method = app_config.events[event_name].type.value.lower()
    event_spec = spec['paths'].get(route)
    if event_spec is None:
        raise APIError(
            f"Missing API Config for app={app_config.app.app_key()} event={event_name}"
        )
    method_spec = event_spec.get(method)
    if method_spec is None:
        raise APIError(
            f"Missing method={method} for app={app_config.app.app_key()} event={event_name}"
        )
    return event_spec[method]
Example #5
0
def test_api_disabled(mock_api_app_config):  # noqa: F811
    api.clear()
    api.register_server_config(mock_api_app_config.server)
    assert api.spec is None
    apps = [mock_api_app_config]
    app = web.Application()
    api.register_apps(apps)
    api.enable_swagger(mock_api_app_config.server, app)
    assert api.spec is None
    route = app_route_name(mock_api_app_config.app,
                           event_name='mock-app-api-get')
    handler = api.add_route('get', route, _test_handler_get)
    assert handler is _test_handler_get
    route = app_route_name(mock_api_app_config.app,
                           event_name='mock-app-noapi')
    handler = api.add_route('get', route, _test_handler_get)
    assert handler is _test_handler_get
Example #6
0
 def _get_route(self, event_name: str):
     """
     Builds the route to an event endpoint based on app + plugin configs.
     Overrides in case app_connection settins specifies so.
     """
     app_descriptor = AppDescriptor(name=self.app_connection.name,
                                    version=self.app_connection.version)
     plugin_descriptor = None
     if self.app_connection.plugin_name:
         plugin_descriptor = AppDescriptor(
             name=self.app_connection.plugin_name,
             version=self.app_connection.plugin_version
             or self.app_connection.version)
     return app_route_name(
         app_descriptor,
         event_name=event_name,
         plugin=plugin_descriptor,
         override_route_name=self.settings.routes_override.get(event_name))
Example #7
0
def _create_get_event_route(app_engine: AppEngine,
                            *,
                            plugin: Optional[AppEngine] = None,
                            event_name: str,
                            event_info: EventDescriptor) -> web.RouteDef:
    """
    Creates route for handling GET requests
    """
    route = app_route_name(
        app_engine.app_config.app,
        event_name=event_name,
        plugin=None if plugin is None else plugin.app_config.app,
        override_route_name=event_info.route)
    logger.info(__name__, f"GET path={route}")
    impl = plugin if plugin else app_engine
    handler = partial(_handle_get_invocation, app_engine, impl, event_name,
                      _auth_types(impl, event_name))
    setattr(handler, '__closure__', None)
    setattr(handler, '__code__', _handle_get_invocation.__code__)
    api_handler = api.add_route('get', route, handler)
    return web.get(route, api_handler)
Example #8
0
def _create_multipart_event_route(
        app_engine: AppEngine,
        *,
        plugin: Optional[AppEngine] = None,
        event_name: str,
        override_route_name: Optional[str]) -> web.RouteDef:
    """
    Creates route for handling MULTIPART event
    """
    datatype = find_datatype_handler(app_config=app_engine.app_config,
                                     event_name=event_name)
    route = app_route_name(
        app_engine.app_config.app,
        event_name=event_name,
        plugin=None if plugin is None else plugin.app_config.app,
        override_route_name=override_route_name)
    logger.info(__name__, f"MULTIPART path={route} input={str(datatype)}")
    impl = plugin if plugin else app_engine
    handler = partial(_handle_multipart_invocation, app_engine, impl,
                      event_name, datatype, _auth_types(impl, event_name))
    setattr(handler, '__closure__', None)
    setattr(handler, '__code__', _handle_multipart_invocation.__code__)
    api_handler = api.add_route('post', route, handler)
    return web.post(route, api_handler)