Skip to content

Commit 391ca3b

Browse files
add delete endpoint
1 parent 4c88efb commit 391ca3b

File tree

4 files changed

+81
-8
lines changed

4 files changed

+81
-8
lines changed

packages/service-library/src/servicelib/rabbitmq/rpc_interfaces/async_jobs/async_jobs.py

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
_logger = logging.getLogger(__name__)
3737

3838

39-
async def cancel(
39+
async def abort(
4040
rabbitmq_rpc_client: RabbitMQRPCClient,
4141
*,
4242
rpc_namespace: RPCNamespace,
@@ -45,7 +45,23 @@ async def cancel(
4545
) -> None:
4646
await rabbitmq_rpc_client.request(
4747
rpc_namespace,
48-
TypeAdapter(RPCMethodName).validate_python("cancel"),
48+
TypeAdapter(RPCMethodName).validate_python("abort"),
49+
job_id=job_id,
50+
job_id_data=job_id_data,
51+
timeout_s=_DEFAULT_TIMEOUT_S,
52+
)
53+
54+
55+
async def delete(
56+
rabbitmq_rpc_client: RabbitMQRPCClient,
57+
*,
58+
rpc_namespace: RPCNamespace,
59+
job_id: AsyncJobId,
60+
job_id_data: AsyncJobNameData,
61+
) -> None:
62+
await rabbitmq_rpc_client.request(
63+
rpc_namespace,
64+
TypeAdapter(RPCMethodName).validate_python("delete"),
4965
job_id=job_id,
5066
job_id_data=job_id_data,
5167
timeout_s=_DEFAULT_TIMEOUT_S,
@@ -222,7 +238,7 @@ async def wait_and_get_result(
222238
)
223239
except (TimeoutError, CancelledError) as error:
224240
try:
225-
await cancel(
241+
await abort(
226242
rabbitmq_rpc_client,
227243
rpc_namespace=rpc_namespace,
228244
job_id=job_id,
@@ -254,7 +270,7 @@ async def submit_and_wait(
254270
except (TimeoutError, CancelledError) as error:
255271
if async_job_rpc_get is not None:
256272
try:
257-
await cancel(
273+
await abort(
258274
rabbitmq_rpc_client,
259275
rpc_namespace=rpc_namespace,
260276
job_id=async_job_rpc_get.job_id,

services/storage/tests/unit/test_async_jobs.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ async def test_async_jobs_cancel(
264264
payload=60 * 10, # test hangs if not cancelled properly
265265
)
266266

267-
await async_jobs.cancel(
267+
await async_jobs.abort(
268268
storage_rabbitmq_rpc_client,
269269
rpc_namespace=STORAGE_RPC_NAMESPACE,
270270
job_id=async_job_get.job_id,

services/web/server/src/simcore_service_webserver/tasks/_rest.py

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,30 @@ async def get_async_job_status(request: web.Request) -> web.Response:
136136

137137
@routes.delete(
138138
_task_prefix + "/{task_id}",
139+
name="delete_async_job",
140+
)
141+
@login_required
142+
@permission_required("storage.files.*")
143+
@handle_export_data_exceptions
144+
async def delete_async_job(request: web.Request) -> web.Response:
145+
146+
_req_ctx = RequestContext.model_validate(request)
147+
148+
rabbitmq_rpc_client = get_rabbitmq_rpc_client(request.app)
149+
async_job_get = parse_request_path_parameters_as(_StorageAsyncJobId, request)
150+
await async_jobs.delete(
151+
rabbitmq_rpc_client=rabbitmq_rpc_client,
152+
rpc_namespace=STORAGE_RPC_NAMESPACE,
153+
job_id=async_job_get.task_id,
154+
job_id_data=AsyncJobNameData(
155+
user_id=_req_ctx.user_id, product_name=_req_ctx.product_name
156+
),
157+
)
158+
return web.Response(status=status.HTTP_204_NO_CONTENT)
159+
160+
161+
@routes.post(
162+
_task_prefix + "/{task_id}:abort",
139163
name="abort_async_job",
140164
)
141165
@login_required
@@ -147,7 +171,7 @@ async def abort_async_job(request: web.Request) -> web.Response:
147171

148172
rabbitmq_rpc_client = get_rabbitmq_rpc_client(request.app)
149173
async_job_get = parse_request_path_parameters_as(_StorageAsyncJobId, request)
150-
await async_jobs.cancel(
174+
await async_jobs.abort(
151175
rabbitmq_rpc_client=rabbitmq_rpc_client,
152176
rpc_namespace=STORAGE_RPC_NAMESPACE,
153177
job_id=async_job_get.task_id,

services/web/server/tests/unit/with_dbs/01/storage/test_storage.py

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -550,7 +550,40 @@ async def test_abort_async_jobs(
550550
_job_id = AsyncJobId(faker.uuid4())
551551
create_storage_rpc_client_mock(
552552
"simcore_service_webserver.tasks._rest",
553-
f"async_jobs.{async_jobs.cancel.__name__}",
553+
f"async_jobs.{async_jobs.abort.__name__}",
554+
backend_result_or_exception,
555+
)
556+
557+
response = await client.post(f"/{API_VERSION}/tasks/{_job_id}:abort")
558+
assert response.status == expected_status
559+
560+
561+
@pytest.mark.parametrize("user_role", _user_roles)
562+
@pytest.mark.parametrize(
563+
"backend_result_or_exception, expected_status",
564+
[
565+
(
566+
AsyncJobAbort(result=True, job_id=AsyncJobId(_faker.uuid4())),
567+
status.HTTP_204_NO_CONTENT,
568+
),
569+
(JobSchedulerError(exc=_faker.text()), status.HTTP_500_INTERNAL_SERVER_ERROR),
570+
(JobMissingError(job_id=_faker.uuid4()), status.HTTP_404_NOT_FOUND),
571+
],
572+
ids=lambda x: type(x).__name__,
573+
)
574+
async def test_delete_async_jobs(
575+
user_role: UserRole,
576+
logged_user: UserInfoDict,
577+
client: TestClient,
578+
create_storage_rpc_client_mock: Callable[[str, str, Any], None],
579+
faker: Faker,
580+
backend_result_or_exception: Any,
581+
expected_status: int,
582+
):
583+
_job_id = AsyncJobId(faker.uuid4())
584+
create_storage_rpc_client_mock(
585+
"simcore_service_webserver.tasks._rest",
586+
f"async_jobs.{async_jobs.delete.__name__}",
554587
backend_result_or_exception,
555588
)
556589

@@ -647,7 +680,7 @@ async def test_get_user_async_jobs(
647680
(
648681
"DELETE",
649682
"abort_href",
650-
async_jobs.cancel.__name__,
683+
async_jobs.abort.__name__,
651684
AsyncJobAbort(result=True, job_id=AsyncJobId(_faker.uuid4())),
652685
status.HTTP_204_NO_CONTENT,
653686
None,

0 commit comments

Comments
 (0)