From 14b391a3289b1f87a69590cb215943bc32ed3bec Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Nov 2024 12:28:44 -0800 Subject: [PATCH 01/24] Bump codecov/codecov-action from 4 to 5 (#753) Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 4 to 5. - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/v4...v5) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Signed-off-by: Elena Kolevska --- .github/workflows/build-push-to-main.yaml | 2 +- .github/workflows/build-tag.yaml | 2 +- .github/workflows/build.yaml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-push-to-main.yaml b/.github/workflows/build-push-to-main.yaml index 4b1382fa..f176144a 100644 --- a/.github/workflows/build-push-to-main.yaml +++ b/.github/workflows/build-push-to-main.yaml @@ -58,7 +58,7 @@ jobs: run: | tox -e py`echo "${{ matrix.python_ver }}" | sed 's/\.//g'` - name: Upload test coverage - uses: codecov/codecov-action@v4 + uses: codecov/codecov-action@v5 publish: needs: build if: github.event_name != 'pull_request' diff --git a/.github/workflows/build-tag.yaml b/.github/workflows/build-tag.yaml index 99bdb1c3..24628f55 100644 --- a/.github/workflows/build-tag.yaml +++ b/.github/workflows/build-tag.yaml @@ -61,7 +61,7 @@ jobs: run: | tox -e py`echo "${{ matrix.python_ver }}" | sed 's/\.//g'` - name: Upload test coverage - uses: codecov/codecov-action@v4 + uses: codecov/codecov-action@v5 publish: needs: build if: github.event_name != 'pull_request' diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 76c6c74d..806c9c88 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -64,4 +64,4 @@ jobs: run: | tox -e py`echo "${{ matrix.python_ver }}" | sed 's/\.//g'` - name: Upload test coverage - uses: codecov/codecov-action@v4 \ No newline at end of file + uses: codecov/codecov-action@v5 \ No newline at end of file From ef8a5cad83b9ffb3883ba9a37ac6d28b19218128 Mon Sep 17 00:00:00 2001 From: Fabian Martinez <46371672+famarting@users.noreply.github.com> Date: Tue, 3 Dec 2024 10:38:06 +0100 Subject: [PATCH 02/24] update durabletask to use fork Signed-off-by: Fabian Martinez <46371672+famarting@users.noreply.github.com> Signed-off-by: Elena Kolevska --- dev-requirements.txt | 2 +- ext/dapr-ext-workflow/setup.cfg | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dev-requirements.txt b/dev-requirements.txt index 15866725..4ca9f6fb 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -15,4 +15,4 @@ Flask>=1.1 # needed for auto fix ruff===0.2.2 # needed for dapr-ext-workflow -durabletask>=0.1.1a1 +durabletask-dapr >= 0.2.0a3 diff --git a/ext/dapr-ext-workflow/setup.cfg b/ext/dapr-ext-workflow/setup.cfg index 475b2bdf..8c292593 100644 --- a/ext/dapr-ext-workflow/setup.cfg +++ b/ext/dapr-ext-workflow/setup.cfg @@ -25,7 +25,7 @@ packages = find_namespace: include_package_data = True install_requires = dapr-dev >= 1.13.0rc1.dev - durabletask >= 0.1.1a1 + durabletask-dapr >= 0.2.0a3 [options.packages.find] include = From 0444d91de011327edb70d099478d7869911d87af Mon Sep 17 00:00:00 2001 From: Fabian Martinez <46371672+famarting@users.noreply.github.com> Date: Tue, 3 Dec 2024 10:38:43 +0100 Subject: [PATCH 03/24] add purge workflow function Signed-off-by: Fabian Martinez <46371672+famarting@users.noreply.github.com> Signed-off-by: Elena Kolevska --- .../dapr/ext/workflow/dapr_workflow_client.py | 14 ++++++++++++-- .../tests/test_workflow_client.py | 7 +++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/ext/dapr-ext-workflow/dapr/ext/workflow/dapr_workflow_client.py b/ext/dapr-ext-workflow/dapr/ext/workflow/dapr_workflow_client.py index 19f49981..50a03423 100644 --- a/ext/dapr-ext-workflow/dapr/ext/workflow/dapr_workflow_client.py +++ b/ext/dapr-ext-workflow/dapr/ext/workflow/dapr_workflow_client.py @@ -208,7 +208,7 @@ def raise_workflow_event( """ return self.__obj.raise_orchestration_event(instance_id, event_name, data=data) - def terminate_workflow(self, instance_id: str, *, output: Optional[Any] = None): + def terminate_workflow(self, instance_id: str, *, output: Optional[Any] = None, recursive: bool = True): """Terminates a running workflow instance and updates its runtime status to WorkflowRuntimeStatus.Terminated This method internally enqueues a "terminate" message in the task hub. When the task hub worker processes this message, it will update the runtime @@ -226,9 +226,10 @@ def terminate_workflow(self, instance_id: str, *, output: Optional[Any] = None): Args: instance_id: The ID of the workflow instance to terminate. output: The optional output to set for the terminated workflow instance. + recursive: The optional flag to terminate all child workflows. """ - return self.__obj.terminate_orchestration(instance_id, output=output) + return self.__obj.terminate_orchestration(instance_id, output=output, recursive=recursive) def pause_workflow(self, instance_id: str): """Suspends a workflow instance, halting processing of it until resume_workflow is used to @@ -246,3 +247,12 @@ def resume_workflow(self, instance_id: str): instance_id: The instance ID of the workflow to resume. """ return self.__obj.resume_orchestration(instance_id) + + def purge_workflow(self, instance_id: str, recursive: bool = True): + """Purge data from a workflow instance. + + Args: + instance_id: The instance ID of the workflow to purge. + recursive: The optional flag to also purge data from all child workflows. + """ + return self.__obj.purge_orchestration(instance_id, recursive) diff --git a/ext/dapr-ext-workflow/tests/test_workflow_client.py b/ext/dapr-ext-workflow/tests/test_workflow_client.py index 4a7f93b9..f52531da 100644 --- a/ext/dapr-ext-workflow/tests/test_workflow_client.py +++ b/ext/dapr-ext-workflow/tests/test_workflow_client.py @@ -26,6 +26,7 @@ mock_terminate_result = 'terminate001' mock_suspend_result = 'suspend001' mock_resume_result = 'resume001' +mock_purge_result = 'purge001' mockInstanceId = 'instance001' @@ -58,6 +59,9 @@ def suspend_orchestration(self, instance_id: str): def resume_orchestration(self, instance_id: str): return mock_resume_result + def purge_workflow(self, instance_id: str, recursive: bool = True): + return mock_purge_result + def _inner_get_orchestration_state(self, instance_id, state: client.OrchestrationStatus): return client.OrchestrationState( instance_id=instance_id, @@ -119,3 +123,6 @@ def test_client_functions(self): actual_resume_result = wfClient.resume_workflow(instance_id=mockInstanceId) assert actual_resume_result == mock_resume_result + + actual_purge_result = wfClient.purge_workflow(instance_id=mockInstanceId) + assert actual_purge_result == mock_purge_result From fd0a242741bd17fd15d97291ed7b6dbc81729ae1 Mon Sep 17 00:00:00 2001 From: Fabian Martinez <46371672+famarting@users.noreply.github.com> Date: Tue, 3 Dec 2024 12:14:15 +0100 Subject: [PATCH 04/24] support reuse id policy Signed-off-by: Fabian Martinez <46371672+famarting@users.noreply.github.com> Signed-off-by: Elena Kolevska --- examples/workflow/monitor.py | 1 + .../dapr/ext/workflow/dapr_workflow_client.py | 10 ++++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/examples/workflow/monitor.py b/examples/workflow/monitor.py index a6da1c7d..6bdb6cc3 100644 --- a/examples/workflow/monitor.py +++ b/examples/workflow/monitor.py @@ -69,6 +69,7 @@ def send_alert(ctx, message: str): except Exception: pass if not status or status.runtime_status.name != 'RUNNING': + # TODO update to use reuse_id_policy instance_id = wf_client.schedule_new_workflow( workflow=status_monitor_workflow, input=JobStatus(job_id=job_id, is_healthy=True), diff --git a/ext/dapr-ext-workflow/dapr/ext/workflow/dapr_workflow_client.py b/ext/dapr-ext-workflow/dapr/ext/workflow/dapr_workflow_client.py index 50a03423..229e59f5 100644 --- a/ext/dapr-ext-workflow/dapr/ext/workflow/dapr_workflow_client.py +++ b/ext/dapr-ext-workflow/dapr/ext/workflow/dapr_workflow_client.py @@ -15,9 +15,11 @@ from __future__ import annotations from datetime import datetime -from typing import Any, Optional, TypeVar +from typing import Any, Optional, TypeVar, Union + from durabletask import client +import durabletask.internal.orchestrator_service_pb2 as pb from dapr.ext.workflow.workflow_state import WorkflowState from dapr.ext.workflow.workflow_context import Workflow @@ -78,6 +80,7 @@ def schedule_new_workflow( input: Optional[TInput] = None, instance_id: Optional[str] = None, start_at: Optional[datetime] = None, + reuse_id_policy: Optional[pb.OrchestrationIdReusePolicy] = None, ) -> str: """Schedules a new workflow instance for execution. @@ -90,6 +93,8 @@ def schedule_new_workflow( start_at: The time when the workflow instance should start executing. If not specified or if a date-time in the past is specified, the workflow instance will be scheduled immediately. + reuse_id_policy: Optional policy to reuse the workflow id when there is a conflict with + an existing workflow instance. Returns: The ID of the scheduled workflow instance. @@ -100,9 +105,10 @@ def schedule_new_workflow( input=input, instance_id=instance_id, start_at=start_at, + reuse_id_policy=Union(reuse_id_policy), ) return self.__obj.schedule_new_orchestration( - workflow.__name__, input=input, instance_id=instance_id, start_at=start_at + workflow.__name__, input=input, instance_id=instance_id, start_at=start_at, reuse_id_policy=Union(reuse_id_policy), ) def get_workflow_state( From 2bc0b2988e487bb87d08864831d8b043f9956873 Mon Sep 17 00:00:00 2001 From: Fabian Martinez <46371672+famarting@users.noreply.github.com> Date: Tue, 3 Dec 2024 12:17:38 +0100 Subject: [PATCH 05/24] support set custom status Signed-off-by: Fabian Martinez <46371672+famarting@users.noreply.github.com> Signed-off-by: Elena Kolevska --- examples/workflow/task_chaining.py | 1 + .../dapr/ext/workflow/dapr_workflow_context.py | 4 ++++ ext/dapr-ext-workflow/dapr/ext/workflow/workflow_context.py | 6 ++++++ 3 files changed, 11 insertions(+) diff --git a/examples/workflow/task_chaining.py b/examples/workflow/task_chaining.py index c24e340c..c67308d5 100644 --- a/examples/workflow/task_chaining.py +++ b/examples/workflow/task_chaining.py @@ -27,6 +27,7 @@ def task_chain_workflow(ctx: wf.DaprWorkflowContext, wf_input: int): except Exception as e: yield ctx.call_activity(error_handler, input=str(e)) raise + # TODO update to set custom status return [result1, result2, result3] diff --git a/ext/dapr-ext-workflow/dapr/ext/workflow/dapr_workflow_context.py b/ext/dapr-ext-workflow/dapr/ext/workflow/dapr_workflow_context.py index dbcccd64..2dee46fe 100644 --- a/ext/dapr-ext-workflow/dapr/ext/workflow/dapr_workflow_context.py +++ b/ext/dapr-ext-workflow/dapr/ext/workflow/dapr_workflow_context.py @@ -53,6 +53,10 @@ def current_utc_datetime(self) -> datetime: def is_replaying(self) -> bool: return self.__obj.is_replaying + def set_custom_status(self, custom_status: str) -> None: + self._logger.debug(f'{self.instance_id}: Setting custom status to {custom_status}') + self.__obj.set_custom_status(custom_status) + def create_timer(self, fire_at: Union[datetime, timedelta]) -> task.Task: self._logger.debug(f'{self.instance_id}: Creating timer to fire at {fire_at} time') return self.__obj.create_timer(fire_at) diff --git a/ext/dapr-ext-workflow/dapr/ext/workflow/workflow_context.py b/ext/dapr-ext-workflow/dapr/ext/workflow/workflow_context.py index e0e3c736..36674236 100644 --- a/ext/dapr-ext-workflow/dapr/ext/workflow/workflow_context.py +++ b/ext/dapr-ext-workflow/dapr/ext/workflow/workflow_context.py @@ -84,6 +84,12 @@ def is_replaying(self) -> bool: """ pass + @abstractmethod + def set_custom_status(self, custom_status: str) -> None: + """Set the custom status. + """ + pass + @abstractmethod def create_timer(self, fire_at: Union[datetime, timedelta]) -> task.Task: """Create a Timer Task to fire after at the specified deadline. From ef88403bb5328aef58f95ad0d7b24fbd7636524e Mon Sep 17 00:00:00 2001 From: Fabian Martinez <46371672+famarting@users.noreply.github.com> Date: Wed, 4 Dec 2024 10:28:40 +0100 Subject: [PATCH 06/24] Update ext/dapr-ext-workflow/dapr/ext/workflow/dapr_workflow_client.py Co-authored-by: Elena Kolevska Signed-off-by: Fabian Martinez <46371672+famarting@users.noreply.github.com> Signed-off-by: Elena Kolevska --- ext/dapr-ext-workflow/dapr/ext/workflow/dapr_workflow_client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/dapr-ext-workflow/dapr/ext/workflow/dapr_workflow_client.py b/ext/dapr-ext-workflow/dapr/ext/workflow/dapr_workflow_client.py index 229e59f5..6169c4b8 100644 --- a/ext/dapr-ext-workflow/dapr/ext/workflow/dapr_workflow_client.py +++ b/ext/dapr-ext-workflow/dapr/ext/workflow/dapr_workflow_client.py @@ -105,7 +105,7 @@ def schedule_new_workflow( input=input, instance_id=instance_id, start_at=start_at, - reuse_id_policy=Union(reuse_id_policy), + reuse_id_policy=reuse_id_policy, ) return self.__obj.schedule_new_orchestration( workflow.__name__, input=input, instance_id=instance_id, start_at=start_at, reuse_id_policy=Union(reuse_id_policy), From e7a05b6ee76101b406711e06305eac229cb53459 Mon Sep 17 00:00:00 2001 From: Fabian Martinez <46371672+famarting@users.noreply.github.com> Date: Wed, 4 Dec 2024 10:28:48 +0100 Subject: [PATCH 07/24] Update ext/dapr-ext-workflow/dapr/ext/workflow/dapr_workflow_client.py Co-authored-by: Elena Kolevska Signed-off-by: Fabian Martinez <46371672+famarting@users.noreply.github.com> Signed-off-by: Elena Kolevska --- ext/dapr-ext-workflow/dapr/ext/workflow/dapr_workflow_client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/dapr-ext-workflow/dapr/ext/workflow/dapr_workflow_client.py b/ext/dapr-ext-workflow/dapr/ext/workflow/dapr_workflow_client.py index 6169c4b8..0d4fb99e 100644 --- a/ext/dapr-ext-workflow/dapr/ext/workflow/dapr_workflow_client.py +++ b/ext/dapr-ext-workflow/dapr/ext/workflow/dapr_workflow_client.py @@ -108,7 +108,7 @@ def schedule_new_workflow( reuse_id_policy=reuse_id_policy, ) return self.__obj.schedule_new_orchestration( - workflow.__name__, input=input, instance_id=instance_id, start_at=start_at, reuse_id_policy=Union(reuse_id_policy), + workflow.__name__, input=input, instance_id=instance_id, start_at=start_at, reuse_id_policy=reuse_id_policy, ) def get_workflow_state( From ffadfbd67204d7691318ec2b7c75860b21cc4465 Mon Sep 17 00:00:00 2001 From: Fabian Martinez <46371672+famarting@users.noreply.github.com> Date: Wed, 4 Dec 2024 10:29:08 +0100 Subject: [PATCH 08/24] Update ext/dapr-ext-workflow/tests/test_workflow_client.py Co-authored-by: Elena Kolevska Signed-off-by: Fabian Martinez <46371672+famarting@users.noreply.github.com> Signed-off-by: Elena Kolevska --- ext/dapr-ext-workflow/tests/test_workflow_client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/dapr-ext-workflow/tests/test_workflow_client.py b/ext/dapr-ext-workflow/tests/test_workflow_client.py index f52531da..e883cc7f 100644 --- a/ext/dapr-ext-workflow/tests/test_workflow_client.py +++ b/ext/dapr-ext-workflow/tests/test_workflow_client.py @@ -59,7 +59,7 @@ def suspend_orchestration(self, instance_id: str): def resume_orchestration(self, instance_id: str): return mock_resume_result - def purge_workflow(self, instance_id: str, recursive: bool = True): + def purge_orchestration(self, instance_id: str, recursive: bool = True): return mock_purge_result def _inner_get_orchestration_state(self, instance_id, state: client.OrchestrationStatus): From c9807d21a93c85dc78b297c7a6c75dac359ba82e Mon Sep 17 00:00:00 2001 From: Fabian Martinez <46371672+famarting@users.noreply.github.com> Date: Wed, 4 Dec 2024 10:29:16 +0100 Subject: [PATCH 09/24] Update ext/dapr-ext-workflow/dapr/ext/workflow/dapr_workflow_client.py Co-authored-by: Elena Kolevska Signed-off-by: Fabian Martinez <46371672+famarting@users.noreply.github.com> Signed-off-by: Elena Kolevska --- ext/dapr-ext-workflow/dapr/ext/workflow/dapr_workflow_client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/dapr-ext-workflow/dapr/ext/workflow/dapr_workflow_client.py b/ext/dapr-ext-workflow/dapr/ext/workflow/dapr_workflow_client.py index 0d4fb99e..23012cfb 100644 --- a/ext/dapr-ext-workflow/dapr/ext/workflow/dapr_workflow_client.py +++ b/ext/dapr-ext-workflow/dapr/ext/workflow/dapr_workflow_client.py @@ -15,7 +15,7 @@ from __future__ import annotations from datetime import datetime -from typing import Any, Optional, TypeVar, Union +from typing import Any, Optional, TypeVar from durabletask import client From 55ce30cb25e78b41072d16459ad6c7d216e043a5 Mon Sep 17 00:00:00 2001 From: Fabian Martinez <46371672+famarting@users.noreply.github.com> Date: Wed, 4 Dec 2024 10:34:26 +0100 Subject: [PATCH 10/24] update test, grpc version and lint Signed-off-by: Fabian Martinez <46371672+famarting@users.noreply.github.com> Signed-off-by: Elena Kolevska --- .../dapr/ext/workflow/dapr_workflow_client.py | 10 ++++++++-- .../dapr/ext/workflow/workflow_context.py | 3 +-- .../tests/test_dapr_workflow_context.py | 8 ++++++++ setup.cfg | 4 ++-- tools/requirements.txt | 2 +- 5 files changed, 20 insertions(+), 7 deletions(-) diff --git a/ext/dapr-ext-workflow/dapr/ext/workflow/dapr_workflow_client.py b/ext/dapr-ext-workflow/dapr/ext/workflow/dapr_workflow_client.py index 23012cfb..b9865344 100644 --- a/ext/dapr-ext-workflow/dapr/ext/workflow/dapr_workflow_client.py +++ b/ext/dapr-ext-workflow/dapr/ext/workflow/dapr_workflow_client.py @@ -108,7 +108,11 @@ def schedule_new_workflow( reuse_id_policy=reuse_id_policy, ) return self.__obj.schedule_new_orchestration( - workflow.__name__, input=input, instance_id=instance_id, start_at=start_at, reuse_id_policy=reuse_id_policy, + workflow.__name__, + input=input, + instance_id=instance_id, + start_at=start_at, + reuse_id_policy=reuse_id_policy, ) def get_workflow_state( @@ -214,7 +218,9 @@ def raise_workflow_event( """ return self.__obj.raise_orchestration_event(instance_id, event_name, data=data) - def terminate_workflow(self, instance_id: str, *, output: Optional[Any] = None, recursive: bool = True): + def terminate_workflow( + self, instance_id: str, *, output: Optional[Any] = None, recursive: bool = True + ): """Terminates a running workflow instance and updates its runtime status to WorkflowRuntimeStatus.Terminated This method internally enqueues a "terminate" message in the task hub. When the task hub worker processes this message, it will update the runtime diff --git a/ext/dapr-ext-workflow/dapr/ext/workflow/workflow_context.py b/ext/dapr-ext-workflow/dapr/ext/workflow/workflow_context.py index 36674236..b4c85f6a 100644 --- a/ext/dapr-ext-workflow/dapr/ext/workflow/workflow_context.py +++ b/ext/dapr-ext-workflow/dapr/ext/workflow/workflow_context.py @@ -86,8 +86,7 @@ def is_replaying(self) -> bool: @abstractmethod def set_custom_status(self, custom_status: str) -> None: - """Set the custom status. - """ + """Set the custom status.""" pass @abstractmethod diff --git a/ext/dapr-ext-workflow/tests/test_dapr_workflow_context.py b/ext/dapr-ext-workflow/tests/test_dapr_workflow_context.py index 6b3c9ad3..9fdfe044 100644 --- a/ext/dapr-ext-workflow/tests/test_dapr_workflow_context.py +++ b/ext/dapr-ext-workflow/tests/test_dapr_workflow_context.py @@ -25,11 +25,13 @@ mock_create_timer = 'create_timer' mock_call_activity = 'call_activity' mock_call_sub_orchestrator = 'call_sub_orchestrator' +mock_custom_status = 'custom_status' class FakeOrchestrationContext: def __init__(self): self.instance_id = mock_instance_id + self.custom_status = None def create_timer(self, fire_at): return mock_create_timer @@ -40,6 +42,9 @@ def call_activity(self, activity, input): def call_sub_orchestrator(self, orchestrator, input, instance_id): return mock_call_sub_orchestrator + def set_custom_status(self, custom_status): + self.custom_status = custom_status + class DaprWorkflowContextTest(unittest.TestCase): def mock_client_activity(ctx: WorkflowActivityContext, input): @@ -65,3 +70,6 @@ def test_workflow_context_functions(self): create_timer_result = dapr_wf_ctx.create_timer(mock_date_time) assert create_timer_result == mock_create_timer + + dapr_wf_ctx.set_custom_status(mock_custom_status) + assert fakeContext.custom_status == mock_custom_status diff --git a/setup.cfg b/setup.cfg index 87c00f36..740c3661 100644 --- a/setup.cfg +++ b/setup.cfg @@ -26,8 +26,8 @@ include_package_data = True zip_safe = False install_requires = protobuf >= 4.22 - grpcio >= 1.37.0 - grpcio-status>=1.37.0 + grpcio >= 1.67.0 + grpcio-status>=1.67.0 aiohttp >= 3.9.0b0 python-dateutil >= 2.8.1 typing-extensions>=4.4.0 diff --git a/tools/requirements.txt b/tools/requirements.txt index d3d503c9..e528d98b 100644 --- a/tools/requirements.txt +++ b/tools/requirements.txt @@ -1 +1 @@ -grpcio-tools>=1.57.0 +grpcio-tools>=1.67.0 From f492e36bcd2755a83f245452b31227afcb663916 Mon Sep 17 00:00:00 2001 From: Elena Kolevska Date: Wed, 4 Dec 2024 17:56:43 +0000 Subject: [PATCH 11/24] Adds missing arguments in FakeTaskHubGrpcClient Signed-off-by: Elena Kolevska --- .../tests/test_workflow_client.py | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/ext/dapr-ext-workflow/tests/test_workflow_client.py b/ext/dapr-ext-workflow/tests/test_workflow_client.py index e883cc7f..294e7542 100644 --- a/ext/dapr-ext-workflow/tests/test_workflow_client.py +++ b/ext/dapr-ext-workflow/tests/test_workflow_client.py @@ -20,6 +20,7 @@ from unittest import mock from dapr.ext.workflow.dapr_workflow_client import DaprWorkflowClient from durabletask import client +import durabletask.internal.orchestrator_service_pb2 as pb mock_schedule_result = 'workflow001' mock_raise_event_result = 'event001' @@ -27,11 +28,11 @@ mock_suspend_result = 'suspend001' mock_resume_result = 'resume001' mock_purge_result = 'purge001' -mockInstanceId = 'instance001' +mock_instance_id = 'instance001' class FakeTaskHubGrpcClient: - def schedule_new_orchestration(self, workflow, input, instance_id, start_at): + def schedule_new_orchestration(self, workflow, input, instance_id, start_at, reuse_id_policy: Union[pb.OrchestrationIdReusePolicy, None] = None): return mock_schedule_result def get_orchestration_state(self, instance_id, fetch_payloads): @@ -50,7 +51,7 @@ def raise_orchestration_event( ): return mock_raise_event_result - def terminate_orchestration(self, instance_id: str, *, output: Union[Any, None] = None): + def terminate_orchestration(self, instance_id: str, *, output: Union[Any, None] = None, recursive: bool = True): return mock_terminate_result def suspend_orchestration(self, instance_id: str): @@ -91,38 +92,38 @@ def test_client_functions(self): assert actual_schedule_result == mock_schedule_result actual_get_result = wfClient.get_workflow_state( - instance_id=mockInstanceId, fetch_payloads=True + instance_id=mock_instance_id, fetch_payloads=True ) assert actual_get_result.runtime_status.name == 'PENDING' - assert actual_get_result.instance_id == mockInstanceId + assert actual_get_result.instance_id == mock_instance_id actual_wait_start_result = wfClient.wait_for_workflow_start( - instance_id=mockInstanceId, timeout_in_seconds=30 + instance_id=mock_instance_id, timeout_in_seconds=30 ) assert actual_wait_start_result.runtime_status.name == 'RUNNING' - assert actual_wait_start_result.instance_id == mockInstanceId + assert actual_wait_start_result.instance_id == mock_instance_id actual_wait_completion_result = wfClient.wait_for_workflow_completion( - instance_id=mockInstanceId, timeout_in_seconds=30 + instance_id=mock_instance_id, timeout_in_seconds=30 ) assert actual_wait_completion_result.runtime_status.name == 'COMPLETED' - assert actual_wait_completion_result.instance_id == mockInstanceId + assert actual_wait_completion_result.instance_id == mock_instance_id actual_raise_event_result = wfClient.raise_workflow_event( - instance_id=mockInstanceId, event_name='test_event', data='test_data' + instance_id=mock_instance_id, event_name='test_event', data='test_data' ) assert actual_raise_event_result == mock_raise_event_result actual_terminate_result = wfClient.terminate_workflow( - instance_id=mockInstanceId, output='test_output' + instance_id=mock_instance_id, output='test_output' ) assert actual_terminate_result == mock_terminate_result - actual_suspend_result = wfClient.pause_workflow(instance_id=mockInstanceId) + actual_suspend_result = wfClient.pause_workflow(instance_id=mock_instance_id) assert actual_suspend_result == mock_suspend_result - actual_resume_result = wfClient.resume_workflow(instance_id=mockInstanceId) + actual_resume_result = wfClient.resume_workflow(instance_id=mock_instance_id) assert actual_resume_result == mock_resume_result - actual_purge_result = wfClient.purge_workflow(instance_id=mockInstanceId) + actual_purge_result = wfClient.purge_workflow(instance_id=mock_instance_id) assert actual_purge_result == mock_purge_result From b70bc83e2588d40b05b18e849bcf168f73e46a0f Mon Sep 17 00:00:00 2001 From: Elena Kolevska Date: Wed, 4 Dec 2024 17:59:01 +0000 Subject: [PATCH 12/24] linter Signed-off-by: Elena Kolevska --- ext/dapr-ext-workflow/tests/test_workflow_client.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/ext/dapr-ext-workflow/tests/test_workflow_client.py b/ext/dapr-ext-workflow/tests/test_workflow_client.py index 294e7542..e1c9b772 100644 --- a/ext/dapr-ext-workflow/tests/test_workflow_client.py +++ b/ext/dapr-ext-workflow/tests/test_workflow_client.py @@ -32,7 +32,14 @@ class FakeTaskHubGrpcClient: - def schedule_new_orchestration(self, workflow, input, instance_id, start_at, reuse_id_policy: Union[pb.OrchestrationIdReusePolicy, None] = None): + def schedule_new_orchestration( + self, + workflow, + input, + instance_id, + start_at, + reuse_id_policy: Union[pb.OrchestrationIdReusePolicy, None] = None, + ): return mock_schedule_result def get_orchestration_state(self, instance_id, fetch_payloads): @@ -51,7 +58,9 @@ def raise_orchestration_event( ): return mock_raise_event_result - def terminate_orchestration(self, instance_id: str, *, output: Union[Any, None] = None, recursive: bool = True): + def terminate_orchestration( + self, instance_id: str, *, output: Union[Any, None] = None, recursive: bool = True + ): return mock_terminate_result def suspend_orchestration(self, instance_id: str): From cb4cb35c3d0098c06430cc55bb87fe1edd65d723 Mon Sep 17 00:00:00 2001 From: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Date: Thu, 19 Dec 2024 10:19:55 -0500 Subject: [PATCH 13/24] remove alpha for workflow stable release (#760) Signed-off-by: Hannah Hunter Signed-off-by: Elena Kolevska --- .../python-workflow-ext/python-workflow.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/daprdocs/content/en/python-sdk-docs/python-sdk-extensions/python-workflow-ext/python-workflow.md b/daprdocs/content/en/python-sdk-docs/python-sdk-extensions/python-workflow-ext/python-workflow.md index 984b2cb8..17f45ec4 100644 --- a/daprdocs/content/en/python-sdk-docs/python-sdk-extensions/python-workflow-ext/python-workflow.md +++ b/daprdocs/content/en/python-sdk-docs/python-sdk-extensions/python-workflow-ext/python-workflow.md @@ -6,10 +6,6 @@ weight: 30000 description: How to get up and running with workflows using the Dapr Python SDK --- -{{% alert title="Note" color="primary" %}} -Dapr Workflow is currently in alpha. -{{% /alert %}} - Let’s create a Dapr workflow and invoke it using the console. With the [provided hello world workflow example](https://github.com/dapr/python-sdk/tree/master/examples/demo_workflow), you will: - Run a [Python console application using `DaprClient`](https://github.com/dapr/python-sdk/blob/master/examples/demo_workflow/app.py) From 83f3329fc8276fe4aba4dbeef7550bd7397d74dd Mon Sep 17 00:00:00 2001 From: Eric Searcy Date: Thu, 19 Dec 2024 07:36:44 -0800 Subject: [PATCH 14/24] Replace deprecated tox.ini option (#762) This option was replaced in 2020, deprecated, and eventually removed in tox 4. The correct option already appears elseware in this tox.ini file. This fix is necessary to run `tox -e doc` per the README.md instructions on tox 4. Signed-off-by: Eric Searcy Co-authored-by: Elena Kolevska Signed-off-by: Elena Kolevska --- tox.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index 78f23086..5e7a2539 100644 --- a/tox.ini +++ b/tox.ini @@ -88,7 +88,7 @@ commands_pre = [testenv:doc] basepython = python3 usedevelop = False -whitelist_externals = make +allowlist_externals = make deps = sphinx commands = sphinx-apidoc -E -o docs/actor dapr/actor From 55a4d1f2df82cf27259eef913b5ed431b8194114 Mon Sep 17 00:00:00 2001 From: Lorenzo Curcio Date: Thu, 2 Jan 2025 13:25:25 +0100 Subject: [PATCH 15/24] Add Actor Mocks (#750) * Moved files to new branch to avoid weird git bug Signed-off-by: Lorenzo Curcio * requested documentation changes Signed-off-by: Lorenzo Curcio * forgot to move file back to starting point Signed-off-by: Lorenzo Curcio * result of ruff format Signed-off-by: Lorenzo Curcio * fixed minor formatting issues, fixed type issues Signed-off-by: Lorenzo Curcio * minor test fix Signed-off-by: Lorenzo Curcio * fixes try_add_state Signed-off-by: Elena Kolevska Signed-off-by: Lorenzo Curcio * Revert "fixes try_add_state" This reverts commit 254ad17bfb184310b2ceae37c1eb82c947466ce6. Signed-off-by: Lorenzo Curcio * Update dapr/actor/runtime/mock_state_manager.py Fixing bug in try_add_state as mentioned in PR #756 Co-authored-by: Elena Kolevska Signed-off-by: Lorenzo Curcio Signed-off-by: Lorenzo Curcio * Update dapr/actor/runtime/mock_actor.py Whoops missed this Co-authored-by: Elena Kolevska Signed-off-by: Lorenzo Curcio * Update daprdocs/content/en/python-sdk-docs/python-actor.md Co-authored-by: Elena Kolevska Signed-off-by: Lorenzo Curcio * Update daprdocs/content/en/python-sdk-docs/python-actor.md Co-authored-by: Elena Kolevska Signed-off-by: Lorenzo Curcio * Update daprdocs/content/en/python-sdk-docs/python-actor.md Co-authored-by: Elena Kolevska Signed-off-by: Lorenzo Curcio * Update daprdocs/content/en/python-sdk-docs/python-actor.md Co-authored-by: Elena Kolevska Signed-off-by: Lorenzo Curcio * Update daprdocs/content/en/python-sdk-docs/python-actor.md Co-authored-by: Elena Kolevska Signed-off-by: Lorenzo Curcio * Update daprdocs/content/en/python-sdk-docs/python-actor.md Co-authored-by: Elena Kolevska Signed-off-by: Lorenzo Curcio * Update daprdocs/content/en/python-sdk-docs/python-actor.md Co-authored-by: Elena Kolevska Signed-off-by: Lorenzo Curcio * minor error in docs Signed-off-by: Lorenzo Curcio * fixed and added more unit tests. Added example Signed-off-by: Lorenzo Curcio * unittest fix Signed-off-by: Lorenzo Curcio * Update examples/demo_actor/README.md Co-authored-by: Elena Kolevska Signed-off-by: Lorenzo Curcio * concentrated some tests Signed-off-by: Lorenzo Curcio * removed unnecessary type hint Signed-off-by: Lorenzo Curcio * Update daprdocs/content/en/python-sdk-docs/python-actor.md didnt see this earlier whoops Co-authored-by: Elena Kolevska Signed-off-by: Lorenzo Curcio * Update examples/demo_actor/README.md Co-authored-by: Elena Kolevska Signed-off-by: Lorenzo Curcio * documentation changes Signed-off-by: Lorenzo Curcio * now requires #type: ignore Signed-off-by: Lorenzo Curcio * small docs change Signed-off-by: Elena Kolevska * examples test fix Signed-off-by: Elena Kolevska --------- Signed-off-by: Lorenzo Curcio Signed-off-by: Lorenzo Curcio Signed-off-by: Elena Kolevska Co-authored-by: Elena Kolevska Co-authored-by: Lorenzo Curcio Co-authored-by: Elena Kolevska Signed-off-by: Elena Kolevska --- dapr/actor/runtime/mock_actor.py | 122 +++++++ dapr/actor/runtime/mock_state_manager.py | 238 +++++++++++++ dapr/actor/runtime/state_manager.py | 5 +- .../en/python-sdk-docs/python-actor.md | 71 +++- docs/clients/clients.grpc.rst | 31 ++ docs/proto/proto.runtime.rst | 18 + docs/proto/proto.runtime.v1.rst | 37 +++ examples/demo_actor/README.md | 55 +++ .../demo_actor/demo_actor/test_demo_actor.py | 40 +++ tests/actor/test_mock_actor.py | 314 ++++++++++++++++++ tests/actor/test_mock_state_manager.py | 73 ++++ 11 files changed, 1000 insertions(+), 4 deletions(-) create mode 100644 dapr/actor/runtime/mock_actor.py create mode 100644 dapr/actor/runtime/mock_state_manager.py create mode 100644 docs/clients/clients.grpc.rst create mode 100644 docs/proto/proto.runtime.rst create mode 100644 docs/proto/proto.runtime.v1.rst create mode 100644 examples/demo_actor/demo_actor/test_demo_actor.py create mode 100644 tests/actor/test_mock_actor.py create mode 100644 tests/actor/test_mock_state_manager.py diff --git a/dapr/actor/runtime/mock_actor.py b/dapr/actor/runtime/mock_actor.py new file mode 100644 index 00000000..e35baac5 --- /dev/null +++ b/dapr/actor/runtime/mock_actor.py @@ -0,0 +1,122 @@ +""" +Copyright 2023 The Dapr Authors +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +""" + +from __future__ import annotations + +from datetime import timedelta +from typing import Any, Optional, TypeVar + +from dapr.actor.id import ActorId +from dapr.actor.runtime._reminder_data import ActorReminderData +from dapr.actor.runtime._timer_data import TIMER_CALLBACK, ActorTimerData +from dapr.actor.runtime.actor import Actor +from dapr.actor.runtime.mock_state_manager import MockStateManager + + +class MockActor(Actor): + """A mock actor class to be used to override certain Actor methods for unit testing. + To be used only via the create_mock_actor function, which takes in a class and returns a + mock actor object for that class. + + Examples: + class SomeActorInterface(ActorInterface): + @actor_method(name="method") + async def set_state(self, data: dict) -> None: + + class SomeActor(Actor, SomeActorInterface): + async def set_state(self, data: dict) -> None: + await self._state_manager.set_state('state', data) + await self._state_manager.save_state() + + mock_actor = create_mock_actor(SomeActor, "actor_1") + assert mock_actor._state_manager._mock_state == {} + await mock_actor.set_state({"test":10}) + assert mock_actor._state_manager._mock_state == {"test":10} + """ + + def __init__(self, actor_id: str, initstate: Optional[dict]): + self.id = ActorId(actor_id) + self._runtime_ctx = None # type: ignore + self._state_manager = MockStateManager(self, initstate) + + async def register_timer( + self, + name: Optional[str], + callback: TIMER_CALLBACK, + state: Any, + due_time: timedelta, + period: timedelta, + ttl: Optional[timedelta] = None, + ) -> None: + """Adds actor timer to self._state_manager._mock_timers. + Args: + name (str): the name of the timer to register. + callback (Callable): An awaitable callable which will be called when the timer fires. + state (Any): An object which will pass to the callback method, or None. + due_time (datetime.timedelta): the amount of time to delay before the awaitable + callback is first invoked. + period (datetime.timedelta): the time interval between invocations + of the awaitable callback. + ttl (Optional[datetime.timedelta]): the time interval before the timer stops firing + """ + name = name or self.__get_new_timer_name() + timer = ActorTimerData(name, callback, state, due_time, period, ttl) + self._state_manager._mock_timers[name] = timer # type: ignore + + async def unregister_timer(self, name: str) -> None: + """Unregisters actor timer from self._state_manager._mock_timers. + + Args: + name (str): the name of the timer to unregister. + """ + self._state_manager._mock_timers.pop(name, None) # type: ignore + + async def register_reminder( + self, + name: str, + state: bytes, + due_time: timedelta, + period: timedelta, + ttl: Optional[timedelta] = None, + ) -> None: + """Adds actor reminder to self._state_manager._mock_reminders. + + Args: + name (str): the name of the reminder to register. the name must be unique per actor. + state (bytes): the user state passed to the reminder invocation. + due_time (datetime.timedelta): the amount of time to delay before invoking the reminder + for the first time. + period (datetime.timedelta): the time interval between reminder invocations after + the first invocation. + ttl (datetime.timedelta): the time interval before the reminder stops firing + """ + reminder = ActorReminderData(name, state, due_time, period, ttl) + self._state_manager._mock_reminders[name] = reminder # type: ignore + + async def unregister_reminder(self, name: str) -> None: + """Unregisters actor reminder from self._state_manager._mock_reminders.. + + Args: + name (str): the name of the reminder to unregister. + """ + self._state_manager._mock_reminders.pop(name, None) # type: ignore + + +T = TypeVar('T', bound=Actor) + + +def create_mock_actor(cls1: type[T], actor_id: str, initstate: Optional[dict] = None) -> T: + class MockSuperClass(MockActor, cls1): # type: ignore + pass + + return MockSuperClass(actor_id, initstate) # type: ignore diff --git a/dapr/actor/runtime/mock_state_manager.py b/dapr/actor/runtime/mock_state_manager.py new file mode 100644 index 00000000..bcac6d95 --- /dev/null +++ b/dapr/actor/runtime/mock_state_manager.py @@ -0,0 +1,238 @@ +""" +Copyright 2023 The Dapr Authors +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +""" + +import asyncio +from contextvars import ContextVar +from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, Tuple, TypeVar + +from dapr.actor.runtime._reminder_data import ActorReminderData +from dapr.actor.runtime._timer_data import ActorTimerData +from dapr.actor.runtime.state_change import ActorStateChange, StateChangeKind +from dapr.actor.runtime.state_manager import ActorStateManager, StateMetadata + +if TYPE_CHECKING: + from dapr.actor.runtime.mock_actor import MockActor + +T = TypeVar('T') +CONTEXT: ContextVar[Optional[Dict[str, Any]]] = ContextVar('state_tracker_context') + + +class MockStateManager(ActorStateManager): + def __init__(self, actor: 'MockActor', initstate: Optional[dict]): + self._actor = actor + self._default_state_change_tracker: Dict[str, StateMetadata] = {} + self._mock_state: Dict[str, Any] = {} + self._mock_timers: Dict[str, ActorTimerData] = {} + self._mock_reminders: Dict[str, ActorReminderData] = {} + if initstate: + self._mock_state = initstate + + async def add_state(self, state_name: str, value: T) -> None: + if not await self.try_add_state(state_name, value): + raise ValueError(f'The actor state name {state_name} already exist.') + + async def try_add_state(self, state_name: str, value: T) -> bool: + if state_name in self._default_state_change_tracker: + state_metadata = self._default_state_change_tracker[state_name] + if state_metadata.change_kind == StateChangeKind.remove: + self._default_state_change_tracker[state_name] = StateMetadata( + value, StateChangeKind.update + ) + return True + return False + existed = state_name in self._mock_state + if existed: + return False + self._default_state_change_tracker[state_name] = StateMetadata(value, StateChangeKind.add) + self._mock_state[state_name] = value + return True + + async def get_state(self, state_name: str) -> Optional[T]: + has_value, val = await self.try_get_state(state_name) + if has_value: + return val + else: + raise KeyError(f'Actor State with name {state_name} was not found.') + + async def try_get_state(self, state_name: str) -> Tuple[bool, Optional[T]]: + if state_name in self._default_state_change_tracker: + state_metadata = self._default_state_change_tracker[state_name] + if state_metadata.change_kind == StateChangeKind.remove: + return False, None + return True, state_metadata.value + has_value = state_name in self._mock_state + val = self._mock_state.get(state_name) + if has_value: + self._default_state_change_tracker[state_name] = StateMetadata( + val, StateChangeKind.none + ) + return has_value, val + + async def set_state(self, state_name: str, value: T) -> None: + await self.set_state_ttl(state_name, value, None) + + async def set_state_ttl(self, state_name: str, value: T, ttl_in_seconds: Optional[int]) -> None: + if ttl_in_seconds is not None and ttl_in_seconds < 0: + return + + if state_name in self._default_state_change_tracker: + state_metadata = self._default_state_change_tracker[state_name] + state_metadata.value = value + state_metadata.ttl_in_seconds = ttl_in_seconds + + if ( + state_metadata.change_kind == StateChangeKind.none + or state_metadata.change_kind == StateChangeKind.remove + ): + state_metadata.change_kind = StateChangeKind.update + self._default_state_change_tracker[state_name] = state_metadata + self._mock_state[state_name] = value + return + + existed = state_name in self._mock_state + if existed: + self._default_state_change_tracker[state_name] = StateMetadata( + value, StateChangeKind.update, ttl_in_seconds + ) + else: + self._default_state_change_tracker[state_name] = StateMetadata( + value, StateChangeKind.add, ttl_in_seconds + ) + self._mock_state[state_name] = value + + async def remove_state(self, state_name: str) -> None: + if not await self.try_remove_state(state_name): + raise KeyError(f'Actor State with name {state_name} was not found.') + + async def try_remove_state(self, state_name: str) -> bool: + if state_name in self._default_state_change_tracker: + state_metadata = self._default_state_change_tracker[state_name] + if state_metadata.change_kind == StateChangeKind.remove: + return False + elif state_metadata.change_kind == StateChangeKind.add: + self._default_state_change_tracker.pop(state_name, None) + self._mock_state.pop(state_name, None) + return True + self._mock_state.pop(state_name, None) + state_metadata.change_kind = StateChangeKind.remove + return True + + existed = state_name in self._mock_state + if existed: + self._default_state_change_tracker[state_name] = StateMetadata( + None, StateChangeKind.remove + ) + self._mock_state.pop(state_name, None) + return True + return False + + async def contains_state(self, state_name: str) -> bool: + if state_name in self._default_state_change_tracker: + state_metadata = self._default_state_change_tracker[state_name] + return state_metadata.change_kind != StateChangeKind.remove + return state_name in self._mock_state + + async def get_or_add_state(self, state_name: str, value: T) -> Optional[T]: + has_value, val = await self.try_get_state(state_name) + if has_value: + return val + change_kind = ( + StateChangeKind.update + if self.is_state_marked_for_remove(state_name) + else StateChangeKind.add + ) + self._mock_state[state_name] = value + self._default_state_change_tracker[state_name] = StateMetadata(value, change_kind) + return value + + async def add_or_update_state( + self, state_name: str, value: T, update_value_factory: Callable[[str, T], T] + ) -> T: + if not callable(update_value_factory): + raise AttributeError('update_value_factory is not callable') + + if state_name in self._default_state_change_tracker: + state_metadata = self._default_state_change_tracker[state_name] + if state_metadata.change_kind == StateChangeKind.remove: + self._default_state_change_tracker[state_name] = StateMetadata( + value, StateChangeKind.update + ) + self._mock_state[state_name] = value + return value + new_value = update_value_factory(state_name, state_metadata.value) + state_metadata.value = new_value + if state_metadata.change_kind == StateChangeKind.none: + state_metadata.change_kind = StateChangeKind.update + self._default_state_change_tracker[state_name] = state_metadata + self._mock_state[state_name] = new_value + return new_value + + has_value = state_name in self._mock_state + val: Any = self._mock_state.get(state_name) + if has_value: + new_value = update_value_factory(state_name, val) + self._default_state_change_tracker[state_name] = StateMetadata( + new_value, StateChangeKind.update + ) + self._mock_state[state_name] = new_value + return new_value + self._default_state_change_tracker[state_name] = StateMetadata(value, StateChangeKind.add) + self._mock_state[state_name] = value + return value + + async def get_state_names(self) -> List[str]: + # TODO: Get all state names from Dapr once implemented. + def append_names_sync(): + state_names = [] + for key, value in self._default_state_change_tracker.items(): + if value.change_kind == StateChangeKind.add: + state_names.append(key) + elif value.change_kind == StateChangeKind.remove: + state_names.append(key) + return state_names + + default_loop = asyncio.get_running_loop() + return await default_loop.run_in_executor(None, append_names_sync) + + async def clear_cache(self) -> None: + self._default_state_change_tracker.clear() + + async def save_state(self) -> None: + if len(self._default_state_change_tracker) == 0: + return + + state_changes = [] + states_to_remove = [] + for state_name, state_metadata in self._default_state_change_tracker.items(): + if state_metadata.change_kind == StateChangeKind.none: + continue + state_changes.append( + ActorStateChange( + state_name, + state_metadata.value, + state_metadata.change_kind, + state_metadata.ttl_in_seconds, + ) + ) + if state_metadata.change_kind == StateChangeKind.remove: + states_to_remove.append(state_name) + # Mark the states as unmodified so that tracking for next invocation is done correctly. + state_metadata.change_kind = StateChangeKind.none + for state_name in states_to_remove: + self._default_state_change_tracker.pop(state_name, None) + + def is_state_marked_for_remove(self, state_name: str) -> bool: + return ( + state_name in self._default_state_change_tracker + and self._default_state_change_tracker[state_name].change_kind == StateChangeKind.remove + ) diff --git a/dapr/actor/runtime/state_manager.py b/dapr/actor/runtime/state_manager.py index 7132175b..35cc33fb 100644 --- a/dapr/actor/runtime/state_manager.py +++ b/dapr/actor/runtime/state_manager.py @@ -15,11 +15,10 @@ import asyncio from contextvars import ContextVar +from typing import TYPE_CHECKING, Any, Callable, Dict, Generic, List, Optional, Tuple, TypeVar -from dapr.actor.runtime.state_change import StateChangeKind, ActorStateChange from dapr.actor.runtime.reentrancy_context import reentrancy_ctx - -from typing import Any, Callable, Dict, Generic, List, Tuple, TypeVar, Optional, TYPE_CHECKING +from dapr.actor.runtime.state_change import ActorStateChange, StateChangeKind if TYPE_CHECKING: from dapr.actor.runtime.actor import Actor diff --git a/daprdocs/content/en/python-sdk-docs/python-actor.md b/daprdocs/content/en/python-sdk-docs/python-actor.md index 565435aa..bd85e996 100644 --- a/daprdocs/content/en/python-sdk-docs/python-actor.md +++ b/daprdocs/content/en/python-sdk-docs/python-actor.md @@ -56,4 +56,73 @@ async def main(): ## Sample -Visit [this page](https://github.com/dapr/python-sdk/tree/release-1.0/examples/demo_actor) for a runnable actor sample. \ No newline at end of file +Visit [this page](https://github.com/dapr/python-sdk/tree/v1.14.0/examples/demo_actor) for a runnable actor sample. + + +## Mock Actor Testing + +The Dapr Python SDK provides the ability to create mock actors to unit test your actor methods and see how they interact with the actor state. + +### Sample Usage + + +``` +from dapr.actor.runtime.mock_actor import create_mock_actor + +class MyActor(Actor, MyActorInterface): + async def save_state(self, data) -> None: + await self._state_manager.set_state('mystate', data) + await self._state_manager.save_state() + +mock_actor = create_mock_actor(MyActor, "id") + +await mock_actor.save_state(5) +assert mockactor._state_manager._mock_state['mystate'] == 5 #True +``` +Mock actors are created by passing your actor class and an actor ID (a string) to the create_mock_actor function. This function returns an instance of the actor with many internal methods overridden. Instead of interacting with Dapr for tasks like saving state or managing timers, the mock actor uses in-memory state to simulate these behaviors. + +This state can be accessed through the following variables: + +**IMPORTANT NOTE: Due to type hinting issues as discussed further down, these variables will not be visible to type hinters/linters/etc, who will think they are invalid variables. You will need to use them with #type: ignore in order to satisfy any such systems.** + +- **_state_manager._mock_state()** +A `[str, object]` dict where all the actor state is stored. Any variable saved via `_state_manager.save_state(key, value)`, or any other statemanager method is stored in the dict as that key, value pair. Any value loaded via `try_get_state` or any other statemanager method is taken from this dict. + +- **_state_manager._mock_timers()** +A `[str, ActorTimerData]` dict which holds the active actor timers. Any actor method which would add or remove a timer adds or pops the appropriate `ActorTimerData` object from this dict. + +- **_state_manager._mock_reminders()** +A [str, ActorReminderData] dict which holds the active actor reminders. Any actor method which would add or remove a timer adds or pops the appropriate ActorReminderData object from this dict. + +**Note: The timers and reminders will never actually trigger. The dictionaries exist only so methods that should add or remove timers/reminders can be tested. If you need to test the callbacks they should activate, you should call them directly with the appropriate values:** +``` +result = await mock_actor.recieve_reminder(name, state, due_time, period, _ttl) +# Test the result directly or test for side effects (like changing state) by querying `_state_manager._mock_state` +``` + +### Usage and Limitations + +**To allow for more fine-grained control, the `_on_activate` method will not be called automatically the way it is when Dapr initializes a new Actor instance. You should call it manually as needed as part of your tests.** + +The `__init__`, `register_timer`, `unregister_timer`, `register_reminder`, `unregister_reminder` methods are all overwritten by the MockActor class that gets applied as a mixin via `create_mock_actor`. If your actor itself overwrites these methods, those modifications will themselves be overwritten and the actor will likely not behave as you expect. + +*note: `__init__` is a special case where you are expected to define it as* +``` + def __init__(self, ctx, actor_id): + super().__init__(ctx, actor_id) +``` +*Mock actors work fine with this, but if you have added any extra logic into `__init__`, it will be overwritten. It is worth noting that the correct way to apply logic on initialization is via `_on_activate` (which can also be safely used with mock actors) instead of `__init__`.* + +*If you have an actor which does override default Dapr actor methods, you can create a custom subclass of the MockActor class (from MockActor.py) which implements whatever custom logic you have along with interacting with `_mock_state`, `_mock_timers`, and `_mock_reminders` as normal, and then applying that custom class as a mixin via a `create_mock_actor` function you define yourself.* + +The actor `_runtime_ctx` variable is set to None. All the normal actor methods have been overwritten such as to not call it, but if your code itself interacts directly with `_runtime_ctx`, tests may fail. + +The actor _state_manager is overwritten with an instance of `MockStateManager`. This has all the same methods and functionality of the base `ActorStateManager`, except for using the various `_mock` variables for storing data instead of the `_runtime_ctx`. If your code implements its own custom state manager it will be overwritten and tests will likely fail. + +### Type Hinting + +Because of Python's lack of a unified method for type hinting type intersections (see: [python/typing #213](https://github.com/python/typing/issues/213)), type hinting unfortunately doesn't work with Mock Actors. The return type is type hinted as "instance of Actor subclass T" when it should really be type hinted as "instance of MockActor subclass T" or "instance of type intersection `[Actor subclass T, MockActor]`" (where, it is worth noting, `MockActor` is itself a subclass of `Actor`). + +This means that, for example, if you hover over `mockactor._state_manager` in a code editor, it will come up as an instance of ActorStateManager (instead of MockStateManager), and various IDE helper functions (like VSCode's `Go to Definition`, which will bring you to the definition of ActorStateManager instead of MockStateManager) won't work properly. + +For now, this issue is unfixable, so it's merely something to be noted because of the confusion it might cause. If in the future it becomes possible to accurately type hint cases like this feel free to open an issue about implementing it. \ No newline at end of file diff --git a/docs/clients/clients.grpc.rst b/docs/clients/clients.grpc.rst new file mode 100644 index 00000000..472cbce6 --- /dev/null +++ b/docs/clients/clients.grpc.rst @@ -0,0 +1,31 @@ +clients.grpc package +==================== + +Submodules +---------- + + +.. automodule:: clients.grpc.client + :members: + :undoc-members: + :show-inheritance: + + +.. automodule:: clients.grpc.interceptors + :members: + :undoc-members: + :show-inheritance: + + +.. automodule:: clients.grpc.subscription + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: clients.grpc + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/proto/proto.runtime.rst b/docs/proto/proto.runtime.rst new file mode 100644 index 00000000..ccad378d --- /dev/null +++ b/docs/proto/proto.runtime.rst @@ -0,0 +1,18 @@ +proto.runtime package +===================== + +Subpackages +----------- + +.. toctree:: + :maxdepth: 4 + + proto.runtime.v1 + +Module contents +--------------- + +.. automodule:: proto.runtime + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/proto/proto.runtime.v1.rst b/docs/proto/proto.runtime.v1.rst new file mode 100644 index 00000000..3d4fb150 --- /dev/null +++ b/docs/proto/proto.runtime.v1.rst @@ -0,0 +1,37 @@ +proto.runtime.v1 package +======================== + +Submodules +---------- + + +.. automodule:: proto.runtime.v1.appcallback_pb2 + :members: + :undoc-members: + :show-inheritance: + + +.. automodule:: proto.runtime.v1.appcallback_pb2_grpc + :members: + :undoc-members: + :show-inheritance: + + +.. automodule:: proto.runtime.v1.dapr_pb2 + :members: + :undoc-members: + :show-inheritance: + + +.. automodule:: proto.runtime.v1.dapr_pb2_grpc + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: proto.runtime.v1 + :members: + :undoc-members: + :show-inheritance: diff --git a/examples/demo_actor/README.md b/examples/demo_actor/README.md index c5ece71e..64ca7ca5 100644 --- a/examples/demo_actor/README.md +++ b/examples/demo_actor/README.md @@ -6,6 +6,7 @@ This document describes how to create an Actor(DemoActor) and invoke its methods - **The actor service(demo_actor_service.py).** This implements FastAPI service that is going to host the actor. It contains the implementation of the actor, `demo_actor.py`. An actor implementation is a class that derives from the base type `Actor` and implements the interfaces defined in `demo_actor_interface.py`. - **The actor service for flask(demo_actor_flask.py).** This implements Flask web service that is going to host the actor. - **The actor client(demo_actor_client.py)** This contains the implementation of the actor client which calls DemoActor's method defined in Actor Interfaces. +- **Actor tests(test_demo_actor.py)** This contains actor unit tests using mock actor testing functionality. ## Pre-requisites @@ -183,3 +184,57 @@ expected_stdout_lines: kubectl logs -l app="demoactor-client" -c demoactor-client ``` +## Run DemoActor mock actor tests + + + +1. Run Tests + + ```bash + cd demo_actor + python -m unittest test_demo_actor.py + ``` + + Expected output (note that the unit test print outputs might not necessarily be in this order - what really matters is that all tests pass anyway): + + ``` + set_my_data: {'state': 5} + has_value: True + clear_my_data + has_value: False + has_value: False + set reminder to True + set reminder is done + set reminder to False + set reminder is done + set_my_data: {'state': 5} + has_value: True + ---------------------------------------------------------------------- + Ran 5 tests in 0.052s + + OK + ``` + + + diff --git a/examples/demo_actor/demo_actor/test_demo_actor.py b/examples/demo_actor/demo_actor/test_demo_actor.py new file mode 100644 index 00000000..e4289dda --- /dev/null +++ b/examples/demo_actor/demo_actor/test_demo_actor.py @@ -0,0 +1,40 @@ +import unittest + +from demo_actor import DemoActor + +from dapr.actor.runtime.mock_actor import create_mock_actor + + +class DemoActorTests(unittest.IsolatedAsyncioTestCase): + def test_create_actor(self): + mockactor = create_mock_actor(DemoActor, '1') + self.assertEqual(mockactor.id.id, '1') + + async def test_get_data(self): + mockactor = create_mock_actor(DemoActor, '1') + self.assertFalse(mockactor._state_manager._mock_state) # type: ignore + val = await mockactor.get_my_data() + self.assertIsNone(val) + + async def test_set_data(self): + mockactor = create_mock_actor(DemoActor, '1') + await mockactor.set_my_data({'state': 5}) + val = await mockactor.get_my_data() + self.assertIs(val['state'], 5) # type: ignore + + async def test_clear_data(self): + mockactor = create_mock_actor(DemoActor, '1') + await mockactor.set_my_data({'state': 5}) + val = await mockactor.get_my_data() + self.assertIs(val['state'], 5) # type: ignore + await mockactor.clear_my_data() + val = await mockactor.get_my_data() + self.assertIsNone(val) + + async def test_reminder(self): + mockactor = create_mock_actor(DemoActor, '1') + self.assertFalse(mockactor._state_manager._mock_reminders) # type: ignore + await mockactor.set_reminder(True) + self.assertTrue('demo_reminder' in mockactor._state_manager._mock_reminders) # type: ignore + await mockactor.set_reminder(False) + self.assertFalse(mockactor._state_manager._mock_reminders) # type: ignore diff --git a/tests/actor/test_mock_actor.py b/tests/actor/test_mock_actor.py new file mode 100644 index 00000000..c37cdf4f --- /dev/null +++ b/tests/actor/test_mock_actor.py @@ -0,0 +1,314 @@ +import datetime +import unittest +from typing import Optional + +from dapr.actor import Actor, ActorInterface, Remindable, actormethod +from dapr.actor.runtime.mock_actor import create_mock_actor +from dapr.actor.runtime.state_change import StateChangeKind + + +class MockTestActorInterface(ActorInterface): + @actormethod(name='GetData') + async def get_data(self) -> object: + ... + + @actormethod(name='SetData') + async def set_data(self, data: object) -> None: + ... + + @actormethod(name='ClearData') + async def clear_data(self) -> None: + ... + + @actormethod(name='TestData') + async def test_data(self) -> int: + ... + + @actormethod(name='AddState') + async def add_state(self, name: str, data: object) -> None: + ... + + @actormethod(name='UpdateState') + async def update_state(self, name: str, data: object) -> None: + ... + + @actormethod(name='AddDataNoSave') + async def add_data_no_save(self, data: object) -> None: + ... + + @actormethod(name='RemoveDataNoSave') + async def remove_data_no_save(self) -> None: + ... + + @actormethod(name='SaveState') + async def save_state(self) -> None: + ... + + @actormethod(name='ToggleReminder') + async def toggle_reminder(self, name: str, enabled: bool) -> None: + ... + + @actormethod(name='ToggleTimer') + async def toggle_timer(self, name: str, enabled: bool) -> None: + ... + + +class MockTestActor(Actor, MockTestActorInterface, Remindable): + def __init__(self, ctx, actor_id): + super().__init__(ctx, actor_id) + + async def _on_activate(self) -> None: + await self._state_manager.set_state('state', {'test': 5}) + await self._state_manager.save_state() + + async def get_data(self) -> object: + _, val = await self._state_manager.try_get_state('state') + return val + + async def set_data(self, data) -> None: + await self._state_manager.set_state('state', data) + await self._state_manager.save_state() + + async def clear_data(self) -> None: + await self._state_manager.remove_state('state') + await self._state_manager.save_state() + + async def test_data(self) -> int: + _, val = await self._state_manager.try_get_state('state') + if val is None: + return 0 + if 'test' not in val: + return 1 + if val['test'] % 2 == 1: + return 2 + elif val['test'] % 2 == 0: + return 3 + return 4 + + async def add_state(self, name: str, data: object) -> None: + await self._state_manager.add_state(name, data) + + async def update_state(self, name: str, data: object) -> None: + def double(_: str, x: int) -> int: + return 2 * x + + await self._state_manager.add_or_update_state(name, data, double) + + async def add_data_no_save(self, data: object) -> None: + await self._state_manager.set_state('state', data) + + async def remove_data_no_save(self) -> None: + await self._state_manager.remove_state('state') + + async def save_state(self) -> None: + await self._state_manager.save_state() + + async def toggle_reminder(self, name: str, enabled: bool) -> None: + if enabled: + await self.register_reminder( + name, + b'reminder_state', + datetime.timedelta(seconds=5), + datetime.timedelta(seconds=10), + datetime.timedelta(seconds=15), + ) + else: + await self.unregister_reminder(name) + + async def toggle_timer(self, name: str, enabled: bool) -> None: + if enabled: + await self.register_timer( + name, + self.timer_callback, + 'timer_state', + datetime.timedelta(seconds=5), + datetime.timedelta(seconds=10), + datetime.timedelta(seconds=15), + ) + else: + await self.unregister_timer(name) + + async def receive_reminder( + self, + name: str, + state: bytes, + due_time: datetime.timedelta, + period: datetime.timedelta, + ttl: Optional[datetime.timedelta] = None, + ) -> None: + await self._state_manager.set_state(name, True) + await self._state_manager.save_state() + + async def timer_callback(self, state) -> None: + print('Timer triggered') + + +class ActorMockActorTests(unittest.IsolatedAsyncioTestCase): + def test_create_actor(self): + mockactor = create_mock_actor(MockTestActor, '1') + self.assertEqual(mockactor.id.id, '1') + + async def test_inistate(self): + mockactor = create_mock_actor(MockTestActor, '1', initstate={'state': 5}) + self.assertTrue('state' in mockactor._state_manager._mock_state) # type: ignore + self.assertEqual(mockactor._state_manager._mock_state['state'], 5) # type: ignore + + async def test_on_activate(self): + mockactor = create_mock_actor(MockTestActor, '1') + await mockactor._on_activate() + self.assertTrue('state' in mockactor._state_manager._mock_state) # type: ignore + self.assertEqual(mockactor._state_manager._mock_state['state'], {'test': 5}) # type: ignore + + async def test_get_data(self): + mockactor = create_mock_actor(MockTestActor, '1') + await mockactor._on_activate() + out1 = await mockactor.get_data() + self.assertEqual(out1, {'test': 5}) + + async def test_get_data_initstate(self): + mockactor = create_mock_actor(MockTestActor, '1', initstate={'state': {'test': 6}}) + out1 = await mockactor.get_data() + self.assertEqual(out1, {'test': 6}) + + async def test_set_data(self): + mockactor = create_mock_actor(MockTestActor, '1') + await mockactor._on_activate() + self.assertTrue('state' in mockactor._state_manager._mock_state) # type: ignore + self.assertEqual(mockactor._state_manager._mock_state['state'], {'test': 5}) # type: ignore + await mockactor.set_data({'test': 10}) + self.assertTrue('state' in mockactor._state_manager._mock_state) # type: ignore + self.assertEqual(mockactor._state_manager._mock_state['state'], {'test': 10}) # type: ignore + out1 = await mockactor.get_data() + self.assertEqual(out1, {'test': 10}) + + async def test_clear_data(self): + mockactor = create_mock_actor(MockTestActor, '1') + await mockactor._on_activate() + self.assertTrue('state' in mockactor._state_manager._mock_state) # type: ignore + self.assertEqual(mockactor._state_manager._mock_state['state'], {'test': 5}) # type: ignore + await mockactor.clear_data() + self.assertFalse('state' in mockactor._state_manager._mock_state) # type: ignore + self.assertIsNone(mockactor._state_manager._mock_state.get('state')) # type: ignore + out1 = await mockactor.get_data() + self.assertIsNone(out1) + + async def test_toggle_reminder(self): + mockactor = create_mock_actor(MockTestActor, '1') + await mockactor._on_activate() + self.assertEqual(len(mockactor._state_manager._mock_reminders), 0) # type: ignore + await mockactor.toggle_reminder('test', True) + self.assertEqual(len(mockactor._state_manager._mock_reminders), 1) # type: ignore + self.assertTrue('test' in mockactor._state_manager._mock_reminders) # type: ignore + reminderstate = mockactor._state_manager._mock_reminders['test'] # type: ignore + self.assertTrue(reminderstate.reminder_name, 'test') + await mockactor.toggle_reminder('test', False) + self.assertEqual(len(mockactor._state_manager._mock_reminders), 0) # type: ignore + + async def test_toggle_timer(self): + mockactor = create_mock_actor(MockTestActor, '1') + await mockactor._on_activate() + self.assertEqual(len(mockactor._state_manager._mock_timers), 0) # type: ignore + await mockactor.toggle_timer('test', True) + self.assertEqual(len(mockactor._state_manager._mock_timers), 1) # type: ignore + self.assertTrue('test' in mockactor._state_manager._mock_timers) # type: ignore + timerstate = mockactor._state_manager._mock_timers['test'] # type: ignore + self.assertTrue(timerstate.timer_name, 'test') + await mockactor.toggle_timer('test', False) + self.assertEqual(len(mockactor._state_manager._mock_timers), 0) # type: ignore + + async def test_activate_reminder(self): + mockactor = create_mock_actor(MockTestActor, '1') + await mockactor.receive_reminder( + 'test', + b'test1', + datetime.timedelta(days=1), + datetime.timedelta(days=1), + datetime.timedelta(days=1), + ) + self.assertEqual(mockactor._state_manager._mock_state['test'], True) # type: ignore + + async def test_test_data(self): + mockactor = create_mock_actor(MockTestActor, '1') + result = await mockactor.test_data() + self.assertEqual(result, 0) + await mockactor.set_data('lol') + result = await mockactor.test_data() + self.assertEqual(result, 1) + await mockactor.set_data({'test': 'lol'}) + with self.assertRaises(TypeError): + await mockactor.test_data() + await mockactor.set_data({'test': 1}) + result = await mockactor.test_data() + self.assertEqual(result, 2) + await mockactor.set_data({'test': 2}) + result = await mockactor.test_data() + self.assertEqual(result, 3) + + async def test_add_state(self): + mockactor = create_mock_actor(MockTestActor, '1') + self.assertFalse(mockactor._state_manager._mock_state) # type: ignore + await mockactor.add_state('test', 5) + self.assertTrue('test' in mockactor._state_manager._mock_state) # type: ignore + self.assertEqual(mockactor._state_manager._mock_state['test'], 5) # type: ignore + await mockactor.add_state('test2', 10) + self.assertTrue('test2' in mockactor._state_manager._mock_state) # type: ignore + self.assertEqual(mockactor._state_manager._mock_state['test2'], 10) # type: ignore + self.assertEqual(len(mockactor._state_manager._mock_state), 2) # type: ignore + with self.assertRaises(ValueError): + await mockactor.add_state('test', 10) + + async def test_update_state(self): + mockactor = create_mock_actor(MockTestActor, '1') + self.assertFalse(mockactor._state_manager._mock_state) # type: ignore + await mockactor.update_state('test', 10) + self.assertTrue('test' in mockactor._state_manager._mock_state) # type: ignore + self.assertEqual(mockactor._state_manager._mock_state['test'], 10) # type: ignore + await mockactor.update_state('test', 10) + self.assertTrue('test' in mockactor._state_manager._mock_state) # type: ignore + self.assertEqual(mockactor._state_manager._mock_state['test'], 20) # type: ignore + self.assertEqual(len(mockactor._state_manager._mock_state), 1) # type: ignore + + async def test_state_change_tracker(self): + mockactor = create_mock_actor(MockTestActor, '1') + self.assertEqual(len(mockactor._state_manager._default_state_change_tracker), 0) + await mockactor._on_activate() + self.assertEqual(len(mockactor._state_manager._default_state_change_tracker), 1) + self.assertTrue('state' in mockactor._state_manager._default_state_change_tracker) + self.assertEqual( + mockactor._state_manager._default_state_change_tracker['state'].change_kind, + StateChangeKind.none, + ) + self.assertEqual( + mockactor._state_manager._default_state_change_tracker['state'].value, {'test': 5} + ) + self.assertEqual(mockactor._state_manager._mock_state['state'], {'test': 5}) # type: ignore + await mockactor.remove_data_no_save() + self.assertEqual( + mockactor._state_manager._default_state_change_tracker['state'].change_kind, + StateChangeKind.remove, + ) + self.assertEqual( + mockactor._state_manager._default_state_change_tracker['state'].value, {'test': 5} + ) + self.assertTrue('state' not in mockactor._state_manager._mock_state) # type: ignore + await mockactor.save_state() + self.assertEqual(len(mockactor._state_manager._default_state_change_tracker), 0) + self.assertTrue('state' not in mockactor._state_manager._mock_state) # type: ignore + await mockactor.add_data_no_save({'test': 6}) + self.assertEqual( + mockactor._state_manager._default_state_change_tracker['state'].change_kind, + StateChangeKind.add, + ) + self.assertEqual( + mockactor._state_manager._default_state_change_tracker['state'].value, {'test': 6} + ) + self.assertEqual(mockactor._state_manager._mock_state['state'], {'test': 6}) # type: ignore + await mockactor.save_state() + self.assertEqual( + mockactor._state_manager._default_state_change_tracker['state'].change_kind, + StateChangeKind.none, + ) + self.assertEqual( + mockactor._state_manager._default_state_change_tracker['state'].value, {'test': 6} + ) + self.assertEqual(mockactor._state_manager._mock_state['state'], {'test': 6}) # type: ignore diff --git a/tests/actor/test_mock_state_manager.py b/tests/actor/test_mock_state_manager.py new file mode 100644 index 00000000..81af9307 --- /dev/null +++ b/tests/actor/test_mock_state_manager.py @@ -0,0 +1,73 @@ +import unittest + +from dapr.actor import Actor, ActorInterface +from dapr.actor.runtime.mock_actor import create_mock_actor +from dapr.actor.runtime.mock_state_manager import MockStateManager + + +def double(_: str, x: int) -> int: + return 2 * x + + +class MockTestActorInterface(ActorInterface): + pass + + +class MockTestActor(Actor, MockTestActorInterface): + def __init__(self, ctx, actor_id): + super().__init__(ctx, actor_id) + + +class ActorMockActorTests(unittest.IsolatedAsyncioTestCase): + def test_init_state(self): + mock_actor = create_mock_actor(MockTestActor, 'test') + state_manager = mock_actor._state_manager + self.assertIsInstance(state_manager, MockStateManager) + self.assertFalse(state_manager._mock_state) # type: ignore + self.assertFalse(state_manager._mock_reminders) # type: ignore + self.assertFalse(state_manager._mock_timers) # type: ignore + + async def test_state_methods(self): + mock_actor = create_mock_actor(MockTestActor, 'test') + state_manager = mock_actor._state_manager + self.assertFalse(await state_manager.contains_state('state')) + self.assertFalse(state_manager._default_state_change_tracker) + names = await state_manager.get_state_names() + self.assertFalse(names) + with self.assertRaises(KeyError): + await state_manager.get_state('state') + await state_manager.add_state('state', 5) + names = await state_manager.get_state_names() + self.assertCountEqual(names, ['state']) + self.assertIs(state_manager._mock_state['state'], 5) # type: ignore + value = await state_manager.get_state('state') + self.assertIs(value, 5) + await state_manager.add_state('state2', 5) + self.assertIs(state_manager._mock_state['state2'], 5) # type: ignore + with self.assertRaises(ValueError): + await state_manager.add_state('state', 5) + await state_manager.set_state('state3', 5) + self.assertIs(state_manager._mock_state['state3'], 5) # type: ignore + await state_manager.set_state('state3', 10) + self.assertIs(state_manager._mock_state['state3'], 10) # type: ignore + self.assertTrue(await state_manager.contains_state('state3')) + await state_manager.remove_state('state3') + self.assertFalse('state3' in state_manager._mock_state) # type: ignore + with self.assertRaises(KeyError): + await state_manager.remove_state('state3') + self.assertFalse(await state_manager.contains_state('state3')) + await state_manager.add_or_update_state('state3', 5, double) + self.assertIs(state_manager._mock_state['state3'], 5) # type: ignore + await state_manager.add_or_update_state('state3', 1000, double) + self.assertIs(state_manager._mock_state['state3'], 10) # type: ignore + out = await state_manager.get_or_add_state('state4', 5) + self.assertIs(out, 5) + self.assertIs(state_manager._mock_state['state4'], 5) # type: ignore + out = await state_manager.get_or_add_state('state4', 10) + self.assertIs(out, 5) + self.assertIs(state_manager._mock_state['state4'], 5) # type: ignore + names = await state_manager.get_state_names() + self.assertCountEqual(names, ['state', 'state2', 'state3', 'state4']) + self.assertTrue('state', state_manager._default_state_change_tracker) + await state_manager.clear_cache() + self.assertFalse(state_manager._default_state_change_tracker) From c9877be553b5abad083de3579bb177a6d2e7d070 Mon Sep 17 00:00:00 2001 From: Elena Kolevska Date: Thu, 2 Jan 2025 12:39:42 +0000 Subject: [PATCH 16/24] Fixes try_add_state in actor state manger (#756) Signed-off-by: Elena Kolevska --- dapr/actor/runtime/state_manager.py | 2 +- tests/actor/test_state_manager.py | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/dapr/actor/runtime/state_manager.py b/dapr/actor/runtime/state_manager.py index 35cc33fb..dc7ec033 100644 --- a/dapr/actor/runtime/state_manager.py +++ b/dapr/actor/runtime/state_manager.py @@ -85,7 +85,7 @@ async def try_add_state(self, state_name: str, value: T) -> bool: existed = await self._actor.runtime_ctx.state_provider.contains_state( self._type_name, self._actor.id.id, state_name ) - if not existed: + if existed: return False state_change_tracker[state_name] = StateMetadata(value, StateChangeKind.add) diff --git a/tests/actor/test_state_manager.py b/tests/actor/test_state_manager.py index 98db0228..c9406dbd 100644 --- a/tests/actor/test_state_manager.py +++ b/tests/actor/test_state_manager.py @@ -46,7 +46,7 @@ def setUp(self): @mock.patch( 'tests.actor.fake_client.FakeDaprActorClient.get_state', - new=_async_mock(return_value=base64.b64encode(b'"value1"')), + new=_async_mock(), ) @mock.patch( 'tests.actor.fake_client.FakeDaprActorClient.save_state_transactionally', new=_async_mock() @@ -67,6 +67,20 @@ def test_add_state(self): added = _run(state_manager.try_add_state('state1', 'value1')) self.assertFalse(added) + @mock.patch( + 'tests.actor.fake_client.FakeDaprActorClient.get_state', + new=_async_mock(return_value=base64.b64encode(b'"value1"')), + ) + @mock.patch( + 'tests.actor.fake_client.FakeDaprActorClient.save_state_transactionally', new=_async_mock() + ) + def test_add_state_with_existing_state(self): + state_manager = ActorStateManager(self._fake_actor) + + # Add first 'state1' + added = _run(state_manager.try_add_state('state1', 'value1')) + self.assertFalse(added) + @mock.patch('tests.actor.fake_client.FakeDaprActorClient.get_state', new=_async_mock()) def test_get_state_for_no_state(self): state_manager = ActorStateManager(self._fake_actor) From ef730850c5f97605d360e571cce2f3aac0588ee9 Mon Sep 17 00:00:00 2001 From: Elena Kolevska Date: Thu, 2 Jan 2025 12:40:22 +0000 Subject: [PATCH 17/24] Integration test for http invocation (#758) Signed-off-by: Elena Kolevska --- examples/invoke-http/README.md | 75 +++++++++++++++++++++++++ examples/invoke-http/invoke-caller.py | 33 +++++++---- examples/invoke-http/invoke-receiver.py | 9 +++ 3 files changed, 106 insertions(+), 11 deletions(-) create mode 100644 examples/invoke-http/README.md diff --git a/examples/invoke-http/README.md b/examples/invoke-http/README.md new file mode 100644 index 00000000..08e8738e --- /dev/null +++ b/examples/invoke-http/README.md @@ -0,0 +1,75 @@ +# Example - Invoke a service + +This example utilizes a receiver and a caller for the `invoke_method` functionality. + +> **Note:** Make sure to use the latest proto bindings + +## Pre-requisites + +- [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started) +- [Install Python 3.8+](https://www.python.org/downloads/) + +### Install requirements + +You can install dapr SDK package using pip command: + + + +```sh +pip3 install dapr Flask +``` + + + +## Run the example + +To run this example, the following code can be utilized: + +Start the receiver: + + +```bash +dapr run --app-id=invoke-receiver --app-port=8088 --app-protocol http -- python3 invoke-receiver.py +``` + + +Start the caller: + + +```bash +dapr run --app-id=invoke-caller -- python3 invoke-caller.py +``` + + +## Cleanup + + + +```bash +dapr stop --app-id invoke-receiver +``` + + \ No newline at end of file diff --git a/examples/invoke-http/invoke-caller.py b/examples/invoke-http/invoke-caller.py index 6e2c3120..ebc5876b 100644 --- a/examples/invoke-http/invoke-caller.py +++ b/examples/invoke-http/invoke-caller.py @@ -6,18 +6,29 @@ with DaprClient() as d: req_data = {'id': 1, 'message': 'hello world'} - while True: - # Create a typed message with content type and body - resp = d.invoke_method( + # First message: success + # Create a typed message with content type and body + resp1 = d.invoke_method( + 'invoke-receiver', + 'my-method', + http_verb='POST', + data=json.dumps(req_data), + ) + + # Print the response + print(resp1.content_type, flush=True) + print(resp1.text(), flush=True) + print(str(resp1.status_code), flush=True) + + # Second message: error + req_data = {'id': 2, 'message': 'hello world'} + try: + resp2 = d.invoke_method( 'invoke-receiver', - 'my-method', + 'my-method-err', http_verb='POST', data=json.dumps(req_data), ) - - # Print the response - print(resp.content_type, flush=True) - print(resp.text(), flush=True) - print(str(resp.status_code), flush=True) - - time.sleep(2) + except Exception as e: + print(e._message, flush=True) + print(e._error_code, flush=True) diff --git a/examples/invoke-http/invoke-receiver.py b/examples/invoke-http/invoke-receiver.py index 95ac3192..8609464a 100644 --- a/examples/invoke-http/invoke-receiver.py +++ b/examples/invoke-http/invoke-receiver.py @@ -12,4 +12,13 @@ def getOrder(): return json.dumps({'success': True}), 200, {'ContentType': 'application/json'} +@app.route('/my-method-err', methods=['POST']) +def getOrderErr(): + data = request.json + print('Order error : ' + json.dumps(data), flush=True) + resp = {'message': 'error occurred', 'errorCode': 'MY_CODE'} + return json.dumps(resp), 503, {'ContentType': 'application/json'} + + +print('Starting Flask app on port 8088...', flush=True) app.run(port=8088) From d876aa7a43b28e66e7c95052149fbdffa3634373 Mon Sep 17 00:00:00 2001 From: Elena Kolevska Date: Thu, 2 Jan 2025 12:48:35 +0000 Subject: [PATCH 18/24] fixes missing state store in test (#759) Signed-off-by: Elena Kolevska --- examples/error_handling/README.md | 2 +- .../error_handling/components/state_redis.yaml | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 examples/error_handling/components/state_redis.yaml diff --git a/examples/error_handling/README.md b/examples/error_handling/README.md index 1d24bc82..0ce190d3 100644 --- a/examples/error_handling/README.md +++ b/examples/error_handling/README.md @@ -38,7 +38,7 @@ timeout_seconds: 5 --> ```bash -dapr run -- python3 error_handling.py +dapr run --resources-path components -- python3 error_handling.py ``` diff --git a/examples/error_handling/components/state_redis.yaml b/examples/error_handling/components/state_redis.yaml new file mode 100644 index 00000000..7c45ff88 --- /dev/null +++ b/examples/error_handling/components/state_redis.yaml @@ -0,0 +1,15 @@ +apiVersion: dapr.io/v1alpha1 +kind: Component +metadata: + name: statestore +spec: + type: state.redis + version: v1 + initTimeout: 1m + metadata: + - name: redisHost + value: localhost:6379 + - name: redisPassword + value: "" + - name: actorStateStore + value: "true" \ No newline at end of file From c5a52f1836b1f3ae4e5b3475a8ea61245778b6c1 Mon Sep 17 00:00:00 2001 From: Fabian Martinez <46371672+famarting@users.noreply.github.com> Date: Thu, 2 Jan 2025 13:49:49 +0100 Subject: [PATCH 19/24] Mark workflows API functions as deprecated (#749) * workflows, remove deprecated functions Signed-off-by: Fabian Martinez <46371672+famarting@users.noreply.github.com> * revert changes to example Signed-off-by: Fabian Martinez <46371672+famarting@users.noreply.github.com> * update warning messages Signed-off-by: Fabian Martinez <46371672+famarting@users.noreply.github.com> * Typos Signed-off-by: Elena Kolevska * fixes linter Signed-off-by: Elena Kolevska * Apply suggestions from code review Signed-off-by: Elena Kolevska * Apply suggestions from code review Signed-off-by: Elena Kolevska --------- Signed-off-by: Fabian Martinez <46371672+famarting@users.noreply.github.com> Signed-off-by: Elena Kolevska Signed-off-by: Elena Kolevska Co-authored-by: Elena Kolevska Co-authored-by: Elena Kolevska Signed-off-by: Elena Kolevska --- dapr/aio/clients/grpc/client.py | 21 ++++++++++++------- dapr/clients/grpc/client.py | 21 ++++++++++++------- examples/demo_workflow/app.py | 3 +++ .../demo_workflow/requirements.txt | 2 +- tests/clients/test_dapr_grpc_client.py | 2 +- 5 files changed, 33 insertions(+), 16 deletions(-) diff --git a/dapr/aio/clients/grpc/client.py b/dapr/aio/clients/grpc/client.py index e4d4e902..7bcf4a13 100644 --- a/dapr/aio/clients/grpc/client.py +++ b/dapr/aio/clients/grpc/client.py @@ -1409,6 +1409,7 @@ async def start_workflow( send_raw_bytes: bool = False, ) -> StartWorkflowResponse: """Starts a workflow. + Deprecated: use dapr-ext-workflow instead Args: workflow_component (str): the name of the workflow component @@ -1430,7 +1431,7 @@ async def start_workflow( """ # Warnings and input validation warn( - 'The Workflow API is a Beta version and is subject to change.', + 'This Workflow API (Beta) method is deprecated and will be removed in a future version. Use the dapr-ext-workflow package instead.', UserWarning, stacklevel=2, ) @@ -1470,6 +1471,7 @@ async def start_workflow( async def get_workflow(self, instance_id: str, workflow_component: str) -> GetWorkflowResponse: """Gets information on a workflow. + Deprecated: use dapr-ext-workflow instead Args: instance_id (str): the ID of the workflow instance, @@ -1482,7 +1484,7 @@ async def get_workflow(self, instance_id: str, workflow_component: str) -> GetWo """ # Warnings and input validation warn( - 'The Workflow API is a Beta version and is subject to change.', + 'This Workflow API (Beta) method is deprecated and will be removed in a future version. Use the dapr-ext-workflow package instead.', UserWarning, stacklevel=2, ) @@ -1511,6 +1513,7 @@ async def get_workflow(self, instance_id: str, workflow_component: str) -> GetWo async def terminate_workflow(self, instance_id: str, workflow_component: str) -> DaprResponse: """Terminates a workflow. + Deprecated: use dapr-ext-workflow instead Args: instance_id (str): the ID of the workflow instance, e.g. @@ -1523,7 +1526,7 @@ async def terminate_workflow(self, instance_id: str, workflow_component: str) -> """ # Warnings and input validation warn( - 'The Workflow API is a Beta version and is subject to change.', + 'This Workflow API (Beta) method is deprecated and will be removed in a future version. Use the dapr-ext-workflow package instead.', UserWarning, stacklevel=2, ) @@ -1548,6 +1551,7 @@ async def raise_workflow_event( send_raw_bytes: bool = False, ) -> DaprResponse: """Raises an event on a workflow. + Deprecated: use dapr-ext-workflow instead Args: instance_id (str): the ID of the workflow instance, @@ -1568,7 +1572,7 @@ async def raise_workflow_event( """ # Warnings and input validation warn( - 'The Workflow API is a Beta version and is subject to change.', + 'This Workflow API (Beta) method is deprecated and will be removed in a future version. Use the dapr-ext-workflow package instead.', UserWarning, stacklevel=2, ) @@ -1611,6 +1615,7 @@ async def raise_workflow_event( async def pause_workflow(self, instance_id: str, workflow_component: str) -> DaprResponse: """Pause a workflow. + Deprecated: use dapr-ext-workflow instead Args: instance_id (str): the ID of the workflow instance, @@ -1624,7 +1629,7 @@ async def pause_workflow(self, instance_id: str, workflow_component: str) -> Dap """ # Warnings and input validation warn( - 'The Workflow API is a Beta version and is subject to change.', + 'This Workflow API (Beta) method is deprecated and will be removed in a future version. Use the dapr-ext-workflow package instead.', UserWarning, stacklevel=2, ) @@ -1643,6 +1648,7 @@ async def pause_workflow(self, instance_id: str, workflow_component: str) -> Dap async def resume_workflow(self, instance_id: str, workflow_component: str) -> DaprResponse: """Resumes a workflow. + Deprecated: use dapr-ext-workflow instead Args: instance_id (str): the ID of the workflow instance, @@ -1655,7 +1661,7 @@ async def resume_workflow(self, instance_id: str, workflow_component: str) -> Da """ # Warnings and input validation warn( - 'The Workflow API is a Beta version and is subject to change.', + 'This Workflow API (Beta) method is deprecated and will be removed in a future version. Use the dapr-ext-workflow package instead.', UserWarning, stacklevel=2, ) @@ -1674,6 +1680,7 @@ async def resume_workflow(self, instance_id: str, workflow_component: str) -> Da async def purge_workflow(self, instance_id: str, workflow_component: str) -> DaprResponse: """Purges a workflow. + Deprecated: use dapr-ext-workflow instead Args: instance_id (str): the ID of the workflow instance, @@ -1686,7 +1693,7 @@ async def purge_workflow(self, instance_id: str, workflow_component: str) -> Dap """ # Warnings and input validation warn( - 'The Workflow API is a Beta version and is subject to change.', + 'This Workflow API (Beta) method is deprecated and will be removed in a future version. Use the dapr-ext-workflow package instead.', UserWarning, stacklevel=2, ) diff --git a/dapr/clients/grpc/client.py b/dapr/clients/grpc/client.py index 4aa75b55..f7c7b850 100644 --- a/dapr/clients/grpc/client.py +++ b/dapr/clients/grpc/client.py @@ -1413,6 +1413,7 @@ def start_workflow( send_raw_bytes: bool = False, ) -> StartWorkflowResponse: """Starts a workflow. + Deprecated: use dapr-ext-workflow instead Args: workflow_component (str): the name of the workflow component @@ -1434,7 +1435,7 @@ def start_workflow( """ # Warnings and input validation warn( - 'The Workflow API is a Beta version and is subject to change.', + 'This Workflow API (Beta) method is deprecated and will be removed in a future version. Use the dapr-ext-workflow package instead.', UserWarning, stacklevel=2, ) @@ -1470,6 +1471,7 @@ def start_workflow( def get_workflow(self, instance_id: str, workflow_component: str) -> GetWorkflowResponse: """Gets information on a workflow. + Deprecated: use dapr-ext-workflow instead Args: instance_id (str): the ID of the workflow instance, @@ -1482,7 +1484,7 @@ def get_workflow(self, instance_id: str, workflow_component: str) -> GetWorkflow """ # Warnings and input validation warn( - 'The Workflow API is a Beta version and is subject to change.', + 'This Workflow API (Beta) method is deprecated and will be removed in a future version. Use the dapr-ext-workflow package instead.', UserWarning, stacklevel=2, ) @@ -1511,6 +1513,7 @@ def get_workflow(self, instance_id: str, workflow_component: str) -> GetWorkflow def terminate_workflow(self, instance_id: str, workflow_component: str) -> DaprResponse: """Terminates a workflow. + Deprecated: use dapr-ext-workflow instead Args: instance_id (str): the ID of the workflow instance, e.g. @@ -1524,7 +1527,7 @@ def terminate_workflow(self, instance_id: str, workflow_component: str) -> DaprR """ # Warnings and input validation warn( - 'The Workflow API is a Beta version and is subject to change.', + 'This Workflow API (Beta) method is deprecated and will be removed in a future version. Use the dapr-ext-workflow package instead.', UserWarning, stacklevel=2, ) @@ -1549,6 +1552,7 @@ def raise_workflow_event( send_raw_bytes: bool = False, ) -> DaprResponse: """Raises an event on a workflow. + Deprecated: use dapr-ext-workflow instead Args: instance_id (str): the ID of the workflow instance, @@ -1568,7 +1572,7 @@ def raise_workflow_event( """ # Warnings and input validation warn( - 'The Workflow API is a Beta version and is subject to change.', + 'This Workflow API (Beta) method is deprecated and will be removed in a future version. Use the dapr-ext-workflow package instead.', UserWarning, stacklevel=2, ) @@ -1613,6 +1617,7 @@ def raise_workflow_event( def pause_workflow(self, instance_id: str, workflow_component: str) -> DaprResponse: """Pause a workflow. + Deprecated: use dapr-ext-workflow instead Args: instance_id (str): the ID of the workflow instance, @@ -1626,7 +1631,7 @@ def pause_workflow(self, instance_id: str, workflow_component: str) -> DaprRespo """ # Warnings and input validation warn( - 'The Workflow API is a Beta version and is subject to change.', + 'This Workflow API (Beta) method is deprecated and will be removed in a future version. Use the dapr-ext-workflow package instead.', UserWarning, stacklevel=2, ) @@ -1645,6 +1650,7 @@ def pause_workflow(self, instance_id: str, workflow_component: str) -> DaprRespo def resume_workflow(self, instance_id: str, workflow_component: str) -> DaprResponse: """Resumes a workflow. + Deprecated: use dapr-ext-workflow instead Args: instance_id (str): the ID of the workflow instance, @@ -1657,7 +1663,7 @@ def resume_workflow(self, instance_id: str, workflow_component: str) -> DaprResp """ # Warnings and input validation warn( - 'The Workflow API is a Beta version and is subject to change.', + 'This Workflow API (Beta) method is deprecated and will be removed in a future version. Use the dapr-ext-workflow package instead.', UserWarning, stacklevel=2, ) @@ -1676,6 +1682,7 @@ def resume_workflow(self, instance_id: str, workflow_component: str) -> DaprResp def purge_workflow(self, instance_id: str, workflow_component: str) -> DaprResponse: """Purges a workflow. + Deprecated: use dapr-ext-workflow instead Args: instance_id (str): the ID of the workflow instance, @@ -1688,7 +1695,7 @@ def purge_workflow(self, instance_id: str, workflow_component: str) -> DaprRespo """ # Warnings and input validation warn( - 'The Workflow API is a Beta version and is subject to change.', + 'This Workflow API (Beta) method is deprecated and will be removed in a future version. Use the dapr-ext-workflow package instead.', UserWarning, stacklevel=2, ) diff --git a/examples/demo_workflow/app.py b/examples/demo_workflow/app.py index 73965562..8f67fdbd 100644 --- a/examples/demo_workflow/app.py +++ b/examples/demo_workflow/app.py @@ -106,6 +106,9 @@ def act_for_child_wf(ctx: WorkflowActivityContext, inp): def main(): + # DEPRECATION NOTICE! + # The workflow methods in the DaprClient are deprecated, instead use the client provided in dapr-ext-workflow + # You can use the examples in https://github.com/dapr/python-sdk/tree/main/examples/workflow with DaprClient() as d: workflow_runtime = WorkflowRuntime() workflow_runtime.register_workflow(hello_world_wf) diff --git a/examples/demo_workflow/demo_workflow/requirements.txt b/examples/demo_workflow/demo_workflow/requirements.txt index 61f7f5c8..c19dc97f 100644 --- a/examples/demo_workflow/demo_workflow/requirements.txt +++ b/examples/demo_workflow/demo_workflow/requirements.txt @@ -1 +1 @@ -dapr-ext-workflow-dev>=0.0.1rc1.dev +dapr-ext-workflow-dev>=0.0.1rc1.dev \ No newline at end of file diff --git a/tests/clients/test_dapr_grpc_client.py b/tests/clients/test_dapr_grpc_client.py index ad90d8cc..f0644ec7 100644 --- a/tests/clients/test_dapr_grpc_client.py +++ b/tests/clients/test_dapr_grpc_client.py @@ -881,7 +881,7 @@ def test_unlock_input_validation(self): # Tests for workflow # - def test_workflow(self): + def test_workflow_deprecated(self): dapr = DaprGrpcClient(f'{self.scheme}localhost:{self.grpc_port}') # Sane parameters workflow_name = 'test_workflow' From 4a79263f682dc6c95f877ef1ccecf4795333483e Mon Sep 17 00:00:00 2001 From: Elena Kolevska Date: Thu, 2 Jan 2025 13:02:41 +0000 Subject: [PATCH 20/24] Removes support for 3.8 and adds 3.13 to test version matrix (#763) Signed-off-by: Elena Kolevska --- .github/workflows/build-push-to-main.yaml | 2 +- .github/workflows/build-tag.yaml | 2 +- .github/workflows/build.yaml | 2 +- .github/workflows/validate_examples.yaml | 2 +- README.md | 2 +- daprdocs/content/en/python-sdk-docs/_index.md | 2 +- daprdocs/content/en/python-sdk-docs/python-actor.md | 2 +- .../python-workflow-ext/python-workflow.md | 2 +- examples/configuration/README.md | 2 +- examples/crypto/README.md | 2 +- examples/demo_actor/README.md | 2 +- examples/demo_workflow/README.md | 2 +- examples/distributed_lock/README.md | 2 +- examples/error_handling/README.md | 2 +- examples/grpc_proxying/README.md | 2 +- examples/invoke-binding/README.md | 2 +- examples/invoke-custom-data/README.md | 2 +- examples/invoke-simple/README.md | 2 +- examples/metadata/README.md | 2 +- examples/pubsub-simple/README.md | 2 +- examples/pubsub-streaming-async/README.md | 2 +- examples/pubsub-streaming/README.md | 2 +- examples/secret_store/README.md | 2 +- examples/state_store/README.md | 2 +- examples/state_store_query/README.md | 2 +- examples/w3c-tracing/README.md | 2 +- examples/workflow/README.md | 2 +- ext/dapr-ext-fastapi/setup.cfg | 4 ++-- ext/dapr-ext-grpc/setup.cfg | 4 ++-- ext/dapr-ext-workflow/setup.cfg | 4 ++-- ext/flask_dapr/setup.cfg | 4 ++-- mypy.ini | 2 +- setup.cfg | 4 ++-- tox.ini | 4 ++-- 34 files changed, 40 insertions(+), 40 deletions(-) diff --git a/.github/workflows/build-push-to-main.yaml b/.github/workflows/build-push-to-main.yaml index f176144a..61e212b3 100644 --- a/.github/workflows/build-push-to-main.yaml +++ b/.github/workflows/build-push-to-main.yaml @@ -40,7 +40,7 @@ jobs: strategy: fail-fast: false matrix: - python_ver: ["3.8", "3.9", "3.10", "3.11", "3.12"] + python_ver: ["3.9", "3.10", "3.11", "3.12", "3.13"] steps: - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python_ver }} diff --git a/.github/workflows/build-tag.yaml b/.github/workflows/build-tag.yaml index 24628f55..2d0969b5 100644 --- a/.github/workflows/build-tag.yaml +++ b/.github/workflows/build-tag.yaml @@ -43,7 +43,7 @@ jobs: strategy: fail-fast: false matrix: - python_ver: ["3.8", "3.9", "3.10", "3.11", "3.12"] + python_ver: ["3.9", "3.10", "3.11", "3.12", "3.13"] steps: - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python_ver }} diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 806c9c88..0d49a8b1 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -46,7 +46,7 @@ jobs: strategy: fail-fast: false matrix: - python_ver: ["3.8", "3.9", "3.10", "3.11", "3.12"] + python_ver: ["3.9", "3.10", "3.11", "3.12", "3.13"] steps: - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python_ver }} diff --git a/.github/workflows/validate_examples.yaml b/.github/workflows/validate_examples.yaml index 423e4317..9617223a 100644 --- a/.github/workflows/validate_examples.yaml +++ b/.github/workflows/validate_examples.yaml @@ -46,7 +46,7 @@ jobs: strategy: fail-fast: false matrix: - python_ver: [3.8, 3.9, "3.10", "3.11", "3.12"] + python_ver: ["3.9", "3.10", "3.11", "3.12", "3.13"] steps: - name: Parse repository_dispatch payload if: github.event_name == 'repository_dispatch' diff --git a/README.md b/README.md index 84da5bd8..c639cd73 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ This includes the following packages: ### Prerequisites * [Install Dapr standalone mode](https://github.com/dapr/cli#install-dapr-on-your-local-machine-self-hosted) -* [Install Python 3.8+](https://www.python.org/downloads/) +* [Install Python 3.9+](https://www.python.org/downloads/) ### Install Dapr python sdk diff --git a/daprdocs/content/en/python-sdk-docs/_index.md b/daprdocs/content/en/python-sdk-docs/_index.md index b098c21d..a22d0843 100644 --- a/daprdocs/content/en/python-sdk-docs/_index.md +++ b/daprdocs/content/en/python-sdk-docs/_index.md @@ -18,7 +18,7 @@ Dapr offers a variety of subpackages to help with the development of Python appl - [Dapr CLI]({{< ref install-dapr-cli.md >}}) installed - Initialized [Dapr environment]({{< ref install-dapr-selfhost.md >}}) -- [Python 3.8+](https://www.python.org/downloads/) installed +- [Python 3.9+](https://www.python.org/downloads/) installed ## Installation diff --git a/daprdocs/content/en/python-sdk-docs/python-actor.md b/daprdocs/content/en/python-sdk-docs/python-actor.md index bd85e996..cc6ba570 100644 --- a/daprdocs/content/en/python-sdk-docs/python-actor.md +++ b/daprdocs/content/en/python-sdk-docs/python-actor.md @@ -12,7 +12,7 @@ The Dapr actor package allows you to interact with Dapr virtual actors from a Py - [Dapr CLI]({{< ref install-dapr-cli.md >}}) installed - Initialized [Dapr environment]({{< ref install-dapr-selfhost.md >}}) -- [Python 3.8+](https://www.python.org/downloads/) installed +- [Python 3.9+](https://www.python.org/downloads/) installed - [Dapr Python package]({{< ref "python#installation" >}}) installed ## Actor interface diff --git a/daprdocs/content/en/python-sdk-docs/python-sdk-extensions/python-workflow-ext/python-workflow.md b/daprdocs/content/en/python-sdk-docs/python-sdk-extensions/python-workflow-ext/python-workflow.md index 17f45ec4..b241c9c1 100644 --- a/daprdocs/content/en/python-sdk-docs/python-sdk-extensions/python-workflow-ext/python-workflow.md +++ b/daprdocs/content/en/python-sdk-docs/python-sdk-extensions/python-workflow-ext/python-workflow.md @@ -21,7 +21,7 @@ In the Python example project, the `app.py` file contains the setup of the app, ## Prerequisites - [Dapr CLI]({{< ref install-dapr-cli.md >}}) installed - Initialized [Dapr environment]({{< ref install-dapr-selfhost.md >}}) -- [Python 3.8+](https://www.python.org/downloads/) installed +- [Python 3.9+](https://www.python.org/downloads/) installed - [Dapr Python package]({{< ref "python#installation" >}}) and the [workflow extension]({{< ref "python-workflow/_index.md" >}}) installed - Verify you're using the latest proto bindings diff --git a/examples/configuration/README.md b/examples/configuration/README.md index 3ecfddd8..a9023888 100644 --- a/examples/configuration/README.md +++ b/examples/configuration/README.md @@ -9,7 +9,7 @@ It demonstrates the following APIs: ## Pre-requisites - [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started) -- [Install Python 3.8+](https://www.python.org/downloads/) +- [Install Python 3.9+](https://www.python.org/downloads/) ## Install Dapr python-SDK diff --git a/examples/crypto/README.md b/examples/crypto/README.md index 2202982a..a176b4c9 100644 --- a/examples/crypto/README.md +++ b/examples/crypto/README.md @@ -11,7 +11,7 @@ It creates a client using `DaprClient`, uses a local store defined in ## Pre-requisites - [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started) -- [Install Python 3.8+](https://www.python.org/downloads/) +- [Install Python 3.9+](https://www.python.org/downloads/) > In order to run this sample, make sure that OpenSSL is available on your system. diff --git a/examples/demo_actor/README.md b/examples/demo_actor/README.md index 64ca7ca5..f1b1bbe2 100644 --- a/examples/demo_actor/README.md +++ b/examples/demo_actor/README.md @@ -11,7 +11,7 @@ This document describes how to create an Actor(DemoActor) and invoke its methods ## Pre-requisites - [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started) -- [Install Python 3.8+](https://www.python.org/downloads/) +- [Install Python 3.9+](https://www.python.org/downloads/) ### Install requirements diff --git a/examples/demo_workflow/README.md b/examples/demo_workflow/README.md index 12b84ae2..7570f8f0 100644 --- a/examples/demo_workflow/README.md +++ b/examples/demo_workflow/README.md @@ -12,7 +12,7 @@ It demonstrates the following APIs: ## Pre-requisites - [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started) -- [Install Python 3.8+](https://www.python.org/downloads/) +- [Install Python 3.9+](https://www.python.org/downloads/) ### Install requirements diff --git a/examples/distributed_lock/README.md b/examples/distributed_lock/README.md index 80696c13..367b0e17 100644 --- a/examples/distributed_lock/README.md +++ b/examples/distributed_lock/README.md @@ -12,7 +12,7 @@ all the distributed lock API methods available as example. ## Pre-requisites - [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started) -- [Install Python 3.8+](https://www.python.org/downloads/) +- [Install Python 3.9+](https://www.python.org/downloads/) ## Install Dapr python-SDK diff --git a/examples/error_handling/README.md b/examples/error_handling/README.md index 0ce190d3..067b3ed1 100644 --- a/examples/error_handling/README.md +++ b/examples/error_handling/README.md @@ -8,7 +8,7 @@ It uses the default configuration from Dapr init in [self-hosted mode](https://g ## Pre-requisites - [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started) -- [Install Python 3.8+](https://www.python.org/downloads/) +- [Install Python 3.9+](https://www.python.org/downloads/) ## Install Dapr python-SDK diff --git a/examples/grpc_proxying/README.md b/examples/grpc_proxying/README.md index e31913de..2cd13947 100644 --- a/examples/grpc_proxying/README.md +++ b/examples/grpc_proxying/README.md @@ -7,7 +7,7 @@ This example creates a gRPC service using the protobuf file and adds it to the P ## Pre-requisites - [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started) -- [Install Python 3.8+](https://www.python.org/downloads/) +- [Install Python 3.9+](https://www.python.org/downloads/) ## Install Dapr python-SDK diff --git a/examples/invoke-binding/README.md b/examples/invoke-binding/README.md index d006f76d..74e39576 100644 --- a/examples/invoke-binding/README.md +++ b/examples/invoke-binding/README.md @@ -7,7 +7,7 @@ This example utilizes a publisher and a receiver for the InvokeBinding / OnBindi ## Pre-requisites - [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started) -- [Install Python 3.8+](https://www.python.org/downloads/) +- [Install Python 3.9+](https://www.python.org/downloads/) ## Install Dapr python-SDK diff --git a/examples/invoke-custom-data/README.md b/examples/invoke-custom-data/README.md index e72d74a7..c25a565b 100644 --- a/examples/invoke-custom-data/README.md +++ b/examples/invoke-custom-data/README.md @@ -7,7 +7,7 @@ This example utilizes a receiver and a caller for the OnInvoke / Invoke function ## Pre-requisites - [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started) -- [Install Python 3.8+](https://www.python.org/downloads/) +- [Install Python 3.9+](https://www.python.org/downloads/) ## Install Dapr python-SDK diff --git a/examples/invoke-simple/README.md b/examples/invoke-simple/README.md index 7d78f0cc..08cf68e7 100644 --- a/examples/invoke-simple/README.md +++ b/examples/invoke-simple/README.md @@ -7,7 +7,7 @@ This example utilizes a receiver and a caller for the OnInvoke / Invoke function ## Pre-requisites - [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started) -- [Install Python 3.8+](https://www.python.org/downloads/) +- [Install Python 3.9+](https://www.python.org/downloads/) ## Install Dapr python-SDK diff --git a/examples/metadata/README.md b/examples/metadata/README.md index 3f913285..eafe3723 100644 --- a/examples/metadata/README.md +++ b/examples/metadata/README.md @@ -15,7 +15,7 @@ It creates a client using `DaprClient`, uses a set of components defined in the ## Pre-requisites - [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started) -- [Install Python 3.8+](https://www.python.org/downloads/) +- [Install Python 3.9+](https://www.python.org/downloads/) ## Install Dapr python-SDK diff --git a/examples/pubsub-simple/README.md b/examples/pubsub-simple/README.md index 97af9a4a..f4730a42 100644 --- a/examples/pubsub-simple/README.md +++ b/examples/pubsub-simple/README.md @@ -10,7 +10,7 @@ The subscriber will tell dapr to retry delivery of the first message it receives ## Pre-requisites - [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started) -- [Install Python 3.8+](https://www.python.org/downloads/) +- [Install Python 3.9+](https://www.python.org/downloads/) ## Install Dapr python-SDK diff --git a/examples/pubsub-streaming-async/README.md b/examples/pubsub-streaming-async/README.md index 60c1cdef..4a399a5b 100644 --- a/examples/pubsub-streaming-async/README.md +++ b/examples/pubsub-streaming-async/README.md @@ -10,7 +10,7 @@ In the s`subscriber.py` file it creates a subscriber object that can call the `n ## Pre-requisites - [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started) -- [Install Python 3.8+](https://www.python.org/downloads/) +- [Install Python 3.9+](https://www.python.org/downloads/) ## Install Dapr python-SDK diff --git a/examples/pubsub-streaming/README.md b/examples/pubsub-streaming/README.md index 15664522..d03ff045 100644 --- a/examples/pubsub-streaming/README.md +++ b/examples/pubsub-streaming/README.md @@ -10,7 +10,7 @@ In the s`subscriber.py` file it creates a subscriber object that can call the `n ## Pre-requisites - [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started) -- [Install Python 3.8+](https://www.python.org/downloads/) +- [Install Python 3.9+](https://www.python.org/downloads/) ## Install Dapr python-SDK diff --git a/examples/secret_store/README.md b/examples/secret_store/README.md index cf5b86e0..1bb8e3ae 100644 --- a/examples/secret_store/README.md +++ b/examples/secret_store/README.md @@ -9,7 +9,7 @@ This example also illustrates the use of access control for secrets. ## Pre-requisites - [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started) -- [Install Python 3.8+](https://www.python.org/downloads/) +- [Install Python 3.9+](https://www.python.org/downloads/) ## Install Dapr python-SDK diff --git a/examples/state_store/README.md b/examples/state_store/README.md index 67ea5791..f4207476 100644 --- a/examples/state_store/README.md +++ b/examples/state_store/README.md @@ -17,7 +17,7 @@ It uses the default configuration from Dapr init in [self-hosted mode](https://g ## Pre-requisites - [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started) -- [Install Python 3.8+](https://www.python.org/downloads/) +- [Install Python 3.9+](https://www.python.org/downloads/) ## Install Dapr python-SDK diff --git a/examples/state_store_query/README.md b/examples/state_store_query/README.md index a6e8fceb..bdfa9416 100644 --- a/examples/state_store_query/README.md +++ b/examples/state_store_query/README.md @@ -9,7 +9,7 @@ It demonstrates the following APIs: ## Pre-requisites - [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started) -- [Install Python 3.8+](https://www.python.org/downloads/) +- [Install Python 3.9+](https://www.python.org/downloads/) ## Install Dapr python-SDK diff --git a/examples/w3c-tracing/README.md b/examples/w3c-tracing/README.md index 8f694e8b..d8ed7d6b 100644 --- a/examples/w3c-tracing/README.md +++ b/examples/w3c-tracing/README.md @@ -15,7 +15,7 @@ This sample uses the Client provided in Dapr's Python SDK invoking a remote meth ## Pre-requisites - [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started) -- [Install Python 3.8+](https://www.python.org/downloads/) +- [Install Python 3.9+](https://www.python.org/downloads/) ### Install dependencies diff --git a/examples/workflow/README.md b/examples/workflow/README.md index 63208c8e..6b936b31 100644 --- a/examples/workflow/README.md +++ b/examples/workflow/README.md @@ -5,7 +5,7 @@ This directory contains examples of using the [Dapr Workflow](https://docs.dapr. ## Prerequisites - [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started) -- [Install Python 3.8+](https://www.python.org/downloads/) +- [Install Python 3.9+](https://www.python.org/downloads/) ### Install requirements diff --git a/ext/dapr-ext-fastapi/setup.cfg b/ext/dapr-ext-fastapi/setup.cfg index f4f5ead4..ed5a6810 100644 --- a/ext/dapr-ext-fastapi/setup.cfg +++ b/ext/dapr-ext-fastapi/setup.cfg @@ -10,17 +10,17 @@ classifiers = License :: OSI Approved :: Apache Software License Operating System :: OS Independent Programming Language :: Python - Programming Language :: Python :: 3.8 Programming Language :: Python :: 3.9 Programming Language :: Python :: 3.10 Programming Language :: Python :: 3.11 Programming Language :: Python :: 3.12 + Programming Language :: Python :: 3.13 project_urls = Documentation = https://github.com/dapr/docs Source = https://github.com/dapr/python-sdk [options] -python_requires = >=3.8 +python_requires = >=3.9 packages = find_namespace: include_package_data = True install_requires = diff --git a/ext/dapr-ext-grpc/setup.cfg b/ext/dapr-ext-grpc/setup.cfg index 7a25b628..1a87234c 100644 --- a/ext/dapr-ext-grpc/setup.cfg +++ b/ext/dapr-ext-grpc/setup.cfg @@ -10,17 +10,17 @@ classifiers = License :: OSI Approved :: Apache Software License Operating System :: OS Independent Programming Language :: Python - Programming Language :: Python :: 3.8 Programming Language :: Python :: 3.9 Programming Language :: Python :: 3.10 Programming Language :: Python :: 3.11 Programming Language :: Python :: 3.12 + Programming Language :: Python :: 3.13 project_urls = Documentation = https://github.com/dapr/docs Source = https://github.com/dapr/python-sdk [options] -python_requires = >=3.8 +python_requires = >=3.9 packages = find_namespace: include_package_data = True install_requires = diff --git a/ext/dapr-ext-workflow/setup.cfg b/ext/dapr-ext-workflow/setup.cfg index 8c292593..3eb6e213 100644 --- a/ext/dapr-ext-workflow/setup.cfg +++ b/ext/dapr-ext-workflow/setup.cfg @@ -10,17 +10,17 @@ classifiers = License :: OSI Approved :: Apache Software License Operating System :: OS Independent Programming Language :: Python - Programming Language :: Python :: 3.8 Programming Language :: Python :: 3.9 Programming Language :: Python :: 3.10 Programming Language :: Python :: 3.11 Programming Language :: Python :: 3.12 + Programming Language :: Python :: 3.13 project_urls = Documentation = https://github.com/dapr/docs Source = https://github.com/dapr/python-sdk [options] -python_requires = >=3.8 +python_requires = >=3.9 packages = find_namespace: include_package_data = True install_requires = diff --git a/ext/flask_dapr/setup.cfg b/ext/flask_dapr/setup.cfg index 4cccbd36..ed98c443 100644 --- a/ext/flask_dapr/setup.cfg +++ b/ext/flask_dapr/setup.cfg @@ -10,17 +10,17 @@ classifiers = License :: OSI Approved :: Apache Software License Operating System :: OS Independent Programming Language :: Python - Programming Language :: Python :: 3.8 Programming Language :: Python :: 3.9 Programming Language :: Python :: 3.10 Programming Language :: Python :: 3.11 Programming Language :: Python :: 3.12 + Programming Language :: Python :: 3.13 project_urls = Documentation = https://github.com/dapr/docs Source = https://github.com/dapr/python-sdk [options] -python_requires = >=3.8 +python_requires = >=3.9 packages = find: include_package_data = true zip_safe = false diff --git a/mypy.ini b/mypy.ini index 9ae893ad..8c0fee4f 100644 --- a/mypy.ini +++ b/mypy.ini @@ -1,5 +1,5 @@ [mypy] -python_version = 3.8 +python_version = 3.9 warn_unused_configs = True warn_redundant_casts = True show_error_codes = True diff --git a/setup.cfg b/setup.cfg index 740c3661..56f3c634 100644 --- a/setup.cfg +++ b/setup.cfg @@ -10,17 +10,17 @@ classifiers = License :: OSI Approved :: Apache Software License Operating System :: OS Independent Programming Language :: Python - Programming Language :: Python :: 3.8 Programming Language :: Python :: 3.9 Programming Language :: Python :: 3.10 Programming Language :: Python :: 3.11 Programming Language :: Python :: 3.12 + Programming Language :: Python :: 3.13 project_urls = Documentation = https://github.com/dapr/docs Source = https://github.com/dapr/python-sdk [options] -python_requires = >=3.8 +python_requires = >=3.9 packages = find_namespace: include_package_data = True zip_safe = False diff --git a/tox.ini b/tox.ini index 5e7a2539..d81984a3 100644 --- a/tox.ini +++ b/tox.ini @@ -1,8 +1,8 @@ [tox] skipsdist = True -minversion = 3.8.0 +minversion = 3.9.0 envlist = - py{38,39,310,311,312} + py{39,310,311,312,313} flake8, ruff, mypy, From 4bd231064baa0caddf12941a1681df5bb61cef6d Mon Sep 17 00:00:00 2001 From: Elena Kolevska Date: Thu, 2 Jan 2025 14:57:05 +0000 Subject: [PATCH 21/24] Updates dapr email to dapr.io (#764) Signed-off-by: Elena Kolevska --- setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index 56f3c634..7484cc8b 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,7 +1,7 @@ [metadata] url = https://dapr.io/ author = Dapr Authors -author_email = daprweb@microsoft.com +author_email = dapr@dapr.io license = Apache license_file = LICENSE classifiers = From 8df177481224227ac559d303c3d8e819d7143538 Mon Sep 17 00:00:00 2001 From: Elena Kolevska Date: Wed, 8 Jan 2025 19:30:03 +0000 Subject: [PATCH 22/24] Reverts grpc bump Signed-off-by: Elena Kolevska --- setup.cfg | 4 ++-- tools/requirements.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/setup.cfg b/setup.cfg index 7484cc8b..de5d53f4 100644 --- a/setup.cfg +++ b/setup.cfg @@ -26,8 +26,8 @@ include_package_data = True zip_safe = False install_requires = protobuf >= 4.22 - grpcio >= 1.67.0 - grpcio-status>=1.67.0 + grpcio >= 1.37.0 + grpcio-status>=1.37.0 aiohttp >= 3.9.0b0 python-dateutil >= 2.8.1 typing-extensions>=4.4.0 diff --git a/tools/requirements.txt b/tools/requirements.txt index e528d98b..d3d503c9 100644 --- a/tools/requirements.txt +++ b/tools/requirements.txt @@ -1 +1 @@ -grpcio-tools>=1.67.0 +grpcio-tools>=1.57.0 From 73e5ac9b03839f4cef162152b388ca42b491275b Mon Sep 17 00:00:00 2001 From: Elena Kolevska Date: Thu, 9 Jan 2025 11:44:30 +0000 Subject: [PATCH 23/24] Updates protos and fixes grpc-tools for protos generation (#766) * Updates protos and fixes grpc-tools for protos generation Signed-off-by: Elena Kolevska * bumps grpcio tools version Signed-off-by: Elena Kolevska --------- Signed-off-by: Elena Kolevska --- README.md | 3 +- dapr/proto/README.md | 2 +- dapr/proto/common/v1/common_pb2.py | 14 +- dapr/proto/runtime/v1/appcallback_pb2.py | 22 +-- dapr/proto/runtime/v1/dapr_pb2.py | 194 ++++++++++++----------- dapr/proto/runtime/v1/dapr_pb2.pyi | 24 +-- dapr/proto/runtime/v1/dapr_pb2_grpc.py | 12 +- tools/requirements.txt | 2 +- 8 files changed, 143 insertions(+), 130 deletions(-) diff --git a/README.md b/README.md index c639cd73..b6f7d0a7 100644 --- a/README.md +++ b/README.md @@ -137,8 +137,7 @@ The generated files will be found in `docs/_build`. ## Generate gRPC Protobuf client ```sh -pip3 install -r dev-requirements.txt - +pip3 install -r tools/requirements.txt ./tools/regen_grpcclient.sh ``` diff --git a/dapr/proto/README.md b/dapr/proto/README.md index 8ce19995..d6639541 100644 --- a/dapr/proto/README.md +++ b/dapr/proto/README.md @@ -12,7 +12,7 @@ source /bin/activate Run the following commands: ```sh -pip3 install -r dev-requirements.txt +pip3 install -r tools/requirements.txt ./tools/regen_grpcclient.sh ``` diff --git a/dapr/proto/common/v1/common_pb2.py b/dapr/proto/common/v1/common_pb2.py index a1bf2566..673bac1b 100644 --- a/dapr/proto/common/v1/common_pb2.py +++ b/dapr/proto/common/v1/common_pb2.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! # source: dapr/proto/common/v1/common.proto +# Protobuf Python Version: 4.25.1 """Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool @@ -20,13 +21,12 @@ _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'dapr.proto.common.v1.common_pb2', _globals) if _descriptor._USE_C_DESCRIPTORS == False: - - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\n\nio.dapr.v1B\014CommonProtosZ/github.com/dapr/dapr/pkg/proto/common/v1;common\252\002\033Dapr.Client.Autogen.Grpc.v1' - _STATEITEM_METADATAENTRY._options = None - _STATEITEM_METADATAENTRY._serialized_options = b'8\001' - _CONFIGURATIONITEM_METADATAENTRY._options = None - _CONFIGURATIONITEM_METADATAENTRY._serialized_options = b'8\001' + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\nio.dapr.v1B\014CommonProtosZ/github.com/dapr/dapr/pkg/proto/common/v1;common\252\002\033Dapr.Client.Autogen.Grpc.v1' + _globals['_STATEITEM_METADATAENTRY']._options = None + _globals['_STATEITEM_METADATAENTRY']._serialized_options = b'8\001' + _globals['_CONFIGURATIONITEM_METADATAENTRY']._options = None + _globals['_CONFIGURATIONITEM_METADATAENTRY']._serialized_options = b'8\001' _globals['_HTTPEXTENSION']._serialized_start=87 _globals['_HTTPEXTENSION']._serialized_end=295 _globals['_HTTPEXTENSION_VERB']._serialized_start=181 diff --git a/dapr/proto/runtime/v1/appcallback_pb2.py b/dapr/proto/runtime/v1/appcallback_pb2.py index f661ff99..6773f762 100644 --- a/dapr/proto/runtime/v1/appcallback_pb2.py +++ b/dapr/proto/runtime/v1/appcallback_pb2.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! # source: dapr/proto/runtime/v1/appcallback.proto +# Protobuf Python Version: 4.25.1 """Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool @@ -23,17 +24,16 @@ _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'dapr.proto.runtime.v1.appcallback_pb2', _globals) if _descriptor._USE_C_DESCRIPTORS == False: - - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\n\nio.dapr.v1B\025DaprAppCallbackProtosZ1github.com/dapr/dapr/pkg/proto/runtime/v1;runtime\252\002 Dapr.AppCallback.Autogen.Grpc.v1' - _TOPICEVENTBULKREQUESTENTRY_METADATAENTRY._options = None - _TOPICEVENTBULKREQUESTENTRY_METADATAENTRY._serialized_options = b'8\001' - _TOPICEVENTBULKREQUEST_METADATAENTRY._options = None - _TOPICEVENTBULKREQUEST_METADATAENTRY._serialized_options = b'8\001' - _BINDINGEVENTREQUEST_METADATAENTRY._options = None - _BINDINGEVENTREQUEST_METADATAENTRY._serialized_options = b'8\001' - _TOPICSUBSCRIPTION_METADATAENTRY._options = None - _TOPICSUBSCRIPTION_METADATAENTRY._serialized_options = b'8\001' + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\nio.dapr.v1B\025DaprAppCallbackProtosZ1github.com/dapr/dapr/pkg/proto/runtime/v1;runtime\252\002 Dapr.AppCallback.Autogen.Grpc.v1' + _globals['_TOPICEVENTBULKREQUESTENTRY_METADATAENTRY']._options = None + _globals['_TOPICEVENTBULKREQUESTENTRY_METADATAENTRY']._serialized_options = b'8\001' + _globals['_TOPICEVENTBULKREQUEST_METADATAENTRY']._options = None + _globals['_TOPICEVENTBULKREQUEST_METADATAENTRY']._serialized_options = b'8\001' + _globals['_BINDINGEVENTREQUEST_METADATAENTRY']._options = None + _globals['_BINDINGEVENTREQUEST_METADATAENTRY']._serialized_options = b'8\001' + _globals['_TOPICSUBSCRIPTION_METADATAENTRY']._options = None + _globals['_TOPICSUBSCRIPTION_METADATAENTRY']._serialized_options = b'8\001' _globals['_JOBEVENTREQUEST']._serialized_start=188 _globals['_JOBEVENTREQUEST']._serialized_end=354 _globals['_JOBEVENTRESPONSE']._serialized_start=356 diff --git a/dapr/proto/runtime/v1/dapr_pb2.py b/dapr/proto/runtime/v1/dapr_pb2.py index e2e9ccbc..7c1520de 100644 --- a/dapr/proto/runtime/v1/dapr_pb2.py +++ b/dapr/proto/runtime/v1/dapr_pb2.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! # source: dapr/proto/runtime/v1/dapr.proto +# Protobuf Python Version: 4.25.1 """Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool @@ -18,85 +19,98 @@ from dapr.proto.runtime.v1 import appcallback_pb2 as dapr_dot_proto_dot_runtime_dot_v1_dot_appcallback__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n dapr/proto/runtime/v1/dapr.proto\x12\x15\x64\x61pr.proto.runtime.v1\x1a\x19google/protobuf/any.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a!dapr/proto/common/v1/common.proto\x1a\'dapr/proto/runtime/v1/appcallback.proto\"X\n\x14InvokeServiceRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12\x34\n\x07message\x18\x03 \x01(\x0b\x32#.dapr.proto.common.v1.InvokeRequest\"\xf5\x01\n\x0fGetStateRequest\x12\x12\n\nstore_name\x18\x01 \x01(\t\x12\x0b\n\x03key\x18\x02 \x01(\t\x12H\n\x0b\x63onsistency\x18\x03 \x01(\x0e\x32\x33.dapr.proto.common.v1.StateOptions.StateConsistency\x12\x46\n\x08metadata\x18\x04 \x03(\x0b\x32\x34.dapr.proto.runtime.v1.GetStateRequest.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xc9\x01\n\x13GetBulkStateRequest\x12\x12\n\nstore_name\x18\x01 \x01(\t\x12\x0c\n\x04keys\x18\x02 \x03(\t\x12\x13\n\x0bparallelism\x18\x03 \x01(\x05\x12J\n\x08metadata\x18\x04 \x03(\x0b\x32\x38.dapr.proto.runtime.v1.GetBulkStateRequest.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"K\n\x14GetBulkStateResponse\x12\x33\n\x05items\x18\x01 \x03(\x0b\x32$.dapr.proto.runtime.v1.BulkStateItem\"\xbe\x01\n\rBulkStateItem\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\x12\x0c\n\x04\x65tag\x18\x03 \x01(\t\x12\r\n\x05\x65rror\x18\x04 \x01(\t\x12\x44\n\x08metadata\x18\x05 \x03(\x0b\x32\x32.dapr.proto.runtime.v1.BulkStateItem.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xa8\x01\n\x10GetStateResponse\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\x12\x0c\n\x04\x65tag\x18\x02 \x01(\t\x12G\n\x08metadata\x18\x03 \x03(\x0b\x32\x35.dapr.proto.runtime.v1.GetStateResponse.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x90\x02\n\x12\x44\x65leteStateRequest\x12\x12\n\nstore_name\x18\x01 \x01(\t\x12\x0b\n\x03key\x18\x02 \x01(\t\x12(\n\x04\x65tag\x18\x03 \x01(\x0b\x32\x1a.dapr.proto.common.v1.Etag\x12\x33\n\x07options\x18\x04 \x01(\x0b\x32\".dapr.proto.common.v1.StateOptions\x12I\n\x08metadata\x18\x05 \x03(\x0b\x32\x37.dapr.proto.runtime.v1.DeleteStateRequest.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"]\n\x16\x44\x65leteBulkStateRequest\x12\x12\n\nstore_name\x18\x01 \x01(\t\x12/\n\x06states\x18\x02 \x03(\x0b\x32\x1f.dapr.proto.common.v1.StateItem\"W\n\x10SaveStateRequest\x12\x12\n\nstore_name\x18\x01 \x01(\t\x12/\n\x06states\x18\x02 \x03(\x0b\x32\x1f.dapr.proto.common.v1.StateItem\"\xbc\x01\n\x11QueryStateRequest\x12\x1d\n\nstore_name\x18\x01 \x01(\tR\tstoreName\x12\r\n\x05query\x18\x02 \x01(\t\x12H\n\x08metadata\x18\x03 \x03(\x0b\x32\x36.dapr.proto.runtime.v1.QueryStateRequest.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"H\n\x0eQueryStateItem\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\x12\x0c\n\x04\x65tag\x18\x03 \x01(\t\x12\r\n\x05\x65rror\x18\x04 \x01(\t\"\xd7\x01\n\x12QueryStateResponse\x12\x36\n\x07results\x18\x01 \x03(\x0b\x32%.dapr.proto.runtime.v1.QueryStateItem\x12\r\n\x05token\x18\x02 \x01(\t\x12I\n\x08metadata\x18\x03 \x03(\x0b\x32\x37.dapr.proto.runtime.v1.QueryStateResponse.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xdf\x01\n\x13PublishEventRequest\x12\x13\n\x0bpubsub_name\x18\x01 \x01(\t\x12\r\n\x05topic\x18\x02 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x03 \x01(\x0c\x12\x19\n\x11\x64\x61ta_content_type\x18\x04 \x01(\t\x12J\n\x08metadata\x18\x05 \x03(\x0b\x32\x38.dapr.proto.runtime.v1.PublishEventRequest.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xf5\x01\n\x12\x42ulkPublishRequest\x12\x13\n\x0bpubsub_name\x18\x01 \x01(\t\x12\r\n\x05topic\x18\x02 \x01(\t\x12?\n\x07\x65ntries\x18\x03 \x03(\x0b\x32..dapr.proto.runtime.v1.BulkPublishRequestEntry\x12I\n\x08metadata\x18\x04 \x03(\x0b\x32\x37.dapr.proto.runtime.v1.BulkPublishRequest.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xd1\x01\n\x17\x42ulkPublishRequestEntry\x12\x10\n\x08\x65ntry_id\x18\x01 \x01(\t\x12\r\n\x05\x65vent\x18\x02 \x01(\x0c\x12\x14\n\x0c\x63ontent_type\x18\x03 \x01(\t\x12N\n\x08metadata\x18\x04 \x03(\x0b\x32<.dapr.proto.runtime.v1.BulkPublishRequestEntry.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"c\n\x13\x42ulkPublishResponse\x12L\n\rfailedEntries\x18\x01 \x03(\x0b\x32\x35.dapr.proto.runtime.v1.BulkPublishResponseFailedEntry\"A\n\x1e\x42ulkPublishResponseFailedEntry\x12\x10\n\x08\x65ntry_id\x18\x01 \x01(\t\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"\x84\x02\n!SubscribeTopicEventsRequestAlpha1\x12Z\n\x0finitial_request\x18\x01 \x01(\x0b\x32?.dapr.proto.runtime.v1.SubscribeTopicEventsRequestInitialAlpha1H\x00\x12\\\n\x0f\x65vent_processed\x18\x02 \x01(\x0b\x32\x41.dapr.proto.runtime.v1.SubscribeTopicEventsRequestProcessedAlpha1H\x00\x42%\n#subscribe_topic_events_request_type\"\x96\x02\n(SubscribeTopicEventsRequestInitialAlpha1\x12\x13\n\x0bpubsub_name\x18\x01 \x01(\t\x12\r\n\x05topic\x18\x02 \x01(\t\x12_\n\x08metadata\x18\x03 \x03(\x0b\x32M.dapr.proto.runtime.v1.SubscribeTopicEventsRequestInitialAlpha1.MetadataEntry\x12\x1e\n\x11\x64\x65\x61\x64_letter_topic\x18\x04 \x01(\tH\x00\x88\x01\x01\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\x14\n\x12_dead_letter_topic\"s\n*SubscribeTopicEventsRequestProcessedAlpha1\x12\n\n\x02id\x18\x01 \x01(\t\x12\x39\n\x06status\x18\x02 \x01(\x0b\x32).dapr.proto.runtime.v1.TopicEventResponse\"\xed\x01\n\"SubscribeTopicEventsResponseAlpha1\x12\\\n\x10initial_response\x18\x01 \x01(\x0b\x32@.dapr.proto.runtime.v1.SubscribeTopicEventsResponseInitialAlpha1H\x00\x12\x41\n\revent_message\x18\x02 \x01(\x0b\x32(.dapr.proto.runtime.v1.TopicEventRequestH\x00\x42&\n$subscribe_topic_events_response_type\"+\n)SubscribeTopicEventsResponseInitialAlpha1\"\xc3\x01\n\x14InvokeBindingRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\x12K\n\x08metadata\x18\x03 \x03(\x0b\x32\x39.dapr.proto.runtime.v1.InvokeBindingRequest.MetadataEntry\x12\x11\n\toperation\x18\x04 \x01(\t\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xa4\x01\n\x15InvokeBindingResponse\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\x12L\n\x08metadata\x18\x02 \x03(\x0b\x32:.dapr.proto.runtime.v1.InvokeBindingResponse.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xb8\x01\n\x10GetSecretRequest\x12\x1d\n\nstore_name\x18\x01 \x01(\tR\tstoreName\x12\x0b\n\x03key\x18\x02 \x01(\t\x12G\n\x08metadata\x18\x03 \x03(\x0b\x32\x35.dapr.proto.runtime.v1.GetSecretRequest.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x82\x01\n\x11GetSecretResponse\x12@\n\x04\x64\x61ta\x18\x01 \x03(\x0b\x32\x32.dapr.proto.runtime.v1.GetSecretResponse.DataEntry\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xb3\x01\n\x14GetBulkSecretRequest\x12\x1d\n\nstore_name\x18\x01 \x01(\tR\tstoreName\x12K\n\x08metadata\x18\x02 \x03(\x0b\x32\x39.dapr.proto.runtime.v1.GetBulkSecretRequest.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x85\x01\n\x0eSecretResponse\x12\x43\n\x07secrets\x18\x01 \x03(\x0b\x32\x32.dapr.proto.runtime.v1.SecretResponse.SecretsEntry\x1a.\n\x0cSecretsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xb1\x01\n\x15GetBulkSecretResponse\x12\x44\n\x04\x64\x61ta\x18\x01 \x03(\x0b\x32\x36.dapr.proto.runtime.v1.GetBulkSecretResponse.DataEntry\x1aR\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x34\n\x05value\x18\x02 \x01(\x0b\x32%.dapr.proto.runtime.v1.SecretResponse:\x02\x38\x01\"f\n\x1bTransactionalStateOperation\x12\x15\n\roperationType\x18\x01 \x01(\t\x12\x30\n\x07request\x18\x02 \x01(\x0b\x32\x1f.dapr.proto.common.v1.StateItem\"\x83\x02\n\x1e\x45xecuteStateTransactionRequest\x12\x11\n\tstoreName\x18\x01 \x01(\t\x12\x46\n\noperations\x18\x02 \x03(\x0b\x32\x32.dapr.proto.runtime.v1.TransactionalStateOperation\x12U\n\x08metadata\x18\x03 \x03(\x0b\x32\x43.dapr.proto.runtime.v1.ExecuteStateTransactionRequest.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xbb\x01\n\x19RegisterActorTimerRequest\x12\x1d\n\nactor_type\x18\x01 \x01(\tR\tactorType\x12\x19\n\x08\x61\x63tor_id\x18\x02 \x01(\tR\x07\x61\x63torId\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x19\n\x08\x64ue_time\x18\x04 \x01(\tR\x07\x64ueTime\x12\x0e\n\x06period\x18\x05 \x01(\t\x12\x10\n\x08\x63\x61llback\x18\x06 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x07 \x01(\x0c\x12\x0b\n\x03ttl\x18\x08 \x01(\t\"e\n\x1bUnregisterActorTimerRequest\x12\x1d\n\nactor_type\x18\x01 \x01(\tR\tactorType\x12\x19\n\x08\x61\x63tor_id\x18\x02 \x01(\tR\x07\x61\x63torId\x12\x0c\n\x04name\x18\x03 \x01(\t\"\xac\x01\n\x1cRegisterActorReminderRequest\x12\x1d\n\nactor_type\x18\x01 \x01(\tR\tactorType\x12\x19\n\x08\x61\x63tor_id\x18\x02 \x01(\tR\x07\x61\x63torId\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x19\n\x08\x64ue_time\x18\x04 \x01(\tR\x07\x64ueTime\x12\x0e\n\x06period\x18\x05 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x06 \x01(\x0c\x12\x0b\n\x03ttl\x18\x07 \x01(\t\"h\n\x1eUnregisterActorReminderRequest\x12\x1d\n\nactor_type\x18\x01 \x01(\tR\tactorType\x12\x19\n\x08\x61\x63tor_id\x18\x02 \x01(\tR\x07\x61\x63torId\x12\x0c\n\x04name\x18\x03 \x01(\t\"]\n\x14GetActorStateRequest\x12\x1d\n\nactor_type\x18\x01 \x01(\tR\tactorType\x12\x19\n\x08\x61\x63tor_id\x18\x02 \x01(\tR\x07\x61\x63torId\x12\x0b\n\x03key\x18\x03 \x01(\t\"\xa4\x01\n\x15GetActorStateResponse\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\x12L\n\x08metadata\x18\x02 \x03(\x0b\x32:.dapr.proto.runtime.v1.GetActorStateResponse.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xac\x01\n#ExecuteActorStateTransactionRequest\x12\x1d\n\nactor_type\x18\x01 \x01(\tR\tactorType\x12\x19\n\x08\x61\x63tor_id\x18\x02 \x01(\tR\x07\x61\x63torId\x12K\n\noperations\x18\x03 \x03(\x0b\x32\x37.dapr.proto.runtime.v1.TransactionalActorStateOperation\"\xf5\x01\n TransactionalActorStateOperation\x12\x15\n\roperationType\x18\x01 \x01(\t\x12\x0b\n\x03key\x18\x02 \x01(\t\x12#\n\x05value\x18\x03 \x01(\x0b\x32\x14.google.protobuf.Any\x12W\n\x08metadata\x18\x04 \x03(\x0b\x32\x45.dapr.proto.runtime.v1.TransactionalActorStateOperation.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xe8\x01\n\x12InvokeActorRequest\x12\x1d\n\nactor_type\x18\x01 \x01(\tR\tactorType\x12\x19\n\x08\x61\x63tor_id\x18\x02 \x01(\tR\x07\x61\x63torId\x12\x0e\n\x06method\x18\x03 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x04 \x01(\x0c\x12I\n\x08metadata\x18\x05 \x03(\x0b\x32\x37.dapr.proto.runtime.v1.InvokeActorRequest.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"#\n\x13InvokeActorResponse\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\"\x14\n\x12GetMetadataRequest\"\x9b\x06\n\x13GetMetadataResponse\x12\n\n\x02id\x18\x01 \x01(\t\x12Q\n\x13\x61\x63tive_actors_count\x18\x02 \x03(\x0b\x32(.dapr.proto.runtime.v1.ActiveActorsCountB\x02\x18\x01R\x06\x61\x63tors\x12V\n\x15registered_components\x18\x03 \x03(\x0b\x32+.dapr.proto.runtime.v1.RegisteredComponentsR\ncomponents\x12\x65\n\x11\x65xtended_metadata\x18\x04 \x03(\x0b\x32@.dapr.proto.runtime.v1.GetMetadataResponse.ExtendedMetadataEntryR\x08\x65xtended\x12O\n\rsubscriptions\x18\x05 \x03(\x0b\x32).dapr.proto.runtime.v1.PubsubSubscriptionR\rsubscriptions\x12R\n\x0ehttp_endpoints\x18\x06 \x03(\x0b\x32+.dapr.proto.runtime.v1.MetadataHTTPEndpointR\rhttpEndpoints\x12j\n\x19\x61pp_connection_properties\x18\x07 \x01(\x0b\x32..dapr.proto.runtime.v1.AppConnectionPropertiesR\x17\x61ppConnectionProperties\x12\'\n\x0fruntime_version\x18\x08 \x01(\tR\x0eruntimeVersion\x12)\n\x10\x65nabled_features\x18\t \x03(\tR\x0f\x65nabledFeatures\x12H\n\ractor_runtime\x18\n \x01(\x0b\x32#.dapr.proto.runtime.v1.ActorRuntimeR\x0c\x61\x63torRuntime\x1a\x37\n\x15\x45xtendedMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xbc\x02\n\x0c\x41\x63torRuntime\x12]\n\x0eruntime_status\x18\x01 \x01(\x0e\x32\x36.dapr.proto.runtime.v1.ActorRuntime.ActorRuntimeStatusR\rruntimeStatus\x12M\n\ractive_actors\x18\x02 \x03(\x0b\x32(.dapr.proto.runtime.v1.ActiveActorsCountR\x0c\x61\x63tiveActors\x12\x1d\n\nhost_ready\x18\x03 \x01(\x08R\thostReady\x12\x1c\n\tplacement\x18\x04 \x01(\tR\tplacement\"A\n\x12\x41\x63torRuntimeStatus\x12\x10\n\x0cINITIALIZING\x10\x00\x12\x0c\n\x08\x44ISABLED\x10\x01\x12\x0b\n\x07RUNNING\x10\x02\"0\n\x11\x41\x63tiveActorsCount\x12\x0c\n\x04type\x18\x01 \x01(\t\x12\r\n\x05\x63ount\x18\x02 \x01(\x05\"Y\n\x14RegisteredComponents\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x02 \x01(\t\x12\x0f\n\x07version\x18\x03 \x01(\t\x12\x14\n\x0c\x63\x61pabilities\x18\x04 \x03(\t\"*\n\x14MetadataHTTPEndpoint\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\"\xd1\x01\n\x17\x41ppConnectionProperties\x12\x0c\n\x04port\x18\x01 \x01(\x05\x12\x10\n\x08protocol\x18\x02 \x01(\t\x12\'\n\x0f\x63hannel_address\x18\x03 \x01(\tR\x0e\x63hannelAddress\x12\'\n\x0fmax_concurrency\x18\x04 \x01(\x05R\x0emaxConcurrency\x12\x44\n\x06health\x18\x05 \x01(\x0b\x32\x34.dapr.proto.runtime.v1.AppConnectionHealthProperties\"\xdc\x01\n\x1d\x41ppConnectionHealthProperties\x12*\n\x11health_check_path\x18\x01 \x01(\tR\x0fhealthCheckPath\x12\x32\n\x15health_probe_interval\x18\x02 \x01(\tR\x13healthProbeInterval\x12\x30\n\x14health_probe_timeout\x18\x03 \x01(\tR\x12healthProbeTimeout\x12)\n\x10health_threshold\x18\x04 \x01(\x05R\x0fhealthThreshold\"\x86\x03\n\x12PubsubSubscription\x12\x1f\n\x0bpubsub_name\x18\x01 \x01(\tR\npubsubname\x12\x14\n\x05topic\x18\x02 \x01(\tR\x05topic\x12S\n\x08metadata\x18\x03 \x03(\x0b\x32\x37.dapr.proto.runtime.v1.PubsubSubscription.MetadataEntryR\x08metadata\x12\x44\n\x05rules\x18\x04 \x01(\x0b\x32..dapr.proto.runtime.v1.PubsubSubscriptionRulesR\x05rules\x12*\n\x11\x64\x65\x61\x64_letter_topic\x18\x05 \x01(\tR\x0f\x64\x65\x61\x64LetterTopic\x12\x41\n\x04type\x18\x06 \x01(\x0e\x32-.dapr.proto.runtime.v1.PubsubSubscriptionTypeR\x04type\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"W\n\x17PubsubSubscriptionRules\x12<\n\x05rules\x18\x01 \x03(\x0b\x32-.dapr.proto.runtime.v1.PubsubSubscriptionRule\"5\n\x16PubsubSubscriptionRule\x12\r\n\x05match\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\t\"0\n\x12SetMetadataRequest\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"\xbc\x01\n\x17GetConfigurationRequest\x12\x12\n\nstore_name\x18\x01 \x01(\t\x12\x0c\n\x04keys\x18\x02 \x03(\t\x12N\n\x08metadata\x18\x03 \x03(\x0b\x32<.dapr.proto.runtime.v1.GetConfigurationRequest.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xbc\x01\n\x18GetConfigurationResponse\x12I\n\x05items\x18\x01 \x03(\x0b\x32:.dapr.proto.runtime.v1.GetConfigurationResponse.ItemsEntry\x1aU\n\nItemsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0b\x32\'.dapr.proto.common.v1.ConfigurationItem:\x02\x38\x01\"\xc8\x01\n\x1dSubscribeConfigurationRequest\x12\x12\n\nstore_name\x18\x01 \x01(\t\x12\x0c\n\x04keys\x18\x02 \x03(\t\x12T\n\x08metadata\x18\x03 \x03(\x0b\x32\x42.dapr.proto.runtime.v1.SubscribeConfigurationRequest.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"A\n\x1fUnsubscribeConfigurationRequest\x12\x12\n\nstore_name\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\"\xd4\x01\n\x1eSubscribeConfigurationResponse\x12\n\n\x02id\x18\x01 \x01(\t\x12O\n\x05items\x18\x02 \x03(\x0b\x32@.dapr.proto.runtime.v1.SubscribeConfigurationResponse.ItemsEntry\x1aU\n\nItemsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0b\x32\'.dapr.proto.common.v1.ConfigurationItem:\x02\x38\x01\"?\n UnsubscribeConfigurationResponse\x12\n\n\x02ok\x18\x01 \x01(\x08\x12\x0f\n\x07message\x18\x02 \x01(\t\"\x9b\x01\n\x0eTryLockRequest\x12\x1d\n\nstore_name\x18\x01 \x01(\tR\tstoreName\x12\x1f\n\x0bresource_id\x18\x02 \x01(\tR\nresourceId\x12\x1d\n\nlock_owner\x18\x03 \x01(\tR\tlockOwner\x12*\n\x11\x65xpiry_in_seconds\x18\x04 \x01(\x05R\x0f\x65xpiryInSeconds\"\"\n\x0fTryLockResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\"n\n\rUnlockRequest\x12\x1d\n\nstore_name\x18\x01 \x01(\tR\tstoreName\x12\x1f\n\x0bresource_id\x18\x02 \x01(\tR\nresourceId\x12\x1d\n\nlock_owner\x18\x03 \x01(\tR\tlockOwner\"\xae\x01\n\x0eUnlockResponse\x12<\n\x06status\x18\x01 \x01(\x0e\x32,.dapr.proto.runtime.v1.UnlockResponse.Status\"^\n\x06Status\x12\x0b\n\x07SUCCESS\x10\x00\x12\x17\n\x13LOCK_DOES_NOT_EXIST\x10\x01\x12\x1a\n\x16LOCK_BELONGS_TO_OTHERS\x10\x02\x12\x12\n\x0eINTERNAL_ERROR\x10\x03\"\xb0\x01\n\x13SubtleGetKeyRequest\x12%\n\x0e\x63omponent_name\x18\x01 \x01(\tR\rcomponentName\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x44\n\x06\x66ormat\x18\x03 \x01(\x0e\x32\x34.dapr.proto.runtime.v1.SubtleGetKeyRequest.KeyFormat\"\x1e\n\tKeyFormat\x12\x07\n\x03PEM\x10\x00\x12\x08\n\x04JSON\x10\x01\"C\n\x14SubtleGetKeyResponse\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x1d\n\npublic_key\x18\x02 \x01(\tR\tpublicKey\"\xb6\x01\n\x14SubtleEncryptRequest\x12%\n\x0e\x63omponent_name\x18\x01 \x01(\tR\rcomponentName\x12\x11\n\tplaintext\x18\x02 \x01(\x0c\x12\x11\n\talgorithm\x18\x03 \x01(\t\x12\x19\n\x08key_name\x18\x04 \x01(\tR\x07keyName\x12\r\n\x05nonce\x18\x05 \x01(\x0c\x12\'\n\x0f\x61ssociated_data\x18\x06 \x01(\x0cR\x0e\x61ssociatedData\"8\n\x15SubtleEncryptResponse\x12\x12\n\nciphertext\x18\x01 \x01(\x0c\x12\x0b\n\x03tag\x18\x02 \x01(\x0c\"\xc4\x01\n\x14SubtleDecryptRequest\x12%\n\x0e\x63omponent_name\x18\x01 \x01(\tR\rcomponentName\x12\x12\n\nciphertext\x18\x02 \x01(\x0c\x12\x11\n\talgorithm\x18\x03 \x01(\t\x12\x19\n\x08key_name\x18\x04 \x01(\tR\x07keyName\x12\r\n\x05nonce\x18\x05 \x01(\x0c\x12\x0b\n\x03tag\x18\x06 \x01(\x0c\x12\'\n\x0f\x61ssociated_data\x18\x07 \x01(\x0cR\x0e\x61ssociatedData\"*\n\x15SubtleDecryptResponse\x12\x11\n\tplaintext\x18\x01 \x01(\x0c\"\xc8\x01\n\x14SubtleWrapKeyRequest\x12%\n\x0e\x63omponent_name\x18\x01 \x01(\tR\rcomponentName\x12#\n\rplaintext_key\x18\x02 \x01(\x0cR\x0cplaintextKey\x12\x11\n\talgorithm\x18\x03 \x01(\t\x12\x19\n\x08key_name\x18\x04 \x01(\tR\x07keyName\x12\r\n\x05nonce\x18\x05 \x01(\x0c\x12\'\n\x0f\x61ssociated_data\x18\x06 \x01(\x0cR\x0e\x61ssociatedData\"E\n\x15SubtleWrapKeyResponse\x12\x1f\n\x0bwrapped_key\x18\x01 \x01(\x0cR\nwrappedKey\x12\x0b\n\x03tag\x18\x02 \x01(\x0c\"\xd3\x01\n\x16SubtleUnwrapKeyRequest\x12%\n\x0e\x63omponent_name\x18\x01 \x01(\tR\rcomponentName\x12\x1f\n\x0bwrapped_key\x18\x02 \x01(\x0cR\nwrappedKey\x12\x11\n\talgorithm\x18\x03 \x01(\t\x12\x19\n\x08key_name\x18\x04 \x01(\tR\x07keyName\x12\r\n\x05nonce\x18\x05 \x01(\x0c\x12\x0b\n\x03tag\x18\x06 \x01(\x0c\x12\'\n\x0f\x61ssociated_data\x18\x07 \x01(\x0cR\x0e\x61ssociatedData\">\n\x17SubtleUnwrapKeyResponse\x12#\n\rplaintext_key\x18\x01 \x01(\x0cR\x0cplaintextKey\"x\n\x11SubtleSignRequest\x12%\n\x0e\x63omponent_name\x18\x01 \x01(\tR\rcomponentName\x12\x0e\n\x06\x64igest\x18\x02 \x01(\x0c\x12\x11\n\talgorithm\x18\x03 \x01(\t\x12\x19\n\x08key_name\x18\x04 \x01(\tR\x07keyName\"\'\n\x12SubtleSignResponse\x12\x11\n\tsignature\x18\x01 \x01(\x0c\"\x8d\x01\n\x13SubtleVerifyRequest\x12%\n\x0e\x63omponent_name\x18\x01 \x01(\tR\rcomponentName\x12\x0e\n\x06\x64igest\x18\x02 \x01(\x0c\x12\x11\n\talgorithm\x18\x03 \x01(\t\x12\x19\n\x08key_name\x18\x04 \x01(\tR\x07keyName\x12\x11\n\tsignature\x18\x05 \x01(\x0c\"%\n\x14SubtleVerifyResponse\x12\r\n\x05valid\x18\x01 \x01(\x08\"\x85\x01\n\x0e\x45ncryptRequest\x12=\n\x07options\x18\x01 \x01(\x0b\x32,.dapr.proto.runtime.v1.EncryptRequestOptions\x12\x34\n\x07payload\x18\x02 \x01(\x0b\x32#.dapr.proto.common.v1.StreamPayload\"\xfe\x01\n\x15\x45ncryptRequestOptions\x12%\n\x0e\x63omponent_name\x18\x01 \x01(\tR\rcomponentName\x12\x19\n\x08key_name\x18\x02 \x01(\tR\x07keyName\x12\x1a\n\x12key_wrap_algorithm\x18\x03 \x01(\t\x12\x1e\n\x16\x64\x61ta_encryption_cipher\x18\n \x01(\t\x12\x37\n\x18omit_decryption_key_name\x18\x0b \x01(\x08R\x15omitDecryptionKeyName\x12.\n\x13\x64\x65\x63ryption_key_name\x18\x0c \x01(\tR\x11\x64\x65\x63ryptionKeyName\"G\n\x0f\x45ncryptResponse\x12\x34\n\x07payload\x18\x01 \x01(\x0b\x32#.dapr.proto.common.v1.StreamPayload\"\x85\x01\n\x0e\x44\x65\x63ryptRequest\x12=\n\x07options\x18\x01 \x01(\x0b\x32,.dapr.proto.runtime.v1.DecryptRequestOptions\x12\x34\n\x07payload\x18\x02 \x01(\x0b\x32#.dapr.proto.common.v1.StreamPayload\"Y\n\x15\x44\x65\x63ryptRequestOptions\x12%\n\x0e\x63omponent_name\x18\x01 \x01(\tR\rcomponentName\x12\x19\n\x08key_name\x18\x0c \x01(\tR\x07keyName\"G\n\x0f\x44\x65\x63ryptResponse\x12\x34\n\x07payload\x18\x01 \x01(\x0b\x32#.dapr.proto.common.v1.StreamPayload\"d\n\x12GetWorkflowRequest\x12\x1f\n\x0binstance_id\x18\x01 \x01(\tR\ninstanceID\x12-\n\x12workflow_component\x18\x02 \x01(\tR\x11workflowComponent\"\x84\x03\n\x13GetWorkflowResponse\x12\x1f\n\x0binstance_id\x18\x01 \x01(\tR\ninstanceID\x12#\n\rworkflow_name\x18\x02 \x01(\tR\x0cworkflowName\x12\x39\n\ncreated_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tcreatedAt\x12\x42\n\x0flast_updated_at\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\rlastUpdatedAt\x12%\n\x0eruntime_status\x18\x05 \x01(\tR\rruntimeStatus\x12N\n\nproperties\x18\x06 \x03(\x0b\x32:.dapr.proto.runtime.v1.GetWorkflowResponse.PropertiesEntry\x1a\x31\n\x0fPropertiesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x95\x02\n\x14StartWorkflowRequest\x12\x1f\n\x0binstance_id\x18\x01 \x01(\tR\ninstanceID\x12-\n\x12workflow_component\x18\x02 \x01(\tR\x11workflowComponent\x12#\n\rworkflow_name\x18\x03 \x01(\tR\x0cworkflowName\x12I\n\x07options\x18\x04 \x03(\x0b\x32\x38.dapr.proto.runtime.v1.StartWorkflowRequest.OptionsEntry\x12\r\n\x05input\x18\x05 \x01(\x0c\x1a.\n\x0cOptionsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"8\n\x15StartWorkflowResponse\x12\x1f\n\x0binstance_id\x18\x01 \x01(\tR\ninstanceID\"j\n\x18TerminateWorkflowRequest\x12\x1f\n\x0binstance_id\x18\x01 \x01(\tR\ninstanceID\x12-\n\x12workflow_component\x18\x02 \x01(\tR\x11workflowComponent\"f\n\x14PauseWorkflowRequest\x12\x1f\n\x0binstance_id\x18\x01 \x01(\tR\ninstanceID\x12-\n\x12workflow_component\x18\x02 \x01(\tR\x11workflowComponent\"g\n\x15ResumeWorkflowRequest\x12\x1f\n\x0binstance_id\x18\x01 \x01(\tR\ninstanceID\x12-\n\x12workflow_component\x18\x02 \x01(\tR\x11workflowComponent\"\x9e\x01\n\x19RaiseEventWorkflowRequest\x12\x1f\n\x0binstance_id\x18\x01 \x01(\tR\ninstanceID\x12-\n\x12workflow_component\x18\x02 \x01(\tR\x11workflowComponent\x12\x1d\n\nevent_name\x18\x03 \x01(\tR\teventName\x12\x12\n\nevent_data\x18\x04 \x01(\x0c\"f\n\x14PurgeWorkflowRequest\x12\x1f\n\x0binstance_id\x18\x01 \x01(\tR\ninstanceID\x12-\n\x12workflow_component\x18\x02 \x01(\tR\x11workflowComponent\"\x11\n\x0fShutdownRequest\"\xe8\x01\n\x03Job\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x1f\n\x08schedule\x18\x02 \x01(\tH\x00R\x08schedule\x88\x01\x01\x12\x1d\n\x07repeats\x18\x03 \x01(\rH\x01R\x07repeats\x88\x01\x01\x12\x1e\n\x08\x64ue_time\x18\x04 \x01(\tH\x02R\x07\x64ueTime\x88\x01\x01\x12\x15\n\x03ttl\x18\x05 \x01(\tH\x03R\x03ttl\x88\x01\x01\x12(\n\x04\x64\x61ta\x18\x06 \x01(\x0b\x32\x14.google.protobuf.AnyR\x04\x64\x61taB\x0b\n\t_scheduleB\n\n\x08_repeatsB\x0b\n\t_due_timeB\x06\n\x04_ttl\"=\n\x12ScheduleJobRequest\x12\'\n\x03job\x18\x01 \x01(\x0b\x32\x1a.dapr.proto.runtime.v1.Job\"\x15\n\x13ScheduleJobResponse\"\x1d\n\rGetJobRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"9\n\x0eGetJobResponse\x12\'\n\x03job\x18\x01 \x01(\x0b\x32\x1a.dapr.proto.runtime.v1.Job\" \n\x10\x44\x65leteJobRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"\x13\n\x11\x44\x65leteJobResponse\"\xf9\x03\n\x19\x43onversationAlpha1Request\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x16\n\tcontextID\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x38\n\x06inputs\x18\x03 \x03(\x0b\x32(.dapr.proto.runtime.v1.ConversationInput\x12T\n\nparameters\x18\x04 \x03(\x0b\x32@.dapr.proto.runtime.v1.ConversationAlpha1Request.ParametersEntry\x12P\n\x08metadata\x18\x05 \x03(\x0b\x32>.dapr.proto.runtime.v1.ConversationAlpha1Request.MetadataEntry\x12\x15\n\x08scrubPII\x18\x06 \x01(\x08H\x01\x88\x01\x01\x12\x18\n\x0btemperature\x18\x07 \x01(\x01H\x02\x88\x01\x01\x1aG\n\x0fParametersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12#\n\x05value\x18\x02 \x01(\x0b\x32\x14.google.protobuf.Any:\x02\x38\x01\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\x0c\n\n_contextIDB\x0b\n\t_scrubPIIB\x0e\n\x0c_temperature\"d\n\x11\x43onversationInput\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x11\n\x04role\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x15\n\x08scrubPII\x18\x03 \x01(\x08H\x01\x88\x01\x01\x42\x07\n\x05_roleB\x0b\n\t_scrubPII\"\xc8\x01\n\x18\x43onversationAlpha1Result\x12\x0e\n\x06result\x18\x01 \x01(\t\x12S\n\nparameters\x18\x02 \x03(\x0b\x32?.dapr.proto.runtime.v1.ConversationAlpha1Result.ParametersEntry\x1aG\n\x0fParametersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12#\n\x05value\x18\x02 \x01(\x0b\x32\x14.google.protobuf.Any:\x02\x38\x01\"\x84\x01\n\x1a\x43onversationAlpha1Response\x12\x16\n\tcontextID\x18\x01 \x01(\tH\x00\x88\x01\x01\x12@\n\x07outputs\x18\x02 \x03(\x0b\x32/.dapr.proto.runtime.v1.ConversationAlpha1ResultB\x0c\n\n_contextID*W\n\x16PubsubSubscriptionType\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x0f\n\x0b\x44\x45\x43LARATIVE\x10\x01\x12\x10\n\x0cPROGRAMMATIC\x10\x02\x12\r\n\tSTREAMING\x10\x03\x32\xb5\x31\n\x04\x44\x61pr\x12\x64\n\rInvokeService\x12+.dapr.proto.runtime.v1.InvokeServiceRequest\x1a$.dapr.proto.common.v1.InvokeResponse\"\x00\x12]\n\x08GetState\x12&.dapr.proto.runtime.v1.GetStateRequest\x1a\'.dapr.proto.runtime.v1.GetStateResponse\"\x00\x12i\n\x0cGetBulkState\x12*.dapr.proto.runtime.v1.GetBulkStateRequest\x1a+.dapr.proto.runtime.v1.GetBulkStateResponse\"\x00\x12N\n\tSaveState\x12\'.dapr.proto.runtime.v1.SaveStateRequest\x1a\x16.google.protobuf.Empty\"\x00\x12i\n\x10QueryStateAlpha1\x12(.dapr.proto.runtime.v1.QueryStateRequest\x1a).dapr.proto.runtime.v1.QueryStateResponse\"\x00\x12R\n\x0b\x44\x65leteState\x12).dapr.proto.runtime.v1.DeleteStateRequest\x1a\x16.google.protobuf.Empty\"\x00\x12Z\n\x0f\x44\x65leteBulkState\x12-.dapr.proto.runtime.v1.DeleteBulkStateRequest\x1a\x16.google.protobuf.Empty\"\x00\x12j\n\x17\x45xecuteStateTransaction\x12\x35.dapr.proto.runtime.v1.ExecuteStateTransactionRequest\x1a\x16.google.protobuf.Empty\"\x00\x12T\n\x0cPublishEvent\x12*.dapr.proto.runtime.v1.PublishEventRequest\x1a\x16.google.protobuf.Empty\"\x00\x12q\n\x16\x42ulkPublishEventAlpha1\x12).dapr.proto.runtime.v1.BulkPublishRequest\x1a*.dapr.proto.runtime.v1.BulkPublishResponse\"\x00\x12\x97\x01\n\x1aSubscribeTopicEventsAlpha1\x12\x38.dapr.proto.runtime.v1.SubscribeTopicEventsRequestAlpha1\x1a\x39.dapr.proto.runtime.v1.SubscribeTopicEventsResponseAlpha1\"\x00(\x01\x30\x01\x12l\n\rInvokeBinding\x12+.dapr.proto.runtime.v1.InvokeBindingRequest\x1a,.dapr.proto.runtime.v1.InvokeBindingResponse\"\x00\x12`\n\tGetSecret\x12\'.dapr.proto.runtime.v1.GetSecretRequest\x1a(.dapr.proto.runtime.v1.GetSecretResponse\"\x00\x12l\n\rGetBulkSecret\x12+.dapr.proto.runtime.v1.GetBulkSecretRequest\x1a,.dapr.proto.runtime.v1.GetBulkSecretResponse\"\x00\x12`\n\x12RegisterActorTimer\x12\x30.dapr.proto.runtime.v1.RegisterActorTimerRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x64\n\x14UnregisterActorTimer\x12\x32.dapr.proto.runtime.v1.UnregisterActorTimerRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x66\n\x15RegisterActorReminder\x12\x33.dapr.proto.runtime.v1.RegisterActorReminderRequest\x1a\x16.google.protobuf.Empty\"\x00\x12j\n\x17UnregisterActorReminder\x12\x35.dapr.proto.runtime.v1.UnregisterActorReminderRequest\x1a\x16.google.protobuf.Empty\"\x00\x12l\n\rGetActorState\x12+.dapr.proto.runtime.v1.GetActorStateRequest\x1a,.dapr.proto.runtime.v1.GetActorStateResponse\"\x00\x12t\n\x1c\x45xecuteActorStateTransaction\x12:.dapr.proto.runtime.v1.ExecuteActorStateTransactionRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x66\n\x0bInvokeActor\x12).dapr.proto.runtime.v1.InvokeActorRequest\x1a*.dapr.proto.runtime.v1.InvokeActorResponse\"\x00\x12{\n\x16GetConfigurationAlpha1\x12..dapr.proto.runtime.v1.GetConfigurationRequest\x1a/.dapr.proto.runtime.v1.GetConfigurationResponse\"\x00\x12u\n\x10GetConfiguration\x12..dapr.proto.runtime.v1.GetConfigurationRequest\x1a/.dapr.proto.runtime.v1.GetConfigurationResponse\"\x00\x12\x8f\x01\n\x1cSubscribeConfigurationAlpha1\x12\x34.dapr.proto.runtime.v1.SubscribeConfigurationRequest\x1a\x35.dapr.proto.runtime.v1.SubscribeConfigurationResponse\"\x00\x30\x01\x12\x89\x01\n\x16SubscribeConfiguration\x12\x34.dapr.proto.runtime.v1.SubscribeConfigurationRequest\x1a\x35.dapr.proto.runtime.v1.SubscribeConfigurationResponse\"\x00\x30\x01\x12\x93\x01\n\x1eUnsubscribeConfigurationAlpha1\x12\x36.dapr.proto.runtime.v1.UnsubscribeConfigurationRequest\x1a\x37.dapr.proto.runtime.v1.UnsubscribeConfigurationResponse\"\x00\x12\x8d\x01\n\x18UnsubscribeConfiguration\x12\x36.dapr.proto.runtime.v1.UnsubscribeConfigurationRequest\x1a\x37.dapr.proto.runtime.v1.UnsubscribeConfigurationResponse\"\x00\x12`\n\rTryLockAlpha1\x12%.dapr.proto.runtime.v1.TryLockRequest\x1a&.dapr.proto.runtime.v1.TryLockResponse\"\x00\x12]\n\x0cUnlockAlpha1\x12$.dapr.proto.runtime.v1.UnlockRequest\x1a%.dapr.proto.runtime.v1.UnlockResponse\"\x00\x12\x62\n\rEncryptAlpha1\x12%.dapr.proto.runtime.v1.EncryptRequest\x1a&.dapr.proto.runtime.v1.EncryptResponse(\x01\x30\x01\x12\x62\n\rDecryptAlpha1\x12%.dapr.proto.runtime.v1.DecryptRequest\x1a&.dapr.proto.runtime.v1.DecryptResponse(\x01\x30\x01\x12\x66\n\x0bGetMetadata\x12).dapr.proto.runtime.v1.GetMetadataRequest\x1a*.dapr.proto.runtime.v1.GetMetadataResponse\"\x00\x12R\n\x0bSetMetadata\x12).dapr.proto.runtime.v1.SetMetadataRequest\x1a\x16.google.protobuf.Empty\"\x00\x12m\n\x12SubtleGetKeyAlpha1\x12*.dapr.proto.runtime.v1.SubtleGetKeyRequest\x1a+.dapr.proto.runtime.v1.SubtleGetKeyResponse\x12p\n\x13SubtleEncryptAlpha1\x12+.dapr.proto.runtime.v1.SubtleEncryptRequest\x1a,.dapr.proto.runtime.v1.SubtleEncryptResponse\x12p\n\x13SubtleDecryptAlpha1\x12+.dapr.proto.runtime.v1.SubtleDecryptRequest\x1a,.dapr.proto.runtime.v1.SubtleDecryptResponse\x12p\n\x13SubtleWrapKeyAlpha1\x12+.dapr.proto.runtime.v1.SubtleWrapKeyRequest\x1a,.dapr.proto.runtime.v1.SubtleWrapKeyResponse\x12v\n\x15SubtleUnwrapKeyAlpha1\x12-.dapr.proto.runtime.v1.SubtleUnwrapKeyRequest\x1a..dapr.proto.runtime.v1.SubtleUnwrapKeyResponse\x12g\n\x10SubtleSignAlpha1\x12(.dapr.proto.runtime.v1.SubtleSignRequest\x1a).dapr.proto.runtime.v1.SubtleSignResponse\x12m\n\x12SubtleVerifyAlpha1\x12*.dapr.proto.runtime.v1.SubtleVerifyRequest\x1a+.dapr.proto.runtime.v1.SubtleVerifyResponse\x12r\n\x13StartWorkflowAlpha1\x12+.dapr.proto.runtime.v1.StartWorkflowRequest\x1a,.dapr.proto.runtime.v1.StartWorkflowResponse\"\x00\x12l\n\x11GetWorkflowAlpha1\x12).dapr.proto.runtime.v1.GetWorkflowRequest\x1a*.dapr.proto.runtime.v1.GetWorkflowResponse\"\x00\x12\\\n\x13PurgeWorkflowAlpha1\x12+.dapr.proto.runtime.v1.PurgeWorkflowRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x64\n\x17TerminateWorkflowAlpha1\x12/.dapr.proto.runtime.v1.TerminateWorkflowRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\\\n\x13PauseWorkflowAlpha1\x12+.dapr.proto.runtime.v1.PauseWorkflowRequest\x1a\x16.google.protobuf.Empty\"\x00\x12^\n\x14ResumeWorkflowAlpha1\x12,.dapr.proto.runtime.v1.ResumeWorkflowRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x66\n\x18RaiseEventWorkflowAlpha1\x12\x30.dapr.proto.runtime.v1.RaiseEventWorkflowRequest\x1a\x16.google.protobuf.Empty\"\x00\x12q\n\x12StartWorkflowBeta1\x12+.dapr.proto.runtime.v1.StartWorkflowRequest\x1a,.dapr.proto.runtime.v1.StartWorkflowResponse\"\x00\x12k\n\x10GetWorkflowBeta1\x12).dapr.proto.runtime.v1.GetWorkflowRequest\x1a*.dapr.proto.runtime.v1.GetWorkflowResponse\"\x00\x12[\n\x12PurgeWorkflowBeta1\x12+.dapr.proto.runtime.v1.PurgeWorkflowRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x63\n\x16TerminateWorkflowBeta1\x12/.dapr.proto.runtime.v1.TerminateWorkflowRequest\x1a\x16.google.protobuf.Empty\"\x00\x12[\n\x12PauseWorkflowBeta1\x12+.dapr.proto.runtime.v1.PauseWorkflowRequest\x1a\x16.google.protobuf.Empty\"\x00\x12]\n\x13ResumeWorkflowBeta1\x12,.dapr.proto.runtime.v1.ResumeWorkflowRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x65\n\x17RaiseEventWorkflowBeta1\x12\x30.dapr.proto.runtime.v1.RaiseEventWorkflowRequest\x1a\x16.google.protobuf.Empty\"\x00\x12L\n\x08Shutdown\x12&.dapr.proto.runtime.v1.ShutdownRequest\x1a\x16.google.protobuf.Empty\"\x00\x12l\n\x11ScheduleJobAlpha1\x12).dapr.proto.runtime.v1.ScheduleJobRequest\x1a*.dapr.proto.runtime.v1.ScheduleJobResponse\"\x00\x12]\n\x0cGetJobAlpha1\x12$.dapr.proto.runtime.v1.GetJobRequest\x1a%.dapr.proto.runtime.v1.GetJobResponse\"\x00\x12\x66\n\x0f\x44\x65leteJobAlpha1\x12\'.dapr.proto.runtime.v1.DeleteJobRequest\x1a(.dapr.proto.runtime.v1.DeleteJobResponse\"\x00\x12w\n\x0e\x43onverseAlpha1\x12\x30.dapr.proto.runtime.v1.ConversationAlpha1Request\x1a\x31.dapr.proto.runtime.v1.ConversationAlpha1Response\"\x00\x42i\n\nio.dapr.v1B\nDaprProtosZ1github.com/dapr/dapr/pkg/proto/runtime/v1;runtime\xaa\x02\x1b\x44\x61pr.Client.Autogen.Grpc.v1b\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n dapr/proto/runtime/v1/dapr.proto\x12\x15\x64\x61pr.proto.runtime.v1\x1a\x19google/protobuf/any.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a!dapr/proto/common/v1/common.proto\x1a\'dapr/proto/runtime/v1/appcallback.proto\"X\n\x14InvokeServiceRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12\x34\n\x07message\x18\x03 \x01(\x0b\x32#.dapr.proto.common.v1.InvokeRequest\"\xf5\x01\n\x0fGetStateRequest\x12\x12\n\nstore_name\x18\x01 \x01(\t\x12\x0b\n\x03key\x18\x02 \x01(\t\x12H\n\x0b\x63onsistency\x18\x03 \x01(\x0e\x32\x33.dapr.proto.common.v1.StateOptions.StateConsistency\x12\x46\n\x08metadata\x18\x04 \x03(\x0b\x32\x34.dapr.proto.runtime.v1.GetStateRequest.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xc9\x01\n\x13GetBulkStateRequest\x12\x12\n\nstore_name\x18\x01 \x01(\t\x12\x0c\n\x04keys\x18\x02 \x03(\t\x12\x13\n\x0bparallelism\x18\x03 \x01(\x05\x12J\n\x08metadata\x18\x04 \x03(\x0b\x32\x38.dapr.proto.runtime.v1.GetBulkStateRequest.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"K\n\x14GetBulkStateResponse\x12\x33\n\x05items\x18\x01 \x03(\x0b\x32$.dapr.proto.runtime.v1.BulkStateItem\"\xbe\x01\n\rBulkStateItem\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\x12\x0c\n\x04\x65tag\x18\x03 \x01(\t\x12\r\n\x05\x65rror\x18\x04 \x01(\t\x12\x44\n\x08metadata\x18\x05 \x03(\x0b\x32\x32.dapr.proto.runtime.v1.BulkStateItem.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xa8\x01\n\x10GetStateResponse\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\x12\x0c\n\x04\x65tag\x18\x02 \x01(\t\x12G\n\x08metadata\x18\x03 \x03(\x0b\x32\x35.dapr.proto.runtime.v1.GetStateResponse.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x90\x02\n\x12\x44\x65leteStateRequest\x12\x12\n\nstore_name\x18\x01 \x01(\t\x12\x0b\n\x03key\x18\x02 \x01(\t\x12(\n\x04\x65tag\x18\x03 \x01(\x0b\x32\x1a.dapr.proto.common.v1.Etag\x12\x33\n\x07options\x18\x04 \x01(\x0b\x32\".dapr.proto.common.v1.StateOptions\x12I\n\x08metadata\x18\x05 \x03(\x0b\x32\x37.dapr.proto.runtime.v1.DeleteStateRequest.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"]\n\x16\x44\x65leteBulkStateRequest\x12\x12\n\nstore_name\x18\x01 \x01(\t\x12/\n\x06states\x18\x02 \x03(\x0b\x32\x1f.dapr.proto.common.v1.StateItem\"W\n\x10SaveStateRequest\x12\x12\n\nstore_name\x18\x01 \x01(\t\x12/\n\x06states\x18\x02 \x03(\x0b\x32\x1f.dapr.proto.common.v1.StateItem\"\xbc\x01\n\x11QueryStateRequest\x12\x1d\n\nstore_name\x18\x01 \x01(\tR\tstoreName\x12\r\n\x05query\x18\x02 \x01(\t\x12H\n\x08metadata\x18\x03 \x03(\x0b\x32\x36.dapr.proto.runtime.v1.QueryStateRequest.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"H\n\x0eQueryStateItem\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\x12\x0c\n\x04\x65tag\x18\x03 \x01(\t\x12\r\n\x05\x65rror\x18\x04 \x01(\t\"\xd7\x01\n\x12QueryStateResponse\x12\x36\n\x07results\x18\x01 \x03(\x0b\x32%.dapr.proto.runtime.v1.QueryStateItem\x12\r\n\x05token\x18\x02 \x01(\t\x12I\n\x08metadata\x18\x03 \x03(\x0b\x32\x37.dapr.proto.runtime.v1.QueryStateResponse.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xdf\x01\n\x13PublishEventRequest\x12\x13\n\x0bpubsub_name\x18\x01 \x01(\t\x12\r\n\x05topic\x18\x02 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x03 \x01(\x0c\x12\x19\n\x11\x64\x61ta_content_type\x18\x04 \x01(\t\x12J\n\x08metadata\x18\x05 \x03(\x0b\x32\x38.dapr.proto.runtime.v1.PublishEventRequest.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xf5\x01\n\x12\x42ulkPublishRequest\x12\x13\n\x0bpubsub_name\x18\x01 \x01(\t\x12\r\n\x05topic\x18\x02 \x01(\t\x12?\n\x07\x65ntries\x18\x03 \x03(\x0b\x32..dapr.proto.runtime.v1.BulkPublishRequestEntry\x12I\n\x08metadata\x18\x04 \x03(\x0b\x32\x37.dapr.proto.runtime.v1.BulkPublishRequest.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xd1\x01\n\x17\x42ulkPublishRequestEntry\x12\x10\n\x08\x65ntry_id\x18\x01 \x01(\t\x12\r\n\x05\x65vent\x18\x02 \x01(\x0c\x12\x14\n\x0c\x63ontent_type\x18\x03 \x01(\t\x12N\n\x08metadata\x18\x04 \x03(\x0b\x32<.dapr.proto.runtime.v1.BulkPublishRequestEntry.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"c\n\x13\x42ulkPublishResponse\x12L\n\rfailedEntries\x18\x01 \x03(\x0b\x32\x35.dapr.proto.runtime.v1.BulkPublishResponseFailedEntry\"A\n\x1e\x42ulkPublishResponseFailedEntry\x12\x10\n\x08\x65ntry_id\x18\x01 \x01(\t\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"\x84\x02\n!SubscribeTopicEventsRequestAlpha1\x12Z\n\x0finitial_request\x18\x01 \x01(\x0b\x32?.dapr.proto.runtime.v1.SubscribeTopicEventsRequestInitialAlpha1H\x00\x12\\\n\x0f\x65vent_processed\x18\x02 \x01(\x0b\x32\x41.dapr.proto.runtime.v1.SubscribeTopicEventsRequestProcessedAlpha1H\x00\x42%\n#subscribe_topic_events_request_type\"\x96\x02\n(SubscribeTopicEventsRequestInitialAlpha1\x12\x13\n\x0bpubsub_name\x18\x01 \x01(\t\x12\r\n\x05topic\x18\x02 \x01(\t\x12_\n\x08metadata\x18\x03 \x03(\x0b\x32M.dapr.proto.runtime.v1.SubscribeTopicEventsRequestInitialAlpha1.MetadataEntry\x12\x1e\n\x11\x64\x65\x61\x64_letter_topic\x18\x04 \x01(\tH\x00\x88\x01\x01\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\x14\n\x12_dead_letter_topic\"s\n*SubscribeTopicEventsRequestProcessedAlpha1\x12\n\n\x02id\x18\x01 \x01(\t\x12\x39\n\x06status\x18\x02 \x01(\x0b\x32).dapr.proto.runtime.v1.TopicEventResponse\"\xed\x01\n\"SubscribeTopicEventsResponseAlpha1\x12\\\n\x10initial_response\x18\x01 \x01(\x0b\x32@.dapr.proto.runtime.v1.SubscribeTopicEventsResponseInitialAlpha1H\x00\x12\x41\n\revent_message\x18\x02 \x01(\x0b\x32(.dapr.proto.runtime.v1.TopicEventRequestH\x00\x42&\n$subscribe_topic_events_response_type\"+\n)SubscribeTopicEventsResponseInitialAlpha1\"\xc3\x01\n\x14InvokeBindingRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\x12K\n\x08metadata\x18\x03 \x03(\x0b\x32\x39.dapr.proto.runtime.v1.InvokeBindingRequest.MetadataEntry\x12\x11\n\toperation\x18\x04 \x01(\t\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xa4\x01\n\x15InvokeBindingResponse\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\x12L\n\x08metadata\x18\x02 \x03(\x0b\x32:.dapr.proto.runtime.v1.InvokeBindingResponse.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xb8\x01\n\x10GetSecretRequest\x12\x1d\n\nstore_name\x18\x01 \x01(\tR\tstoreName\x12\x0b\n\x03key\x18\x02 \x01(\t\x12G\n\x08metadata\x18\x03 \x03(\x0b\x32\x35.dapr.proto.runtime.v1.GetSecretRequest.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x82\x01\n\x11GetSecretResponse\x12@\n\x04\x64\x61ta\x18\x01 \x03(\x0b\x32\x32.dapr.proto.runtime.v1.GetSecretResponse.DataEntry\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xb3\x01\n\x14GetBulkSecretRequest\x12\x1d\n\nstore_name\x18\x01 \x01(\tR\tstoreName\x12K\n\x08metadata\x18\x02 \x03(\x0b\x32\x39.dapr.proto.runtime.v1.GetBulkSecretRequest.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x85\x01\n\x0eSecretResponse\x12\x43\n\x07secrets\x18\x01 \x03(\x0b\x32\x32.dapr.proto.runtime.v1.SecretResponse.SecretsEntry\x1a.\n\x0cSecretsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xb1\x01\n\x15GetBulkSecretResponse\x12\x44\n\x04\x64\x61ta\x18\x01 \x03(\x0b\x32\x36.dapr.proto.runtime.v1.GetBulkSecretResponse.DataEntry\x1aR\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x34\n\x05value\x18\x02 \x01(\x0b\x32%.dapr.proto.runtime.v1.SecretResponse:\x02\x38\x01\"f\n\x1bTransactionalStateOperation\x12\x15\n\roperationType\x18\x01 \x01(\t\x12\x30\n\x07request\x18\x02 \x01(\x0b\x32\x1f.dapr.proto.common.v1.StateItem\"\x83\x02\n\x1e\x45xecuteStateTransactionRequest\x12\x11\n\tstoreName\x18\x01 \x01(\t\x12\x46\n\noperations\x18\x02 \x03(\x0b\x32\x32.dapr.proto.runtime.v1.TransactionalStateOperation\x12U\n\x08metadata\x18\x03 \x03(\x0b\x32\x43.dapr.proto.runtime.v1.ExecuteStateTransactionRequest.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xbb\x01\n\x19RegisterActorTimerRequest\x12\x1d\n\nactor_type\x18\x01 \x01(\tR\tactorType\x12\x19\n\x08\x61\x63tor_id\x18\x02 \x01(\tR\x07\x61\x63torId\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x19\n\x08\x64ue_time\x18\x04 \x01(\tR\x07\x64ueTime\x12\x0e\n\x06period\x18\x05 \x01(\t\x12\x10\n\x08\x63\x61llback\x18\x06 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x07 \x01(\x0c\x12\x0b\n\x03ttl\x18\x08 \x01(\t\"e\n\x1bUnregisterActorTimerRequest\x12\x1d\n\nactor_type\x18\x01 \x01(\tR\tactorType\x12\x19\n\x08\x61\x63tor_id\x18\x02 \x01(\tR\x07\x61\x63torId\x12\x0c\n\x04name\x18\x03 \x01(\t\"\xac\x01\n\x1cRegisterActorReminderRequest\x12\x1d\n\nactor_type\x18\x01 \x01(\tR\tactorType\x12\x19\n\x08\x61\x63tor_id\x18\x02 \x01(\tR\x07\x61\x63torId\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x19\n\x08\x64ue_time\x18\x04 \x01(\tR\x07\x64ueTime\x12\x0e\n\x06period\x18\x05 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x06 \x01(\x0c\x12\x0b\n\x03ttl\x18\x07 \x01(\t\"h\n\x1eUnregisterActorReminderRequest\x12\x1d\n\nactor_type\x18\x01 \x01(\tR\tactorType\x12\x19\n\x08\x61\x63tor_id\x18\x02 \x01(\tR\x07\x61\x63torId\x12\x0c\n\x04name\x18\x03 \x01(\t\"]\n\x14GetActorStateRequest\x12\x1d\n\nactor_type\x18\x01 \x01(\tR\tactorType\x12\x19\n\x08\x61\x63tor_id\x18\x02 \x01(\tR\x07\x61\x63torId\x12\x0b\n\x03key\x18\x03 \x01(\t\"\xa4\x01\n\x15GetActorStateResponse\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\x12L\n\x08metadata\x18\x02 \x03(\x0b\x32:.dapr.proto.runtime.v1.GetActorStateResponse.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xac\x01\n#ExecuteActorStateTransactionRequest\x12\x1d\n\nactor_type\x18\x01 \x01(\tR\tactorType\x12\x19\n\x08\x61\x63tor_id\x18\x02 \x01(\tR\x07\x61\x63torId\x12K\n\noperations\x18\x03 \x03(\x0b\x32\x37.dapr.proto.runtime.v1.TransactionalActorStateOperation\"\xf5\x01\n TransactionalActorStateOperation\x12\x15\n\roperationType\x18\x01 \x01(\t\x12\x0b\n\x03key\x18\x02 \x01(\t\x12#\n\x05value\x18\x03 \x01(\x0b\x32\x14.google.protobuf.Any\x12W\n\x08metadata\x18\x04 \x03(\x0b\x32\x45.dapr.proto.runtime.v1.TransactionalActorStateOperation.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xe8\x01\n\x12InvokeActorRequest\x12\x1d\n\nactor_type\x18\x01 \x01(\tR\tactorType\x12\x19\n\x08\x61\x63tor_id\x18\x02 \x01(\tR\x07\x61\x63torId\x12\x0e\n\x06method\x18\x03 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x04 \x01(\x0c\x12I\n\x08metadata\x18\x05 \x03(\x0b\x32\x37.dapr.proto.runtime.v1.InvokeActorRequest.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"#\n\x13InvokeActorResponse\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\"\x14\n\x12GetMetadataRequest\"\x9b\x06\n\x13GetMetadataResponse\x12\n\n\x02id\x18\x01 \x01(\t\x12Q\n\x13\x61\x63tive_actors_count\x18\x02 \x03(\x0b\x32(.dapr.proto.runtime.v1.ActiveActorsCountB\x02\x18\x01R\x06\x61\x63tors\x12V\n\x15registered_components\x18\x03 \x03(\x0b\x32+.dapr.proto.runtime.v1.RegisteredComponentsR\ncomponents\x12\x65\n\x11\x65xtended_metadata\x18\x04 \x03(\x0b\x32@.dapr.proto.runtime.v1.GetMetadataResponse.ExtendedMetadataEntryR\x08\x65xtended\x12O\n\rsubscriptions\x18\x05 \x03(\x0b\x32).dapr.proto.runtime.v1.PubsubSubscriptionR\rsubscriptions\x12R\n\x0ehttp_endpoints\x18\x06 \x03(\x0b\x32+.dapr.proto.runtime.v1.MetadataHTTPEndpointR\rhttpEndpoints\x12j\n\x19\x61pp_connection_properties\x18\x07 \x01(\x0b\x32..dapr.proto.runtime.v1.AppConnectionPropertiesR\x17\x61ppConnectionProperties\x12\'\n\x0fruntime_version\x18\x08 \x01(\tR\x0eruntimeVersion\x12)\n\x10\x65nabled_features\x18\t \x03(\tR\x0f\x65nabledFeatures\x12H\n\ractor_runtime\x18\n \x01(\x0b\x32#.dapr.proto.runtime.v1.ActorRuntimeR\x0c\x61\x63torRuntime\x1a\x37\n\x15\x45xtendedMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xbc\x02\n\x0c\x41\x63torRuntime\x12]\n\x0eruntime_status\x18\x01 \x01(\x0e\x32\x36.dapr.proto.runtime.v1.ActorRuntime.ActorRuntimeStatusR\rruntimeStatus\x12M\n\ractive_actors\x18\x02 \x03(\x0b\x32(.dapr.proto.runtime.v1.ActiveActorsCountR\x0c\x61\x63tiveActors\x12\x1d\n\nhost_ready\x18\x03 \x01(\x08R\thostReady\x12\x1c\n\tplacement\x18\x04 \x01(\tR\tplacement\"A\n\x12\x41\x63torRuntimeStatus\x12\x10\n\x0cINITIALIZING\x10\x00\x12\x0c\n\x08\x44ISABLED\x10\x01\x12\x0b\n\x07RUNNING\x10\x02\"0\n\x11\x41\x63tiveActorsCount\x12\x0c\n\x04type\x18\x01 \x01(\t\x12\r\n\x05\x63ount\x18\x02 \x01(\x05\"Y\n\x14RegisteredComponents\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x02 \x01(\t\x12\x0f\n\x07version\x18\x03 \x01(\t\x12\x14\n\x0c\x63\x61pabilities\x18\x04 \x03(\t\"*\n\x14MetadataHTTPEndpoint\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\"\xd1\x01\n\x17\x41ppConnectionProperties\x12\x0c\n\x04port\x18\x01 \x01(\x05\x12\x10\n\x08protocol\x18\x02 \x01(\t\x12\'\n\x0f\x63hannel_address\x18\x03 \x01(\tR\x0e\x63hannelAddress\x12\'\n\x0fmax_concurrency\x18\x04 \x01(\x05R\x0emaxConcurrency\x12\x44\n\x06health\x18\x05 \x01(\x0b\x32\x34.dapr.proto.runtime.v1.AppConnectionHealthProperties\"\xdc\x01\n\x1d\x41ppConnectionHealthProperties\x12*\n\x11health_check_path\x18\x01 \x01(\tR\x0fhealthCheckPath\x12\x32\n\x15health_probe_interval\x18\x02 \x01(\tR\x13healthProbeInterval\x12\x30\n\x14health_probe_timeout\x18\x03 \x01(\tR\x12healthProbeTimeout\x12)\n\x10health_threshold\x18\x04 \x01(\x05R\x0fhealthThreshold\"\x86\x03\n\x12PubsubSubscription\x12\x1f\n\x0bpubsub_name\x18\x01 \x01(\tR\npubsubname\x12\x14\n\x05topic\x18\x02 \x01(\tR\x05topic\x12S\n\x08metadata\x18\x03 \x03(\x0b\x32\x37.dapr.proto.runtime.v1.PubsubSubscription.MetadataEntryR\x08metadata\x12\x44\n\x05rules\x18\x04 \x01(\x0b\x32..dapr.proto.runtime.v1.PubsubSubscriptionRulesR\x05rules\x12*\n\x11\x64\x65\x61\x64_letter_topic\x18\x05 \x01(\tR\x0f\x64\x65\x61\x64LetterTopic\x12\x41\n\x04type\x18\x06 \x01(\x0e\x32-.dapr.proto.runtime.v1.PubsubSubscriptionTypeR\x04type\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"W\n\x17PubsubSubscriptionRules\x12<\n\x05rules\x18\x01 \x03(\x0b\x32-.dapr.proto.runtime.v1.PubsubSubscriptionRule\"5\n\x16PubsubSubscriptionRule\x12\r\n\x05match\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\t\"0\n\x12SetMetadataRequest\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"\xbc\x01\n\x17GetConfigurationRequest\x12\x12\n\nstore_name\x18\x01 \x01(\t\x12\x0c\n\x04keys\x18\x02 \x03(\t\x12N\n\x08metadata\x18\x03 \x03(\x0b\x32<.dapr.proto.runtime.v1.GetConfigurationRequest.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xbc\x01\n\x18GetConfigurationResponse\x12I\n\x05items\x18\x01 \x03(\x0b\x32:.dapr.proto.runtime.v1.GetConfigurationResponse.ItemsEntry\x1aU\n\nItemsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0b\x32\'.dapr.proto.common.v1.ConfigurationItem:\x02\x38\x01\"\xc8\x01\n\x1dSubscribeConfigurationRequest\x12\x12\n\nstore_name\x18\x01 \x01(\t\x12\x0c\n\x04keys\x18\x02 \x03(\t\x12T\n\x08metadata\x18\x03 \x03(\x0b\x32\x42.dapr.proto.runtime.v1.SubscribeConfigurationRequest.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"A\n\x1fUnsubscribeConfigurationRequest\x12\x12\n\nstore_name\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\"\xd4\x01\n\x1eSubscribeConfigurationResponse\x12\n\n\x02id\x18\x01 \x01(\t\x12O\n\x05items\x18\x02 \x03(\x0b\x32@.dapr.proto.runtime.v1.SubscribeConfigurationResponse.ItemsEntry\x1aU\n\nItemsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0b\x32\'.dapr.proto.common.v1.ConfigurationItem:\x02\x38\x01\"?\n UnsubscribeConfigurationResponse\x12\n\n\x02ok\x18\x01 \x01(\x08\x12\x0f\n\x07message\x18\x02 \x01(\t\"\x9b\x01\n\x0eTryLockRequest\x12\x1d\n\nstore_name\x18\x01 \x01(\tR\tstoreName\x12\x1f\n\x0bresource_id\x18\x02 \x01(\tR\nresourceId\x12\x1d\n\nlock_owner\x18\x03 \x01(\tR\tlockOwner\x12*\n\x11\x65xpiry_in_seconds\x18\x04 \x01(\x05R\x0f\x65xpiryInSeconds\"\"\n\x0fTryLockResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\"n\n\rUnlockRequest\x12\x1d\n\nstore_name\x18\x01 \x01(\tR\tstoreName\x12\x1f\n\x0bresource_id\x18\x02 \x01(\tR\nresourceId\x12\x1d\n\nlock_owner\x18\x03 \x01(\tR\tlockOwner\"\xae\x01\n\x0eUnlockResponse\x12<\n\x06status\x18\x01 \x01(\x0e\x32,.dapr.proto.runtime.v1.UnlockResponse.Status\"^\n\x06Status\x12\x0b\n\x07SUCCESS\x10\x00\x12\x17\n\x13LOCK_DOES_NOT_EXIST\x10\x01\x12\x1a\n\x16LOCK_BELONGS_TO_OTHERS\x10\x02\x12\x12\n\x0eINTERNAL_ERROR\x10\x03\"\xb0\x01\n\x13SubtleGetKeyRequest\x12%\n\x0e\x63omponent_name\x18\x01 \x01(\tR\rcomponentName\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x44\n\x06\x66ormat\x18\x03 \x01(\x0e\x32\x34.dapr.proto.runtime.v1.SubtleGetKeyRequest.KeyFormat\"\x1e\n\tKeyFormat\x12\x07\n\x03PEM\x10\x00\x12\x08\n\x04JSON\x10\x01\"C\n\x14SubtleGetKeyResponse\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x1d\n\npublic_key\x18\x02 \x01(\tR\tpublicKey\"\xb6\x01\n\x14SubtleEncryptRequest\x12%\n\x0e\x63omponent_name\x18\x01 \x01(\tR\rcomponentName\x12\x11\n\tplaintext\x18\x02 \x01(\x0c\x12\x11\n\talgorithm\x18\x03 \x01(\t\x12\x19\n\x08key_name\x18\x04 \x01(\tR\x07keyName\x12\r\n\x05nonce\x18\x05 \x01(\x0c\x12\'\n\x0f\x61ssociated_data\x18\x06 \x01(\x0cR\x0e\x61ssociatedData\"8\n\x15SubtleEncryptResponse\x12\x12\n\nciphertext\x18\x01 \x01(\x0c\x12\x0b\n\x03tag\x18\x02 \x01(\x0c\"\xc4\x01\n\x14SubtleDecryptRequest\x12%\n\x0e\x63omponent_name\x18\x01 \x01(\tR\rcomponentName\x12\x12\n\nciphertext\x18\x02 \x01(\x0c\x12\x11\n\talgorithm\x18\x03 \x01(\t\x12\x19\n\x08key_name\x18\x04 \x01(\tR\x07keyName\x12\r\n\x05nonce\x18\x05 \x01(\x0c\x12\x0b\n\x03tag\x18\x06 \x01(\x0c\x12\'\n\x0f\x61ssociated_data\x18\x07 \x01(\x0cR\x0e\x61ssociatedData\"*\n\x15SubtleDecryptResponse\x12\x11\n\tplaintext\x18\x01 \x01(\x0c\"\xc8\x01\n\x14SubtleWrapKeyRequest\x12%\n\x0e\x63omponent_name\x18\x01 \x01(\tR\rcomponentName\x12#\n\rplaintext_key\x18\x02 \x01(\x0cR\x0cplaintextKey\x12\x11\n\talgorithm\x18\x03 \x01(\t\x12\x19\n\x08key_name\x18\x04 \x01(\tR\x07keyName\x12\r\n\x05nonce\x18\x05 \x01(\x0c\x12\'\n\x0f\x61ssociated_data\x18\x06 \x01(\x0cR\x0e\x61ssociatedData\"E\n\x15SubtleWrapKeyResponse\x12\x1f\n\x0bwrapped_key\x18\x01 \x01(\x0cR\nwrappedKey\x12\x0b\n\x03tag\x18\x02 \x01(\x0c\"\xd3\x01\n\x16SubtleUnwrapKeyRequest\x12%\n\x0e\x63omponent_name\x18\x01 \x01(\tR\rcomponentName\x12\x1f\n\x0bwrapped_key\x18\x02 \x01(\x0cR\nwrappedKey\x12\x11\n\talgorithm\x18\x03 \x01(\t\x12\x19\n\x08key_name\x18\x04 \x01(\tR\x07keyName\x12\r\n\x05nonce\x18\x05 \x01(\x0c\x12\x0b\n\x03tag\x18\x06 \x01(\x0c\x12\'\n\x0f\x61ssociated_data\x18\x07 \x01(\x0cR\x0e\x61ssociatedData\">\n\x17SubtleUnwrapKeyResponse\x12#\n\rplaintext_key\x18\x01 \x01(\x0cR\x0cplaintextKey\"x\n\x11SubtleSignRequest\x12%\n\x0e\x63omponent_name\x18\x01 \x01(\tR\rcomponentName\x12\x0e\n\x06\x64igest\x18\x02 \x01(\x0c\x12\x11\n\talgorithm\x18\x03 \x01(\t\x12\x19\n\x08key_name\x18\x04 \x01(\tR\x07keyName\"\'\n\x12SubtleSignResponse\x12\x11\n\tsignature\x18\x01 \x01(\x0c\"\x8d\x01\n\x13SubtleVerifyRequest\x12%\n\x0e\x63omponent_name\x18\x01 \x01(\tR\rcomponentName\x12\x0e\n\x06\x64igest\x18\x02 \x01(\x0c\x12\x11\n\talgorithm\x18\x03 \x01(\t\x12\x19\n\x08key_name\x18\x04 \x01(\tR\x07keyName\x12\x11\n\tsignature\x18\x05 \x01(\x0c\"%\n\x14SubtleVerifyResponse\x12\r\n\x05valid\x18\x01 \x01(\x08\"\x85\x01\n\x0e\x45ncryptRequest\x12=\n\x07options\x18\x01 \x01(\x0b\x32,.dapr.proto.runtime.v1.EncryptRequestOptions\x12\x34\n\x07payload\x18\x02 \x01(\x0b\x32#.dapr.proto.common.v1.StreamPayload\"\xfe\x01\n\x15\x45ncryptRequestOptions\x12%\n\x0e\x63omponent_name\x18\x01 \x01(\tR\rcomponentName\x12\x19\n\x08key_name\x18\x02 \x01(\tR\x07keyName\x12\x1a\n\x12key_wrap_algorithm\x18\x03 \x01(\t\x12\x1e\n\x16\x64\x61ta_encryption_cipher\x18\n \x01(\t\x12\x37\n\x18omit_decryption_key_name\x18\x0b \x01(\x08R\x15omitDecryptionKeyName\x12.\n\x13\x64\x65\x63ryption_key_name\x18\x0c \x01(\tR\x11\x64\x65\x63ryptionKeyName\"G\n\x0f\x45ncryptResponse\x12\x34\n\x07payload\x18\x01 \x01(\x0b\x32#.dapr.proto.common.v1.StreamPayload\"\x85\x01\n\x0e\x44\x65\x63ryptRequest\x12=\n\x07options\x18\x01 \x01(\x0b\x32,.dapr.proto.runtime.v1.DecryptRequestOptions\x12\x34\n\x07payload\x18\x02 \x01(\x0b\x32#.dapr.proto.common.v1.StreamPayload\"Y\n\x15\x44\x65\x63ryptRequestOptions\x12%\n\x0e\x63omponent_name\x18\x01 \x01(\tR\rcomponentName\x12\x19\n\x08key_name\x18\x0c \x01(\tR\x07keyName\"G\n\x0f\x44\x65\x63ryptResponse\x12\x34\n\x07payload\x18\x01 \x01(\x0b\x32#.dapr.proto.common.v1.StreamPayload\"d\n\x12GetWorkflowRequest\x12\x1f\n\x0binstance_id\x18\x01 \x01(\tR\ninstanceID\x12-\n\x12workflow_component\x18\x02 \x01(\tR\x11workflowComponent\"\x84\x03\n\x13GetWorkflowResponse\x12\x1f\n\x0binstance_id\x18\x01 \x01(\tR\ninstanceID\x12#\n\rworkflow_name\x18\x02 \x01(\tR\x0cworkflowName\x12\x39\n\ncreated_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tcreatedAt\x12\x42\n\x0flast_updated_at\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\rlastUpdatedAt\x12%\n\x0eruntime_status\x18\x05 \x01(\tR\rruntimeStatus\x12N\n\nproperties\x18\x06 \x03(\x0b\x32:.dapr.proto.runtime.v1.GetWorkflowResponse.PropertiesEntry\x1a\x31\n\x0fPropertiesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x95\x02\n\x14StartWorkflowRequest\x12\x1f\n\x0binstance_id\x18\x01 \x01(\tR\ninstanceID\x12-\n\x12workflow_component\x18\x02 \x01(\tR\x11workflowComponent\x12#\n\rworkflow_name\x18\x03 \x01(\tR\x0cworkflowName\x12I\n\x07options\x18\x04 \x03(\x0b\x32\x38.dapr.proto.runtime.v1.StartWorkflowRequest.OptionsEntry\x12\r\n\x05input\x18\x05 \x01(\x0c\x1a.\n\x0cOptionsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"8\n\x15StartWorkflowResponse\x12\x1f\n\x0binstance_id\x18\x01 \x01(\tR\ninstanceID\"j\n\x18TerminateWorkflowRequest\x12\x1f\n\x0binstance_id\x18\x01 \x01(\tR\ninstanceID\x12-\n\x12workflow_component\x18\x02 \x01(\tR\x11workflowComponent\"f\n\x14PauseWorkflowRequest\x12\x1f\n\x0binstance_id\x18\x01 \x01(\tR\ninstanceID\x12-\n\x12workflow_component\x18\x02 \x01(\tR\x11workflowComponent\"g\n\x15ResumeWorkflowRequest\x12\x1f\n\x0binstance_id\x18\x01 \x01(\tR\ninstanceID\x12-\n\x12workflow_component\x18\x02 \x01(\tR\x11workflowComponent\"\x9e\x01\n\x19RaiseEventWorkflowRequest\x12\x1f\n\x0binstance_id\x18\x01 \x01(\tR\ninstanceID\x12-\n\x12workflow_component\x18\x02 \x01(\tR\x11workflowComponent\x12\x1d\n\nevent_name\x18\x03 \x01(\tR\teventName\x12\x12\n\nevent_data\x18\x04 \x01(\x0c\"f\n\x14PurgeWorkflowRequest\x12\x1f\n\x0binstance_id\x18\x01 \x01(\tR\ninstanceID\x12-\n\x12workflow_component\x18\x02 \x01(\tR\x11workflowComponent\"\x11\n\x0fShutdownRequest\"\xe8\x01\n\x03Job\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x1f\n\x08schedule\x18\x02 \x01(\tH\x00R\x08schedule\x88\x01\x01\x12\x1d\n\x07repeats\x18\x03 \x01(\rH\x01R\x07repeats\x88\x01\x01\x12\x1e\n\x08\x64ue_time\x18\x04 \x01(\tH\x02R\x07\x64ueTime\x88\x01\x01\x12\x15\n\x03ttl\x18\x05 \x01(\tH\x03R\x03ttl\x88\x01\x01\x12(\n\x04\x64\x61ta\x18\x06 \x01(\x0b\x32\x14.google.protobuf.AnyR\x04\x64\x61taB\x0b\n\t_scheduleB\n\n\x08_repeatsB\x0b\n\t_due_timeB\x06\n\x04_ttl\"=\n\x12ScheduleJobRequest\x12\'\n\x03job\x18\x01 \x01(\x0b\x32\x1a.dapr.proto.runtime.v1.Job\"\x15\n\x13ScheduleJobResponse\"\x1d\n\rGetJobRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"9\n\x0eGetJobResponse\x12\'\n\x03job\x18\x01 \x01(\x0b\x32\x1a.dapr.proto.runtime.v1.Job\" \n\x10\x44\x65leteJobRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"\x13\n\x11\x44\x65leteJobResponse\"\xe7\x03\n\x13\x43onversationRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x16\n\tcontextID\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x38\n\x06inputs\x18\x03 \x03(\x0b\x32(.dapr.proto.runtime.v1.ConversationInput\x12N\n\nparameters\x18\x04 \x03(\x0b\x32:.dapr.proto.runtime.v1.ConversationRequest.ParametersEntry\x12J\n\x08metadata\x18\x05 \x03(\x0b\x32\x38.dapr.proto.runtime.v1.ConversationRequest.MetadataEntry\x12\x15\n\x08scrubPII\x18\x06 \x01(\x08H\x01\x88\x01\x01\x12\x18\n\x0btemperature\x18\x07 \x01(\x01H\x02\x88\x01\x01\x1aG\n\x0fParametersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12#\n\x05value\x18\x02 \x01(\x0b\x32\x14.google.protobuf.Any:\x02\x38\x01\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\x0c\n\n_contextIDB\x0b\n\t_scrubPIIB\x0e\n\x0c_temperature\"d\n\x11\x43onversationInput\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x11\n\x04role\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x15\n\x08scrubPII\x18\x03 \x01(\x08H\x01\x88\x01\x01\x42\x07\n\x05_roleB\x0b\n\t_scrubPII\"\xbc\x01\n\x12\x43onversationResult\x12\x0e\n\x06result\x18\x01 \x01(\t\x12M\n\nparameters\x18\x02 \x03(\x0b\x32\x39.dapr.proto.runtime.v1.ConversationResult.ParametersEntry\x1aG\n\x0fParametersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12#\n\x05value\x18\x02 \x01(\x0b\x32\x14.google.protobuf.Any:\x02\x38\x01\"x\n\x14\x43onversationResponse\x12\x16\n\tcontextID\x18\x01 \x01(\tH\x00\x88\x01\x01\x12:\n\x07outputs\x18\x02 \x03(\x0b\x32).dapr.proto.runtime.v1.ConversationResultB\x0c\n\n_contextID*W\n\x16PubsubSubscriptionType\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x0f\n\x0b\x44\x45\x43LARATIVE\x10\x01\x12\x10\n\x0cPROGRAMMATIC\x10\x02\x12\r\n\tSTREAMING\x10\x03\x32\xbe\x31\n\x04\x44\x61pr\x12\x64\n\rInvokeService\x12+.dapr.proto.runtime.v1.InvokeServiceRequest\x1a$.dapr.proto.common.v1.InvokeResponse\"\x00\x12]\n\x08GetState\x12&.dapr.proto.runtime.v1.GetStateRequest\x1a\'.dapr.proto.runtime.v1.GetStateResponse\"\x00\x12i\n\x0cGetBulkState\x12*.dapr.proto.runtime.v1.GetBulkStateRequest\x1a+.dapr.proto.runtime.v1.GetBulkStateResponse\"\x00\x12N\n\tSaveState\x12\'.dapr.proto.runtime.v1.SaveStateRequest\x1a\x16.google.protobuf.Empty\"\x00\x12i\n\x10QueryStateAlpha1\x12(.dapr.proto.runtime.v1.QueryStateRequest\x1a).dapr.proto.runtime.v1.QueryStateResponse\"\x00\x12R\n\x0b\x44\x65leteState\x12).dapr.proto.runtime.v1.DeleteStateRequest\x1a\x16.google.protobuf.Empty\"\x00\x12Z\n\x0f\x44\x65leteBulkState\x12-.dapr.proto.runtime.v1.DeleteBulkStateRequest\x1a\x16.google.protobuf.Empty\"\x00\x12j\n\x17\x45xecuteStateTransaction\x12\x35.dapr.proto.runtime.v1.ExecuteStateTransactionRequest\x1a\x16.google.protobuf.Empty\"\x00\x12T\n\x0cPublishEvent\x12*.dapr.proto.runtime.v1.PublishEventRequest\x1a\x16.google.protobuf.Empty\"\x00\x12q\n\x16\x42ulkPublishEventAlpha1\x12).dapr.proto.runtime.v1.BulkPublishRequest\x1a*.dapr.proto.runtime.v1.BulkPublishResponse\"\x00\x12\x97\x01\n\x1aSubscribeTopicEventsAlpha1\x12\x38.dapr.proto.runtime.v1.SubscribeTopicEventsRequestAlpha1\x1a\x39.dapr.proto.runtime.v1.SubscribeTopicEventsResponseAlpha1\"\x00(\x01\x30\x01\x12l\n\rInvokeBinding\x12+.dapr.proto.runtime.v1.InvokeBindingRequest\x1a,.dapr.proto.runtime.v1.InvokeBindingResponse\"\x00\x12`\n\tGetSecret\x12\'.dapr.proto.runtime.v1.GetSecretRequest\x1a(.dapr.proto.runtime.v1.GetSecretResponse\"\x00\x12l\n\rGetBulkSecret\x12+.dapr.proto.runtime.v1.GetBulkSecretRequest\x1a,.dapr.proto.runtime.v1.GetBulkSecretResponse\"\x00\x12`\n\x12RegisterActorTimer\x12\x30.dapr.proto.runtime.v1.RegisterActorTimerRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x64\n\x14UnregisterActorTimer\x12\x32.dapr.proto.runtime.v1.UnregisterActorTimerRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x66\n\x15RegisterActorReminder\x12\x33.dapr.proto.runtime.v1.RegisterActorReminderRequest\x1a\x16.google.protobuf.Empty\"\x00\x12j\n\x17UnregisterActorReminder\x12\x35.dapr.proto.runtime.v1.UnregisterActorReminderRequest\x1a\x16.google.protobuf.Empty\"\x00\x12l\n\rGetActorState\x12+.dapr.proto.runtime.v1.GetActorStateRequest\x1a,.dapr.proto.runtime.v1.GetActorStateResponse\"\x00\x12t\n\x1c\x45xecuteActorStateTransaction\x12:.dapr.proto.runtime.v1.ExecuteActorStateTransactionRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x66\n\x0bInvokeActor\x12).dapr.proto.runtime.v1.InvokeActorRequest\x1a*.dapr.proto.runtime.v1.InvokeActorResponse\"\x00\x12{\n\x16GetConfigurationAlpha1\x12..dapr.proto.runtime.v1.GetConfigurationRequest\x1a/.dapr.proto.runtime.v1.GetConfigurationResponse\"\x00\x12u\n\x10GetConfiguration\x12..dapr.proto.runtime.v1.GetConfigurationRequest\x1a/.dapr.proto.runtime.v1.GetConfigurationResponse\"\x00\x12\x8f\x01\n\x1cSubscribeConfigurationAlpha1\x12\x34.dapr.proto.runtime.v1.SubscribeConfigurationRequest\x1a\x35.dapr.proto.runtime.v1.SubscribeConfigurationResponse\"\x00\x30\x01\x12\x89\x01\n\x16SubscribeConfiguration\x12\x34.dapr.proto.runtime.v1.SubscribeConfigurationRequest\x1a\x35.dapr.proto.runtime.v1.SubscribeConfigurationResponse\"\x00\x30\x01\x12\x93\x01\n\x1eUnsubscribeConfigurationAlpha1\x12\x36.dapr.proto.runtime.v1.UnsubscribeConfigurationRequest\x1a\x37.dapr.proto.runtime.v1.UnsubscribeConfigurationResponse\"\x00\x12\x8d\x01\n\x18UnsubscribeConfiguration\x12\x36.dapr.proto.runtime.v1.UnsubscribeConfigurationRequest\x1a\x37.dapr.proto.runtime.v1.UnsubscribeConfigurationResponse\"\x00\x12`\n\rTryLockAlpha1\x12%.dapr.proto.runtime.v1.TryLockRequest\x1a&.dapr.proto.runtime.v1.TryLockResponse\"\x00\x12]\n\x0cUnlockAlpha1\x12$.dapr.proto.runtime.v1.UnlockRequest\x1a%.dapr.proto.runtime.v1.UnlockResponse\"\x00\x12\x62\n\rEncryptAlpha1\x12%.dapr.proto.runtime.v1.EncryptRequest\x1a&.dapr.proto.runtime.v1.EncryptResponse(\x01\x30\x01\x12\x62\n\rDecryptAlpha1\x12%.dapr.proto.runtime.v1.DecryptRequest\x1a&.dapr.proto.runtime.v1.DecryptResponse(\x01\x30\x01\x12\x66\n\x0bGetMetadata\x12).dapr.proto.runtime.v1.GetMetadataRequest\x1a*.dapr.proto.runtime.v1.GetMetadataResponse\"\x00\x12R\n\x0bSetMetadata\x12).dapr.proto.runtime.v1.SetMetadataRequest\x1a\x16.google.protobuf.Empty\"\x00\x12m\n\x12SubtleGetKeyAlpha1\x12*.dapr.proto.runtime.v1.SubtleGetKeyRequest\x1a+.dapr.proto.runtime.v1.SubtleGetKeyResponse\x12p\n\x13SubtleEncryptAlpha1\x12+.dapr.proto.runtime.v1.SubtleEncryptRequest\x1a,.dapr.proto.runtime.v1.SubtleEncryptResponse\x12p\n\x13SubtleDecryptAlpha1\x12+.dapr.proto.runtime.v1.SubtleDecryptRequest\x1a,.dapr.proto.runtime.v1.SubtleDecryptResponse\x12p\n\x13SubtleWrapKeyAlpha1\x12+.dapr.proto.runtime.v1.SubtleWrapKeyRequest\x1a,.dapr.proto.runtime.v1.SubtleWrapKeyResponse\x12v\n\x15SubtleUnwrapKeyAlpha1\x12-.dapr.proto.runtime.v1.SubtleUnwrapKeyRequest\x1a..dapr.proto.runtime.v1.SubtleUnwrapKeyResponse\x12g\n\x10SubtleSignAlpha1\x12(.dapr.proto.runtime.v1.SubtleSignRequest\x1a).dapr.proto.runtime.v1.SubtleSignResponse\x12m\n\x12SubtleVerifyAlpha1\x12*.dapr.proto.runtime.v1.SubtleVerifyRequest\x1a+.dapr.proto.runtime.v1.SubtleVerifyResponse\x12u\n\x13StartWorkflowAlpha1\x12+.dapr.proto.runtime.v1.StartWorkflowRequest\x1a,.dapr.proto.runtime.v1.StartWorkflowResponse\"\x03\x88\x02\x01\x12o\n\x11GetWorkflowAlpha1\x12).dapr.proto.runtime.v1.GetWorkflowRequest\x1a*.dapr.proto.runtime.v1.GetWorkflowResponse\"\x03\x88\x02\x01\x12_\n\x13PurgeWorkflowAlpha1\x12+.dapr.proto.runtime.v1.PurgeWorkflowRequest\x1a\x16.google.protobuf.Empty\"\x03\x88\x02\x01\x12g\n\x17TerminateWorkflowAlpha1\x12/.dapr.proto.runtime.v1.TerminateWorkflowRequest\x1a\x16.google.protobuf.Empty\"\x03\x88\x02\x01\x12_\n\x13PauseWorkflowAlpha1\x12+.dapr.proto.runtime.v1.PauseWorkflowRequest\x1a\x16.google.protobuf.Empty\"\x03\x88\x02\x01\x12\x61\n\x14ResumeWorkflowAlpha1\x12,.dapr.proto.runtime.v1.ResumeWorkflowRequest\x1a\x16.google.protobuf.Empty\"\x03\x88\x02\x01\x12i\n\x18RaiseEventWorkflowAlpha1\x12\x30.dapr.proto.runtime.v1.RaiseEventWorkflowRequest\x1a\x16.google.protobuf.Empty\"\x03\x88\x02\x01\x12q\n\x12StartWorkflowBeta1\x12+.dapr.proto.runtime.v1.StartWorkflowRequest\x1a,.dapr.proto.runtime.v1.StartWorkflowResponse\"\x00\x12k\n\x10GetWorkflowBeta1\x12).dapr.proto.runtime.v1.GetWorkflowRequest\x1a*.dapr.proto.runtime.v1.GetWorkflowResponse\"\x00\x12[\n\x12PurgeWorkflowBeta1\x12+.dapr.proto.runtime.v1.PurgeWorkflowRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x63\n\x16TerminateWorkflowBeta1\x12/.dapr.proto.runtime.v1.TerminateWorkflowRequest\x1a\x16.google.protobuf.Empty\"\x00\x12[\n\x12PauseWorkflowBeta1\x12+.dapr.proto.runtime.v1.PauseWorkflowRequest\x1a\x16.google.protobuf.Empty\"\x00\x12]\n\x13ResumeWorkflowBeta1\x12,.dapr.proto.runtime.v1.ResumeWorkflowRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x65\n\x17RaiseEventWorkflowBeta1\x12\x30.dapr.proto.runtime.v1.RaiseEventWorkflowRequest\x1a\x16.google.protobuf.Empty\"\x00\x12L\n\x08Shutdown\x12&.dapr.proto.runtime.v1.ShutdownRequest\x1a\x16.google.protobuf.Empty\"\x00\x12l\n\x11ScheduleJobAlpha1\x12).dapr.proto.runtime.v1.ScheduleJobRequest\x1a*.dapr.proto.runtime.v1.ScheduleJobResponse\"\x00\x12]\n\x0cGetJobAlpha1\x12$.dapr.proto.runtime.v1.GetJobRequest\x1a%.dapr.proto.runtime.v1.GetJobResponse\"\x00\x12\x66\n\x0f\x44\x65leteJobAlpha1\x12\'.dapr.proto.runtime.v1.DeleteJobRequest\x1a(.dapr.proto.runtime.v1.DeleteJobResponse\"\x00\x12k\n\x0e\x43onverseAlpha1\x12*.dapr.proto.runtime.v1.ConversationRequest\x1a+.dapr.proto.runtime.v1.ConversationResponse\"\x00\x42i\n\nio.dapr.v1B\nDaprProtosZ1github.com/dapr/dapr/pkg/proto/runtime/v1;runtime\xaa\x02\x1b\x44\x61pr.Client.Autogen.Grpc.v1b\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'dapr.proto.runtime.v1.dapr_pb2', _globals) if _descriptor._USE_C_DESCRIPTORS == False: - - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\n\nio.dapr.v1B\nDaprProtosZ1github.com/dapr/dapr/pkg/proto/runtime/v1;runtime\252\002\033Dapr.Client.Autogen.Grpc.v1' - _GETSTATEREQUEST_METADATAENTRY._options = None - _GETSTATEREQUEST_METADATAENTRY._serialized_options = b'8\001' - _GETBULKSTATEREQUEST_METADATAENTRY._options = None - _GETBULKSTATEREQUEST_METADATAENTRY._serialized_options = b'8\001' - _BULKSTATEITEM_METADATAENTRY._options = None - _BULKSTATEITEM_METADATAENTRY._serialized_options = b'8\001' - _GETSTATERESPONSE_METADATAENTRY._options = None - _GETSTATERESPONSE_METADATAENTRY._serialized_options = b'8\001' - _DELETESTATEREQUEST_METADATAENTRY._options = None - _DELETESTATEREQUEST_METADATAENTRY._serialized_options = b'8\001' - _QUERYSTATEREQUEST_METADATAENTRY._options = None - _QUERYSTATEREQUEST_METADATAENTRY._serialized_options = b'8\001' - _QUERYSTATERESPONSE_METADATAENTRY._options = None - _QUERYSTATERESPONSE_METADATAENTRY._serialized_options = b'8\001' - _PUBLISHEVENTREQUEST_METADATAENTRY._options = None - _PUBLISHEVENTREQUEST_METADATAENTRY._serialized_options = b'8\001' - _BULKPUBLISHREQUEST_METADATAENTRY._options = None - _BULKPUBLISHREQUEST_METADATAENTRY._serialized_options = b'8\001' - _BULKPUBLISHREQUESTENTRY_METADATAENTRY._options = None - _BULKPUBLISHREQUESTENTRY_METADATAENTRY._serialized_options = b'8\001' - _SUBSCRIBETOPICEVENTSREQUESTINITIALALPHA1_METADATAENTRY._options = None - _SUBSCRIBETOPICEVENTSREQUESTINITIALALPHA1_METADATAENTRY._serialized_options = b'8\001' - _INVOKEBINDINGREQUEST_METADATAENTRY._options = None - _INVOKEBINDINGREQUEST_METADATAENTRY._serialized_options = b'8\001' - _INVOKEBINDINGRESPONSE_METADATAENTRY._options = None - _INVOKEBINDINGRESPONSE_METADATAENTRY._serialized_options = b'8\001' - _GETSECRETREQUEST_METADATAENTRY._options = None - _GETSECRETREQUEST_METADATAENTRY._serialized_options = b'8\001' - _GETSECRETRESPONSE_DATAENTRY._options = None - _GETSECRETRESPONSE_DATAENTRY._serialized_options = b'8\001' - _GETBULKSECRETREQUEST_METADATAENTRY._options = None - _GETBULKSECRETREQUEST_METADATAENTRY._serialized_options = b'8\001' - _SECRETRESPONSE_SECRETSENTRY._options = None - _SECRETRESPONSE_SECRETSENTRY._serialized_options = b'8\001' - _GETBULKSECRETRESPONSE_DATAENTRY._options = None - _GETBULKSECRETRESPONSE_DATAENTRY._serialized_options = b'8\001' - _EXECUTESTATETRANSACTIONREQUEST_METADATAENTRY._options = None - _EXECUTESTATETRANSACTIONREQUEST_METADATAENTRY._serialized_options = b'8\001' - _GETACTORSTATERESPONSE_METADATAENTRY._options = None - _GETACTORSTATERESPONSE_METADATAENTRY._serialized_options = b'8\001' - _TRANSACTIONALACTORSTATEOPERATION_METADATAENTRY._options = None - _TRANSACTIONALACTORSTATEOPERATION_METADATAENTRY._serialized_options = b'8\001' - _INVOKEACTORREQUEST_METADATAENTRY._options = None - _INVOKEACTORREQUEST_METADATAENTRY._serialized_options = b'8\001' - _GETMETADATARESPONSE_EXTENDEDMETADATAENTRY._options = None - _GETMETADATARESPONSE_EXTENDEDMETADATAENTRY._serialized_options = b'8\001' - _GETMETADATARESPONSE.fields_by_name['active_actors_count']._options = None - _GETMETADATARESPONSE.fields_by_name['active_actors_count']._serialized_options = b'\030\001' - _PUBSUBSUBSCRIPTION_METADATAENTRY._options = None - _PUBSUBSUBSCRIPTION_METADATAENTRY._serialized_options = b'8\001' - _GETCONFIGURATIONREQUEST_METADATAENTRY._options = None - _GETCONFIGURATIONREQUEST_METADATAENTRY._serialized_options = b'8\001' - _GETCONFIGURATIONRESPONSE_ITEMSENTRY._options = None - _GETCONFIGURATIONRESPONSE_ITEMSENTRY._serialized_options = b'8\001' - _SUBSCRIBECONFIGURATIONREQUEST_METADATAENTRY._options = None - _SUBSCRIBECONFIGURATIONREQUEST_METADATAENTRY._serialized_options = b'8\001' - _SUBSCRIBECONFIGURATIONRESPONSE_ITEMSENTRY._options = None - _SUBSCRIBECONFIGURATIONRESPONSE_ITEMSENTRY._serialized_options = b'8\001' - _GETWORKFLOWRESPONSE_PROPERTIESENTRY._options = None - _GETWORKFLOWRESPONSE_PROPERTIESENTRY._serialized_options = b'8\001' - _STARTWORKFLOWREQUEST_OPTIONSENTRY._options = None - _STARTWORKFLOWREQUEST_OPTIONSENTRY._serialized_options = b'8\001' - _CONVERSATIONALPHA1REQUEST_PARAMETERSENTRY._options = None - _CONVERSATIONALPHA1REQUEST_PARAMETERSENTRY._serialized_options = b'8\001' - _CONVERSATIONALPHA1REQUEST_METADATAENTRY._options = None - _CONVERSATIONALPHA1REQUEST_METADATAENTRY._serialized_options = b'8\001' - _CONVERSATIONALPHA1RESULT_PARAMETERSENTRY._options = None - _CONVERSATIONALPHA1RESULT_PARAMETERSENTRY._serialized_options = b'8\001' - _globals['_PUBSUBSUBSCRIPTIONTYPE']._serialized_start=16034 - _globals['_PUBSUBSUBSCRIPTIONTYPE']._serialized_end=16121 + _globals['DESCRIPTOR']._options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\nio.dapr.v1B\nDaprProtosZ1github.com/dapr/dapr/pkg/proto/runtime/v1;runtime\252\002\033Dapr.Client.Autogen.Grpc.v1' + _globals['_GETSTATEREQUEST_METADATAENTRY']._options = None + _globals['_GETSTATEREQUEST_METADATAENTRY']._serialized_options = b'8\001' + _globals['_GETBULKSTATEREQUEST_METADATAENTRY']._options = None + _globals['_GETBULKSTATEREQUEST_METADATAENTRY']._serialized_options = b'8\001' + _globals['_BULKSTATEITEM_METADATAENTRY']._options = None + _globals['_BULKSTATEITEM_METADATAENTRY']._serialized_options = b'8\001' + _globals['_GETSTATERESPONSE_METADATAENTRY']._options = None + _globals['_GETSTATERESPONSE_METADATAENTRY']._serialized_options = b'8\001' + _globals['_DELETESTATEREQUEST_METADATAENTRY']._options = None + _globals['_DELETESTATEREQUEST_METADATAENTRY']._serialized_options = b'8\001' + _globals['_QUERYSTATEREQUEST_METADATAENTRY']._options = None + _globals['_QUERYSTATEREQUEST_METADATAENTRY']._serialized_options = b'8\001' + _globals['_QUERYSTATERESPONSE_METADATAENTRY']._options = None + _globals['_QUERYSTATERESPONSE_METADATAENTRY']._serialized_options = b'8\001' + _globals['_PUBLISHEVENTREQUEST_METADATAENTRY']._options = None + _globals['_PUBLISHEVENTREQUEST_METADATAENTRY']._serialized_options = b'8\001' + _globals['_BULKPUBLISHREQUEST_METADATAENTRY']._options = None + _globals['_BULKPUBLISHREQUEST_METADATAENTRY']._serialized_options = b'8\001' + _globals['_BULKPUBLISHREQUESTENTRY_METADATAENTRY']._options = None + _globals['_BULKPUBLISHREQUESTENTRY_METADATAENTRY']._serialized_options = b'8\001' + _globals['_SUBSCRIBETOPICEVENTSREQUESTINITIALALPHA1_METADATAENTRY']._options = None + _globals['_SUBSCRIBETOPICEVENTSREQUESTINITIALALPHA1_METADATAENTRY']._serialized_options = b'8\001' + _globals['_INVOKEBINDINGREQUEST_METADATAENTRY']._options = None + _globals['_INVOKEBINDINGREQUEST_METADATAENTRY']._serialized_options = b'8\001' + _globals['_INVOKEBINDINGRESPONSE_METADATAENTRY']._options = None + _globals['_INVOKEBINDINGRESPONSE_METADATAENTRY']._serialized_options = b'8\001' + _globals['_GETSECRETREQUEST_METADATAENTRY']._options = None + _globals['_GETSECRETREQUEST_METADATAENTRY']._serialized_options = b'8\001' + _globals['_GETSECRETRESPONSE_DATAENTRY']._options = None + _globals['_GETSECRETRESPONSE_DATAENTRY']._serialized_options = b'8\001' + _globals['_GETBULKSECRETREQUEST_METADATAENTRY']._options = None + _globals['_GETBULKSECRETREQUEST_METADATAENTRY']._serialized_options = b'8\001' + _globals['_SECRETRESPONSE_SECRETSENTRY']._options = None + _globals['_SECRETRESPONSE_SECRETSENTRY']._serialized_options = b'8\001' + _globals['_GETBULKSECRETRESPONSE_DATAENTRY']._options = None + _globals['_GETBULKSECRETRESPONSE_DATAENTRY']._serialized_options = b'8\001' + _globals['_EXECUTESTATETRANSACTIONREQUEST_METADATAENTRY']._options = None + _globals['_EXECUTESTATETRANSACTIONREQUEST_METADATAENTRY']._serialized_options = b'8\001' + _globals['_GETACTORSTATERESPONSE_METADATAENTRY']._options = None + _globals['_GETACTORSTATERESPONSE_METADATAENTRY']._serialized_options = b'8\001' + _globals['_TRANSACTIONALACTORSTATEOPERATION_METADATAENTRY']._options = None + _globals['_TRANSACTIONALACTORSTATEOPERATION_METADATAENTRY']._serialized_options = b'8\001' + _globals['_INVOKEACTORREQUEST_METADATAENTRY']._options = None + _globals['_INVOKEACTORREQUEST_METADATAENTRY']._serialized_options = b'8\001' + _globals['_GETMETADATARESPONSE_EXTENDEDMETADATAENTRY']._options = None + _globals['_GETMETADATARESPONSE_EXTENDEDMETADATAENTRY']._serialized_options = b'8\001' + _globals['_GETMETADATARESPONSE'].fields_by_name['active_actors_count']._options = None + _globals['_GETMETADATARESPONSE'].fields_by_name['active_actors_count']._serialized_options = b'\030\001' + _globals['_PUBSUBSUBSCRIPTION_METADATAENTRY']._options = None + _globals['_PUBSUBSUBSCRIPTION_METADATAENTRY']._serialized_options = b'8\001' + _globals['_GETCONFIGURATIONREQUEST_METADATAENTRY']._options = None + _globals['_GETCONFIGURATIONREQUEST_METADATAENTRY']._serialized_options = b'8\001' + _globals['_GETCONFIGURATIONRESPONSE_ITEMSENTRY']._options = None + _globals['_GETCONFIGURATIONRESPONSE_ITEMSENTRY']._serialized_options = b'8\001' + _globals['_SUBSCRIBECONFIGURATIONREQUEST_METADATAENTRY']._options = None + _globals['_SUBSCRIBECONFIGURATIONREQUEST_METADATAENTRY']._serialized_options = b'8\001' + _globals['_SUBSCRIBECONFIGURATIONRESPONSE_ITEMSENTRY']._options = None + _globals['_SUBSCRIBECONFIGURATIONRESPONSE_ITEMSENTRY']._serialized_options = b'8\001' + _globals['_GETWORKFLOWRESPONSE_PROPERTIESENTRY']._options = None + _globals['_GETWORKFLOWRESPONSE_PROPERTIESENTRY']._serialized_options = b'8\001' + _globals['_STARTWORKFLOWREQUEST_OPTIONSENTRY']._options = None + _globals['_STARTWORKFLOWREQUEST_OPTIONSENTRY']._serialized_options = b'8\001' + _globals['_CONVERSATIONREQUEST_PARAMETERSENTRY']._options = None + _globals['_CONVERSATIONREQUEST_PARAMETERSENTRY']._serialized_options = b'8\001' + _globals['_CONVERSATIONREQUEST_METADATAENTRY']._options = None + _globals['_CONVERSATIONREQUEST_METADATAENTRY']._serialized_options = b'8\001' + _globals['_CONVERSATIONRESULT_PARAMETERSENTRY']._options = None + _globals['_CONVERSATIONRESULT_PARAMETERSENTRY']._serialized_options = b'8\001' + _globals['_DAPR'].methods_by_name['StartWorkflowAlpha1']._options = None + _globals['_DAPR'].methods_by_name['StartWorkflowAlpha1']._serialized_options = b'\210\002\001' + _globals['_DAPR'].methods_by_name['GetWorkflowAlpha1']._options = None + _globals['_DAPR'].methods_by_name['GetWorkflowAlpha1']._serialized_options = b'\210\002\001' + _globals['_DAPR'].methods_by_name['PurgeWorkflowAlpha1']._options = None + _globals['_DAPR'].methods_by_name['PurgeWorkflowAlpha1']._serialized_options = b'\210\002\001' + _globals['_DAPR'].methods_by_name['TerminateWorkflowAlpha1']._options = None + _globals['_DAPR'].methods_by_name['TerminateWorkflowAlpha1']._serialized_options = b'\210\002\001' + _globals['_DAPR'].methods_by_name['PauseWorkflowAlpha1']._options = None + _globals['_DAPR'].methods_by_name['PauseWorkflowAlpha1']._serialized_options = b'\210\002\001' + _globals['_DAPR'].methods_by_name['ResumeWorkflowAlpha1']._options = None + _globals['_DAPR'].methods_by_name['ResumeWorkflowAlpha1']._serialized_options = b'\210\002\001' + _globals['_DAPR'].methods_by_name['RaiseEventWorkflowAlpha1']._options = None + _globals['_DAPR'].methods_by_name['RaiseEventWorkflowAlpha1']._serialized_options = b'\210\002\001' + _globals['_PUBSUBSUBSCRIPTIONTYPE']._serialized_start=15991 + _globals['_PUBSUBSUBSCRIPTIONTYPE']._serialized_end=16078 _globals['_INVOKESERVICEREQUEST']._serialized_start=224 _globals['_INVOKESERVICEREQUEST']._serialized_end=312 _globals['_GETSTATEREQUEST']._serialized_start=315 @@ -363,20 +377,20 @@ _globals['_DELETEJOBREQUEST']._serialized_end=15063 _globals['_DELETEJOBRESPONSE']._serialized_start=15065 _globals['_DELETEJOBRESPONSE']._serialized_end=15084 - _globals['_CONVERSATIONALPHA1REQUEST']._serialized_start=15087 - _globals['_CONVERSATIONALPHA1REQUEST']._serialized_end=15592 - _globals['_CONVERSATIONALPHA1REQUEST_PARAMETERSENTRY']._serialized_start=15429 - _globals['_CONVERSATIONALPHA1REQUEST_PARAMETERSENTRY']._serialized_end=15500 - _globals['_CONVERSATIONALPHA1REQUEST_METADATAENTRY']._serialized_start=513 - _globals['_CONVERSATIONALPHA1REQUEST_METADATAENTRY']._serialized_end=560 - _globals['_CONVERSATIONINPUT']._serialized_start=15594 - _globals['_CONVERSATIONINPUT']._serialized_end=15694 - _globals['_CONVERSATIONALPHA1RESULT']._serialized_start=15697 - _globals['_CONVERSATIONALPHA1RESULT']._serialized_end=15897 - _globals['_CONVERSATIONALPHA1RESULT_PARAMETERSENTRY']._serialized_start=15429 - _globals['_CONVERSATIONALPHA1RESULT_PARAMETERSENTRY']._serialized_end=15500 - _globals['_CONVERSATIONALPHA1RESPONSE']._serialized_start=15900 - _globals['_CONVERSATIONALPHA1RESPONSE']._serialized_end=16032 - _globals['_DAPR']._serialized_start=16124 - _globals['_DAPR']._serialized_end=22449 + _globals['_CONVERSATIONREQUEST']._serialized_start=15087 + _globals['_CONVERSATIONREQUEST']._serialized_end=15574 + _globals['_CONVERSATIONREQUEST_PARAMETERSENTRY']._serialized_start=15411 + _globals['_CONVERSATIONREQUEST_PARAMETERSENTRY']._serialized_end=15482 + _globals['_CONVERSATIONREQUEST_METADATAENTRY']._serialized_start=513 + _globals['_CONVERSATIONREQUEST_METADATAENTRY']._serialized_end=560 + _globals['_CONVERSATIONINPUT']._serialized_start=15576 + _globals['_CONVERSATIONINPUT']._serialized_end=15676 + _globals['_CONVERSATIONRESULT']._serialized_start=15679 + _globals['_CONVERSATIONRESULT']._serialized_end=15867 + _globals['_CONVERSATIONRESULT_PARAMETERSENTRY']._serialized_start=15411 + _globals['_CONVERSATIONRESULT_PARAMETERSENTRY']._serialized_end=15482 + _globals['_CONVERSATIONRESPONSE']._serialized_start=15869 + _globals['_CONVERSATIONRESPONSE']._serialized_end=15989 + _globals['_DAPR']._serialized_start=16081 + _globals['_DAPR']._serialized_end=22415 # @@protoc_insertion_point(module_scope) diff --git a/dapr/proto/runtime/v1/dapr_pb2.pyi b/dapr/proto/runtime/v1/dapr_pb2.pyi index 11f695a5..aee50395 100644 --- a/dapr/proto/runtime/v1/dapr_pb2.pyi +++ b/dapr/proto/runtime/v1/dapr_pb2.pyi @@ -3261,8 +3261,8 @@ class DeleteJobResponse(google.protobuf.message.Message): global___DeleteJobResponse = DeleteJobResponse @typing_extensions.final -class ConversationAlpha1Request(google.protobuf.message.Message): - """ConversationAlpha1Request is the request object for Conversation.""" +class ConversationRequest(google.protobuf.message.Message): + """ConversationRequest is the request object for Conversation.""" DESCRIPTOR: google.protobuf.descriptor.Descriptor @@ -3308,7 +3308,7 @@ class ConversationAlpha1Request(google.protobuf.message.Message): SCRUBPII_FIELD_NUMBER: builtins.int TEMPERATURE_FIELD_NUMBER: builtins.int name: builtins.str - """The name of Coverstaion component""" + """The name of Conversation component""" contextID: builtins.str """The ID of an existing chat (like in ChatGPT)""" @property @@ -3344,7 +3344,7 @@ class ConversationAlpha1Request(google.protobuf.message.Message): @typing.overload def WhichOneof(self, oneof_group: typing_extensions.Literal["_temperature", b"_temperature"]) -> typing_extensions.Literal["temperature"] | None: ... -global___ConversationAlpha1Request = ConversationAlpha1Request +global___ConversationRequest = ConversationRequest @typing_extensions.final class ConversationInput(google.protobuf.message.Message): @@ -3376,8 +3376,8 @@ class ConversationInput(google.protobuf.message.Message): global___ConversationInput = ConversationInput @typing_extensions.final -class ConversationAlpha1Result(google.protobuf.message.Message): - """ConversationAlpha1Result is the result for one input.""" +class ConversationResult(google.protobuf.message.Message): + """ConversationResult is the result for one input.""" DESCRIPTOR: google.protobuf.descriptor.Descriptor @@ -3414,11 +3414,11 @@ class ConversationAlpha1Result(google.protobuf.message.Message): ) -> None: ... def ClearField(self, field_name: typing_extensions.Literal["parameters", b"parameters", "result", b"result"]) -> None: ... -global___ConversationAlpha1Result = ConversationAlpha1Result +global___ConversationResult = ConversationResult @typing_extensions.final -class ConversationAlpha1Response(google.protobuf.message.Message): - """ConversationAlpha1Response is the response for Conversation.""" +class ConversationResponse(google.protobuf.message.Message): + """ConversationResponse is the response for Conversation.""" DESCRIPTOR: google.protobuf.descriptor.Descriptor @@ -3427,16 +3427,16 @@ class ConversationAlpha1Response(google.protobuf.message.Message): contextID: builtins.str """The ID of an existing chat (like in ChatGPT)""" @property - def outputs(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___ConversationAlpha1Result]: + def outputs(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___ConversationResult]: """An array of results.""" def __init__( self, *, contextID: builtins.str | None = ..., - outputs: collections.abc.Iterable[global___ConversationAlpha1Result] | None = ..., + outputs: collections.abc.Iterable[global___ConversationResult] | None = ..., ) -> None: ... def HasField(self, field_name: typing_extensions.Literal["_contextID", b"_contextID", "contextID", b"contextID"]) -> builtins.bool: ... def ClearField(self, field_name: typing_extensions.Literal["_contextID", b"_contextID", "contextID", b"contextID", "outputs", b"outputs"]) -> None: ... def WhichOneof(self, oneof_group: typing_extensions.Literal["_contextID", b"_contextID"]) -> typing_extensions.Literal["contextID"] | None: ... -global___ConversationAlpha1Response = ConversationAlpha1Response +global___ConversationResponse = ConversationResponse diff --git a/dapr/proto/runtime/v1/dapr_pb2_grpc.py b/dapr/proto/runtime/v1/dapr_pb2_grpc.py index 60b4c241..d371896b 100644 --- a/dapr/proto/runtime/v1/dapr_pb2_grpc.py +++ b/dapr/proto/runtime/v1/dapr_pb2_grpc.py @@ -309,8 +309,8 @@ def __init__(self, channel): ) self.ConverseAlpha1 = channel.unary_unary( '/dapr.proto.runtime.v1.Dapr/ConverseAlpha1', - request_serializer=dapr_dot_proto_dot_runtime_dot_v1_dot_dapr__pb2.ConversationAlpha1Request.SerializeToString, - response_deserializer=dapr_dot_proto_dot_runtime_dot_v1_dot_dapr__pb2.ConversationAlpha1Response.FromString, + request_serializer=dapr_dot_proto_dot_runtime_dot_v1_dot_dapr__pb2.ConversationRequest.SerializeToString, + response_deserializer=dapr_dot_proto_dot_runtime_dot_v1_dot_dapr__pb2.ConversationResponse.FromString, ) @@ -1028,8 +1028,8 @@ def add_DaprServicer_to_server(servicer, server): ), 'ConverseAlpha1': grpc.unary_unary_rpc_method_handler( servicer.ConverseAlpha1, - request_deserializer=dapr_dot_proto_dot_runtime_dot_v1_dot_dapr__pb2.ConversationAlpha1Request.FromString, - response_serializer=dapr_dot_proto_dot_runtime_dot_v1_dot_dapr__pb2.ConversationAlpha1Response.SerializeToString, + request_deserializer=dapr_dot_proto_dot_runtime_dot_v1_dot_dapr__pb2.ConversationRequest.FromString, + response_serializer=dapr_dot_proto_dot_runtime_dot_v1_dot_dapr__pb2.ConversationResponse.SerializeToString, ), } generic_handler = grpc.method_handlers_generic_handler( @@ -2040,7 +2040,7 @@ def ConverseAlpha1(request, timeout=None, metadata=None): return grpc.experimental.unary_unary(request, target, '/dapr.proto.runtime.v1.Dapr/ConverseAlpha1', - dapr_dot_proto_dot_runtime_dot_v1_dot_dapr__pb2.ConversationAlpha1Request.SerializeToString, - dapr_dot_proto_dot_runtime_dot_v1_dot_dapr__pb2.ConversationAlpha1Response.FromString, + dapr_dot_proto_dot_runtime_dot_v1_dot_dapr__pb2.ConversationRequest.SerializeToString, + dapr_dot_proto_dot_runtime_dot_v1_dot_dapr__pb2.ConversationResponse.FromString, options, channel_credentials, insecure, call_credentials, compression, wait_for_ready, timeout, metadata) diff --git a/tools/requirements.txt b/tools/requirements.txt index d3d503c9..627d683a 100644 --- a/tools/requirements.txt +++ b/tools/requirements.txt @@ -1 +1 @@ -grpcio-tools>=1.57.0 +grpcio-tools==1.62.3 From 296de6cf8b237adbc6a81ef02f1bec63c9bb19d6 Mon Sep 17 00:00:00 2001 From: Elena Kolevska Date: Mon, 13 Jan 2025 16:45:12 +0000 Subject: [PATCH 24/24] Bump dapr/durabletask version Signed-off-by: Elena Kolevska --- dev-requirements.txt | 2 +- ext/dapr-ext-workflow/setup.cfg | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dev-requirements.txt b/dev-requirements.txt index 4ca9f6fb..769b1e1e 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -15,4 +15,4 @@ Flask>=1.1 # needed for auto fix ruff===0.2.2 # needed for dapr-ext-workflow -durabletask-dapr >= 0.2.0a3 +durabletask-dapr >= 0.2.0a4 diff --git a/ext/dapr-ext-workflow/setup.cfg b/ext/dapr-ext-workflow/setup.cfg index 3eb6e213..e61b94ec 100644 --- a/ext/dapr-ext-workflow/setup.cfg +++ b/ext/dapr-ext-workflow/setup.cfg @@ -25,7 +25,7 @@ packages = find_namespace: include_package_data = True install_requires = dapr-dev >= 1.13.0rc1.dev - durabletask-dapr >= 0.2.0a3 + durabletask-dapr >= 0.2.0a4 [options.packages.find] include =