Skip to content
Merged
Show file tree
Hide file tree
Changes from 40 commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
ead97ac
implement rpc endpoint in dirv2 for getting log fileids
bisgaard-itis Jul 3, 2025
2a06a99
add rpc client function
bisgaard-itis Jul 4, 2025
100fc15
add docstring
bisgaard-itis Jul 4, 2025
669779a
add unit tests for director-v2 rpc endpoint
bisgaard-itis Jul 4, 2025
e0c22ca
start adding dirv2 rpc client in api server
bisgaard-itis Jul 4, 2025
e1ce600
map exceptions
bisgaard-itis Jul 4, 2025
a964afe
Merge branch 'master' into 114-expose-fileids-dirv2-and-logs-in-apise…
bisgaard-itis Jul 7, 2025
2b470bc
Merge branch 'master' into 114-expose-fileids-dirv2-and-logs-in-apise…
bisgaard-itis Jul 7, 2025
9f0663c
add rpc storage client in api-server
bisgaard-itis Jul 7, 2025
4a098e1
minor correction
bisgaard-itis Jul 7, 2025
1645e74
added endpoint for exporting function jobs logs
bisgaard-itis Jul 7, 2025
cbc6c59
add endpoint for exporting as downloadlink
bisgaard-itis Jul 9, 2025
52e7b28
add docstring
bisgaard-itis Jul 9, 2025
7c6225a
Merge branch 'master' into 114-expose-fileids-dirv2-and-logs-in-apise…
bisgaard-itis Jul 10, 2025
38aecfd
Merge branch 'master' into allow_zipping_endpoint_to_return_download_…
bisgaard-itis Jul 10, 2025
bf5686c
start adding tests
bisgaard-itis Jul 10, 2025
c8ef1c4
ensure result is serializable
bisgaard-itis Jul 10, 2025
4c82001
fix import
bisgaard-itis Jul 11, 2025
519ec7f
fix unitest
bisgaard-itis Jul 11, 2025
3c9cfa8
commit forgotten change
bisgaard-itis Jul 11, 2025
cbf3f4c
remove default value
bisgaard-itis Jul 11, 2025
65814f0
add test for invalid export type
bisgaard-itis Jul 11, 2025
d104e3e
Merge branch 'master' into allow_zipping_endpoint_to_return_download_…
bisgaard-itis Jul 11, 2025
b6e134a
Merge branch 'master' into 114-expose-fileids-dirv2-and-logs-in-apise…
bisgaard-itis Jul 11, 2025
456ffe8
start adding test
bisgaard-itis Jul 11, 2025
f2b8933
Merge branch 'master' into allow_zipping_endpoint_to_return_download_…
bisgaard-itis Jul 11, 2025
58dc8aa
changes according to PR feedback
bisgaard-itis Jul 15, 2025
0415850
Merge branch 'master' into allow_zipping_endpoint_to_return_download_…
bisgaard-itis Jul 15, 2025
31bdb4e
Merge branch '114-expose-fileids-dirv2-and-logs-in-apiserver' of gith…
bisgaard-itis Jul 15, 2025
c87a14b
Merge branch 'master' into 114-expose-fileids-dirv2-and-logs-in-apise…
bisgaard-itis Jul 15, 2025
7531de3
Merge branch 'allow_zipping_endpoint_to_return_download_link' into 11…
bisgaard-itis Jul 15, 2025
616c1d7
add export_as input
bisgaard-itis Jul 15, 2025
9a2c13e
make project_id a kwargs
bisgaard-itis Jul 15, 2025
80253dc
add mock of director v2 endpoint
bisgaard-itis Jul 15, 2025
63d64c9
add fixture for mocking dirv2 rpc endpoint
bisgaard-itis Jul 15, 2025
3ff886a
finish implementing test
bisgaard-itis Jul 15, 2025
e6000ca
expose task endpoints
bisgaard-itis Jul 15, 2025
b9b239b
services/api-server version: 0.9.1 → 0.10.0
bisgaard-itis Jul 15, 2025
4ea610c
update openapi specs
bisgaard-itis Jul 15, 2025
633daf3
Merge branch 'master' into 114-expose-fileids-dirv2-and-logs-in-apise…
bisgaard-itis Jul 15, 2025
6a93f56
mock_registered_function_job -> mock_registered_project_function_job
bisgaard-itis Jul 15, 2025
a9d6f1b
mock_function_job -> mock_project_function_job
bisgaard-itis Jul 15, 2025
d8640c6
add fixtures for solver function jobs
bisgaard-itis Jul 15, 2025
98e2a85
also cover solver function job test case
bisgaard-itis Jul 15, 2025
a083ea7
fix in tests
bisgaard-itis Jul 15, 2025
fe07ac6
fix imports
bisgaard-itis Jul 16, 2025
556132c
fix tests in director-v2
bisgaard-itis Jul 16, 2025
c31e86a
Merge branch 'master' into 114-expose-fileids-dirv2-and-logs-in-apise…
bisgaard-itis Jul 16, 2025
8929879
@pcrespov use RPCInterfaceError
bisgaard-itis Jul 16, 2025
563c1a7
fix import
bisgaard-itis Jul 16, 2025
9a77864
move error models to servicelib
bisgaard-itis Jul 16, 2025
91eba98
fix unused argument pylint
bisgaard-itis Jul 16, 2025
f81d8b7
@wvangeit change handler name
bisgaard-itis Jul 17, 2025
6d71d32
update openapi specs
bisgaard-itis Jul 17, 2025
1b81707
move rpc name validation out of method @sanderegg
bisgaard-itis Jul 17, 2025
8ad62ba
@sanderegg analyze_pipeline -> validate_pipeline
bisgaard-itis Jul 17, 2025
0ef5ad6
@sanderegg move LOG_FILE_NAME to constants
bisgaard-itis Jul 17, 2025
7392a35
also validate pipeline in rpc case @sanderegg
bisgaard-itis Jul 17, 2025
446bd66
Merge branch 'master' into 114-expose-fileids-dirv2-and-logs-in-apise…
bisgaard-itis Jul 17, 2025
f358985
remove comments
bisgaard-itis Jul 17, 2025
e3ddb10
Merge branch 'master' into 114-expose-fileids-dirv2-and-logs-in-apise…
bisgaard-itis Jul 17, 2025
13bd472
fix imports
bisgaard-itis Jul 17, 2025
b1ff618
handle PipelineTaskMissingError
bisgaard-itis Jul 17, 2025
eacc504
Merge branch 'master' into 114-expose-fileids-dirv2-and-logs-in-apise…
bisgaard-itis Jul 17, 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
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

