Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
45c28b6
Add functions rest api inside webserver
wvangeit May 16, 2025
5083273
Merge branch 'master' into add_wbserver_functions_rest
wvangeit May 16, 2025
9b35341
Remove some commented out code
wvangeit May 16, 2025
9f39af5
includes _functsions in openapi
pcrespov May 16, 2025
e835dc0
Merge remote-tracking branch 'origin/master' into add_wbserver_functi…
wvangeit May 16, 2025
0605cd8
Merge branch 'add_wbserver_functions_rest' of github.com:wvangeit/osp…
wvangeit May 16, 2025
89393df
Resolve comments in PR about function wb rest api
wvangeit May 16, 2025
6efb10a
Merge branch 'master' into add_wbserver_functions_rest
wvangeit May 19, 2025
74c9251
Merge branch 'add_wbserver_functions_rest' of github.com:wvangeit/osp…
wvangeit May 19, 2025
6eb93db
Merge branch 'master' into add_wbserver_functions_rest
wvangeit May 19, 2025
d676c18
Merge branch 'master' into add_wbserver_functions_rest
wvangeit May 19, 2025
db30f3d
Merge branch 'add_wbserver_functions_rest' of github.com:wvangeit/osp…
wvangeit May 19, 2025
4f165f3
Changes to create function frontend
wvangeit May 19, 2025
1348ea8
Remove newlines in functions frontend
wvangeit May 19, 2025
ee73225
Allow empty description
wvangeit May 19, 2025
74530d7
Merge branch 'master' into add_wbserver_functions_rest
wvangeit May 19, 2025
a1b41cd
Fix linting
wvangeit May 19, 2025
184e164
Merge branch 'add_wbserver_functions_rest' of github.com:wvangeit/osp…
wvangeit May 19, 2025
5ff3c85
One more pylint error fix
wvangeit May 19, 2025
dc371c7
Add a few type annotation in function wb rest
wvangeit May 19, 2025
6db18ee
Add function_id / jobs endpoint
wvangeit May 19, 2025
a6ac82d
Add new openapi json for functions
wvangeit May 19, 2025
7b6214e
services/api-server version: 0.7.1 → 0.7.2
wvangeit May 19, 2025
c94f6cd
Merge branch 'master' into add_wbserver_functions_rest
wvangeit May 19, 2025
4193632
Mention release versoin
wvangeit May 19, 2025
e37e22e
services/api-server version: 0.7.2 → 0.8.0
wvangeit May 19, 2025
cf58d48
Merge branch 'add_wbserver_functions_rest' of github.com:wvangeit/osp…
wvangeit May 19, 2025
9abff15
Update openapi spec for functions
wvangeit May 19, 2025
adbf763
Merge branch 'master' into add_wbserver_functions_rest
wvangeit May 19, 2025
ef271f7
Add context manager to catch validation error in function rest
wvangeit May 19, 2025
db308ad
Merge branch 'add_wbserver_functions_rest' of github.com:wvangeit/osp…
wvangeit May 19, 2025
fafeaac
Merge branch 'master' into add_wbserver_functions_rest
wvangeit May 19, 2025
c1b2b74
Fix e2e test by avoid importing fastapi in webserver rest
wvangeit May 20, 2025
d7b7f98
Merge branch 'master' into add_wbserver_functions_rest
wvangeit May 20, 2025
e814088
Merge branch 'master' into add_wbserver_functions_rest
wvangeit May 20, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 53 additions & 0 deletions api/specs/web-server/_functions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
# pylint: disable=protected-access
# pylint: disable=redefined-outer-name
# pylint: disable=too-many-arguments
# pylint: disable=unused-argument
# pylint: disable=unused-variable


from typing import Annotated

from fastapi import APIRouter, Depends, status
from models_library.api_schemas_webserver.functions import (
FunctionToRegister,
RegisteredFunctionGet,
)
from models_library.generics import Envelope
from simcore_service_webserver._meta import API_VTAG
from simcore_service_webserver.functions._controller._functions_rest_schemas import (
FunctionPathParams,
)

