diff --git a/dapr/aio/clients/__init__.py b/dapr/aio/clients/__init__.py index ae77258e8..e945b1307 100644 --- a/dapr/aio/clients/__init__.py +++ b/dapr/aio/clients/__init__.py @@ -18,6 +18,7 @@ from dapr.clients.base import DaprActorClientBase from dapr.clients.exceptions import DaprInternalError, ERROR_CODE_UNKNOWN from dapr.aio.clients.grpc.client import DaprGrpcClientAsync, MetadataTuple, InvokeMethodResponse +from dapr.clients.grpc._jobs import Job, FailurePolicy, DropFailurePolicy, ConstantFailurePolicy from dapr.clients.http.dapr_actor_http_client import DaprActorHttpClient from dapr.clients.http.dapr_invocation_http_client import DaprInvocationHttpClient from dapr.conf import settings @@ -29,6 +30,10 @@ 'DaprActorHttpClient', 'DaprInternalError', 'ERROR_CODE_UNKNOWN', + 'Job', + 'FailurePolicy', + 'DropFailurePolicy', + 'ConstantFailurePolicy', ] from grpc.aio import ( # type: ignore diff --git a/dapr/aio/clients/grpc/client.py b/dapr/aio/clients/grpc/client.py index 315c219c8..8daa3cb07 100644 --- a/dapr/aio/clients/grpc/client.py +++ b/dapr/aio/clients/grpc/client.py @@ -78,6 +78,7 @@ TransactionalStateOperation, ConversationInput, ) +from dapr.clients.grpc._jobs import Job from dapr.clients.grpc._response import ( BindingResponse, ConversationResponse, @@ -1847,6 +1848,107 @@ async def get_metadata(self) -> GetMetadataResponse: headers=await call.initial_metadata(), ) + async def schedule_job_alpha1(self, job: Job) -> DaprResponse: + """Schedules a job to be triggered at a specified time or interval. + + This is an Alpha API and is subject to change. + + Args: + job (Job): The job to schedule. Must have a name and either schedule or due_time. + + Returns: + DaprResponse: Empty response indicating successful scheduling. + + Raises: + ValueError: If job name is empty or both schedule and due_time are missing. + DaprGrpcError: If the Dapr runtime returns an error. + """ + # Warnings and input validation + warn( + 'The Jobs API is an Alpha version and is subject to change.', + UserWarning, + stacklevel=2, + ) + validateNotBlankString(job_name=job.name) + + if not job.schedule and not job.due_time: + raise ValueError('Job must have either schedule or due_time specified') + + # Convert job to proto using the Job class private method + job_proto = job._get_proto() + request = api_v1.ScheduleJobRequest(job=job_proto) + + try: + call = self._stub.ScheduleJobAlpha1(request) + await call + return DaprResponse(headers=await call.initial_metadata()) + except grpc.aio.AioRpcError as err: + raise DaprGrpcError(err) from err + + async def get_job_alpha1(self, name: str) -> Job: + """Gets a scheduled job by name. + + This is an Alpha API and is subject to change. + + Args: + name (str): The name of the job to retrieve. + + Returns: + Job: The job details retrieved from the scheduler. + + Raises: + ValueError: If job name is empty. + DaprGrpcError: If the Dapr runtime returns an error. + """ + # Warnings and input validation + warn( + 'The Jobs API is an Alpha version and is subject to change.', + UserWarning, + stacklevel=2, + ) + validateNotBlankString(job_name=name) + + request = api_v1.GetJobRequest(name=name) + + try: + call = self._stub.GetJobAlpha1(request) + response = await call + return Job._from_proto(response.job) + except grpc.aio.AioRpcError as err: + raise DaprGrpcError(err) from err + + async def delete_job_alpha1(self, name: str) -> DaprResponse: + """Deletes a scheduled job by name. + + This is an Alpha API and is subject to change. + + Args: + name (str): The name of the job to delete. + + Returns: + DaprResponse: Empty response indicating successful deletion. + + Raises: + ValueError: If job name is empty. + DaprGrpcError: If the Dapr runtime returns an error. + """ + # Warnings and input validation + warn( + 'The Jobs API is an Alpha version and is subject to change.', + UserWarning, + stacklevel=2, + ) + validateNotBlankString(job_name=name) + + request = api_v1.DeleteJobRequest(name=name) + + try: + call = self._stub.DeleteJobAlpha1(request) + await call + return DaprResponse(headers=await call.initial_metadata()) + except grpc.aio.AioRpcError as err: + raise DaprGrpcError(err) from err + async def set_metadata(self, attributeName: str, attributeValue: str) -> DaprResponse: """Adds a custom (extended) metadata attribute to the Dapr sidecar information stored by the Metadata endpoint. diff --git a/dapr/clients/__init__.py b/dapr/clients/__init__.py index 20c147856..78ad99eb4 100644 --- a/dapr/clients/__init__.py +++ b/dapr/clients/__init__.py @@ -19,6 +19,7 @@ from dapr.clients.base import DaprActorClientBase from dapr.clients.exceptions import DaprInternalError, ERROR_CODE_UNKNOWN from dapr.clients.grpc.client import DaprGrpcClient, MetadataTuple, InvokeMethodResponse +from dapr.clients.grpc._jobs import Job, FailurePolicy, DropFailurePolicy, ConstantFailurePolicy from dapr.clients.http.dapr_actor_http_client import DaprActorHttpClient from dapr.clients.http.dapr_invocation_http_client import DaprInvocationHttpClient from dapr.clients.retry import RetryPolicy @@ -32,6 +33,10 @@ 'DaprActorHttpClient', 'DaprInternalError', 'ERROR_CODE_UNKNOWN', + 'Job', + 'FailurePolicy', + 'DropFailurePolicy', + 'ConstantFailurePolicy', ] diff --git a/dapr/clients/grpc/_jobs.py b/dapr/clients/grpc/_jobs.py new file mode 100644 index 000000000..8087b3f72 --- /dev/null +++ b/dapr/clients/grpc/_jobs.py @@ -0,0 +1,188 @@ +# -*- coding: utf-8 -*- + +# Copyright 2025 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. + +""" +This module contains the Job class and related utilities for the Dapr Jobs API. +""" + +from abc import ABC, abstractmethod +from dataclasses import dataclass +from typing import Optional + +from google.protobuf.any_pb2 import Any as GrpcAny +from google.protobuf.duration_pb2 import Duration as GrpcDuration + + +class FailurePolicy(ABC): + """Abstract base class for job failure policies.""" + + @abstractmethod + def _to_proto(self): + """Convert this failure policy to its protobuf representation.""" + pass + + +class DropFailurePolicy(FailurePolicy): + """A failure policy that drops the job when it fails to trigger. + + When a job fails to trigger, it will be dropped and not retried. + """ + + def _to_proto(self): + """Convert to protobuf JobFailurePolicy with drop policy.""" + from dapr.proto.common.v1 import common_pb2 + + return common_pb2.JobFailurePolicy(drop=common_pb2.JobFailurePolicyDrop()) + + +class ConstantFailurePolicy(FailurePolicy): + """A failure policy that retries the job at constant intervals. + + When a job fails to trigger, it will be retried after a constant interval, + up to a maximum number of retries (if specified). + + Args: + max_retries (Optional[int]): Maximum number of retries. If None, retries indefinitely. + interval_seconds (Optional[int]): Interval between retries in seconds. Defaults to 30. + """ + + def __init__(self, max_retries: Optional[int] = None, interval_seconds: Optional[int] = 30): + self.max_retries = max_retries + self.interval_seconds = interval_seconds + + def _to_proto(self): + """Convert to protobuf JobFailurePolicy with constant policy.""" + from dapr.proto.common.v1 import common_pb2 + + constant_policy = common_pb2.JobFailurePolicyConstant() + + if self.interval_seconds is not None: + constant_policy.interval.CopyFrom(GrpcDuration(seconds=self.interval_seconds)) + + if self.max_retries is not None: + constant_policy.max_retries = self.max_retries + + return common_pb2.JobFailurePolicy(constant=constant_policy) + + +@dataclass +class Job: + """Represents a Dapr job for scheduling. + + At least one of schedule or due_time must be provided but can also be provided together. + + Attributes: + name (str): The unique name for the job. + schedule (Optional[str]): Schedule at which the job is to be run. + Accepts both systemd timer style cron expressions, as well as human + readable '@' prefixed period strings. + repeats (Optional[int]): The optional number of times in which the job should be + triggered. If not set, the job will run indefinitely or until expiration. + due_time (Optional[str]): The optional time at which the job should be active, or the + "one shot" time if other scheduling type fields are not provided. Accepts + a "point in time" string in the format of RFC3339, Go duration string + (calculated from job creation time), or non-repeating ISO8601. + ttl (Optional[str]): The optional time to live or expiration of the job. Accepts a + "point in time" string in the format of RFC3339, Go duration string + (calculated from job creation time), or non-repeating ISO8601. + data (Optional[GrpcAny]): The serialized job payload that will be sent to the recipient + when the job is triggered. If not provided, an empty Any proto will be used. + failure_policy (Optional[FailurePolicy]): The failure policy to apply when the job fails + to trigger. If not provided, the default behavior is determined by the Dapr runtime. + overwrite (bool): If true, allows this job to overwrite an existing job with the same name. + """ + + name: str + schedule: Optional[str] = None + repeats: Optional[int] = None + due_time: Optional[str] = None + ttl: Optional[str] = None + data: Optional[GrpcAny] = None + failure_policy: Optional[FailurePolicy] = None + overwrite: bool = False + + def _get_proto(self): + """Convert this Job instance to a Dapr Job proto message. + + This is an internal method for SDK use only. Not part of the public API. + + Returns: + api_v1.Job: The proto representation of this job. + """ + from dapr.proto.runtime.v1 import dapr_pb2 as api_v1 + from google.protobuf.any_pb2 import Any as GrpcAny + + # Build the job proto + job_proto = api_v1.Job(name=self.name, overwrite=self.overwrite) + + if self.schedule: + job_proto.schedule = self.schedule + if self.repeats is not None: + job_proto.repeats = self.repeats + if self.due_time: + job_proto.due_time = self.due_time + if self.ttl: + job_proto.ttl = self.ttl + # overwrite is already set in the constructor above + + # data field is required, set empty Any if not provided + if self.data: + job_proto.data.CopyFrom(self.data) + else: + # Set empty Any proto + job_proto.data.CopyFrom(GrpcAny()) + + # Set failure policy if provided + if self.failure_policy: + job_proto.failure_policy.CopyFrom(self.failure_policy._to_proto()) + + return job_proto + + @classmethod + def _from_proto(cls, job_proto): + """Create a Job instance from a Dapr Job proto message. + + This is an internal method for SDK use only. Not part of the public API. + + Args: + job_proto (api_v1.Job): The proto message to convert. + + Returns: + Job: A new Job instance. + """ + # Parse failure policy if present + failure_policy: Optional[FailurePolicy] = None + if job_proto.HasField('failure_policy'): + policy = job_proto.failure_policy + if policy.HasField('drop'): + failure_policy = DropFailurePolicy() + elif policy.HasField('constant'): + constant = policy.constant + max_retries = constant.max_retries if constant.HasField('max_retries') else None + interval_seconds = None + if constant.HasField('interval'): + interval_seconds = constant.interval.seconds + failure_policy = ConstantFailurePolicy( + max_retries=max_retries, interval_seconds=interval_seconds + ) + + return cls( + name=job_proto.name, + schedule=job_proto.schedule if job_proto.HasField('schedule') else None, + repeats=job_proto.repeats if job_proto.HasField('repeats') else None, + due_time=job_proto.due_time if job_proto.HasField('due_time') else None, + ttl=job_proto.ttl if job_proto.HasField('ttl') else None, + data=job_proto.data if job_proto.HasField('data') and job_proto.data.value else None, + failure_policy=failure_policy, + overwrite=job_proto.overwrite, + ) diff --git a/dapr/clients/grpc/_request.py b/dapr/clients/grpc/_request.py index bdd699b1e..c914a9d52 100644 --- a/dapr/clients/grpc/_request.py +++ b/dapr/clients/grpc/_request.py @@ -435,3 +435,30 @@ class ConversationInput: content: str role: Optional[str] = None scrub_pii: Optional[bool] = None + + +class JobEvent: + """Represents a job event received from Dapr runtime. + + This matches the Go SDK's common.JobEvent structure and represents + a job that is currently being executed, not a job definition. + + Args: + name (str): The name/type of the job being executed. + data (bytes): The raw job data payload. + """ + + def __init__(self, name: str, data: bytes = b''): + self.name = name + self.data = data + + def get_data_as_string(self, encoding: str = 'utf-8') -> str: + """Get the job data as a string. + + Args: + encoding (str): The encoding to use for decoding bytes. Defaults to 'utf-8'. + + Returns: + str: The job data as a string, or empty string if no data. + """ + return self.data.decode(encoding) if self.data else '' diff --git a/dapr/clients/grpc/client.py b/dapr/clients/grpc/client.py index 9868af083..ac0def79f 100644 --- a/dapr/clients/grpc/client.py +++ b/dapr/clients/grpc/client.py @@ -67,6 +67,7 @@ DecryptRequestIterator, ConversationInput, ) +from dapr.clients.grpc._jobs import Job from dapr.clients.grpc._response import ( BindingResponse, DaprResponse, @@ -1774,6 +1775,104 @@ def converse_alpha1( except RpcError as err: raise DaprGrpcError(err) from err + def schedule_job_alpha1(self, job: Job) -> DaprResponse: + """Schedules a job to be triggered at a specified time or interval. + + This is an Alpha API and is subject to change. + + Args: + job (Job): The job to schedule. Must have a name and either schedule or due_time. + + Returns: + DaprResponse: Empty response indicating successful scheduling. + + Raises: + ValueError: If job name is empty or both schedule and due_time are missing. + DaprGrpcError: If the Dapr runtime returns an error. + """ + # Warnings and input validation + warn( + 'The Jobs API is an Alpha version and is subject to change.', + UserWarning, + stacklevel=2, + ) + validateNotBlankString(job_name=job.name) + + if not job.schedule and not job.due_time: + raise ValueError('Job must have either schedule or due_time specified') + + # Convert job to proto using the Job class private method + job_proto = job._get_proto() + request = api_v1.ScheduleJobRequest(job=job_proto) + + try: + _, call = self.retry_policy.run_rpc(self._stub.ScheduleJobAlpha1.with_call, request) + return DaprResponse(headers=call.initial_metadata()) + except RpcError as err: + raise DaprGrpcError(err) from err + + def get_job_alpha1(self, name: str) -> Job: + """Gets a scheduled job by name. + + This is an Alpha API and is subject to change. + + Args: + name (str): The name of the job to retrieve. + + Returns: + Job: The job details retrieved from the scheduler. + + Raises: + ValueError: If job name is empty. + DaprGrpcError: If the Dapr runtime returns an error. + """ + # Warnings and input validation + warn( + 'The Jobs API is an Alpha version and is subject to change.', + UserWarning, + stacklevel=2, + ) + validateNotBlankString(job_name=name) + + request = api_v1.GetJobRequest(name=name) + + try: + response, call = self.retry_policy.run_rpc(self._stub.GetJobAlpha1.with_call, request) + return Job._from_proto(response.job) + except RpcError as err: + raise DaprGrpcError(err) from err + + def delete_job_alpha1(self, name: str) -> DaprResponse: + """Deletes a scheduled job by name. + + This is an Alpha API and is subject to change. + + Args: + name (str): The name of the job to delete. + + Returns: + DaprResponse: Empty response indicating successful deletion. + + Raises: + ValueError: If job name is empty. + DaprGrpcError: If the Dapr runtime returns an error. + """ + # Warnings and input validation + warn( + 'The Jobs API is an Alpha version and is subject to change.', + UserWarning, + stacklevel=2, + ) + validateNotBlankString(job_name=name) + + request = api_v1.DeleteJobRequest(name=name) + + try: + _, call = self.retry_policy.run_rpc(self._stub.DeleteJobAlpha1.with_call, request) + return DaprResponse(headers=call.initial_metadata()) + except RpcError as err: + raise DaprGrpcError(err) from err + def wait(self, timeout_s: float): """Waits for sidecar to be available within the timeout. diff --git a/dapr/proto/common/v1/common_pb2.py b/dapr/proto/common/v1/common_pb2.py index 673bac1ba..7f8feb46b 100644 --- a/dapr/proto/common/v1/common_pb2.py +++ b/dapr/proto/common/v1/common_pb2.py @@ -13,9 +13,10 @@ from google.protobuf import any_pb2 as google_dot_protobuf_dot_any__pb2 +from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n!dapr/proto/common/v1/common.proto\x12\x14\x64\x61pr.proto.common.v1\x1a\x19google/protobuf/any.proto\"\xd0\x01\n\rHTTPExtension\x12\x36\n\x04verb\x18\x01 \x01(\x0e\x32(.dapr.proto.common.v1.HTTPExtension.Verb\x12\x13\n\x0bquerystring\x18\x02 \x01(\t\"r\n\x04Verb\x12\x08\n\x04NONE\x10\x00\x12\x07\n\x03GET\x10\x01\x12\x08\n\x04HEAD\x10\x02\x12\x08\n\x04POST\x10\x03\x12\x07\n\x03PUT\x10\x04\x12\n\n\x06\x44\x45LETE\x10\x05\x12\x0b\n\x07\x43ONNECT\x10\x06\x12\x0b\n\x07OPTIONS\x10\x07\x12\t\n\x05TRACE\x10\x08\x12\t\n\x05PATCH\x10\t\"\x96\x01\n\rInvokeRequest\x12\x0e\n\x06method\x18\x01 \x01(\t\x12\"\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x14.google.protobuf.Any\x12\x14\n\x0c\x63ontent_type\x18\x03 \x01(\t\x12;\n\x0ehttp_extension\x18\x04 \x01(\x0b\x32#.dapr.proto.common.v1.HTTPExtension\"J\n\x0eInvokeResponse\x12\"\n\x04\x64\x61ta\x18\x01 \x01(\x0b\x32\x14.google.protobuf.Any\x12\x14\n\x0c\x63ontent_type\x18\x02 \x01(\t\"*\n\rStreamPayload\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\x12\x0b\n\x03seq\x18\x02 \x01(\x04\"\xf8\x01\n\tStateItem\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x0c\x12(\n\x04\x65tag\x18\x03 \x01(\x0b\x32\x1a.dapr.proto.common.v1.Etag\x12?\n\x08metadata\x18\x04 \x03(\x0b\x32-.dapr.proto.common.v1.StateItem.MetadataEntry\x12\x33\n\x07options\x18\x05 \x01(\x0b\x32\".dapr.proto.common.v1.StateOptions\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x15\n\x04\x45tag\x12\r\n\x05value\x18\x01 \x01(\t\"\xef\x02\n\x0cStateOptions\x12H\n\x0b\x63oncurrency\x18\x01 \x01(\x0e\x32\x33.dapr.proto.common.v1.StateOptions.StateConcurrency\x12H\n\x0b\x63onsistency\x18\x02 \x01(\x0e\x32\x33.dapr.proto.common.v1.StateOptions.StateConsistency\"h\n\x10StateConcurrency\x12\x1b\n\x17\x43ONCURRENCY_UNSPECIFIED\x10\x00\x12\x1b\n\x17\x43ONCURRENCY_FIRST_WRITE\x10\x01\x12\x1a\n\x16\x43ONCURRENCY_LAST_WRITE\x10\x02\"a\n\x10StateConsistency\x12\x1b\n\x17\x43ONSISTENCY_UNSPECIFIED\x10\x00\x12\x18\n\x14\x43ONSISTENCY_EVENTUAL\x10\x01\x12\x16\n\x12\x43ONSISTENCY_STRONG\x10\x02\"\xad\x01\n\x11\x43onfigurationItem\x12\r\n\x05value\x18\x01 \x01(\t\x12\x0f\n\x07version\x18\x02 \x01(\t\x12G\n\x08metadata\x18\x03 \x03(\x0b\x32\x35.dapr.proto.common.v1.ConfigurationItem.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42i\n\nio.dapr.v1B\x0c\x43ommonProtosZ/github.com/dapr/dapr/pkg/proto/common/v1;common\xaa\x02\x1b\x44\x61pr.Client.Autogen.Grpc.v1b\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n!dapr/proto/common/v1/common.proto\x12\x14\x64\x61pr.proto.common.v1\x1a\x19google/protobuf/any.proto\x1a\x1egoogle/protobuf/duration.proto\"\xd0\x01\n\rHTTPExtension\x12\x36\n\x04verb\x18\x01 \x01(\x0e\x32(.dapr.proto.common.v1.HTTPExtension.Verb\x12\x13\n\x0bquerystring\x18\x02 \x01(\t\"r\n\x04Verb\x12\x08\n\x04NONE\x10\x00\x12\x07\n\x03GET\x10\x01\x12\x08\n\x04HEAD\x10\x02\x12\x08\n\x04POST\x10\x03\x12\x07\n\x03PUT\x10\x04\x12\n\n\x06\x44\x45LETE\x10\x05\x12\x0b\n\x07\x43ONNECT\x10\x06\x12\x0b\n\x07OPTIONS\x10\x07\x12\t\n\x05TRACE\x10\x08\x12\t\n\x05PATCH\x10\t\"\x96\x01\n\rInvokeRequest\x12\x0e\n\x06method\x18\x01 \x01(\t\x12\"\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x14.google.protobuf.Any\x12\x14\n\x0c\x63ontent_type\x18\x03 \x01(\t\x12;\n\x0ehttp_extension\x18\x04 \x01(\x0b\x32#.dapr.proto.common.v1.HTTPExtension\"J\n\x0eInvokeResponse\x12\"\n\x04\x64\x61ta\x18\x01 \x01(\x0b\x32\x14.google.protobuf.Any\x12\x14\n\x0c\x63ontent_type\x18\x02 \x01(\t\"*\n\rStreamPayload\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\x12\x0b\n\x03seq\x18\x02 \x01(\x04\"\xf8\x01\n\tStateItem\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x0c\x12(\n\x04\x65tag\x18\x03 \x01(\x0b\x32\x1a.dapr.proto.common.v1.Etag\x12?\n\x08metadata\x18\x04 \x03(\x0b\x32-.dapr.proto.common.v1.StateItem.MetadataEntry\x12\x33\n\x07options\x18\x05 \x01(\x0b\x32\".dapr.proto.common.v1.StateOptions\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x15\n\x04\x45tag\x12\r\n\x05value\x18\x01 \x01(\t\"\xef\x02\n\x0cStateOptions\x12H\n\x0b\x63oncurrency\x18\x01 \x01(\x0e\x32\x33.dapr.proto.common.v1.StateOptions.StateConcurrency\x12H\n\x0b\x63onsistency\x18\x02 \x01(\x0e\x32\x33.dapr.proto.common.v1.StateOptions.StateConsistency\"h\n\x10StateConcurrency\x12\x1b\n\x17\x43ONCURRENCY_UNSPECIFIED\x10\x00\x12\x1b\n\x17\x43ONCURRENCY_FIRST_WRITE\x10\x01\x12\x1a\n\x16\x43ONCURRENCY_LAST_WRITE\x10\x02\"a\n\x10StateConsistency\x12\x1b\n\x17\x43ONSISTENCY_UNSPECIFIED\x10\x00\x12\x18\n\x14\x43ONSISTENCY_EVENTUAL\x10\x01\x12\x16\n\x12\x43ONSISTENCY_STRONG\x10\x02\"\xad\x01\n\x11\x43onfigurationItem\x12\r\n\x05value\x18\x01 \x01(\t\x12\x0f\n\x07version\x18\x02 \x01(\t\x12G\n\x08metadata\x18\x03 \x03(\x0b\x32\x35.dapr.proto.common.v1.ConfigurationItem.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x9c\x01\n\x10JobFailurePolicy\x12:\n\x04\x64rop\x18\x01 \x01(\x0b\x32*.dapr.proto.common.v1.JobFailurePolicyDropH\x00\x12\x42\n\x08\x63onstant\x18\x02 \x01(\x0b\x32..dapr.proto.common.v1.JobFailurePolicyConstantH\x00\x42\x08\n\x06policy\"\x16\n\x14JobFailurePolicyDrop\"q\n\x18JobFailurePolicyConstant\x12+\n\x08interval\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x18\n\x0bmax_retries\x18\x02 \x01(\rH\x00\x88\x01\x01\x42\x0e\n\x0c_max_retriesBi\n\nio.dapr.v1B\x0c\x43ommonProtosZ/github.com/dapr/dapr/pkg/proto/common/v1;common\xaa\x02\x1b\x44\x61pr.Client.Autogen.Grpc.v1b\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -27,30 +28,36 @@ _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 - _globals['_HTTPEXTENSION_VERB']._serialized_end=295 - _globals['_INVOKEREQUEST']._serialized_start=298 - _globals['_INVOKEREQUEST']._serialized_end=448 - _globals['_INVOKERESPONSE']._serialized_start=450 - _globals['_INVOKERESPONSE']._serialized_end=524 - _globals['_STREAMPAYLOAD']._serialized_start=526 - _globals['_STREAMPAYLOAD']._serialized_end=568 - _globals['_STATEITEM']._serialized_start=571 - _globals['_STATEITEM']._serialized_end=819 - _globals['_STATEITEM_METADATAENTRY']._serialized_start=772 - _globals['_STATEITEM_METADATAENTRY']._serialized_end=819 - _globals['_ETAG']._serialized_start=821 - _globals['_ETAG']._serialized_end=842 - _globals['_STATEOPTIONS']._serialized_start=845 - _globals['_STATEOPTIONS']._serialized_end=1212 - _globals['_STATEOPTIONS_STATECONCURRENCY']._serialized_start=1009 - _globals['_STATEOPTIONS_STATECONCURRENCY']._serialized_end=1113 - _globals['_STATEOPTIONS_STATECONSISTENCY']._serialized_start=1115 - _globals['_STATEOPTIONS_STATECONSISTENCY']._serialized_end=1212 - _globals['_CONFIGURATIONITEM']._serialized_start=1215 - _globals['_CONFIGURATIONITEM']._serialized_end=1388 - _globals['_CONFIGURATIONITEM_METADATAENTRY']._serialized_start=772 - _globals['_CONFIGURATIONITEM_METADATAENTRY']._serialized_end=819 + _globals['_HTTPEXTENSION']._serialized_start=119 + _globals['_HTTPEXTENSION']._serialized_end=327 + _globals['_HTTPEXTENSION_VERB']._serialized_start=213 + _globals['_HTTPEXTENSION_VERB']._serialized_end=327 + _globals['_INVOKEREQUEST']._serialized_start=330 + _globals['_INVOKEREQUEST']._serialized_end=480 + _globals['_INVOKERESPONSE']._serialized_start=482 + _globals['_INVOKERESPONSE']._serialized_end=556 + _globals['_STREAMPAYLOAD']._serialized_start=558 + _globals['_STREAMPAYLOAD']._serialized_end=600 + _globals['_STATEITEM']._serialized_start=603 + _globals['_STATEITEM']._serialized_end=851 + _globals['_STATEITEM_METADATAENTRY']._serialized_start=804 + _globals['_STATEITEM_METADATAENTRY']._serialized_end=851 + _globals['_ETAG']._serialized_start=853 + _globals['_ETAG']._serialized_end=874 + _globals['_STATEOPTIONS']._serialized_start=877 + _globals['_STATEOPTIONS']._serialized_end=1244 + _globals['_STATEOPTIONS_STATECONCURRENCY']._serialized_start=1041 + _globals['_STATEOPTIONS_STATECONCURRENCY']._serialized_end=1145 + _globals['_STATEOPTIONS_STATECONSISTENCY']._serialized_start=1147 + _globals['_STATEOPTIONS_STATECONSISTENCY']._serialized_end=1244 + _globals['_CONFIGURATIONITEM']._serialized_start=1247 + _globals['_CONFIGURATIONITEM']._serialized_end=1420 + _globals['_CONFIGURATIONITEM_METADATAENTRY']._serialized_start=804 + _globals['_CONFIGURATIONITEM_METADATAENTRY']._serialized_end=851 + _globals['_JOBFAILUREPOLICY']._serialized_start=1423 + _globals['_JOBFAILUREPOLICY']._serialized_end=1579 + _globals['_JOBFAILUREPOLICYDROP']._serialized_start=1581 + _globals['_JOBFAILUREPOLICYDROP']._serialized_end=1603 + _globals['_JOBFAILUREPOLICYCONSTANT']._serialized_start=1605 + _globals['_JOBFAILUREPOLICYCONSTANT']._serialized_end=1718 # @@protoc_insertion_point(module_scope) diff --git a/dapr/proto/common/v1/common_pb2.pyi b/dapr/proto/common/v1/common_pb2.pyi index b018cd8b4..bc44e3359 100644 --- a/dapr/proto/common/v1/common_pb2.pyi +++ b/dapr/proto/common/v1/common_pb2.pyi @@ -18,6 +18,7 @@ import builtins import collections.abc import google.protobuf.any_pb2 import google.protobuf.descriptor +import google.protobuf.duration_pb2 import google.protobuf.internal.containers import google.protobuf.internal.enum_type_wrapper import google.protobuf.message @@ -373,3 +374,67 @@ class ConfigurationItem(google.protobuf.message.Message): def ClearField(self, field_name: typing.Literal["metadata", b"metadata", "value", b"value", "version", b"version"]) -> None: ... global___ConfigurationItem = ConfigurationItem + +@typing.final +class JobFailurePolicy(google.protobuf.message.Message): + """JobFailurePolicy defines the policy to apply when a job fails to trigger.""" + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + DROP_FIELD_NUMBER: builtins.int + CONSTANT_FIELD_NUMBER: builtins.int + @property + def drop(self) -> global___JobFailurePolicyDrop: ... + @property + def constant(self) -> global___JobFailurePolicyConstant: ... + def __init__( + self, + *, + drop: global___JobFailurePolicyDrop | None = ..., + constant: global___JobFailurePolicyConstant | None = ..., + ) -> None: ... + def HasField(self, field_name: typing.Literal["constant", b"constant", "drop", b"drop", "policy", b"policy"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["constant", b"constant", "drop", b"drop", "policy", b"policy"]) -> None: ... + def WhichOneof(self, oneof_group: typing.Literal["policy", b"policy"]) -> typing.Literal["drop", "constant"] | None: ... + +global___JobFailurePolicy = JobFailurePolicy + +@typing.final +class JobFailurePolicyDrop(google.protobuf.message.Message): + """JobFailurePolicyDrop is a policy which drops the job tick when the job fails to trigger.""" + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +global___JobFailurePolicyDrop = JobFailurePolicyDrop + +@typing.final +class JobFailurePolicyConstant(google.protobuf.message.Message): + """JobFailurePolicyConstant is a policy which retries the job at a consistent interval when the job fails to trigger.""" + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + INTERVAL_FIELD_NUMBER: builtins.int + MAX_RETRIES_FIELD_NUMBER: builtins.int + max_retries: builtins.int + """max_retries is the optional maximum number of retries to attempt before giving up. + If unset, the Job will be retried indefinitely. + """ + @property + def interval(self) -> google.protobuf.duration_pb2.Duration: + """interval is the constant delay to wait before retrying the job.""" + + def __init__( + self, + *, + interval: google.protobuf.duration_pb2.Duration | None = ..., + max_retries: builtins.int | None = ..., + ) -> None: ... + def HasField(self, field_name: typing.Literal["_max_retries", b"_max_retries", "interval", b"interval", "max_retries", b"max_retries"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["_max_retries", b"_max_retries", "interval", b"interval", "max_retries", b"max_retries"]) -> None: ... + def WhichOneof(self, oneof_group: typing.Literal["_max_retries", b"_max_retries"]) -> typing.Literal["max_retries"] | None: ... + +global___JobFailurePolicyConstant = JobFailurePolicyConstant diff --git a/dapr/proto/runtime/v1/dapr_pb2.py b/dapr/proto/runtime/v1/dapr_pb2.py index 53b664fdd..76c3b50bc 100644 --- a/dapr/proto/runtime/v1/dapr_pb2.py +++ b/dapr/proto/runtime/v1/dapr_pb2.py @@ -19,7 +19,7 @@ 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\"\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\x07\x63ontent\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') +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\"\xf6\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\x12K\n\tscheduler\x18\x0b \x01(\x0b\x32(.dapr.proto.runtime.v1.MetadataSchedulerH\x00R\tscheduler\x88\x01\x01\x1a\x37\n\x15\x45xtendedMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\x0c\n\n_scheduler\"0\n\x11MetadataScheduler\x12\x1b\n\x13\x63onnected_addresses\x18\x01 \x03(\t\"\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\"\xed\x02\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\x61ta\x12\x1c\n\toverwrite\x18\x07 \x01(\x08R\toverwrite\x12R\n\x0e\x66\x61ilure_policy\x18\x08 \x01(\x0b\x32&.dapr.proto.common.v1.JobFailurePolicyH\x04R\rfailurePolicy\x88\x01\x01\x42\x0b\n\t_scheduleB\n\n\x08_repeatsB\x0b\n\t_due_timeB\x06\n\x04_ttlB\x11\n\x0f_failure_policy\"=\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\x07\x63ontent\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) @@ -109,8 +109,8 @@ _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['_PUBSUBSUBSCRIPTIONTYPE']._serialized_start=16265 + _globals['_PUBSUBSUBSCRIPTIONTYPE']._serialized_end=16352 _globals['_INVOKESERVICEREQUEST']._serialized_start=224 _globals['_INVOKESERVICEREQUEST']._serialized_end=312 _globals['_GETSTATEREQUEST']._serialized_start=315 @@ -240,157 +240,159 @@ _globals['_GETMETADATAREQUEST']._serialized_start=7029 _globals['_GETMETADATAREQUEST']._serialized_end=7049 _globals['_GETMETADATARESPONSE']._serialized_start=7052 - _globals['_GETMETADATARESPONSE']._serialized_end=7847 - _globals['_GETMETADATARESPONSE_EXTENDEDMETADATAENTRY']._serialized_start=7792 - _globals['_GETMETADATARESPONSE_EXTENDEDMETADATAENTRY']._serialized_end=7847 - _globals['_ACTORRUNTIME']._serialized_start=7850 - _globals['_ACTORRUNTIME']._serialized_end=8166 - _globals['_ACTORRUNTIME_ACTORRUNTIMESTATUS']._serialized_start=8101 - _globals['_ACTORRUNTIME_ACTORRUNTIMESTATUS']._serialized_end=8166 - _globals['_ACTIVEACTORSCOUNT']._serialized_start=8168 - _globals['_ACTIVEACTORSCOUNT']._serialized_end=8216 - _globals['_REGISTEREDCOMPONENTS']._serialized_start=8218 - _globals['_REGISTEREDCOMPONENTS']._serialized_end=8307 - _globals['_METADATAHTTPENDPOINT']._serialized_start=8309 - _globals['_METADATAHTTPENDPOINT']._serialized_end=8351 - _globals['_APPCONNECTIONPROPERTIES']._serialized_start=8354 - _globals['_APPCONNECTIONPROPERTIES']._serialized_end=8563 - _globals['_APPCONNECTIONHEALTHPROPERTIES']._serialized_start=8566 - _globals['_APPCONNECTIONHEALTHPROPERTIES']._serialized_end=8786 - _globals['_PUBSUBSUBSCRIPTION']._serialized_start=8789 - _globals['_PUBSUBSUBSCRIPTION']._serialized_end=9179 + _globals['_GETMETADATARESPONSE']._serialized_end=7938 + _globals['_GETMETADATARESPONSE_EXTENDEDMETADATAENTRY']._serialized_start=7869 + _globals['_GETMETADATARESPONSE_EXTENDEDMETADATAENTRY']._serialized_end=7924 + _globals['_METADATASCHEDULER']._serialized_start=7940 + _globals['_METADATASCHEDULER']._serialized_end=7988 + _globals['_ACTORRUNTIME']._serialized_start=7991 + _globals['_ACTORRUNTIME']._serialized_end=8307 + _globals['_ACTORRUNTIME_ACTORRUNTIMESTATUS']._serialized_start=8242 + _globals['_ACTORRUNTIME_ACTORRUNTIMESTATUS']._serialized_end=8307 + _globals['_ACTIVEACTORSCOUNT']._serialized_start=8309 + _globals['_ACTIVEACTORSCOUNT']._serialized_end=8357 + _globals['_REGISTEREDCOMPONENTS']._serialized_start=8359 + _globals['_REGISTEREDCOMPONENTS']._serialized_end=8448 + _globals['_METADATAHTTPENDPOINT']._serialized_start=8450 + _globals['_METADATAHTTPENDPOINT']._serialized_end=8492 + _globals['_APPCONNECTIONPROPERTIES']._serialized_start=8495 + _globals['_APPCONNECTIONPROPERTIES']._serialized_end=8704 + _globals['_APPCONNECTIONHEALTHPROPERTIES']._serialized_start=8707 + _globals['_APPCONNECTIONHEALTHPROPERTIES']._serialized_end=8927 + _globals['_PUBSUBSUBSCRIPTION']._serialized_start=8930 + _globals['_PUBSUBSUBSCRIPTION']._serialized_end=9320 _globals['_PUBSUBSUBSCRIPTION_METADATAENTRY']._serialized_start=513 _globals['_PUBSUBSUBSCRIPTION_METADATAENTRY']._serialized_end=560 - _globals['_PUBSUBSUBSCRIPTIONRULES']._serialized_start=9181 - _globals['_PUBSUBSUBSCRIPTIONRULES']._serialized_end=9268 - _globals['_PUBSUBSUBSCRIPTIONRULE']._serialized_start=9270 - _globals['_PUBSUBSUBSCRIPTIONRULE']._serialized_end=9323 - _globals['_SETMETADATAREQUEST']._serialized_start=9325 - _globals['_SETMETADATAREQUEST']._serialized_end=9373 - _globals['_GETCONFIGURATIONREQUEST']._serialized_start=9376 - _globals['_GETCONFIGURATIONREQUEST']._serialized_end=9564 + _globals['_PUBSUBSUBSCRIPTIONRULES']._serialized_start=9322 + _globals['_PUBSUBSUBSCRIPTIONRULES']._serialized_end=9409 + _globals['_PUBSUBSUBSCRIPTIONRULE']._serialized_start=9411 + _globals['_PUBSUBSUBSCRIPTIONRULE']._serialized_end=9464 + _globals['_SETMETADATAREQUEST']._serialized_start=9466 + _globals['_SETMETADATAREQUEST']._serialized_end=9514 + _globals['_GETCONFIGURATIONREQUEST']._serialized_start=9517 + _globals['_GETCONFIGURATIONREQUEST']._serialized_end=9705 _globals['_GETCONFIGURATIONREQUEST_METADATAENTRY']._serialized_start=513 _globals['_GETCONFIGURATIONREQUEST_METADATAENTRY']._serialized_end=560 - _globals['_GETCONFIGURATIONRESPONSE']._serialized_start=9567 - _globals['_GETCONFIGURATIONRESPONSE']._serialized_end=9755 - _globals['_GETCONFIGURATIONRESPONSE_ITEMSENTRY']._serialized_start=9670 - _globals['_GETCONFIGURATIONRESPONSE_ITEMSENTRY']._serialized_end=9755 - _globals['_SUBSCRIBECONFIGURATIONREQUEST']._serialized_start=9758 - _globals['_SUBSCRIBECONFIGURATIONREQUEST']._serialized_end=9958 + _globals['_GETCONFIGURATIONRESPONSE']._serialized_start=9708 + _globals['_GETCONFIGURATIONRESPONSE']._serialized_end=9896 + _globals['_GETCONFIGURATIONRESPONSE_ITEMSENTRY']._serialized_start=9811 + _globals['_GETCONFIGURATIONRESPONSE_ITEMSENTRY']._serialized_end=9896 + _globals['_SUBSCRIBECONFIGURATIONREQUEST']._serialized_start=9899 + _globals['_SUBSCRIBECONFIGURATIONREQUEST']._serialized_end=10099 _globals['_SUBSCRIBECONFIGURATIONREQUEST_METADATAENTRY']._serialized_start=513 _globals['_SUBSCRIBECONFIGURATIONREQUEST_METADATAENTRY']._serialized_end=560 - _globals['_UNSUBSCRIBECONFIGURATIONREQUEST']._serialized_start=9960 - _globals['_UNSUBSCRIBECONFIGURATIONREQUEST']._serialized_end=10025 - _globals['_SUBSCRIBECONFIGURATIONRESPONSE']._serialized_start=10028 - _globals['_SUBSCRIBECONFIGURATIONRESPONSE']._serialized_end=10240 - _globals['_SUBSCRIBECONFIGURATIONRESPONSE_ITEMSENTRY']._serialized_start=9670 - _globals['_SUBSCRIBECONFIGURATIONRESPONSE_ITEMSENTRY']._serialized_end=9755 - _globals['_UNSUBSCRIBECONFIGURATIONRESPONSE']._serialized_start=10242 - _globals['_UNSUBSCRIBECONFIGURATIONRESPONSE']._serialized_end=10305 - _globals['_TRYLOCKREQUEST']._serialized_start=10308 - _globals['_TRYLOCKREQUEST']._serialized_end=10463 - _globals['_TRYLOCKRESPONSE']._serialized_start=10465 - _globals['_TRYLOCKRESPONSE']._serialized_end=10499 - _globals['_UNLOCKREQUEST']._serialized_start=10501 - _globals['_UNLOCKREQUEST']._serialized_end=10611 - _globals['_UNLOCKRESPONSE']._serialized_start=10614 - _globals['_UNLOCKRESPONSE']._serialized_end=10788 - _globals['_UNLOCKRESPONSE_STATUS']._serialized_start=10694 - _globals['_UNLOCKRESPONSE_STATUS']._serialized_end=10788 - _globals['_SUBTLEGETKEYREQUEST']._serialized_start=10791 - _globals['_SUBTLEGETKEYREQUEST']._serialized_end=10967 - _globals['_SUBTLEGETKEYREQUEST_KEYFORMAT']._serialized_start=10937 - _globals['_SUBTLEGETKEYREQUEST_KEYFORMAT']._serialized_end=10967 - _globals['_SUBTLEGETKEYRESPONSE']._serialized_start=10969 - _globals['_SUBTLEGETKEYRESPONSE']._serialized_end=11036 - _globals['_SUBTLEENCRYPTREQUEST']._serialized_start=11039 - _globals['_SUBTLEENCRYPTREQUEST']._serialized_end=11221 - _globals['_SUBTLEENCRYPTRESPONSE']._serialized_start=11223 - _globals['_SUBTLEENCRYPTRESPONSE']._serialized_end=11279 - _globals['_SUBTLEDECRYPTREQUEST']._serialized_start=11282 - _globals['_SUBTLEDECRYPTREQUEST']._serialized_end=11478 - _globals['_SUBTLEDECRYPTRESPONSE']._serialized_start=11480 - _globals['_SUBTLEDECRYPTRESPONSE']._serialized_end=11522 - _globals['_SUBTLEWRAPKEYREQUEST']._serialized_start=11525 - _globals['_SUBTLEWRAPKEYREQUEST']._serialized_end=11725 - _globals['_SUBTLEWRAPKEYRESPONSE']._serialized_start=11727 - _globals['_SUBTLEWRAPKEYRESPONSE']._serialized_end=11796 - _globals['_SUBTLEUNWRAPKEYREQUEST']._serialized_start=11799 - _globals['_SUBTLEUNWRAPKEYREQUEST']._serialized_end=12010 - _globals['_SUBTLEUNWRAPKEYRESPONSE']._serialized_start=12012 - _globals['_SUBTLEUNWRAPKEYRESPONSE']._serialized_end=12074 - _globals['_SUBTLESIGNREQUEST']._serialized_start=12076 - _globals['_SUBTLESIGNREQUEST']._serialized_end=12196 - _globals['_SUBTLESIGNRESPONSE']._serialized_start=12198 - _globals['_SUBTLESIGNRESPONSE']._serialized_end=12237 - _globals['_SUBTLEVERIFYREQUEST']._serialized_start=12240 - _globals['_SUBTLEVERIFYREQUEST']._serialized_end=12381 - _globals['_SUBTLEVERIFYRESPONSE']._serialized_start=12383 - _globals['_SUBTLEVERIFYRESPONSE']._serialized_end=12420 - _globals['_ENCRYPTREQUEST']._serialized_start=12423 - _globals['_ENCRYPTREQUEST']._serialized_end=12556 - _globals['_ENCRYPTREQUESTOPTIONS']._serialized_start=12559 - _globals['_ENCRYPTREQUESTOPTIONS']._serialized_end=12813 - _globals['_ENCRYPTRESPONSE']._serialized_start=12815 - _globals['_ENCRYPTRESPONSE']._serialized_end=12886 - _globals['_DECRYPTREQUEST']._serialized_start=12889 - _globals['_DECRYPTREQUEST']._serialized_end=13022 - _globals['_DECRYPTREQUESTOPTIONS']._serialized_start=13024 - _globals['_DECRYPTREQUESTOPTIONS']._serialized_end=13113 - _globals['_DECRYPTRESPONSE']._serialized_start=13115 - _globals['_DECRYPTRESPONSE']._serialized_end=13186 - _globals['_GETWORKFLOWREQUEST']._serialized_start=13188 - _globals['_GETWORKFLOWREQUEST']._serialized_end=13288 - _globals['_GETWORKFLOWRESPONSE']._serialized_start=13291 - _globals['_GETWORKFLOWRESPONSE']._serialized_end=13679 - _globals['_GETWORKFLOWRESPONSE_PROPERTIESENTRY']._serialized_start=13630 - _globals['_GETWORKFLOWRESPONSE_PROPERTIESENTRY']._serialized_end=13679 - _globals['_STARTWORKFLOWREQUEST']._serialized_start=13682 - _globals['_STARTWORKFLOWREQUEST']._serialized_end=13959 - _globals['_STARTWORKFLOWREQUEST_OPTIONSENTRY']._serialized_start=13913 - _globals['_STARTWORKFLOWREQUEST_OPTIONSENTRY']._serialized_end=13959 - _globals['_STARTWORKFLOWRESPONSE']._serialized_start=13961 - _globals['_STARTWORKFLOWRESPONSE']._serialized_end=14017 - _globals['_TERMINATEWORKFLOWREQUEST']._serialized_start=14019 - _globals['_TERMINATEWORKFLOWREQUEST']._serialized_end=14125 - _globals['_PAUSEWORKFLOWREQUEST']._serialized_start=14127 - _globals['_PAUSEWORKFLOWREQUEST']._serialized_end=14229 - _globals['_RESUMEWORKFLOWREQUEST']._serialized_start=14231 - _globals['_RESUMEWORKFLOWREQUEST']._serialized_end=14334 - _globals['_RAISEEVENTWORKFLOWREQUEST']._serialized_start=14337 - _globals['_RAISEEVENTWORKFLOWREQUEST']._serialized_end=14495 - _globals['_PURGEWORKFLOWREQUEST']._serialized_start=14497 - _globals['_PURGEWORKFLOWREQUEST']._serialized_end=14599 - _globals['_SHUTDOWNREQUEST']._serialized_start=14601 - _globals['_SHUTDOWNREQUEST']._serialized_end=14618 - _globals['_JOB']._serialized_start=14621 - _globals['_JOB']._serialized_end=14853 - _globals['_SCHEDULEJOBREQUEST']._serialized_start=14855 - _globals['_SCHEDULEJOBREQUEST']._serialized_end=14916 - _globals['_SCHEDULEJOBRESPONSE']._serialized_start=14918 - _globals['_SCHEDULEJOBRESPONSE']._serialized_end=14939 - _globals['_GETJOBREQUEST']._serialized_start=14941 - _globals['_GETJOBREQUEST']._serialized_end=14970 - _globals['_GETJOBRESPONSE']._serialized_start=14972 - _globals['_GETJOBRESPONSE']._serialized_end=15029 - _globals['_DELETEJOBREQUEST']._serialized_start=15031 - _globals['_DELETEJOBREQUEST']._serialized_end=15063 - _globals['_DELETEJOBRESPONSE']._serialized_start=15065 - _globals['_DELETEJOBRESPONSE']._serialized_end=15084 - _globals['_CONVERSATIONREQUEST']._serialized_start=15087 - _globals['_CONVERSATIONREQUEST']._serialized_end=15574 - _globals['_CONVERSATIONREQUEST_PARAMETERSENTRY']._serialized_start=15411 - _globals['_CONVERSATIONREQUEST_PARAMETERSENTRY']._serialized_end=15482 + _globals['_UNSUBSCRIBECONFIGURATIONREQUEST']._serialized_start=10101 + _globals['_UNSUBSCRIBECONFIGURATIONREQUEST']._serialized_end=10166 + _globals['_SUBSCRIBECONFIGURATIONRESPONSE']._serialized_start=10169 + _globals['_SUBSCRIBECONFIGURATIONRESPONSE']._serialized_end=10381 + _globals['_SUBSCRIBECONFIGURATIONRESPONSE_ITEMSENTRY']._serialized_start=9811 + _globals['_SUBSCRIBECONFIGURATIONRESPONSE_ITEMSENTRY']._serialized_end=9896 + _globals['_UNSUBSCRIBECONFIGURATIONRESPONSE']._serialized_start=10383 + _globals['_UNSUBSCRIBECONFIGURATIONRESPONSE']._serialized_end=10446 + _globals['_TRYLOCKREQUEST']._serialized_start=10449 + _globals['_TRYLOCKREQUEST']._serialized_end=10604 + _globals['_TRYLOCKRESPONSE']._serialized_start=10606 + _globals['_TRYLOCKRESPONSE']._serialized_end=10640 + _globals['_UNLOCKREQUEST']._serialized_start=10642 + _globals['_UNLOCKREQUEST']._serialized_end=10752 + _globals['_UNLOCKRESPONSE']._serialized_start=10755 + _globals['_UNLOCKRESPONSE']._serialized_end=10929 + _globals['_UNLOCKRESPONSE_STATUS']._serialized_start=10835 + _globals['_UNLOCKRESPONSE_STATUS']._serialized_end=10929 + _globals['_SUBTLEGETKEYREQUEST']._serialized_start=10932 + _globals['_SUBTLEGETKEYREQUEST']._serialized_end=11108 + _globals['_SUBTLEGETKEYREQUEST_KEYFORMAT']._serialized_start=11078 + _globals['_SUBTLEGETKEYREQUEST_KEYFORMAT']._serialized_end=11108 + _globals['_SUBTLEGETKEYRESPONSE']._serialized_start=11110 + _globals['_SUBTLEGETKEYRESPONSE']._serialized_end=11177 + _globals['_SUBTLEENCRYPTREQUEST']._serialized_start=11180 + _globals['_SUBTLEENCRYPTREQUEST']._serialized_end=11362 + _globals['_SUBTLEENCRYPTRESPONSE']._serialized_start=11364 + _globals['_SUBTLEENCRYPTRESPONSE']._serialized_end=11420 + _globals['_SUBTLEDECRYPTREQUEST']._serialized_start=11423 + _globals['_SUBTLEDECRYPTREQUEST']._serialized_end=11619 + _globals['_SUBTLEDECRYPTRESPONSE']._serialized_start=11621 + _globals['_SUBTLEDECRYPTRESPONSE']._serialized_end=11663 + _globals['_SUBTLEWRAPKEYREQUEST']._serialized_start=11666 + _globals['_SUBTLEWRAPKEYREQUEST']._serialized_end=11866 + _globals['_SUBTLEWRAPKEYRESPONSE']._serialized_start=11868 + _globals['_SUBTLEWRAPKEYRESPONSE']._serialized_end=11937 + _globals['_SUBTLEUNWRAPKEYREQUEST']._serialized_start=11940 + _globals['_SUBTLEUNWRAPKEYREQUEST']._serialized_end=12151 + _globals['_SUBTLEUNWRAPKEYRESPONSE']._serialized_start=12153 + _globals['_SUBTLEUNWRAPKEYRESPONSE']._serialized_end=12215 + _globals['_SUBTLESIGNREQUEST']._serialized_start=12217 + _globals['_SUBTLESIGNREQUEST']._serialized_end=12337 + _globals['_SUBTLESIGNRESPONSE']._serialized_start=12339 + _globals['_SUBTLESIGNRESPONSE']._serialized_end=12378 + _globals['_SUBTLEVERIFYREQUEST']._serialized_start=12381 + _globals['_SUBTLEVERIFYREQUEST']._serialized_end=12522 + _globals['_SUBTLEVERIFYRESPONSE']._serialized_start=12524 + _globals['_SUBTLEVERIFYRESPONSE']._serialized_end=12561 + _globals['_ENCRYPTREQUEST']._serialized_start=12564 + _globals['_ENCRYPTREQUEST']._serialized_end=12697 + _globals['_ENCRYPTREQUESTOPTIONS']._serialized_start=12700 + _globals['_ENCRYPTREQUESTOPTIONS']._serialized_end=12954 + _globals['_ENCRYPTRESPONSE']._serialized_start=12956 + _globals['_ENCRYPTRESPONSE']._serialized_end=13027 + _globals['_DECRYPTREQUEST']._serialized_start=13030 + _globals['_DECRYPTREQUEST']._serialized_end=13163 + _globals['_DECRYPTREQUESTOPTIONS']._serialized_start=13165 + _globals['_DECRYPTREQUESTOPTIONS']._serialized_end=13254 + _globals['_DECRYPTRESPONSE']._serialized_start=13256 + _globals['_DECRYPTRESPONSE']._serialized_end=13327 + _globals['_GETWORKFLOWREQUEST']._serialized_start=13329 + _globals['_GETWORKFLOWREQUEST']._serialized_end=13429 + _globals['_GETWORKFLOWRESPONSE']._serialized_start=13432 + _globals['_GETWORKFLOWRESPONSE']._serialized_end=13820 + _globals['_GETWORKFLOWRESPONSE_PROPERTIESENTRY']._serialized_start=13771 + _globals['_GETWORKFLOWRESPONSE_PROPERTIESENTRY']._serialized_end=13820 + _globals['_STARTWORKFLOWREQUEST']._serialized_start=13823 + _globals['_STARTWORKFLOWREQUEST']._serialized_end=14100 + _globals['_STARTWORKFLOWREQUEST_OPTIONSENTRY']._serialized_start=14054 + _globals['_STARTWORKFLOWREQUEST_OPTIONSENTRY']._serialized_end=14100 + _globals['_STARTWORKFLOWRESPONSE']._serialized_start=14102 + _globals['_STARTWORKFLOWRESPONSE']._serialized_end=14158 + _globals['_TERMINATEWORKFLOWREQUEST']._serialized_start=14160 + _globals['_TERMINATEWORKFLOWREQUEST']._serialized_end=14266 + _globals['_PAUSEWORKFLOWREQUEST']._serialized_start=14268 + _globals['_PAUSEWORKFLOWREQUEST']._serialized_end=14370 + _globals['_RESUMEWORKFLOWREQUEST']._serialized_start=14372 + _globals['_RESUMEWORKFLOWREQUEST']._serialized_end=14475 + _globals['_RAISEEVENTWORKFLOWREQUEST']._serialized_start=14478 + _globals['_RAISEEVENTWORKFLOWREQUEST']._serialized_end=14636 + _globals['_PURGEWORKFLOWREQUEST']._serialized_start=14638 + _globals['_PURGEWORKFLOWREQUEST']._serialized_end=14740 + _globals['_SHUTDOWNREQUEST']._serialized_start=14742 + _globals['_SHUTDOWNREQUEST']._serialized_end=14759 + _globals['_JOB']._serialized_start=14762 + _globals['_JOB']._serialized_end=15127 + _globals['_SCHEDULEJOBREQUEST']._serialized_start=15129 + _globals['_SCHEDULEJOBREQUEST']._serialized_end=15190 + _globals['_SCHEDULEJOBRESPONSE']._serialized_start=15192 + _globals['_SCHEDULEJOBRESPONSE']._serialized_end=15213 + _globals['_GETJOBREQUEST']._serialized_start=15215 + _globals['_GETJOBREQUEST']._serialized_end=15244 + _globals['_GETJOBRESPONSE']._serialized_start=15246 + _globals['_GETJOBRESPONSE']._serialized_end=15303 + _globals['_DELETEJOBREQUEST']._serialized_start=15305 + _globals['_DELETEJOBREQUEST']._serialized_end=15337 + _globals['_DELETEJOBRESPONSE']._serialized_start=15339 + _globals['_DELETEJOBRESPONSE']._serialized_end=15358 + _globals['_CONVERSATIONREQUEST']._serialized_start=15361 + _globals['_CONVERSATIONREQUEST']._serialized_end=15848 + _globals['_CONVERSATIONREQUEST_PARAMETERSENTRY']._serialized_start=15685 + _globals['_CONVERSATIONREQUEST_PARAMETERSENTRY']._serialized_end=15756 _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 + _globals['_CONVERSATIONINPUT']._serialized_start=15850 + _globals['_CONVERSATIONINPUT']._serialized_end=15950 + _globals['_CONVERSATIONRESULT']._serialized_start=15953 + _globals['_CONVERSATIONRESULT']._serialized_end=16141 + _globals['_CONVERSATIONRESULT_PARAMETERSENTRY']._serialized_start=15685 + _globals['_CONVERSATIONRESULT_PARAMETERSENTRY']._serialized_end=15756 + _globals['_CONVERSATIONRESPONSE']._serialized_start=16143 + _globals['_CONVERSATIONRESPONSE']._serialized_end=16263 + _globals['_DAPR']._serialized_start=16355 + _globals['_DAPR']._serialized_end=22689 # @@protoc_insertion_point(module_scope) diff --git a/dapr/proto/runtime/v1/dapr_pb2.pyi b/dapr/proto/runtime/v1/dapr_pb2.pyi index 7b6ce8a70..9099aac9c 100644 --- a/dapr/proto/runtime/v1/dapr_pb2.pyi +++ b/dapr/proto/runtime/v1/dapr_pb2.pyi @@ -1613,6 +1613,7 @@ class GetMetadataResponse(google.protobuf.message.Message): RUNTIME_VERSION_FIELD_NUMBER: builtins.int ENABLED_FEATURES_FIELD_NUMBER: builtins.int ACTOR_RUNTIME_FIELD_NUMBER: builtins.int + SCHEDULER_FIELD_NUMBER: builtins.int id: builtins.str runtime_version: builtins.str @property @@ -1632,9 +1633,9 @@ class GetMetadataResponse(google.protobuf.message.Message): @property def enabled_features(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: ... @property - def actor_runtime(self) -> global___ActorRuntime: - """TODO: Cassie: probably add scheduler runtime status""" - + def actor_runtime(self) -> global___ActorRuntime: ... + @property + def scheduler(self) -> global___MetadataScheduler: ... def __init__( self, *, @@ -1648,12 +1649,36 @@ class GetMetadataResponse(google.protobuf.message.Message): runtime_version: builtins.str = ..., enabled_features: collections.abc.Iterable[builtins.str] | None = ..., actor_runtime: global___ActorRuntime | None = ..., + scheduler: global___MetadataScheduler | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["actor_runtime", b"actor_runtime", "app_connection_properties", b"app_connection_properties"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["active_actors_count", b"active_actors_count", "actor_runtime", b"actor_runtime", "app_connection_properties", b"app_connection_properties", "enabled_features", b"enabled_features", "extended_metadata", b"extended_metadata", "http_endpoints", b"http_endpoints", "id", b"id", "registered_components", b"registered_components", "runtime_version", b"runtime_version", "subscriptions", b"subscriptions"]) -> None: ... + def HasField(self, field_name: typing.Literal["_scheduler", b"_scheduler", "actor_runtime", b"actor_runtime", "app_connection_properties", b"app_connection_properties", "scheduler", b"scheduler"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["_scheduler", b"_scheduler", "active_actors_count", b"active_actors_count", "actor_runtime", b"actor_runtime", "app_connection_properties", b"app_connection_properties", "enabled_features", b"enabled_features", "extended_metadata", b"extended_metadata", "http_endpoints", b"http_endpoints", "id", b"id", "registered_components", b"registered_components", "runtime_version", b"runtime_version", "scheduler", b"scheduler", "subscriptions", b"subscriptions"]) -> None: ... + def WhichOneof(self, oneof_group: typing.Literal["_scheduler", b"_scheduler"]) -> typing.Literal["scheduler"] | None: ... global___GetMetadataResponse = GetMetadataResponse +@typing.final +class MetadataScheduler(google.protobuf.message.Message): + """MetadataScheduler is a message that contains the list of addresses of the + scheduler connections. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + CONNECTED_ADDRESSES_FIELD_NUMBER: builtins.int + @property + def connected_addresses(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + """connected_addresses the list of addresses of the scheduler connections.""" + + def __init__( + self, + *, + connected_addresses: collections.abc.Iterable[builtins.str] | None = ..., + ) -> None: ... + def ClearField(self, field_name: typing.Literal["connected_addresses", b"connected_addresses"]) -> None: ... + +global___MetadataScheduler = MetadataScheduler + @typing.final class ActorRuntime(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor @@ -3141,6 +3166,8 @@ class Job(google.protobuf.message.Message): DUE_TIME_FIELD_NUMBER: builtins.int TTL_FIELD_NUMBER: builtins.int DATA_FIELD_NUMBER: builtins.int + OVERWRITE_FIELD_NUMBER: builtins.int + FAILURE_POLICY_FIELD_NUMBER: builtins.int name: builtins.str """The unique name for the job.""" schedule: builtins.str @@ -3180,12 +3207,18 @@ class Job(google.protobuf.message.Message): "point in time" string in the format of RFC3339, Go duration string (calculated from job creation time), or non-repeating ISO8601. """ + overwrite: builtins.bool + """If true, allows this job to overwrite an existing job with the same name.""" @property def data(self) -> google.protobuf.any_pb2.Any: """payload is the serialized job payload that will be sent to the recipient when the job is triggered. """ + @property + def failure_policy(self) -> dapr.proto.common.v1.common_pb2.JobFailurePolicy: + """failure_policy is the optional policy for handling job failures.""" + def __init__( self, *, @@ -3195,12 +3228,16 @@ class Job(google.protobuf.message.Message): due_time: builtins.str | None = ..., ttl: builtins.str | None = ..., data: google.protobuf.any_pb2.Any | None = ..., + overwrite: builtins.bool = ..., + failure_policy: dapr.proto.common.v1.common_pb2.JobFailurePolicy | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["_due_time", b"_due_time", "_repeats", b"_repeats", "_schedule", b"_schedule", "_ttl", b"_ttl", "data", b"data", "due_time", b"due_time", "repeats", b"repeats", "schedule", b"schedule", "ttl", b"ttl"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["_due_time", b"_due_time", "_repeats", b"_repeats", "_schedule", b"_schedule", "_ttl", b"_ttl", "data", b"data", "due_time", b"due_time", "name", b"name", "repeats", b"repeats", "schedule", b"schedule", "ttl", b"ttl"]) -> None: ... + def HasField(self, field_name: typing.Literal["_due_time", b"_due_time", "_failure_policy", b"_failure_policy", "_repeats", b"_repeats", "_schedule", b"_schedule", "_ttl", b"_ttl", "data", b"data", "due_time", b"due_time", "failure_policy", b"failure_policy", "repeats", b"repeats", "schedule", b"schedule", "ttl", b"ttl"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["_due_time", b"_due_time", "_failure_policy", b"_failure_policy", "_repeats", b"_repeats", "_schedule", b"_schedule", "_ttl", b"_ttl", "data", b"data", "due_time", b"due_time", "failure_policy", b"failure_policy", "name", b"name", "overwrite", b"overwrite", "repeats", b"repeats", "schedule", b"schedule", "ttl", b"ttl"]) -> None: ... @typing.overload def WhichOneof(self, oneof_group: typing.Literal["_due_time", b"_due_time"]) -> typing.Literal["due_time"] | None: ... @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_failure_policy", b"_failure_policy"]) -> typing.Literal["failure_policy"] | None: ... + @typing.overload def WhichOneof(self, oneof_group: typing.Literal["_repeats", b"_repeats"]) -> typing.Literal["repeats"] | None: ... @typing.overload def WhichOneof(self, oneof_group: typing.Literal["_schedule", b"_schedule"]) -> typing.Literal["schedule"] | None: ... diff --git a/examples/jobs/README.md b/examples/jobs/README.md new file mode 100644 index 000000000..c596e28ef --- /dev/null +++ b/examples/jobs/README.md @@ -0,0 +1,259 @@ +# Example - Jobs API + +This example demonstrates the [Jobs API](https://docs.dapr.io/developing-applications/building-blocks/jobs/) in Dapr. +It demonstrates the following APIs: +- **schedule_job_alpha1**: Schedule a job to run at specified times +- **get_job_alpha1**: Retrieve details about a scheduled job +- **delete_job_alpha1**: Delete a scheduled job + +It includes two examples that showcase different aspects of the Jobs API: + +1. **`job_management.py`** - Focuses on job scheduling patterns and management operations +2. **`job_processing.py`** - Shows the complete workflow including job event handling + +> **Note:** The Jobs API is currently in Alpha and subject to change. Make sure to use the latest proto bindings. + +## Prerequisites + +- [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started) +- [Install Python 3.9+](https://www.python.org/downloads/) +- Dapr runtime v1.15+ (Jobs API support) + +## Install Dapr python-SDK + + + +```bash +pip3 install dapr dapr-ext-grpc +``` + +## Run the example + +To run this example, the following code can be utilized: + + + +```bash +dapr run --app-id jobs-example -- python3 job_management.py +``` + + + +## Example 2: Complete Workflow with Job Event Handling + +This example (`job_processing.py`) demonstrates the complete Jobs API workflow in a single application that both schedules jobs and handles job events when they trigger. This shows: + +- How to register job event handlers using `@app.job_event()` decorators +- How to schedule jobs from the same application that handles them +- How to process job events with structured data +- Complete end-to-end job lifecycle (schedule → trigger → handle) + +Run the following command in a terminal/command-prompt: + + + +```bash +# Start the complete workflow example (schedules jobs and handles job events) +dapr run --app-id jobs-workflow --app-protocol grpc --app-port 50051 python3 job_processing.py +``` + + + +## Cleanup + + + +```bash +dapr stop --app-id jobs-workflow +``` + + + +## Example Comparison + +| Feature | `job_management.py` | `job_processing.py` | +|---------|---------------------|---------------------| +| **Purpose** | Job scheduling and management | Complete workflow with event handling | +| **Job Scheduling** | ✅ Multiple patterns | ✅ Simple patterns | +| **Job Event Handling** | ❌ No | ✅ Yes | +| **Job Data Processing** | ❌ No | ✅ Yes | +| **Use Case** | Learning job scheduling | Production job processing | +| **Complexity** | Simple | Moderate | + +**Use `job_management.py` when:** +- Learning how to schedule different types of jobs +- Testing job scheduling patterns +- Managing jobs without processing them + +**Use `job_processing.py` when:** +- Building applications that process job events +- Need complete end-to-end job workflow +- Want to see job event handling in action + +The output should be as follows: + +``` +0. Scheduling a simple job without data... +✓ Simple job scheduled successfully +1. Scheduling a recurring job with cron schedule... +✓ Recurring job scheduled successfully +2. Scheduling a one-time job with due_time... +✓ One-time job scheduled successfully +3. Getting job details... +✓ Retrieved job details: + - Name: recurring-hello-job + - Schedule: @every 30s + - TTL: 5m + - Data: {'message': 'Hello from recurring job!'} +4. Cleaning up - deleting jobs... +✓ Deleted job: simple-job +✓ Deleted job: recurring-hello-job +✓ Deleted job: one-time-hello-job +``` + +## Job Scheduling Features + +### Schedule Formats + +The Jobs API supports multiple schedule formats: + +**Cron Expressions (systemd timer style)** +- `"0 30 * * * *"` - Every hour on the half hour +- `"0 15 3 * * *"` - Every day at 03:15 + +**Human-readable Period Strings** +- `"@every 1h30m"` - Every 1 hour and 30 minutes +- `"@yearly"` or `"@annually"` - Once a year, midnight, Jan. 1st +- `"@monthly"` - Once a month, midnight, first of month +- `"@weekly"` - Once a week, midnight on Sunday +- `"@daily"` or `"@midnight"` - Once a day, midnight +- `"@hourly"` - Once an hour, beginning of hour + +### Job Properties + +- **name**: Unique identifier for the job +- **schedule**: Cron expression or period string (optional if due_time is provided) +- **due_time**: Specific time for one-shot execution (optional if schedule is provided) +- **repeats**: Number of times to repeat the job (optional) +- **ttl**: Time-to-live for the job (optional) +- **data**: Payload data to send when the job is triggered (optional, empty Any proto used if not provided) +- **failure_policy**: Policy to apply when the job fails to trigger (optional) +- **overwrite**: If true, allows this job to overwrite an existing job with the same name (default: false) + +## Job Failure Policies + +Jobs can be configured with failure policies that determine what happens when a job fails to trigger: + +### DropFailurePolicy + +Drops the job when it fails to trigger (no retries): + +```python +from dapr.clients import Job, DropFailurePolicy + +job = Job( + name="my-job", + schedule="@every 30s", + failure_policy=DropFailurePolicy() +) +``` + +### ConstantFailurePolicy + +Retries the job at constant intervals when it fails to trigger: + +```python +from dapr.clients import Job, ConstantFailurePolicy + +job = Job( + name="my-job", + schedule="@every 30s", + failure_policy=ConstantFailurePolicy( + max_retries=3, # Maximum number of retries (optional) + interval_seconds=10 # Interval between retries in seconds + ) +) +``` + +**ConstantFailurePolicy Parameters:** +- **max_retries**: Maximum number of retries. If not specified, retries indefinitely. +- **interval_seconds**: Interval between retries in seconds. Defaults to 30 seconds. + +## Handling Job Events + +To handle job events when they're triggered, create a callback service using the gRPC extension: + +```python +from dapr.ext.grpc import App, JobEvent + +app = App() + +@app.job_event('my-job') +def handle_my_job(job_event: JobEvent) -> None: + print(f"Job {job_event.name} triggered!") + data_str = job_event.get_data_as_string() + print(f"Job data: {data_str}") + # Process the job... + +app.run(50051) +``` + +The callback service must: +- Use the `@app.job_event('job-name')` decorator to register handlers +- Accept a `JobEvent` object parameter containing job execution data +- Run on a gRPC port (default 50051) that Dapr can reach + +## Additional Information + +- The Jobs API is currently in **Alpha** and subject to change +- Jobs are persistent and will survive Dapr sidecar restarts +- Job names must be unique within the Dapr application +- Both `schedule` and `due_time` are optional - if neither is provided, the job will trigger immediately +- Requires Dapr runtime v1.14+ for Jobs API support + +For more information about the Jobs API, see: +- [Dapr Jobs Building Block](https://docs.dapr.io/developing-applications/building-blocks/jobs/) +- [Dapr Jobs API Proposal](https://github.com/dapr/proposals/blob/main/0012-BIRS-distributed-scheduler.md) diff --git a/examples/jobs/job_management.py b/examples/jobs/job_management.py new file mode 100644 index 000000000..8c29b86f2 --- /dev/null +++ b/examples/jobs/job_management.py @@ -0,0 +1,131 @@ +import json +from datetime import datetime, timedelta + +from dapr.clients import DaprClient, Job, DropFailurePolicy, ConstantFailurePolicy +from google.protobuf.any_pb2 import Any as GrpcAny + + +def create_job_data(message: str): + """Helper function to create job payload data.""" + data = GrpcAny() + data.value = json.dumps({'message': message}).encode('utf-8') + return data + + +def main(): + with DaprClient() as client: + # Example 0: Simple job without data (works without protobuf) + print('0. Scheduling a simple job without data...', flush=True) + simple_job = Job(name='simple-job', schedule='@every 30s', overwrite=True) + + try: + client.schedule_job_alpha1(simple_job) + print(f'✓ Simple job scheduled successfully', flush=True) + except Exception as e: + print(f'✗ Failed to schedule simple job: {e}', flush=True) + return + + # Example 1: Schedule a recurring job with cron schedule + print('1. Scheduling a recurring job with cron schedule...', flush=True) + job_data = create_job_data('Hello from recurring job!') + recurring_job = Job( + name='recurring-hello-job', + schedule='@every 30s', + data=job_data, + ttl='5m', + overwrite=True, + ) + + try: + client.schedule_job_alpha1(recurring_job) + print(f'✓ Recurring job scheduled successfully', flush=True) + except Exception as e: + print(f'✗ Failed to schedule recurring job: {e}', flush=True) + return + + # Example 2: Schedule a one-time job with due_time + print('\n2. Scheduling a one-time job with due_time...', flush=True) + due_time = (datetime.now() + timedelta(seconds=10)).isoformat() + 'Z' + one_time_job = Job( + name='one-time-hello-job', + due_time=due_time, + data=create_job_data('Hello from one-time job!'), + ) + + try: + client.schedule_job_alpha1(one_time_job) + print(f'✓ One-time job scheduled successfully', flush=True) + except Exception as e: + print(f'✗ Failed to schedule one-time job: {e}', flush=True) + return + + # Example 3: Schedule jobs with failure policies + print('\n3. Scheduling jobs with failure policies...', flush=True) + + # Job with drop failure policy (drops job if it fails to trigger) + drop_policy_job = Job( + name='drop-policy-job', + schedule='@every 45s', + data=create_job_data('Job with drop failure policy'), + failure_policy=DropFailurePolicy(), + overwrite=True, + ) + + try: + client.schedule_job_alpha1(drop_policy_job) + print(f'✓ Job with drop failure policy scheduled successfully', flush=True) + except Exception as e: + print(f'✗ Failed to schedule job with drop policy: {e}', flush=True) + + # Job with constant retry failure policy (retries with constant interval) + constant_policy_job = Job( + name='retry-policy-job', + schedule='@every 60s', + data=create_job_data('Job with constant retry policy'), + failure_policy=ConstantFailurePolicy(max_retries=3, interval_seconds=10), + overwrite=True, + ) + + try: + client.schedule_job_alpha1(constant_policy_job) + print(f'✓ Job with constant retry policy scheduled successfully', flush=True) + except Exception as e: + print(f'✗ Failed to schedule job with retry policy: {e}', flush=True) + + # Example 4: Get job details + print('\n4. Getting job details...', flush=True) + try: + job = client.get_job_alpha1('recurring-hello-job') + print(f'✓ Retrieved job details:', flush=True) + print(f' - Name: {job.name}', flush=True) + print(f' - Schedule: {job.schedule}', flush=True) + print(f' - TTL: {job.ttl}', flush=True) + if job.data: + try: + payload = json.loads(job.data.value.decode('utf-8')) + print(f' - Data: {payload}', flush=True) + except Exception: + print(f' - Data: ', flush=True) + else: + print(f' - Data: None', flush=True) + except Exception as e: + print(f'✗ Failed to get job details: {e}', flush=True) + + # Example 5: Delete jobs + print('\n5. Cleaning up - deleting jobs...', flush=True) + for job_name in [ + 'simple-job', + 'recurring-hello-job', + 'one-time-hello-job', + 'drop-policy-job', + 'retry-policy-job', + ]: + try: + client.delete_job_alpha1(job_name) + print(f'✓ Deleted job: {job_name}', flush=True) + except Exception as e: + print(f'✗ Failed to delete job {job_name}: {e}', flush=True) + + +if __name__ == '__main__': + main() diff --git a/examples/jobs/job_processing.py b/examples/jobs/job_processing.py new file mode 100644 index 000000000..9f5733b79 --- /dev/null +++ b/examples/jobs/job_processing.py @@ -0,0 +1,138 @@ +# ------------------------------------------------------------ +# Copyright 2024 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 json +import threading +import time +from datetime import datetime, timedelta +from dapr.ext.grpc import App, JobEvent +from dapr.clients import DaprClient, Job, ConstantFailurePolicy + +try: + from google.protobuf.any_pb2 import Any as GrpcAny + + PROTOBUF_AVAILABLE = True +except ImportError: + PROTOBUF_AVAILABLE = False + print( + 'Warning: protobuf not available, jobs with data will be scheduled without data', flush=True + ) + +app = App() + + +def create_job_data(data_dict): + """Create job data from a dictionary.""" + if not PROTOBUF_AVAILABLE: + return None + + data = GrpcAny() + data.value = json.dumps(data_dict).encode('utf-8') + return data + + +# Job event handlers +@app.job_event('hello-job') +def handle_hello_job(job_event: JobEvent) -> None: + """Handle the 'hello-job' job event.""" + print(f'Job event received: {job_event.name}', flush=True) + + if job_event.data: + data_str = job_event.get_data_as_string() + print(f'Job data: {data_str}', flush=True) + else: + print('Job data: None', flush=True) + + print('Hello job processing completed!', flush=True) + + +@app.job_event('data-job') +def handle_data_job(job_event: JobEvent) -> None: + """Handle the 'data-job' job event with structured data.""" + print(f'Data job event received: {job_event.name}', flush=True) + + if job_event.data: + try: + data_str = job_event.get_data_as_string() + job_data = json.loads(data_str) + + task_type = job_data.get('task_type', 'unknown') + priority = job_data.get('priority', 'normal') + items = job_data.get('items', 0) + + print(f'Processing {task_type} task with priority {priority}', flush=True) + print(f'Processing {items} items...', flush=True) + print('Data job processing completed!', flush=True) + + except json.JSONDecodeError as e: + print(f'Failed to parse job data: {e}', flush=True) + else: + print('No data provided for data job', flush=True) + + +def schedule_jobs(): + """Schedule test jobs after the server starts.""" + # Wait for the server to fully start + time.sleep(5) + + print('Scheduling jobs...', flush=True) + + try: + # Create Dapr client + with DaprClient() as client: + # Calculate due times + due_time_1 = '1s' + due_time_2 = '3s' + + # Job 1: Simple hello job (no data) + print(f'Scheduling hello-job for {due_time_1}...', flush=True) + hello_job = Job(name='hello-job', due_time=due_time_1) + client.schedule_job_alpha1(hello_job) + print('✓ hello-job scheduled', flush=True) + + # Job 2: Data processing job (with JSON data) + print(f'Scheduling data-job for {due_time_2}...', flush=True) + job_data = { + 'task_type': 'data_processing', + 'priority': 'high', + 'items': 42, + 'source': 'test_data', + } + + data_job = Job( + name='data-job', + due_time=due_time_2, + data=create_job_data(job_data), + failure_policy=ConstantFailurePolicy(max_retries=2, interval_seconds=5), + ) + client.schedule_job_alpha1(data_job) + print('✓ data-job scheduled', flush=True) + + print('Jobs scheduled! Waiting for execution...', flush=True) + + except Exception as e: + print(f'✗ Failed to schedule jobs: {e}', flush=True) + + +if __name__ == '__main__': + print('Dapr Jobs Example', flush=True) + print('This server will:', flush=True) + print('1. Register job event handlers', flush=True) + print('2. Schedule test jobs', flush=True) + print('3. Process job events when they trigger', flush=True) + + # Schedule jobs in a background thread after server starts + threading.Thread(target=schedule_jobs, daemon=True).start() + + print('Starting gRPC server on port 50051...', flush=True) + app.run(50051) diff --git a/ext/dapr-ext-grpc/dapr/ext/grpc/__init__.py b/ext/dapr-ext-grpc/dapr/ext/grpc/__init__.py index 3a843ea92..7d73b4a48 100644 --- a/ext/dapr-ext-grpc/dapr/ext/grpc/__init__.py +++ b/ext/dapr-ext-grpc/dapr/ext/grpc/__init__.py @@ -13,8 +13,9 @@ limitations under the License. """ -from dapr.clients.grpc._request import InvokeMethodRequest, BindingRequest +from dapr.clients.grpc._request import InvokeMethodRequest, BindingRequest, JobEvent from dapr.clients.grpc._response import InvokeMethodResponse, TopicEventResponse +from dapr.clients.grpc._jobs import Job, FailurePolicy, DropFailurePolicy, ConstantFailurePolicy from dapr.ext.grpc.app import App, Rule # type:ignore @@ -26,4 +27,9 @@ 'InvokeMethodResponse', 'BindingRequest', 'TopicEventResponse', + 'Job', + 'JobEvent', + 'FailurePolicy', + 'DropFailurePolicy', + 'ConstantFailurePolicy', ] diff --git a/ext/dapr-ext-grpc/dapr/ext/grpc/_servicer.py b/ext/dapr-ext-grpc/dapr/ext/grpc/_servicer.py index 2217d50fe..c51df48ba 100644 --- a/ext/dapr-ext-grpc/dapr/ext/grpc/_servicer.py +++ b/ext/dapr-ext-grpc/dapr/ext/grpc/_servicer.py @@ -22,15 +22,20 @@ from google.protobuf.struct_pb2 import Struct from dapr.proto import appcallback_service_v1, common_v1, appcallback_v1 -from dapr.proto.runtime.v1.appcallback_pb2 import TopicEventRequest, BindingEventRequest +from dapr.proto.runtime.v1.appcallback_pb2 import ( + TopicEventRequest, + BindingEventRequest, + JobEventRequest, +) from dapr.proto.common.v1.common_pb2 import InvokeRequest from dapr.clients.base import DEFAULT_JSON_CONTENT_TYPE -from dapr.clients.grpc._request import InvokeMethodRequest, BindingRequest +from dapr.clients.grpc._request import InvokeMethodRequest, BindingRequest, JobEvent from dapr.clients.grpc._response import InvokeMethodResponse, TopicEventResponse InvokeMethodCallable = Callable[[InvokeMethodRequest], Union[str, bytes, InvokeMethodResponse]] TopicSubscribeCallable = Callable[[v1.Event], Optional[TopicEventResponse]] BindingCallable = Callable[[BindingRequest], None] +JobEventCallable = Callable[[JobEvent], None] DELIMITER = ':' @@ -51,7 +56,9 @@ def __init__( self.rules = rules -class _CallbackServicer(appcallback_service_v1.AppCallbackServicer): +class _CallbackServicer( + appcallback_service_v1.AppCallbackServicer, appcallback_service_v1.AppCallbackAlphaServicer +): """The implementation of AppCallback Server. This internal class implements application server and provides helpers to register @@ -65,6 +72,7 @@ def __init__(self): self._invoke_method_map: Dict[str, InvokeMethodCallable] = {} self._topic_map: Dict[str, TopicSubscribeCallable] = {} self._binding_map: Dict[str, BindingCallable] = {} + self._job_event_map: Dict[str, JobEventCallable] = {} self._registered_topics_map: Dict[str, _RegisteredSubscription] = {} self._registered_topics: List[appcallback_v1.TopicSubscription] = [] @@ -133,6 +141,17 @@ def register_binding(self, name: str, cb: BindingCallable) -> None: self._binding_map[name] = cb self._registered_bindings.append(name) + def register_job_event(self, name: str, cb: JobEventCallable) -> None: + """Registers job event handler. + + Args: + name (str): The name of the job to handle events for. + cb (JobEventCallable): The callback function to handle job events. + """ + if name in self._job_event_map: + raise ValueError(f'Job event handler for {name} is already registered') + self._job_event_map[name] = cb + def OnInvoke(self, request: InvokeRequest, context): """Invokes service method with InvokeRequest.""" if request.method not in self._invoke_method_map: @@ -224,3 +243,36 @@ def OnBindingEvent(self, request: BindingEventRequest, context): # TODO: support output bindings options return appcallback_v1.BindingEventResponse() + + def OnJobEventAlpha1(self, request: JobEventRequest, context): + """Handles job events from Dapr runtime. + + This method is called by Dapr when a scheduled job is triggered. + It routes the job event to the appropriate registered handler based on the job name. + + Args: + request (JobEventRequest): The job event request from Dapr. + context: The gRPC context. + + Returns: + appcallback_v1.JobEventResponse: Empty response indicating successful handling. + """ + job_name = request.name + + if job_name not in self._job_event_map: + context.set_code(grpc.StatusCode.UNIMPLEMENTED) # type: ignore + raise NotImplementedError(f'Job event handler for {job_name} not implemented!') + + # Create a JobEvent object matching Go SDK's common.JobEvent + # Extract raw data bytes from the Any proto (matching Go implementation) + data_bytes = b'' + if request.HasField('data') and request.data.value: + data_bytes = request.data.value + + job_event = JobEvent(name=request.name, data=data_bytes) + + # Call the registered handler with the JobEvent object + self._job_event_map[job_name](job_event) + + # Return empty response + return appcallback_v1.JobEventResponse() diff --git a/ext/dapr-ext-grpc/dapr/ext/grpc/app.py b/ext/dapr-ext-grpc/dapr/ext/grpc/app.py index 13a0bec69..9f9ac8472 100644 --- a/ext/dapr-ext-grpc/dapr/ext/grpc/app.py +++ b/ext/dapr-ext-grpc/dapr/ext/grpc/app.py @@ -58,6 +58,7 @@ def __init__(self, max_grpc_message_length: Optional[int] = None, **kwargs): else: self._server = grpc.server(**kwargs) # type: ignore appcallback_service_v1.add_AppCallbackServicer_to_server(self._servicer, self._server) + appcallback_service_v1.add_AppCallbackAlphaServicer_to_server(self._servicer, self._server) appcallback_service_v1.add_AppCallbackHealthCheckServicer_to_server( self._health_check_servicer, self._server ) @@ -198,3 +199,29 @@ def decorator(func): self._servicer.register_binding(name, func) return decorator + + def job_event(self, name: str): + """A decorator that is used to register job event handler. + + This decorator registers a handler for job events triggered by the Dapr scheduler. + The handler will be called when a job with the specified name is triggered. + + The below registers a job event handler for jobs named 'my-job': + + from dapr.ext.grpc import JobEvent + + @app.job_event('my-job') + def handle_my_job(job_event: JobEvent) -> None: + print(f"Job {job_event.name} triggered") + data_str = job_event.get_data_as_string() + print(f"Job data: {data_str}") + # Process the job... + + Args: + name (str): the name of the job to handle events for + """ + + def decorator(func): + self._servicer.register_job_event(name, func) + + return decorator diff --git a/tests/clients/fake_dapr_server.py b/tests/clients/fake_dapr_server.py index ccc5aedf3..5ffc9da13 100644 --- a/tests/clients/fake_dapr_server.py +++ b/tests/clients/fake_dapr_server.py @@ -54,6 +54,7 @@ def __init__(self, grpc_port: int = 50001, http_port: int = 8080): self.workflow_status = {} self.workflow_options: Dict[str, str] = {} self.metadata: Dict[str, str] = {} + self.jobs: Dict[str, api_v1.Job] = {} self._next_exception = None def start(self): @@ -536,6 +537,48 @@ def ConverseAlpha1(self, request, context): return api_v1.ConversationResponse(contextID=request.contextID, outputs=outputs) + def ScheduleJobAlpha1(self, request, context): + self.check_for_exception(context) + + # Validate job name + if not request.job.name: + raise ValueError('Job name is required') + + # Validate job name + if not request.job.schedule and not request.job.due_time: + raise ValueError('Schedule is empty') + + # Store the job + self.jobs[request.job.name] = request.job + + return empty_pb2.Empty() + + def GetJobAlpha1(self, request, context): + self.check_for_exception(context) + + # Validate job name + if not request.name: + raise ValueError('Job name is required') + + # Check if job exists + if request.name not in self.jobs: + raise Exception(f'Job "{request.name}" not found') + + return api_v1.GetJobResponse(job=self.jobs[request.name]) + + def DeleteJobAlpha1(self, request, context): + self.check_for_exception(context) + + # Validate job name + if not request.name: + raise ValueError('Job name is required') + + # Check if job exists (optional - some implementations might not error) + if request.name in self.jobs: + del self.jobs[request.name] + + return empty_pb2.Empty() + def SetMetadata(self, request: SetMetadataRequest, context): self.metadata[request.key] = request.value return empty_pb2.Empty() diff --git a/tests/clients/test_dapr_grpc_client.py b/tests/clients/test_dapr_grpc_client.py index f838f5c68..369d7c08c 100644 --- a/tests/clients/test_dapr_grpc_client.py +++ b/tests/clients/test_dapr_grpc_client.py @@ -38,12 +38,14 @@ TransactionOperationType, ConversationInput, ) +from dapr.clients.grpc._jobs import Job from dapr.clients.grpc._state import StateOptions, Consistency, Concurrency, StateItem from dapr.clients.grpc._crypto import EncryptOptions, DecryptOptions from dapr.clients.grpc._response import ( ConfigurationItem, ConfigurationResponse, ConfigurationWatcher, + DaprResponse, UnlockResponseStatus, WorkflowRuntimeStatus, TopicEventResponse, @@ -1233,6 +1235,152 @@ def test_converse_alpha1_error_handling(self): dapr.converse_alpha1(name='test-llm', inputs=inputs) self.assertTrue('Invalid argument' in str(context.exception)) + # + # Tests for Jobs API (Alpha) + # + + def test_schedule_job_alpha1_success(self): + """Test successful job scheduling.""" + dapr = DaprGrpcClient(f'{self.scheme}localhost:{self.grpc_port}') + job = Job(name='test-job', schedule='@every 1m') + + # Schedule the job + response = dapr.schedule_job_alpha1(job) + + # Verify response type + self.assertIsInstance(response, DaprResponse) + + # Verify job was stored in fake server + self.assertIn('test-job', self._fake_dapr_server.jobs) + stored_job = self._fake_dapr_server.jobs['test-job'] + self.assertEqual(stored_job.name, 'test-job') + self.assertEqual(stored_job.schedule, '@every 1m') + self.assertEqual(stored_job.overwrite, False) + # Verify data field is always set (even if empty) + self.assertTrue(stored_job.HasField('data')) + + def test_schedule_job_alpha1_success_with_data(self): + """Test successful job scheduling with data payload.""" + from google.protobuf.any_pb2 import Any as GrpcAny + + dapr = DaprGrpcClient(f'{self.scheme}localhost:{self.grpc_port}') + + # Create job data + data = GrpcAny() + data.value = b'{"message": "Hello from job!", "priority": "high"}' + + job = Job(name='test-job-with-data', schedule='@every 2m', data=data, repeats=3, ttl='10m') + + # Schedule the job + response = dapr.schedule_job_alpha1(job) + + # Verify response type + self.assertIsInstance(response, DaprResponse) + + # Verify job was stored in fake server with all data + self.assertIn('test-job-with-data', self._fake_dapr_server.jobs) + stored_job = self._fake_dapr_server.jobs['test-job-with-data'] + self.assertEqual(stored_job.name, 'test-job-with-data') + self.assertEqual(stored_job.schedule, '@every 2m') + self.assertEqual(stored_job.repeats, 3) + self.assertEqual(stored_job.ttl, '10m') + self.assertEqual(stored_job.overwrite, False) + + # Verify data field contains the payload + self.assertTrue(stored_job.HasField('data')) + self.assertEqual( + stored_job.data.value, b'{"message": "Hello from job!", "priority": "high"}' + ) + + def test_schedule_job_alpha1_validation_error(self): + """Test validation error in job scheduling.""" + dapr = DaprGrpcClient(f'{self.scheme}localhost:{self.grpc_port}') + + # Test empty job name - this should be caught by client validation + with self.assertRaises(ValueError): + job = Job(name='', schedule='@every 1m') + dapr.schedule_job_alpha1(job) + + # Test missing schedule and due_time - this should be caught by client validation + with self.assertRaises(ValueError): + job = Job(name='test-job') + dapr.schedule_job_alpha1(job) + + def test_get_job_alpha1_success(self): + """Test successful job retrieval.""" + dapr = DaprGrpcClient(f'{self.scheme}localhost:{self.grpc_port}') + + # First schedule a job + original_job = Job(name='test-job', schedule='@every 1m', repeats=5, ttl='1h') + dapr.schedule_job_alpha1(original_job) + + # Now retrieve it + retrieved_job = dapr.get_job_alpha1('test-job') + + # Verify response + self.assertIsInstance(retrieved_job, Job) + self.assertEqual(retrieved_job.name, 'test-job') + self.assertEqual(retrieved_job.schedule, '@every 1m') + self.assertEqual(retrieved_job.repeats, 5) + self.assertEqual(retrieved_job.ttl, '1h') + self.assertEqual(retrieved_job.overwrite, False) + + def test_get_job_alpha1_validation_error(self): + """Test validation error in job retrieval.""" + dapr = DaprGrpcClient(f'{self.scheme}localhost:{self.grpc_port}') + + with self.assertRaises(ValueError): + dapr.get_job_alpha1('') + + def test_get_job_alpha1_not_found(self): + """Test getting a job that doesn't exist.""" + dapr = DaprGrpcClient(f'{self.scheme}localhost:{self.grpc_port}') + + with self.assertRaises(DaprGrpcError): + dapr.get_job_alpha1('non-existent-job') + + def test_delete_job_alpha1_success(self): + """Test successful job deletion.""" + dapr = DaprGrpcClient(f'{self.scheme}localhost:{self.grpc_port}') + + # First schedule a job + job = Job(name='test-job', schedule='@every 1m') + dapr.schedule_job_alpha1(job) + + # Verify job exists + self.assertIn('test-job', self._fake_dapr_server.jobs) + + # Delete the job + response = dapr.delete_job_alpha1('test-job') + + # Verify response + self.assertIsInstance(response, DaprResponse) + + # Verify job was removed from fake server + self.assertNotIn('test-job', self._fake_dapr_server.jobs) + + def test_delete_job_alpha1_validation_error(self): + """Test validation error in job deletion.""" + dapr = DaprGrpcClient(f'{self.scheme}localhost:{self.grpc_port}') + + with self.assertRaises(ValueError): + dapr.delete_job_alpha1('') + + def test_jobs_error_handling(self): + """Test error handling for Jobs API using fake server's exception mechanism.""" + from google.rpc import status_pb2, code_pb2 + + dapr = DaprGrpcClient(f'{self.scheme}localhost:{self.grpc_port}') + + # Set up fake server to raise an exception on next call + error_status = status_pb2.Status(code=code_pb2.INTERNAL, message='Simulated server error') + self._fake_dapr_server.raise_exception_on_next_call(error_status) + + # Try to schedule a job - should raise DaprGrpcError + job = Job(name='error-test', schedule='@every 1m') + with self.assertRaises(DaprGrpcError): + dapr.schedule_job_alpha1(job) + if __name__ == '__main__': unittest.main() diff --git a/tests/clients/test_dapr_grpc_client_async.py b/tests/clients/test_dapr_grpc_client_async.py index 627f56ce7..8eb70045a 100644 --- a/tests/clients/test_dapr_grpc_client_async.py +++ b/tests/clients/test_dapr_grpc_client_async.py @@ -30,12 +30,14 @@ from dapr.conf import settings from dapr.clients.grpc._helpers import to_bytes from dapr.clients.grpc._request import TransactionalStateOperation, ConversationInput +from dapr.clients.grpc._jobs import Job from dapr.clients.grpc._state import StateOptions, Consistency, Concurrency, StateItem from dapr.clients.grpc._crypto import EncryptOptions, DecryptOptions from dapr.clients.grpc._response import ( ConfigurationItem, ConfigurationWatcher, ConfigurationResponse, + DaprResponse, UnlockResponseStatus, ) @@ -1164,6 +1166,218 @@ async def test_converse_alpha1_error_handling(self): self.assertTrue('Invalid argument' in str(context.exception)) await dapr.close() + # + # Tests for Jobs API (Alpha) - Async + # + + async def test_schedule_job_alpha1_success(self): + """Test successful async job scheduling.""" + dapr = DaprGrpcClientAsync(f'{self.scheme}localhost:{self.grpc_port}') + job = Job(name='async-test-job', schedule='@every 1m') + + # Schedule the job + response = await dapr.schedule_job_alpha1(job) + + # Verify response type + self.assertIsInstance(response, DaprResponse) + + # Verify job was stored in fake server + self.assertIn('async-test-job', self._fake_dapr_server.jobs) + stored_job = self._fake_dapr_server.jobs['async-test-job'] + self.assertEqual(stored_job.name, 'async-test-job') + self.assertEqual(stored_job.schedule, '@every 1m') + self.assertEqual(stored_job.overwrite, False) + # Verify data field is always set (even if empty) + self.assertTrue(stored_job.HasField('data')) + + await dapr.close() + + async def test_schedule_job_alpha1_success_with_data(self): + """Test successful async job scheduling with data payload.""" + from google.protobuf.any_pb2 import Any as GrpcAny + + dapr = DaprGrpcClientAsync(f'{self.scheme}localhost:{self.grpc_port}') + + # Create job data + data = GrpcAny() + data.value = b'{"message": "Hello from async job!", "priority": "high"}' + + job = Job( + name='async-test-job-with-data', schedule='@every 2m', data=data, repeats=3, ttl='10m' + ) + + # Schedule the job + response = await dapr.schedule_job_alpha1(job) + + # Verify response type + self.assertIsInstance(response, DaprResponse) + + # Verify job was stored in fake server with all data + self.assertIn('async-test-job-with-data', self._fake_dapr_server.jobs) + stored_job = self._fake_dapr_server.jobs['async-test-job-with-data'] + self.assertEqual(stored_job.name, 'async-test-job-with-data') + self.assertEqual(stored_job.schedule, '@every 2m') + self.assertEqual(stored_job.repeats, 3) + self.assertEqual(stored_job.ttl, '10m') + self.assertEqual(stored_job.overwrite, False) + + # Verify data field contains the payload + self.assertTrue(stored_job.HasField('data')) + self.assertEqual( + stored_job.data.value, b'{"message": "Hello from async job!", "priority": "high"}' + ) + + await dapr.close() + + async def test_schedule_job_alpha1_validation_error(self): + """Test async validation error in job scheduling.""" + dapr = DaprGrpcClientAsync(f'{self.scheme}localhost:{self.grpc_port}') + + # Test empty job name - this should be caught by client validation + with self.assertRaises(ValueError): + job = Job(name='', schedule='@every 1m') + await dapr.schedule_job_alpha1(job) + + # Test missing schedule and due_time - this should be caught by client validation + with self.assertRaises(ValueError): + job = Job(name='async-test-job') + await dapr.schedule_job_alpha1(job) + + await dapr.close() + + async def test_schedule_jobs_error_handling(self): + """Test async error handling for Jobs API using fake server's exception mechanism.""" + dapr = DaprGrpcClientAsync(f'{self.scheme}localhost:{self.grpc_port}') + + # Set up fake server to raise an exception on next call + error_status = status_pb2.Status( + code=code_pb2.INTERNAL, message='Simulated async server error' + ) + self._fake_dapr_server.raise_exception_on_next_call(error_status) + + # Try to schedule a job - should raise DaprGrpcError + job = Job(name='async-error-test', schedule='@every 1m') + with self.assertRaises(DaprGrpcError): + await dapr.schedule_job_alpha1(job) + + await dapr.close() + + async def test_get_job_alpha1_success(self): + """Test successful async job retrieval.""" + dapr = DaprGrpcClientAsync(f'{self.scheme}localhost:{self.grpc_port}') + + # First schedule a job + original_job = Job(name='async-get-test-job', schedule='@every 1m', repeats=5, ttl='1h') + await dapr.schedule_job_alpha1(original_job) + + # Now retrieve it + retrieved_job = await dapr.get_job_alpha1('async-get-test-job') + + # Verify response + self.assertIsInstance(retrieved_job, Job) + self.assertEqual(retrieved_job.name, 'async-get-test-job') + self.assertEqual(retrieved_job.schedule, '@every 1m') + self.assertEqual(retrieved_job.repeats, 5) + self.assertEqual(retrieved_job.ttl, '1h') + self.assertEqual(retrieved_job.overwrite, False) + + await dapr.close() + + async def test_get_job_alpha1_validation_error(self): + """Test async validation error in job retrieval.""" + dapr = DaprGrpcClientAsync(f'{self.scheme}localhost:{self.grpc_port}') + + with self.assertRaises(ValueError): + await dapr.get_job_alpha1('') + + await dapr.close() + + async def test_get_job_alpha1_not_found(self): + """Test async getting a job that doesn't exist.""" + dapr = DaprGrpcClientAsync(f'{self.scheme}localhost:{self.grpc_port}') + + # Setup server to raise an exception + self._fake_dapr_server.raise_exception_on_next_call( + status_pb2.Status(code=code_pb2.NOT_FOUND, message='Job not found') + ) + + with self.assertRaises(DaprGrpcError): + await dapr.get_job_alpha1('async-non-existent-job') + + await dapr.close() + + async def test_delete_job_alpha1_success(self): + """Test successful async job deletion.""" + dapr = DaprGrpcClientAsync(f'{self.scheme}localhost:{self.grpc_port}') + + # First schedule a job + job = Job(name='async-delete-test-job', schedule='@every 1m') + await dapr.schedule_job_alpha1(job) + + # Verify job exists + self.assertIn('async-delete-test-job', self._fake_dapr_server.jobs) + + # Delete the job + response = await dapr.delete_job_alpha1('async-delete-test-job') + + # Verify response + self.assertIsInstance(response, DaprResponse) + + # Verify job was removed from fake server + self.assertNotIn('async-delete-test-job', self._fake_dapr_server.jobs) + + await dapr.close() + + async def test_delete_job_alpha1_validation_error(self): + """Test async validation error in job deletion.""" + dapr = DaprGrpcClientAsync(f'{self.scheme}localhost:{self.grpc_port}') + + with self.assertRaises(ValueError): + await dapr.delete_job_alpha1('') + + await dapr.close() + + async def test_job_lifecycle(self): + """Test complete async job lifecycle: schedule → get → delete.""" + from google.protobuf.any_pb2 import Any as GrpcAny + + dapr = DaprGrpcClientAsync(f'{self.scheme}localhost:{self.grpc_port}') + + # Create job with data + data = GrpcAny() + data.value = b'{"lifecycle": "test"}' + + job = Job( + name='async-lifecycle-job', + schedule='@every 5m', + data=data, + repeats=10, + ttl='30m', + overwrite=True, + ) + + # 1. Schedule the job + schedule_response = await dapr.schedule_job_alpha1(job) + self.assertIsInstance(schedule_response, DaprResponse) + + # 2. Get the job and verify all fields + retrieved_job = await dapr.get_job_alpha1('async-lifecycle-job') + self.assertEqual(retrieved_job.name, 'async-lifecycle-job') + self.assertEqual(retrieved_job.schedule, '@every 5m') + self.assertEqual(retrieved_job.repeats, 10) + self.assertEqual(retrieved_job.ttl, '30m') + self.assertTrue(retrieved_job.overwrite) + self.assertEqual(retrieved_job.data.value, b'{"lifecycle": "test"}') + + # 3. Delete the job + delete_response = await dapr.delete_job_alpha1('async-lifecycle-job') + self.assertIsInstance(delete_response, DaprResponse) + + # 4. Verify job is gone + self.assertNotIn('async-lifecycle-job', self._fake_dapr_server.jobs) + + await dapr.close() + if __name__ == '__main__': unittest.main() diff --git a/tests/clients/test_jobs.py b/tests/clients/test_jobs.py new file mode 100644 index 000000000..18259b6f2 --- /dev/null +++ b/tests/clients/test_jobs.py @@ -0,0 +1,198 @@ +#!/usr/bin/env python3 + +""" +Unit tests for the Job class and its proto conversion methods. +""" + +import unittest +from google.protobuf.any_pb2 import Any as GrpcAny + +from dapr.clients.grpc._jobs import Job, DropFailurePolicy, ConstantFailurePolicy +from dapr.proto.runtime.v1 import dapr_pb2 as api_v1 + + +class TestJobClass(unittest.TestCase): + """Test cases for the Job class and its proto conversion methods.""" + + def test_job_creation(self): + """Test Job dataclass creation.""" + # Test minimal job + job = Job(name='test-job', schedule='@every 1m') + self.assertEqual(job.name, 'test-job') + self.assertEqual(job.schedule, '@every 1m') + self.assertIsNone(job.repeats) + self.assertIsNone(job.due_time) + self.assertIsNone(job.ttl) + self.assertIsNone(job.data) + self.assertEqual(job.overwrite, False) + + # Test job with all fields + data = GrpcAny() + data.value = b'{"message": "test"}' + + job_full = Job( + name='full-job', + schedule='0 0 * * *', + repeats=5, + due_time='2024-01-01T00:00:00Z', + ttl='1h', + data=data, + overwrite=True, + ) + self.assertEqual(job_full.name, 'full-job') + self.assertEqual(job_full.schedule, '0 0 * * *') + self.assertEqual(job_full.repeats, 5) + self.assertEqual(job_full.due_time, '2024-01-01T00:00:00Z') + self.assertEqual(job_full.ttl, '1h') + self.assertEqual(job_full.data, data) + self.assertEqual(job_full.overwrite, True) + + def test_job_get_proto_full(self): + """Test _get_proto() method with all fields.""" + data = GrpcAny() + data.value = b'{"message": "test"}' + + job = Job( + name='full-job', + schedule='0 0 * * *', + repeats=5, + due_time='2024-01-01T00:00:00Z', + ttl='1h', + data=data, + overwrite=True, + ) + job_proto = job._get_proto() + + # Verify all proto fields + self.assertIsInstance(job_proto, api_v1.Job) + self.assertEqual(job_proto.name, 'full-job') + self.assertEqual(job_proto.schedule, '0 0 * * *') + self.assertEqual(job_proto.repeats, 5) + self.assertEqual(job_proto.due_time, '2024-01-01T00:00:00Z') + self.assertEqual(job_proto.ttl, '1h') + self.assertTrue(job_proto.overwrite) + + # Verify data field + self.assertTrue(job_proto.HasField('data')) + self.assertEqual(job_proto.data.value, b'{"message": "test"}') + + def test_job_get_proto_no_data(self): + """Test _get_proto() method when data is None.""" + job = Job(name='no-data-job', schedule='@every 1m', data=None) + job_proto = job._get_proto() + + # Verify data field is set to empty Any + self.assertTrue(job_proto.HasField('data')) + self.assertEqual(job_proto.data.value, b'') + + def test_job_from_proto_no_data(self): + """Test _from_proto() method with minimal proto.""" + # Create minimal proto + job_proto = api_v1.Job(name='test-job', overwrite=False) + job_proto.data.CopyFrom(GrpcAny()) # Empty data + + # Convert to Job + job = Job._from_proto(job_proto) + + # Verify Job fields + self.assertEqual(job.name, 'test-job') + self.assertIsNone(job.schedule) + self.assertIsNone(job.repeats) + self.assertIsNone(job.due_time) + self.assertIsNone(job.ttl) + self.assertIsNone(job.data) # Empty data becomes None + self.assertEqual(job.overwrite, False) + + def test_job_from_proto_full(self): + """Test _from_proto() method with all fields.""" + # Create full proto + data = GrpcAny() + data.value = b'{"message": "test"}' + + job_proto = api_v1.Job( + name='full-job', + schedule='0 0 * * *', + repeats=5, + due_time='2024-01-01T00:00:00Z', + ttl='1h', + overwrite=True, + ) + job_proto.data.CopyFrom(data) + + # Convert to Job + job = Job._from_proto(job_proto) + + # Verify all Job fields + self.assertEqual(job.name, 'full-job') + self.assertEqual(job.schedule, '0 0 * * *') + self.assertEqual(job.repeats, 5) + self.assertEqual(job.due_time, '2024-01-01T00:00:00Z') + self.assertEqual(job.ttl, '1h') + self.assertEqual(job.data.value, b'{"message": "test"}') + self.assertTrue(job.overwrite) + + def test_job_with_drop_failure_policy(self): + """Test Job with DropFailurePolicy.""" + drop_policy = DropFailurePolicy() + job = Job(name='drop-job', schedule='@every 1m', failure_policy=drop_policy) + + # Convert to proto and back + job_proto = job._get_proto() + self.assertTrue(job_proto.HasField('failure_policy')) + self.assertTrue(job_proto.failure_policy.HasField('drop')) + + # Convert back to Job + job_from_proto = Job._from_proto(job_proto) + self.assertIsInstance(job_from_proto.failure_policy, DropFailurePolicy) + + def test_job_with_constant_failure_policy(self): + """Test Job with ConstantFailurePolicy.""" + constant_policy = ConstantFailurePolicy(max_retries=3, interval_seconds=10) + job = Job(name='retry-job', schedule='@every 1m', failure_policy=constant_policy) + + # Convert to proto and back + job_proto = job._get_proto() + self.assertTrue(job_proto.HasField('failure_policy')) + self.assertTrue(job_proto.failure_policy.HasField('constant')) + self.assertEqual(job_proto.failure_policy.constant.max_retries, 3) + self.assertEqual(job_proto.failure_policy.constant.interval.seconds, 10) + + # Convert back to Job + job_from_proto = Job._from_proto(job_proto) + self.assertIsInstance(job_from_proto.failure_policy, ConstantFailurePolicy) + self.assertEqual(job_from_proto.failure_policy.max_retries, 3) + self.assertEqual(job_from_proto.failure_policy.interval_seconds, 10) + + def test_job_with_constant_failure_policy_no_max_retries(self): + """Test Job with ConstantFailurePolicy without max_retries.""" + constant_policy = ConstantFailurePolicy(interval_seconds=5) + job = Job(name='retry-job', schedule='@every 1m', failure_policy=constant_policy) + + # Convert to proto and back + job_proto = job._get_proto() + self.assertTrue(job_proto.HasField('failure_policy')) + self.assertTrue(job_proto.failure_policy.HasField('constant')) + self.assertFalse(job_proto.failure_policy.constant.HasField('max_retries')) + self.assertEqual(job_proto.failure_policy.constant.interval.seconds, 5) + + # Convert back to Job + job_from_proto = Job._from_proto(job_proto) + self.assertIsInstance(job_from_proto.failure_policy, ConstantFailurePolicy) + self.assertIsNone(job_from_proto.failure_policy.max_retries) + self.assertEqual(job_from_proto.failure_policy.interval_seconds, 5) + + def test_job_without_failure_policy(self): + """Test Job without failure policy.""" + job = Job(name='no-policy-job', schedule='@every 1m') + + # Convert to proto and back + job_proto = job._get_proto() + self.assertFalse(job_proto.HasField('failure_policy')) + + # Convert back to Job + job_from_proto = Job._from_proto(job_proto) + self.assertIsNone(job_from_proto.failure_policy) + + +if __name__ == '__main__': + unittest.main() diff --git a/tox.ini b/tox.ini index fc8a5f3ad..0c9ebeabb 100644 --- a/tox.ini +++ b/tox.ini @@ -66,6 +66,7 @@ commands = ./validate.sh configuration ./validate.sh demo_workflow ./validate.sh workflow + ./validate.sh jobs ./validate.sh ../ commands_pre = pip3 install -e {toxinidir}/