Skip to content

Commit 9a01f15

Browse files
committed
add method for getting job which also checks parent resource
1 parent 0425414 commit 9a01f15

File tree

4 files changed

+59
-10
lines changed

4 files changed

+59
-10
lines changed

services/api-server/src/simcore_service_api_server/_service_jobs.py

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,13 @@
1717
PageMetaInfoLimitOffset,
1818
PageOffsetInt,
1919
)
20+
from models_library.rpc.webserver.projects import ProjectJobRpcGet
2021
from models_library.rpc_pagination import PageLimitInt
2122
from models_library.users import UserID
2223
from pydantic import HttpUrl
2324
from servicelib.logging_utils import log_context
2425

26+
from .models.api_resources import RelativeResourceName
2527
from .models.basic_types import NameValueTuple
2628
from .models.schemas.jobs import Job, JobID, JobInputs
2729
from .models.schemas.programs import Program
@@ -175,20 +177,31 @@ async def start_log_export(
175177
)
176178
return async_job_get
177179

180+
async def get_job(
181+
self, job_parent_resource_name: RelativeResourceName, job_id: JobID
182+
) -> ProjectJobRpcGet:
183+
"""This method can be used to check that the project exists and has the correct parent resource."""
184+
return await self._web_rpc_client.get_project_marked_as_job(
185+
product_name=self.product_name,
186+
user_id=self.user_id,
187+
project_uuid=job_id,
188+
job_parent_resource_name=job_parent_resource_name,
189+
)
190+
178191
async def delete_job_assets(
179-
self, solver_or_program: Solver | Program, project_id: ProjectID
192+
self, job_parent_resource_name: RelativeResourceName, job_id: JobID
180193
):
181194
"""Marks job project as hidden and deletes S3 assets associated it"""
182195
await self._web_rest_client.patch_project(
183-
project_id=project_id, patch_params=ProjectPatch(hidden=True)
196+
project_id=job_id, patch_params=ProjectPatch(hidden=True)
184197
)
185198
await self._storage_rest_client.delete_project_s3_assets(
186-
user_id=self.user_id, project_id=project_id
199+
user_id=self.user_id, project_id=job_id
187200
)
188201
await self._web_rpc_client.mark_project_as_job(
189202
product_name=self.product_name,
190203
user_id=self.user_id,
191-
project_uuid=project_id,
192-
job_parent_resource_name=solver_or_program.name,
204+
project_uuid=job_id,
205+
job_parent_resource_name=job_parent_resource_name,
193206
storage_data_deleted=True,
194207
)

services/api-server/src/simcore_service_api_server/api/routes/solvers_jobs.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -167,14 +167,17 @@ async def delete_job_assets(
167167
version: VersionStr,
168168
job_id: JobID,
169169
job_service: Annotated[JobService, Depends(get_job_service)],
170-
solver_service: Annotated[SolverService, Depends(get_solver_service)],
171170
):
172-
solver = await solver_service.get_solver(
173-
solver_key=solver_key,
174-
solver_version=version,
171+
job_parent_resource_name = compose_job_resource_name(solver_key, version, job_id)
172+
173+
# check that job exists and is accessible to user
174+
project_job_rpc_get = await job_service.get_job(
175+
job_parent_resource_name=job_parent_resource_name, job_id=job_id
175176
)
177+
assert project_job_rpc_get.uuid == job_id # nosec
178+
176179
await job_service.delete_job_assets(
177-
job_parent_resource_name=solver.name, project_id=job_id
180+
job_parent_resource_name=job_parent_resource_name, job_id=job_id
178181
)
179182

180183

services/api-server/src/simcore_service_api_server/exceptions/backend_errors.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,11 @@ class ServiceForbiddenAccessError(BaseBackEndError):
5757
status_code = status.HTTP_403_FORBIDDEN
5858

5959

60+
class JobForbiddenAccessError(BaseBackEndError):
61+
msg_template = "Forbidden access to job {project_id}"
62+
status_code = status.HTTP_403_FORBIDDEN
63+
64+
6065
class JobNotFoundError(BaseBackEndError):
6166
msg_template = "Could not get solver/study job {project_id}"
6267
status_code = status.HTTP_404_NOT_FOUND

services/api-server/src/simcore_service_api_server/services_rpc/wb_api_server.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,10 @@
6363
NotEnoughAvailableSeatsError,
6464
)
6565
from servicelib.rabbitmq.rpc_interfaces.webserver import projects as projects_rpc
66+
from servicelib.rabbitmq.rpc_interfaces.webserver.errors import (
67+
ProjectForbiddenRpcError,
68+
ProjectNotFoundRpcError,
69+
)
6670
from servicelib.rabbitmq.rpc_interfaces.webserver.functions import (
6771
functions_rpc_interface,
6872
)
@@ -83,6 +87,8 @@
8387
from ..exceptions.backend_errors import (
8488
CanNotCheckoutServiceIsNotRunningError,
8589
InsufficientNumberOfSeatsError,
90+
JobForbiddenAccessError,
91+
JobNotFoundError,
8692
LicensedItemCheckoutNotFoundError,
8793
)
8894
from ..exceptions.service_errors_utils import service_exception_mapper
@@ -253,6 +259,28 @@ async def mark_project_as_job(
253259
storage_data_deleted=storage_data_deleted,
254260
)
255261

262+
@_exception_mapper(
263+
rpc_exception_map={
264+
ProjectForbiddenRpcError: JobForbiddenAccessError,
265+
ProjectNotFoundRpcError: JobNotFoundError,
266+
}
267+
)
268+
async def get_project_marked_as_job(
269+
self,
270+
*,
271+
product_name: ProductName,
272+
user_id: UserID,
273+
project_uuid: ProjectID,
274+
job_parent_resource_name: RelativeResourceName,
275+
):
276+
return await projects_rpc.get_project_marked_as_job(
277+
rpc_client=self._client,
278+
product_name=product_name,
279+
user_id=user_id,
280+
project_uuid=project_uuid,
281+
job_parent_resource_name=job_parent_resource_name,
282+
)
283+
256284
async def list_projects_marked_as_jobs(
257285
self,
258286
*,

0 commit comments

Comments
 (0)