from ..basic_types import IDStr
from ..projects import ProjectID
from ..projects_nodes_io import NodeID
from ..projects_nodes_io import NodeID, SimcoreS3FileID
from ..projects_pipeline import ComputationTask
from ..users import UserID
from ..wallets import WalletInfo
Expand Down Expand Up @@ -126,6 +126,30 @@ class TaskLogFileGet(BaseModel):
] = None


class TaskLogFileIdGet(BaseModel):
task_id: NodeID
file_id: SimcoreS3FileID | None

model_config = ConfigDict(
json_schema_extra={
"examples": [
{
"task_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"file_id": "1c46752c-b096-11ea-a3c4-02420a00392e/3fa85f64-5717-4562-b3fc-2c963f66afa6/logs/task_logs.txt",
},
{
"task_id": "6ba7b810-9dad-11d1-80b4-00c04fd430c8",
"file_id": "1c46752c-b096-11ea-a3c4-02420a00392e/6ba7b810-9dad-11d1-80b4-00c04fd430c8/logs/debug.log",
},
{
"task_id": "6ba7b811-9dad-11d1-80b4-00c04fd430c8",
"file_id": None,
},
]
}
)


class TasksSelection(BaseModel):
nodes_ids: list[NodeID]

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from typing import Annotated

from common_library.errors_classes import OsparcErrorMixin
from pydantic import BaseModel, Field


Expand All @@ -15,3 +16,11 @@ class ErrorType(BaseModel):

class ErrorEnveloped(BaseModel):
error: ErrorType


class BaseRpcError(OsparcErrorMixin, Exception):
pass


class ComputationalTaskMissingError(BaseRpcError):
msg_template = "Computational run not found for project {project_id}"
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,17 @@ class AsyncJobResult(BaseModel):


class AsyncJobGet(BaseModel):
model_config = ConfigDict(
json_schema_extra={
"examples": [
{
"job_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"job_name": "export_data_task",
}
]
}
)

job_id: AsyncJobId
job_name: AsyncJobName

