diff --git a/temporalio/client/_impl.py b/temporalio/client/_impl.py index 3986f9e82..87440491a 100644 --- a/temporalio/client/_impl.py +++ b/temporalio/client/_impl.py @@ -685,8 +685,9 @@ async def terminate_activity(self, input: TerminateActivityInput) -> None: namespace=self._client.namespace, activity_id=input.activity_id, run_id=input.activity_run_id or "", - reason=input.reason or "", identity=self._client.identity, + request_id=str(uuid.uuid4()), + reason=input.reason or "", ), retry=True, metadata=input.rpc_metadata, diff --git a/tests/test_activity_operator_commands_requests.py b/tests/test_activity_operator_commands_requests.py index f71f5566b..67e9dc78f 100644 --- a/tests/test_activity_operator_commands_requests.py +++ b/tests/test_activity_operator_commands_requests.py @@ -2,6 +2,7 @@ from __future__ import annotations +import uuid from datetime import timedelta from typing import Any from unittest.mock import AsyncMock, Mock @@ -27,6 +28,10 @@ def __init__(self) -> None: "unpause", temporalio.api.workflowservice.v1.UnpauseActivityExecutionResponse(), ) + self.terminate_activity_execution = self._recorder( + "terminate", + temporalio.api.workflowservice.v1.TerminateActivityExecutionResponse(), + ) self.update_activity_execution_options = self._recorder( "update", temporalio.api.workflowservice.v1.UpdateActivityExecutionOptionsResponse( @@ -201,3 +206,18 @@ async def test_update_options_masks_only_changed_options( assert update.activity_options.start_to_close_timeout.ToTimedelta() == timedelta( seconds=90 ) + + +async def test_terminate_activity_sends_request_id_and_reason( + client: Client, captured: _CapturedService +): + handle = client.get_activity_handle("act-1") + await handle.terminate(reason="term-reason") + + req = captured.requests["terminate"] + assert req.activity_id == "act-1" + assert req.reason == "term-reason" + assert req.identity == "test-identity" + assert req.namespace == "test-namespace" + assert req.request_id + assert uuid.UUID(req.request_id)