router = APIRouter(
prefix=f"/{API_VTAG}",
tags=[
"functions",
],
)


@router.post(
"/functions",
response_model=Envelope[RegisteredFunctionGet],
)
async def register_function(
_body: FunctionToRegister,
) -> Envelope[RegisteredFunctionGet]: ...


@router.get(
"/functions/{function_id}",
response_model=Envelope[RegisteredFunctionGet],
)
async def get_function(
_path: Annotated[FunctionPathParams, Depends()],
): ...


@router.delete(
"/projects/{function_id}",
status_code=status.HTTP_204_NO_CONTENT,
)
async def delete_function(
_path: Annotated[FunctionPathParams, Depends()],
): ...
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# pylint: disable=unused-import

from ..functions import ( # noqa: F401
Function,
FunctionClass,
FunctionClassSpecificData,
FunctionID,
FunctionIDNotFoundError,
FunctionInputs,
FunctionInputSchema,
FunctionInputsList,
FunctionInputsValidationError,
FunctionJob,
FunctionJobClassSpecificData,
FunctionJobCollection,
FunctionJobCollectionID,
FunctionJobCollectionIDNotFoundError,
FunctionJobCollectionStatus,
FunctionJobID,
FunctionJobIDNotFoundError,
FunctionJobStatus,
FunctionOutputs,
FunctionOutputSchema,
FunctionSchemaClass,
JSONFunctionInputSchema,
JSONFunctionOutputSchema,
ProjectFunction,
ProjectFunctionJob,
RegisteredFunction,
RegisteredFunctionJob,
RegisteredFunctionJobCollection,
RegisteredProjectFunction,
RegisteredProjectFunctionJob,
SolverFunction,
SolverFunctionJob,
UnsupportedFunctionClassError,
UnsupportedFunctionFunctionJobClassCombinationError,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
# pylint: disable=unused-import

from typing import Annotated, TypeAlias

from pydantic import Field

from ..functions import ( # noqa: F401
Function,
FunctionBase,
FunctionClass,
FunctionClassSpecificData,
FunctionID,
FunctionIDNotFoundError,
FunctionInputs,
FunctionInputSchema,
FunctionInputsList,
FunctionInputsValidationError,
FunctionJob,
FunctionJobClassSpecificData,
FunctionJobCollection,
FunctionJobCollectionID,
FunctionJobCollectionIDNotFoundError,
FunctionJobCollectionStatus,
FunctionJobID,
FunctionJobIDNotFoundError,
FunctionJobStatus,
FunctionOutputs,
FunctionOutputSchema,
FunctionSchemaClass,
JSONFunctionInputSchema,
JSONFunctionOutputSchema,
ProjectFunction,
ProjectFunctionJob,
RegisteredFunction,
RegisteredFunctionBase,
RegisteredFunctionJob,
RegisteredFunctionJobCollection,
RegisteredProjectFunction,
RegisteredProjectFunctionJob,
RegisteredSolverFunction,
SolverFunction,
SolverFunctionJob,
UnsupportedFunctionClassError,
UnsupportedFunctionFunctionJobClassCombinationError,
)
from ._base import InputSchema, OutputSchema


class RegisteredSolverFunctionGet(RegisteredSolverFunction, OutputSchema): ...


class RegisteredProjectFunctionGet(RegisteredProjectFunction, OutputSchema): ...


class SolverFunctionToRegister(SolverFunction, InputSchema): ...


class ProjectFunctionToRegister(ProjectFunction, InputSchema): ...


FunctionToRegister: TypeAlias = Annotated[
ProjectFunctionToRegister | SolverFunctionToRegister,
Field(discriminator="function_class"),
]

RegisteredFunctionGet: TypeAlias = Annotated[
RegisteredProjectFunctionGet | RegisteredSolverFunctionGet,
Field(discriminator="function_class"),
]
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from models_library.services_types import ServiceKey, ServiceVersion
from pydantic import BaseModel, Field

from ..projects import ProjectID
from .projects import ProjectID

FunctionID: TypeAlias = UUID
FunctionJobID: TypeAlias = UUID
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import logging

from models_library.api_schemas_webserver import WEBSERVER_RPC_NAMESPACE
from models_library.api_schemas_webserver.functions_wb_schema import (
from models_library.api_schemas_webserver.functions import (
Function,
FunctionID,
FunctionInputs,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

from fastapi import APIRouter, Depends, status
from fastapi_pagination.api import create_page
from models_library.api_schemas_webserver.functions_wb_schema import (
from models_library.api_schemas_webserver.functions import (
FunctionJobCollection,
FunctionJobCollectionID,
FunctionJobCollectionStatus,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

from fastapi import APIRouter, Depends, status
from fastapi_pagination.api import create_page
from models_library.api_schemas_webserver.functions_wb_schema import (
from models_library.api_schemas_webserver.functions import (
Function,
FunctionClass,
FunctionJob,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from fastapi import APIRouter, Depends, Request, status
from fastapi_pagination.api import create_page
from jsonschema import ValidationError
from models_library.api_schemas_webserver.functions_wb_schema import (
from models_library.api_schemas_api_server.functions import (
Function,
FunctionClass,
FunctionID,
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

from fastapi import FastAPI
from fastapi_pagination import create_page
from models_library.api_schemas_webserver.functions_wb_schema import (
from models_library.api_schemas_api_server.functions import (
Function,
FunctionID,
FunctionInputs,
Expand Down
2 changes: 1 addition & 1 deletion services/api-server/tests/unit/api_functions/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

import pytest
from fastapi import FastAPI
from models_library.api_schemas_webserver.functions_wb_schema import (
from models_library.api_schemas_webserver.functions import (
Function,
FunctionClass,
FunctionIDNotFoundError,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

import pytest
from httpx import AsyncClient
from models_library.api_schemas_webserver.functions_wb_schema import (
from models_library.api_schemas_webserver.functions import (
FunctionIDNotFoundError,
FunctionJobCollection,
ProjectFunction,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
from aiohttp import web
from fastapi import status
from models_library.api_schemas_webserver.functions import (
Function,
FunctionToRegister,
RegisteredFunctionGet,
)
from pydantic import TypeAdapter
from servicelib.aiohttp.requests_validation import parse_request_path_parameters_as
from servicelib.rabbitmq import RPCRouter
from simcore_service_webserver.utils_aiohttp import envelope_json_response

from ..._meta import API_VTAG as VTAG
from .. import _functions_service
from ._functions_rest_exceptions import handle_rest_requests_exceptions
from ._functions_rest_schemas import FunctionPathParams

router = RPCRouter()

routes = web.RouteTableDef()


@routes.post(f"/{VTAG}/functions", name="register_function")
@handle_rest_requests_exceptions
async def register_function(request: web.Request) -> web.Response:
function_to_register = TypeAdapter(FunctionToRegister).validate_python(
await request.json()
)

registered_function = await _functions_service.register_function(
app=request.app,
function=TypeAdapter(Function).validate_python(function_to_register),
)

return envelope_json_response(
TypeAdapter(RegisteredFunctionGet).validate_python(
registered_function.model_dump(mode="json")
)
)


@routes.get(
f"/{VTAG}/functions/{{function_id}}",
name="get_function",
)
@handle_rest_requests_exceptions
async def get_function(request: web.Request) -> web.Response:
path_params = parse_request_path_parameters_as(FunctionPathParams, request)
function_id = path_params.function_id

registered_function = await _functions_service.get_function(
app=request.app,
function_id=function_id,
)

return envelope_json_response(
TypeAdapter(RegisteredFunctionGet).validate_python(
registered_function.model_dump(mode="json")
)
)


@routes.delete(
f"/{VTAG}/functions/{{function_id}}",
name="delete_function",
)
@handle_rest_requests_exceptions
async def delete_function(request: web.Request) -> web.Response:
path_params = parse_request_path_parameters_as(FunctionPathParams, request)
function_id = path_params.function_id

await _functions_service.delete_function(
app=request.app,
function_id=function_id,
)

return web.Response(status=status.HTTP_204_NO_CONTENT)
Loading
Loading