Expand All @@ -42,6 +53,18 @@ class AsyncJobAbort(BaseModel):
class AsyncJobFilter(AsyncJobFilterBase):
"""Data for controlling access to an async job"""

model_config = ConfigDict(
json_schema_extra={
"examples": [
{
"product_name": "osparc",
"user_id": 123,
"client_name": "web_client",
}
]
},
)

product_name: ProductName
user_id: UserID
client_name: Annotated[
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# pylint: disable=no-self-use
# pylint: disable=not-context-manager
# pylint: disable=protected-access
# pylint: disable=redefined-outer-name
# pylint: disable=unused-argument
# pylint: disable=unused-variable


from models_library.api_schemas_directorv2.computations import TaskLogFileIdGet
from models_library.projects import ProjectID
from pydantic import TypeAdapter, validate_call
from pytest_mock import MockType
from servicelib.rabbitmq._client_rpc import RabbitMQRPCClient


class DirectorV2SideEffects:
# pylint: disable=no-self-use
@validate_call(config={"arbitrary_types_allowed": True})
async def get_computation_task_log_file_ids(
self,
rpc_client: RabbitMQRPCClient | MockType,
*,
project_id: ProjectID,
) -> list[TaskLogFileIdGet]:
assert rpc_client
assert project_id

return TypeAdapter(list[TaskLogFileIdGet]).validate_python(
TaskLogFileIdGet.model_json_schema()["examples"],
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# pylint: disable=no-self-use
# pylint: disable=not-context-manager
# pylint: disable=protected-access
# pylint: disable=redefined-outer-name
# pylint: disable=unused-argument
# pylint: disable=unused-variable


from typing import Literal

from models_library.api_schemas_rpc_async_jobs.async_jobs import (
AsyncJobFilter,
AsyncJobGet,
)
from models_library.api_schemas_webserver.storage import PathToExport
from models_library.products import ProductName
from models_library.users import UserID
from pydantic import TypeAdapter, validate_call
from pytest_mock import MockType
from servicelib.rabbitmq._client_rpc import RabbitMQRPCClient


class StorageSideEffects:
# pylint: disable=no-self-use
@validate_call(config={"arbitrary_types_allowed": True})
async def start_export_data(
self,
rabbitmq_rpc_client: RabbitMQRPCClient | MockType,
*,
user_id: UserID,
product_name: ProductName,
paths_to_export: list[PathToExport],
export_as: Literal["path", "download_link"],
) -> tuple[AsyncJobGet, AsyncJobFilter]:
assert rabbitmq_rpc_client
assert user_id
assert product_name
assert paths_to_export
assert export_as

async_job_get = TypeAdapter(AsyncJobGet).validate_python(
AsyncJobGet.model_json_schema()["examples"][0],
)
async_job_filter = TypeAdapter(AsyncJobFilter).validate_python(
AsyncJobFilter.model_json_schema()["examples"][0],
)

return async_job_get, async_job_filter
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# pylint: disable=too-many-arguments
import logging

from models_library.api_schemas_directorv2 import (
DIRECTOR_V2_RPC_NAMESPACE,
)
from models_library.api_schemas_directorv2.computations import TaskLogFileIdGet
from models_library.projects import ProjectID
from models_library.rabbitmq_basic_types import RPCMethodName
from pydantic import TypeAdapter

from ....logging_utils import log_decorator
from ... import RabbitMQRPCClient

_logger = logging.getLogger(__name__)


_RPC_METHOD_NAME_ADAPTER: TypeAdapter[RPCMethodName] = TypeAdapter(RPCMethodName)


@log_decorator(_logger, level=logging.DEBUG)
async def get_computation_task_log_file_ids(
rabbitmq_rpc_client: RabbitMQRPCClient, *, project_id: ProjectID
) -> list[TaskLogFileIdGet]:
"""
Raises:
ComputationalTaskMissingError
"""
result = await rabbitmq_rpc_client.request(
DIRECTOR_V2_RPC_NAMESPACE,
_RPC_METHOD_NAME_ADAPTER.validate_python("get_computation_task_log_file_ids"),
project_id=project_id,
)
assert isinstance(result, list) # nosec
assert all(isinstance(item, TaskLogFileIdGet) for item in result) # nosec
return result
2 changes: 1 addition & 1 deletion services/api-server/VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0.9.1
0.10.0
Loading
Loading