diff --git a/buf.gen.yaml b/buf.gen.yaml index 907fa20..3094c30 100644 --- a/buf.gen.yaml +++ b/buf.gen.yaml @@ -7,6 +7,8 @@ managed: - buf.build/envoyproxy/protoc-gen-validate - buf.build/bufbuild/protovalidate plugins: + - plugin: buf.build/protocolbuffers/python:v28.2 + out: modules/ - plugin: buf.build/connectrpc/go:v1.11.1 out: pkg/gen/ opt: diff --git a/example/main.py b/example/main.py new file mode 100644 index 0000000..7088dcc --- /dev/null +++ b/example/main.py @@ -0,0 +1,57 @@ +from typing import TypedDict, List +from enum import Enum +from modules.task import task, TaskType, TaskSpec +from modules.workflow import Workflow, WorkflowSpec + +@task(TaskSpec( + name="hello_world", + type=TaskType.PYTHON, + description="This is a test task", + dependencies="This is a test task", + metadata={ + "author": "Yuvraj Singh", + "version": "1.0.0", + }, + base_image="python:3.12", + entrypoint="python", + args=[], + env={} +)) +def hello_world(a : int, b : int) -> bool: + print("Hello, World!") + return True + + +@task(TaskSpec( + name="hello_world", + type=TaskType.PYTHON, + description="This is a test task", + dependencies="This is a test task", + metadata={ + "author": "Yuvraj Singh", + "version": "1.0.0", + }, + base_image="python:3.12", + entrypoint="python", + args=[], + env={} +)) +def hello_world_2(a : int, b : int) -> bool: + print("Hello, World!") + return True + + +@Workflow(WorkflowSpec( + name="hello_world", + description="This is a test workflow", + metadata={ + "author": "Yuvraj Singh", + "version": "1.0.0", + }, +)) +def hello_world_workflow(a : int, b : int)-> bool: + return hello_world(a=a, b=b) or hello_world(a=a, b=b) + + +if __name__ == "__main__": + hello_world() diff --git a/idl/cloud/v1/cloud.proto b/idl/cloud/v1/cloud.proto index 43bf488..47988b2 100644 --- a/idl/cloud/v1/cloud.proto +++ b/idl/cloud/v1/cloud.proto @@ -4,6 +4,8 @@ package cloud.v1; import "validate/validate.proto"; import "google/protobuf/empty.proto"; +import "google/protobuf/timestamp.proto"; + // Enum for Task statuses enum TaskStatusEnum { @@ -99,8 +101,50 @@ message Task { string description = 9 [(validate.rules).string = { max_len: 5000 }]; + repeated string dependencies = 10; // IDs of tasks that must complete before this task + string base_image = 11; + string entrypoint = 12; + repeated string args = 13; + map env = 14; } +// Workflow represents a collection of tasks organized in a DAG +message Workflow { + string id = 1; + string name = 2; + string description = 3; + repeated Task tasks = 4; + map metadata = 5; + } + + // ExecutionStatus represents the current state of a task or workflow execution +enum ExecutionStatus { + EXECUTION_STATUS_UNSPECIFIED = 0; + EXECUTION_STATUS_PENDING = 1; + EXECUTION_STATUS_RUNNING = 2; + EXECUTION_STATUS_COMPLETED = 3; + EXECUTION_STATUS_FAILED = 4; + } + + // TaskExecution represents the execution of a task +message TaskExecution { + string task_id = 1; + ExecutionStatus status = 2; + google.protobuf.Timestamp created_at = 3; + google.protobuf.Timestamp updated_at = 4; + map execution_metadata = 5; + } + + // WorkflowExecution represents the execution of a workflow +message WorkflowExecution { + string workflow_id = 1; + ExecutionStatus status = 2; + repeated TaskExecution task_executions = 3; + google.protobuf.Timestamp created_at = 4; + google.protobuf.Timestamp updated_at = 5; + map execution_metadata = 6; + } + // Message for Task history message TaskHistory { // Unique identifier for the history entry. Must be >= 0. diff --git a/modules/__init__.py b/modules/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/modules/cloud/v1/cloud_pb2.py b/modules/cloud/v1/cloud_pb2.py new file mode 100644 index 0000000..10eed05 --- /dev/null +++ b/modules/cloud/v1/cloud_pb2.py @@ -0,0 +1,172 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: cloud/v1/cloud.proto +# Protobuf Python Version: 5.28.2 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 5, + 28, + 2, + '', + 'cloud/v1/cloud.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from validate import validate_pb2 as validate_dot_validate__pb2 +from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x14\x63loud/v1/cloud.proto\x12\x08\x63loud.v1\x1a\x17validate/validate.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\xb0\x01\n\x07Payload\x12\x66\n\nparameters\x18\x01 \x03(\x0b\x32!.cloud.v1.Payload.ParametersEntryB#\xfa\x42 \x9a\x01\x1d\"\x14r\x12\x32\x10^[a-zA-Z0-9_-]+$*\x05r\x03\x18\x80\x08R\nparameters\x1a=\n\x0fParametersEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value:\x02\x38\x01\"\xc4\x01\n\x11\x43reateTaskRequest\x12.\n\x04name\x18\x01 \x01(\tB\x1a\xfa\x42\x17r\x15\x18\xff\x01\x32\x10^[a-zA-Z0-9_-]+$R\x04name\x12\x1c\n\x04type\x18\x02 \x01(\tB\x08\xfa\x42\x05\x82\x01\x02\x10\x01R\x04type\x12\x35\n\x07payload\x18\x03 \x01(\x0b\x32\x11.cloud.v1.PayloadB\x08\xfa\x42\x05\x8a\x01\x02\x10\x01R\x07payload\x12*\n\x0b\x64\x65scription\x18\x04 \x01(\tB\x08\xfa\x42\x05r\x03\x18\x88\'R\x0b\x64\x65scription\"-\n\x12\x43reateTaskResponse\x12\x17\n\x02id\x18\x01 \x01(\x05\x42\x07\xfa\x42\x04\x1a\x02(\x00R\x02id\"\xfe\x04\n\x04Task\x12\x17\n\x02id\x18\x01 \x01(\x05\x42\x07\xfa\x42\x04\x1a\x02(\x00R\x02id\x12.\n\x04name\x18\x02 \x01(\tB\x1a\xfa\x42\x17r\x15\x18\xff\x01\x32\x10^[a-zA-Z0-9_-]+$R\x04name\x12\x1c\n\x04type\x18\x03 \x01(\tB\x08\xfa\x42\x05\x82\x01\x02\x10\x01R\x04type\x12:\n\x06status\x18\x04 \x01(\x0e\x32\x18.cloud.v1.TaskStatusEnumB\x08\xfa\x42\x05\x82\x01\x02\x10\x01R\x06status\x12#\n\x07retries\x18\x05 \x01(\x05\x42\t\xfa\x42\x06\x1a\x04\x18\n(\x00R\x07retries\x12#\n\x08priority\x18\x06 \x01(\x05\x42\x07\xfa\x42\x04\x1a\x02(\x00R\x08priority\x12L\n\ncreated_at\x18\x07 \x01(\tB-\xfa\x42*r(2&^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$R\tcreatedAt\x12\x35\n\x07payload\x18\x08 \x01(\x0b\x32\x11.cloud.v1.PayloadB\x08\xfa\x42\x05\x8a\x01\x02\x10\x01R\x07payload\x12*\n\x0b\x64\x65scription\x18\t \x01(\tB\x08\xfa\x42\x05r\x03\x18\x88\'R\x0b\x64\x65scription\x12\"\n\x0c\x64\x65pendencies\x18\n \x03(\tR\x0c\x64\x65pendencies\x12\x1d\n\nbase_image\x18\x0b \x01(\tR\tbaseImage\x12\x1e\n\nentrypoint\x18\x0c \x01(\tR\nentrypoint\x12\x12\n\x04\x61rgs\x18\r \x03(\tR\x04\x61rgs\x12)\n\x03\x65nv\x18\x0e \x03(\x0b\x32\x17.cloud.v1.Task.EnvEntryR\x03\x65nv\x1a\x36\n\x08\x45nvEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value:\x02\x38\x01\"\xf1\x01\n\x08Workflow\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n\x04name\x18\x02 \x01(\tR\x04name\x12 \n\x0b\x64\x65scription\x18\x03 \x01(\tR\x0b\x64\x65scription\x12$\n\x05tasks\x18\x04 \x03(\x0b\x32\x0e.cloud.v1.TaskR\x05tasks\x12<\n\x08metadata\x18\x05 \x03(\x0b\x32 .cloud.v1.Workflow.MetadataEntryR\x08metadata\x1a;\n\rMetadataEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value:\x02\x38\x01\"\xf6\x02\n\rTaskExecution\x12\x17\n\x07task_id\x18\x01 \x01(\tR\x06taskId\x12\x31\n\x06status\x18\x02 \x01(\x0e\x32\x19.cloud.v1.ExecutionStatusR\x06status\x12\x39\n\ncreated_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tcreatedAt\x12\x39\n\nupdated_at\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tupdatedAt\x12]\n\x12\x65xecution_metadata\x18\x05 \x03(\x0b\x32..cloud.v1.TaskExecution.ExecutionMetadataEntryR\x11\x65xecutionMetadata\x1a\x44\n\x16\x45xecutionMetadataEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value:\x02\x38\x01\"\xc8\x03\n\x11WorkflowExecution\x12\x1f\n\x0bworkflow_id\x18\x01 \x01(\tR\nworkflowId\x12\x31\n\x06status\x18\x02 \x01(\x0e\x32\x19.cloud.v1.ExecutionStatusR\x06status\x12@\n\x0ftask_executions\x18\x03 \x03(\x0b\x32\x17.cloud.v1.TaskExecutionR\x0etaskExecutions\x12\x39\n\ncreated_at\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tcreatedAt\x12\x39\n\nupdated_at\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tupdatedAt\x12\x61\n\x12\x65xecution_metadata\x18\x06 \x03(\x0b\x32\x32.cloud.v1.WorkflowExecution.ExecutionMetadataEntryR\x11\x65xecutionMetadata\x1a\x44\n\x16\x45xecutionMetadataEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value:\x02\x38\x01\"\xd4\x01\n\x0bTaskHistory\x12\x17\n\x02id\x18\x01 \x01(\x05\x42\x07\xfa\x42\x04\x1a\x02(\x00R\x02id\x12:\n\x06status\x18\x02 \x01(\x0e\x32\x18.cloud.v1.TaskStatusEnumB\x08\xfa\x42\x05\x82\x01\x02\x10\x01R\x06status\x12L\n\ncreated_at\x18\x03 \x01(\tB-\xfa\x42*r(2&^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$R\tcreatedAt\x12\"\n\x07\x64\x65tails\x18\x04 \x01(\tB\x08\xfa\x42\x05r\x03\x18\xd0\x0fR\x07\x64\x65tails\")\n\x0eGetTaskRequest\x12\x17\n\x02id\x18\x01 \x01(\x05\x42\x07\xfa\x42\x04\x1a\x02(\x00R\x02id\"0\n\x15GetTaskHistoryRequest\x12\x17\n\x02id\x18\x01 \x01(\x05\x42\x07\xfa\x42\x04\x1a\x02(\x00R\x02id\"V\n\x16GetTaskHistoryResponse\x12<\n\x07history\x18\x01 \x03(\x0b\x32\x15.cloud.v1.TaskHistoryB\x0b\xfa\x42\x08\x92\x01\x05\x08\x01\x10\xe8\x07R\x07history\"\x92\x01\n\x17UpdateTaskStatusRequest\x12\x17\n\x02id\x18\x01 \x01(\x05\x42\x07\xfa\x42\x04\x1a\x02(\x00R\x02id\x12:\n\x06status\x18\x02 \x01(\x0e\x32\x18.cloud.v1.TaskStatusEnumB\x08\xfa\x42\x05\x82\x01\x02\x10\x01R\x06status\x12\"\n\x07message\x18\x03 \x01(\tB\x08\xfa\x42\x05r\x03\x18\xd0\x0fR\x07message\"\xd6\x01\n\x10HeartbeatRequest\x12K\n\ttimestamp\x18\x01 \x01(\tB-\xfa\x42*r(2&^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$R\ttimestamp\x12u\n\x04uuid\x18\x02 \x01(\tBa\xfa\x42^r\\2Z^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-5][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$R\x04uuid\"\x13\n\x11HeartbeatResponse\"\x13\n\x11PullEventsRequest\"B\n\x12PullEventsResponse\x12,\n\x04work\x18\x01 \x01(\x0b\x32\x18.cloud.v1.WorkAssignmentR\x04work\"c\n\x0eWorkAssignment\x12#\n\rassignment_id\x18\x01 \x01(\x03R\x0c\x61ssignmentId\x12,\n\x04task\x18\x02 \x01(\x0b\x32\x0e.cloud.v1.TaskB\x08\xfa\x42\x05\x8a\x01\x02\x10\x01R\x04task\"\x12\n\x10GetStatusRequest\"\xa8\x01\n\x11GetStatusResponse\x12R\n\rstatus_counts\x18\x01 \x03(\x0b\x32-.cloud.v1.GetStatusResponse.StatusCountsEntryR\x0cstatusCounts\x1a?\n\x11StatusCountsEntry\x12\x10\n\x03key\x18\x01 \x01(\x05R\x03key\x12\x14\n\x05value\x18\x02 \x01(\x03R\x05value:\x02\x38\x01\"0\n\x08TaskList\x12$\n\x05tasks\x18\x01 \x03(\x0b\x32\x0e.cloud.v1.TaskR\x05tasks\"\xd5\x01\n\x0fTaskListRequest\x12\x1f\n\x05limit\x18\x01 \x01(\x05\x42\t\xfa\x42\x06\x1a\x04\x18\x64(\x01R\x05limit\x12\x1f\n\x06offset\x18\x02 \x01(\x05\x42\x07\xfa\x42\x04\x1a\x02(\x00R\x06offset\x12\x35\n\x06status\x18\x03 \x01(\x0e\x32\x18.cloud.v1.TaskStatusEnumH\x00R\x06status\x88\x01\x01\x12\x35\n\x04type\x18\x04 \x01(\tB\x1c\xfa\x42\x19r\x17R\nsend_emailR\trun_queryH\x01R\x04type\x88\x01\x01\x42\t\n\x07_statusB\x07\n\x05_type*Z\n\x0eTaskStatusEnum\x12\n\n\x06QUEUED\x10\x00\x12\x0b\n\x07RUNNING\x10\x01\x12\n\n\x06\x46\x41ILED\x10\x02\x12\r\n\tSUCCEEDED\x10\x03\x12\x0b\n\x07UNKNOWN\x10\x04\x12\x07\n\x03\x41LL\x10\x05*\xac\x01\n\x0f\x45xecutionStatus\x12 \n\x1c\x45XECUTION_STATUS_UNSPECIFIED\x10\x00\x12\x1c\n\x18\x45XECUTION_STATUS_PENDING\x10\x01\x12\x1c\n\x18\x45XECUTION_STATUS_RUNNING\x10\x02\x12\x1e\n\x1a\x45XECUTION_STATUS_COMPLETED\x10\x03\x12\x1b\n\x17\x45XECUTION_STATUS_FAILED\x10\x04\x32\xdc\x04\n\x15TaskManagementService\x12I\n\nCreateTask\x12\x1b.cloud.v1.CreateTaskRequest\x1a\x1c.cloud.v1.CreateTaskResponse\"\x00\x12\x35\n\x07GetTask\x12\x18.cloud.v1.GetTaskRequest\x1a\x0e.cloud.v1.Task\"\x00\x12<\n\tListTasks\x12\x19.cloud.v1.TaskListRequest\x1a\x12.cloud.v1.TaskList\"\x00\x12U\n\x0eGetTaskHistory\x12\x1f.cloud.v1.GetTaskHistoryRequest\x1a .cloud.v1.GetTaskHistoryResponse\"\x00\x12O\n\x10UpdateTaskStatus\x12!.cloud.v1.UpdateTaskStatusRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x46\n\tGetStatus\x12\x1a.cloud.v1.GetStatusRequest\x1a\x1b.cloud.v1.GetStatusResponse\"\x00\x12\x46\n\tHeartbeat\x12\x1a.cloud.v1.HeartbeatRequest\x1a\x1b.cloud.v1.HeartbeatResponse\"\x00\x12K\n\nPullEvents\x12\x1b.cloud.v1.PullEventsRequest\x1a\x1c.cloud.v1.PullEventsResponse\"\x00\x30\x01\x42z\n\x0c\x63om.cloud.v1B\nCloudProtoP\x01Z\x1dtask/pkg/gen/cloud/v1;cloudv1\xa2\x02\x03\x43XX\xaa\x02\x08\x43loud.V1\xca\x02\x08\x43loud\\V1\xe2\x02\x14\x43loud\\V1\\GPBMetadata\xea\x02\tCloud::V1b\x06proto3') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'cloud.v1.cloud_pb2', _globals) +if not _descriptor._USE_C_DESCRIPTORS: + _globals['DESCRIPTOR']._loaded_options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\014com.cloud.v1B\nCloudProtoP\001Z\035task/pkg/gen/cloud/v1;cloudv1\242\002\003CXX\252\002\010Cloud.V1\312\002\010Cloud\\V1\342\002\024Cloud\\V1\\GPBMetadata\352\002\tCloud::V1' + _globals['_PAYLOAD_PARAMETERSENTRY']._loaded_options = None + _globals['_PAYLOAD_PARAMETERSENTRY']._serialized_options = b'8\001' + _globals['_PAYLOAD'].fields_by_name['parameters']._loaded_options = None + _globals['_PAYLOAD'].fields_by_name['parameters']._serialized_options = b'\372B \232\001\035\"\024r\0222\020^[a-zA-Z0-9_-]+$*\005r\003\030\200\010' + _globals['_CREATETASKREQUEST'].fields_by_name['name']._loaded_options = None + _globals['_CREATETASKREQUEST'].fields_by_name['name']._serialized_options = b'\372B\027r\025\030\377\0012\020^[a-zA-Z0-9_-]+$' + _globals['_CREATETASKREQUEST'].fields_by_name['type']._loaded_options = None + _globals['_CREATETASKREQUEST'].fields_by_name['type']._serialized_options = b'\372B\005\202\001\002\020\001' + _globals['_CREATETASKREQUEST'].fields_by_name['payload']._loaded_options = None + _globals['_CREATETASKREQUEST'].fields_by_name['payload']._serialized_options = b'\372B\005\212\001\002\020\001' + _globals['_CREATETASKREQUEST'].fields_by_name['description']._loaded_options = None + _globals['_CREATETASKREQUEST'].fields_by_name['description']._serialized_options = b'\372B\005r\003\030\210\'' + _globals['_CREATETASKRESPONSE'].fields_by_name['id']._loaded_options = None + _globals['_CREATETASKRESPONSE'].fields_by_name['id']._serialized_options = b'\372B\004\032\002(\000' + _globals['_TASK_ENVENTRY']._loaded_options = None + _globals['_TASK_ENVENTRY']._serialized_options = b'8\001' + _globals['_TASK'].fields_by_name['id']._loaded_options = None + _globals['_TASK'].fields_by_name['id']._serialized_options = b'\372B\004\032\002(\000' + _globals['_TASK'].fields_by_name['name']._loaded_options = None + _globals['_TASK'].fields_by_name['name']._serialized_options = b'\372B\027r\025\030\377\0012\020^[a-zA-Z0-9_-]+$' + _globals['_TASK'].fields_by_name['type']._loaded_options = None + _globals['_TASK'].fields_by_name['type']._serialized_options = b'\372B\005\202\001\002\020\001' + _globals['_TASK'].fields_by_name['status']._loaded_options = None + _globals['_TASK'].fields_by_name['status']._serialized_options = b'\372B\005\202\001\002\020\001' + _globals['_TASK'].fields_by_name['retries']._loaded_options = None + _globals['_TASK'].fields_by_name['retries']._serialized_options = b'\372B\006\032\004\030\n(\000' + _globals['_TASK'].fields_by_name['priority']._loaded_options = None + _globals['_TASK'].fields_by_name['priority']._serialized_options = b'\372B\004\032\002(\000' + _globals['_TASK'].fields_by_name['created_at']._loaded_options = None + _globals['_TASK'].fields_by_name['created_at']._serialized_options = b'\372B*r(2&^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$' + _globals['_TASK'].fields_by_name['payload']._loaded_options = None + _globals['_TASK'].fields_by_name['payload']._serialized_options = b'\372B\005\212\001\002\020\001' + _globals['_TASK'].fields_by_name['description']._loaded_options = None + _globals['_TASK'].fields_by_name['description']._serialized_options = b'\372B\005r\003\030\210\'' + _globals['_WORKFLOW_METADATAENTRY']._loaded_options = None + _globals['_WORKFLOW_METADATAENTRY']._serialized_options = b'8\001' + _globals['_TASKEXECUTION_EXECUTIONMETADATAENTRY']._loaded_options = None + _globals['_TASKEXECUTION_EXECUTIONMETADATAENTRY']._serialized_options = b'8\001' + _globals['_WORKFLOWEXECUTION_EXECUTIONMETADATAENTRY']._loaded_options = None + _globals['_WORKFLOWEXECUTION_EXECUTIONMETADATAENTRY']._serialized_options = b'8\001' + _globals['_TASKHISTORY'].fields_by_name['id']._loaded_options = None + _globals['_TASKHISTORY'].fields_by_name['id']._serialized_options = b'\372B\004\032\002(\000' + _globals['_TASKHISTORY'].fields_by_name['status']._loaded_options = None + _globals['_TASKHISTORY'].fields_by_name['status']._serialized_options = b'\372B\005\202\001\002\020\001' + _globals['_TASKHISTORY'].fields_by_name['created_at']._loaded_options = None + _globals['_TASKHISTORY'].fields_by_name['created_at']._serialized_options = b'\372B*r(2&^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$' + _globals['_TASKHISTORY'].fields_by_name['details']._loaded_options = None + _globals['_TASKHISTORY'].fields_by_name['details']._serialized_options = b'\372B\005r\003\030\320\017' + _globals['_GETTASKREQUEST'].fields_by_name['id']._loaded_options = None + _globals['_GETTASKREQUEST'].fields_by_name['id']._serialized_options = b'\372B\004\032\002(\000' + _globals['_GETTASKHISTORYREQUEST'].fields_by_name['id']._loaded_options = None + _globals['_GETTASKHISTORYREQUEST'].fields_by_name['id']._serialized_options = b'\372B\004\032\002(\000' + _globals['_GETTASKHISTORYRESPONSE'].fields_by_name['history']._loaded_options = None + _globals['_GETTASKHISTORYRESPONSE'].fields_by_name['history']._serialized_options = b'\372B\010\222\001\005\010\001\020\350\007' + _globals['_UPDATETASKSTATUSREQUEST'].fields_by_name['id']._loaded_options = None + _globals['_UPDATETASKSTATUSREQUEST'].fields_by_name['id']._serialized_options = b'\372B\004\032\002(\000' + _globals['_UPDATETASKSTATUSREQUEST'].fields_by_name['status']._loaded_options = None + _globals['_UPDATETASKSTATUSREQUEST'].fields_by_name['status']._serialized_options = b'\372B\005\202\001\002\020\001' + _globals['_UPDATETASKSTATUSREQUEST'].fields_by_name['message']._loaded_options = None + _globals['_UPDATETASKSTATUSREQUEST'].fields_by_name['message']._serialized_options = b'\372B\005r\003\030\320\017' + _globals['_HEARTBEATREQUEST'].fields_by_name['timestamp']._loaded_options = None + _globals['_HEARTBEATREQUEST'].fields_by_name['timestamp']._serialized_options = b'\372B*r(2&^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$' + _globals['_HEARTBEATREQUEST'].fields_by_name['uuid']._loaded_options = None + _globals['_HEARTBEATREQUEST'].fields_by_name['uuid']._serialized_options = b'\372B^r\\2Z^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-5][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$' + _globals['_WORKASSIGNMENT'].fields_by_name['task']._loaded_options = None + _globals['_WORKASSIGNMENT'].fields_by_name['task']._serialized_options = b'\372B\005\212\001\002\020\001' + _globals['_GETSTATUSRESPONSE_STATUSCOUNTSENTRY']._loaded_options = None + _globals['_GETSTATUSRESPONSE_STATUSCOUNTSENTRY']._serialized_options = b'8\001' + _globals['_TASKLISTREQUEST'].fields_by_name['limit']._loaded_options = None + _globals['_TASKLISTREQUEST'].fields_by_name['limit']._serialized_options = b'\372B\006\032\004\030d(\001' + _globals['_TASKLISTREQUEST'].fields_by_name['offset']._loaded_options = None + _globals['_TASKLISTREQUEST'].fields_by_name['offset']._serialized_options = b'\372B\004\032\002(\000' + _globals['_TASKLISTREQUEST'].fields_by_name['type']._loaded_options = None + _globals['_TASKLISTREQUEST'].fields_by_name['type']._serialized_options = b'\372B\031r\027R\nsend_emailR\trun_query' + _globals['_TASKSTATUSENUM']._serialized_start=3697 + _globals['_TASKSTATUSENUM']._serialized_end=3787 + _globals['_EXECUTIONSTATUS']._serialized_start=3790 + _globals['_EXECUTIONSTATUS']._serialized_end=3962 + _globals['_PAYLOAD']._serialized_start=122 + _globals['_PAYLOAD']._serialized_end=298 + _globals['_PAYLOAD_PARAMETERSENTRY']._serialized_start=237 + _globals['_PAYLOAD_PARAMETERSENTRY']._serialized_end=298 + _globals['_CREATETASKREQUEST']._serialized_start=301 + _globals['_CREATETASKREQUEST']._serialized_end=497 + _globals['_CREATETASKRESPONSE']._serialized_start=499 + _globals['_CREATETASKRESPONSE']._serialized_end=544 + _globals['_TASK']._serialized_start=547 + _globals['_TASK']._serialized_end=1185 + _globals['_TASK_ENVENTRY']._serialized_start=1131 + _globals['_TASK_ENVENTRY']._serialized_end=1185 + _globals['_WORKFLOW']._serialized_start=1188 + _globals['_WORKFLOW']._serialized_end=1429 + _globals['_WORKFLOW_METADATAENTRY']._serialized_start=1370 + _globals['_WORKFLOW_METADATAENTRY']._serialized_end=1429 + _globals['_TASKEXECUTION']._serialized_start=1432 + _globals['_TASKEXECUTION']._serialized_end=1806 + _globals['_TASKEXECUTION_EXECUTIONMETADATAENTRY']._serialized_start=1738 + _globals['_TASKEXECUTION_EXECUTIONMETADATAENTRY']._serialized_end=1806 + _globals['_WORKFLOWEXECUTION']._serialized_start=1809 + _globals['_WORKFLOWEXECUTION']._serialized_end=2265 + _globals['_WORKFLOWEXECUTION_EXECUTIONMETADATAENTRY']._serialized_start=1738 + _globals['_WORKFLOWEXECUTION_EXECUTIONMETADATAENTRY']._serialized_end=1806 + _globals['_TASKHISTORY']._serialized_start=2268 + _globals['_TASKHISTORY']._serialized_end=2480 + _globals['_GETTASKREQUEST']._serialized_start=2482 + _globals['_GETTASKREQUEST']._serialized_end=2523 + _globals['_GETTASKHISTORYREQUEST']._serialized_start=2525 + _globals['_GETTASKHISTORYREQUEST']._serialized_end=2573 + _globals['_GETTASKHISTORYRESPONSE']._serialized_start=2575 + _globals['_GETTASKHISTORYRESPONSE']._serialized_end=2661 + _globals['_UPDATETASKSTATUSREQUEST']._serialized_start=2664 + _globals['_UPDATETASKSTATUSREQUEST']._serialized_end=2810 + _globals['_HEARTBEATREQUEST']._serialized_start=2813 + _globals['_HEARTBEATREQUEST']._serialized_end=3027 + _globals['_HEARTBEATRESPONSE']._serialized_start=3029 + _globals['_HEARTBEATRESPONSE']._serialized_end=3048 + _globals['_PULLEVENTSREQUEST']._serialized_start=3050 + _globals['_PULLEVENTSREQUEST']._serialized_end=3069 + _globals['_PULLEVENTSRESPONSE']._serialized_start=3071 + _globals['_PULLEVENTSRESPONSE']._serialized_end=3137 + _globals['_WORKASSIGNMENT']._serialized_start=3139 + _globals['_WORKASSIGNMENT']._serialized_end=3238 + _globals['_GETSTATUSREQUEST']._serialized_start=3240 + _globals['_GETSTATUSREQUEST']._serialized_end=3258 + _globals['_GETSTATUSRESPONSE']._serialized_start=3261 + _globals['_GETSTATUSRESPONSE']._serialized_end=3429 + _globals['_GETSTATUSRESPONSE_STATUSCOUNTSENTRY']._serialized_start=3366 + _globals['_GETSTATUSRESPONSE_STATUSCOUNTSENTRY']._serialized_end=3429 + _globals['_TASKLIST']._serialized_start=3431 + _globals['_TASKLIST']._serialized_end=3479 + _globals['_TASKLISTREQUEST']._serialized_start=3482 + _globals['_TASKLISTREQUEST']._serialized_end=3695 + _globals['_TASKMANAGEMENTSERVICE']._serialized_start=3965 + _globals['_TASKMANAGEMENTSERVICE']._serialized_end=4569 +# @@protoc_insertion_point(module_scope) diff --git a/modules/task.py b/modules/task.py new file mode 100644 index 0000000..439d984 --- /dev/null +++ b/modules/task.py @@ -0,0 +1,21 @@ + +from typing import TypedDict, List +from enum import Enum +from functools import wraps +from modules.cloud.v1.cloud_pb2 import Task + +class TaskType(Enum): + PYTHON = "python" + +class TaskMetadata(TypedDict): + author: str + version: str + +class TaskSpec(TypedDict): + name: str + type: TaskType + description: str + dependencies: List[str] + metadata: TaskMetadata + base_image: str + entrypoint: str diff --git a/modules/validate/validate_pb2.py b/modules/validate/validate_pb2.py new file mode 100644 index 0000000..5181fea --- /dev/null +++ b/modules/validate/validate_pb2.py @@ -0,0 +1,86 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: validate/validate.proto +# Protobuf Python Version: 5.28.2 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 5, + 28, + 2, + '', + 'validate/validate.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.protobuf import descriptor_pb2 as google_dot_protobuf_dot_descriptor__pb2 +from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x17validate/validate.proto\x12\x08validate\x1a google/protobuf/descriptor.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\xc8\x08\n\nFieldRules\x12\x30\n\x07message\x18\x11 \x01(\x0b\x32\x16.validate.MessageRulesR\x07message\x12,\n\x05\x66loat\x18\x01 \x01(\x0b\x32\x14.validate.FloatRulesH\x00R\x05\x66loat\x12/\n\x06\x64ouble\x18\x02 \x01(\x0b\x32\x15.validate.DoubleRulesH\x00R\x06\x64ouble\x12,\n\x05int32\x18\x03 \x01(\x0b\x32\x14.validate.Int32RulesH\x00R\x05int32\x12,\n\x05int64\x18\x04 \x01(\x0b\x32\x14.validate.Int64RulesH\x00R\x05int64\x12/\n\x06uint32\x18\x05 \x01(\x0b\x32\x15.validate.UInt32RulesH\x00R\x06uint32\x12/\n\x06uint64\x18\x06 \x01(\x0b\x32\x15.validate.UInt64RulesH\x00R\x06uint64\x12/\n\x06sint32\x18\x07 \x01(\x0b\x32\x15.validate.SInt32RulesH\x00R\x06sint32\x12/\n\x06sint64\x18\x08 \x01(\x0b\x32\x15.validate.SInt64RulesH\x00R\x06sint64\x12\x32\n\x07\x66ixed32\x18\t \x01(\x0b\x32\x16.validate.Fixed32RulesH\x00R\x07\x66ixed32\x12\x32\n\x07\x66ixed64\x18\n \x01(\x0b\x32\x16.validate.Fixed64RulesH\x00R\x07\x66ixed64\x12\x35\n\x08sfixed32\x18\x0b \x01(\x0b\x32\x17.validate.SFixed32RulesH\x00R\x08sfixed32\x12\x35\n\x08sfixed64\x18\x0c \x01(\x0b\x32\x17.validate.SFixed64RulesH\x00R\x08sfixed64\x12)\n\x04\x62ool\x18\r \x01(\x0b\x32\x13.validate.BoolRulesH\x00R\x04\x62ool\x12/\n\x06string\x18\x0e \x01(\x0b\x32\x15.validate.StringRulesH\x00R\x06string\x12,\n\x05\x62ytes\x18\x0f \x01(\x0b\x32\x14.validate.BytesRulesH\x00R\x05\x62ytes\x12)\n\x04\x65num\x18\x10 \x01(\x0b\x32\x13.validate.EnumRulesH\x00R\x04\x65num\x12\x35\n\x08repeated\x18\x12 \x01(\x0b\x32\x17.validate.RepeatedRulesH\x00R\x08repeated\x12&\n\x03map\x18\x13 \x01(\x0b\x32\x12.validate.MapRulesH\x00R\x03map\x12&\n\x03\x61ny\x18\x14 \x01(\x0b\x32\x12.validate.AnyRulesH\x00R\x03\x61ny\x12\x35\n\x08\x64uration\x18\x15 \x01(\x0b\x32\x17.validate.DurationRulesH\x00R\x08\x64uration\x12\x38\n\ttimestamp\x18\x16 \x01(\x0b\x32\x18.validate.TimestampRulesH\x00R\ttimestampB\x06\n\x04type\"\xb0\x01\n\nFloatRules\x12\x14\n\x05\x63onst\x18\x01 \x01(\x02R\x05\x63onst\x12\x0e\n\x02lt\x18\x02 \x01(\x02R\x02lt\x12\x10\n\x03lte\x18\x03 \x01(\x02R\x03lte\x12\x0e\n\x02gt\x18\x04 \x01(\x02R\x02gt\x12\x10\n\x03gte\x18\x05 \x01(\x02R\x03gte\x12\x0e\n\x02in\x18\x06 \x03(\x02R\x02in\x12\x15\n\x06not_in\x18\x07 \x03(\x02R\x05notIn\x12!\n\x0cignore_empty\x18\x08 \x01(\x08R\x0bignoreEmpty\"\xb1\x01\n\x0b\x44oubleRules\x12\x14\n\x05\x63onst\x18\x01 \x01(\x01R\x05\x63onst\x12\x0e\n\x02lt\x18\x02 \x01(\x01R\x02lt\x12\x10\n\x03lte\x18\x03 \x01(\x01R\x03lte\x12\x0e\n\x02gt\x18\x04 \x01(\x01R\x02gt\x12\x10\n\x03gte\x18\x05 \x01(\x01R\x03gte\x12\x0e\n\x02in\x18\x06 \x03(\x01R\x02in\x12\x15\n\x06not_in\x18\x07 \x03(\x01R\x05notIn\x12!\n\x0cignore_empty\x18\x08 \x01(\x08R\x0bignoreEmpty\"\xb0\x01\n\nInt32Rules\x12\x14\n\x05\x63onst\x18\x01 \x01(\x05R\x05\x63onst\x12\x0e\n\x02lt\x18\x02 \x01(\x05R\x02lt\x12\x10\n\x03lte\x18\x03 \x01(\x05R\x03lte\x12\x0e\n\x02gt\x18\x04 \x01(\x05R\x02gt\x12\x10\n\x03gte\x18\x05 \x01(\x05R\x03gte\x12\x0e\n\x02in\x18\x06 \x03(\x05R\x02in\x12\x15\n\x06not_in\x18\x07 \x03(\x05R\x05notIn\x12!\n\x0cignore_empty\x18\x08 \x01(\x08R\x0bignoreEmpty\"\xb0\x01\n\nInt64Rules\x12\x14\n\x05\x63onst\x18\x01 \x01(\x03R\x05\x63onst\x12\x0e\n\x02lt\x18\x02 \x01(\x03R\x02lt\x12\x10\n\x03lte\x18\x03 \x01(\x03R\x03lte\x12\x0e\n\x02gt\x18\x04 \x01(\x03R\x02gt\x12\x10\n\x03gte\x18\x05 \x01(\x03R\x03gte\x12\x0e\n\x02in\x18\x06 \x03(\x03R\x02in\x12\x15\n\x06not_in\x18\x07 \x03(\x03R\x05notIn\x12!\n\x0cignore_empty\x18\x08 \x01(\x08R\x0bignoreEmpty\"\xb1\x01\n\x0bUInt32Rules\x12\x14\n\x05\x63onst\x18\x01 \x01(\rR\x05\x63onst\x12\x0e\n\x02lt\x18\x02 \x01(\rR\x02lt\x12\x10\n\x03lte\x18\x03 \x01(\rR\x03lte\x12\x0e\n\x02gt\x18\x04 \x01(\rR\x02gt\x12\x10\n\x03gte\x18\x05 \x01(\rR\x03gte\x12\x0e\n\x02in\x18\x06 \x03(\rR\x02in\x12\x15\n\x06not_in\x18\x07 \x03(\rR\x05notIn\x12!\n\x0cignore_empty\x18\x08 \x01(\x08R\x0bignoreEmpty\"\xb1\x01\n\x0bUInt64Rules\x12\x14\n\x05\x63onst\x18\x01 \x01(\x04R\x05\x63onst\x12\x0e\n\x02lt\x18\x02 \x01(\x04R\x02lt\x12\x10\n\x03lte\x18\x03 \x01(\x04R\x03lte\x12\x0e\n\x02gt\x18\x04 \x01(\x04R\x02gt\x12\x10\n\x03gte\x18\x05 \x01(\x04R\x03gte\x12\x0e\n\x02in\x18\x06 \x03(\x04R\x02in\x12\x15\n\x06not_in\x18\x07 \x03(\x04R\x05notIn\x12!\n\x0cignore_empty\x18\x08 \x01(\x08R\x0bignoreEmpty\"\xb1\x01\n\x0bSInt32Rules\x12\x14\n\x05\x63onst\x18\x01 \x01(\x11R\x05\x63onst\x12\x0e\n\x02lt\x18\x02 \x01(\x11R\x02lt\x12\x10\n\x03lte\x18\x03 \x01(\x11R\x03lte\x12\x0e\n\x02gt\x18\x04 \x01(\x11R\x02gt\x12\x10\n\x03gte\x18\x05 \x01(\x11R\x03gte\x12\x0e\n\x02in\x18\x06 \x03(\x11R\x02in\x12\x15\n\x06not_in\x18\x07 \x03(\x11R\x05notIn\x12!\n\x0cignore_empty\x18\x08 \x01(\x08R\x0bignoreEmpty\"\xb1\x01\n\x0bSInt64Rules\x12\x14\n\x05\x63onst\x18\x01 \x01(\x12R\x05\x63onst\x12\x0e\n\x02lt\x18\x02 \x01(\x12R\x02lt\x12\x10\n\x03lte\x18\x03 \x01(\x12R\x03lte\x12\x0e\n\x02gt\x18\x04 \x01(\x12R\x02gt\x12\x10\n\x03gte\x18\x05 \x01(\x12R\x03gte\x12\x0e\n\x02in\x18\x06 \x03(\x12R\x02in\x12\x15\n\x06not_in\x18\x07 \x03(\x12R\x05notIn\x12!\n\x0cignore_empty\x18\x08 \x01(\x08R\x0bignoreEmpty\"\xb2\x01\n\x0c\x46ixed32Rules\x12\x14\n\x05\x63onst\x18\x01 \x01(\x07R\x05\x63onst\x12\x0e\n\x02lt\x18\x02 \x01(\x07R\x02lt\x12\x10\n\x03lte\x18\x03 \x01(\x07R\x03lte\x12\x0e\n\x02gt\x18\x04 \x01(\x07R\x02gt\x12\x10\n\x03gte\x18\x05 \x01(\x07R\x03gte\x12\x0e\n\x02in\x18\x06 \x03(\x07R\x02in\x12\x15\n\x06not_in\x18\x07 \x03(\x07R\x05notIn\x12!\n\x0cignore_empty\x18\x08 \x01(\x08R\x0bignoreEmpty\"\xb2\x01\n\x0c\x46ixed64Rules\x12\x14\n\x05\x63onst\x18\x01 \x01(\x06R\x05\x63onst\x12\x0e\n\x02lt\x18\x02 \x01(\x06R\x02lt\x12\x10\n\x03lte\x18\x03 \x01(\x06R\x03lte\x12\x0e\n\x02gt\x18\x04 \x01(\x06R\x02gt\x12\x10\n\x03gte\x18\x05 \x01(\x06R\x03gte\x12\x0e\n\x02in\x18\x06 \x03(\x06R\x02in\x12\x15\n\x06not_in\x18\x07 \x03(\x06R\x05notIn\x12!\n\x0cignore_empty\x18\x08 \x01(\x08R\x0bignoreEmpty\"\xb3\x01\n\rSFixed32Rules\x12\x14\n\x05\x63onst\x18\x01 \x01(\x0fR\x05\x63onst\x12\x0e\n\x02lt\x18\x02 \x01(\x0fR\x02lt\x12\x10\n\x03lte\x18\x03 \x01(\x0fR\x03lte\x12\x0e\n\x02gt\x18\x04 \x01(\x0fR\x02gt\x12\x10\n\x03gte\x18\x05 \x01(\x0fR\x03gte\x12\x0e\n\x02in\x18\x06 \x03(\x0fR\x02in\x12\x15\n\x06not_in\x18\x07 \x03(\x0fR\x05notIn\x12!\n\x0cignore_empty\x18\x08 \x01(\x08R\x0bignoreEmpty\"\xb3\x01\n\rSFixed64Rules\x12\x14\n\x05\x63onst\x18\x01 \x01(\x10R\x05\x63onst\x12\x0e\n\x02lt\x18\x02 \x01(\x10R\x02lt\x12\x10\n\x03lte\x18\x03 \x01(\x10R\x03lte\x12\x0e\n\x02gt\x18\x04 \x01(\x10R\x02gt\x12\x10\n\x03gte\x18\x05 \x01(\x10R\x03gte\x12\x0e\n\x02in\x18\x06 \x03(\x10R\x02in\x12\x15\n\x06not_in\x18\x07 \x03(\x10R\x05notIn\x12!\n\x0cignore_empty\x18\x08 \x01(\x08R\x0bignoreEmpty\"!\n\tBoolRules\x12\x14\n\x05\x63onst\x18\x01 \x01(\x08R\x05\x63onst\"\xd4\x05\n\x0bStringRules\x12\x14\n\x05\x63onst\x18\x01 \x01(\tR\x05\x63onst\x12\x10\n\x03len\x18\x13 \x01(\x04R\x03len\x12\x17\n\x07min_len\x18\x02 \x01(\x04R\x06minLen\x12\x17\n\x07max_len\x18\x03 \x01(\x04R\x06maxLen\x12\x1b\n\tlen_bytes\x18\x14 \x01(\x04R\x08lenBytes\x12\x1b\n\tmin_bytes\x18\x04 \x01(\x04R\x08minBytes\x12\x1b\n\tmax_bytes\x18\x05 \x01(\x04R\x08maxBytes\x12\x18\n\x07pattern\x18\x06 \x01(\tR\x07pattern\x12\x16\n\x06prefix\x18\x07 \x01(\tR\x06prefix\x12\x16\n\x06suffix\x18\x08 \x01(\tR\x06suffix\x12\x1a\n\x08\x63ontains\x18\t \x01(\tR\x08\x63ontains\x12!\n\x0cnot_contains\x18\x17 \x01(\tR\x0bnotContains\x12\x0e\n\x02in\x18\n \x03(\tR\x02in\x12\x15\n\x06not_in\x18\x0b \x03(\tR\x05notIn\x12\x16\n\x05\x65mail\x18\x0c \x01(\x08H\x00R\x05\x65mail\x12\x1c\n\x08hostname\x18\r \x01(\x08H\x00R\x08hostname\x12\x10\n\x02ip\x18\x0e \x01(\x08H\x00R\x02ip\x12\x14\n\x04ipv4\x18\x0f \x01(\x08H\x00R\x04ipv4\x12\x14\n\x04ipv6\x18\x10 \x01(\x08H\x00R\x04ipv6\x12\x12\n\x03uri\x18\x11 \x01(\x08H\x00R\x03uri\x12\x19\n\x07uri_ref\x18\x12 \x01(\x08H\x00R\x06uriRef\x12\x1a\n\x07\x61\x64\x64ress\x18\x15 \x01(\x08H\x00R\x07\x61\x64\x64ress\x12\x14\n\x04uuid\x18\x16 \x01(\x08H\x00R\x04uuid\x12@\n\x10well_known_regex\x18\x18 \x01(\x0e\x32\x14.validate.KnownRegexH\x00R\x0ewellKnownRegex\x12\x1c\n\x06strict\x18\x19 \x01(\x08:\x04trueR\x06strict\x12!\n\x0cignore_empty\x18\x1a \x01(\x08R\x0bignoreEmptyB\x0c\n\nwell_known\"\xe2\x02\n\nBytesRules\x12\x14\n\x05\x63onst\x18\x01 \x01(\x0cR\x05\x63onst\x12\x10\n\x03len\x18\r \x01(\x04R\x03len\x12\x17\n\x07min_len\x18\x02 \x01(\x04R\x06minLen\x12\x17\n\x07max_len\x18\x03 \x01(\x04R\x06maxLen\x12\x18\n\x07pattern\x18\x04 \x01(\tR\x07pattern\x12\x16\n\x06prefix\x18\x05 \x01(\x0cR\x06prefix\x12\x16\n\x06suffix\x18\x06 \x01(\x0cR\x06suffix\x12\x1a\n\x08\x63ontains\x18\x07 \x01(\x0cR\x08\x63ontains\x12\x0e\n\x02in\x18\x08 \x03(\x0cR\x02in\x12\x15\n\x06not_in\x18\t \x03(\x0cR\x05notIn\x12\x10\n\x02ip\x18\n \x01(\x08H\x00R\x02ip\x12\x14\n\x04ipv4\x18\x0b \x01(\x08H\x00R\x04ipv4\x12\x14\n\x04ipv6\x18\x0c \x01(\x08H\x00R\x04ipv6\x12!\n\x0cignore_empty\x18\x0e \x01(\x08R\x0bignoreEmptyB\x0c\n\nwell_known\"k\n\tEnumRules\x12\x14\n\x05\x63onst\x18\x01 \x01(\x05R\x05\x63onst\x12!\n\x0c\x64\x65\x66ined_only\x18\x02 \x01(\x08R\x0b\x64\x65\x66inedOnly\x12\x0e\n\x02in\x18\x03 \x03(\x05R\x02in\x12\x15\n\x06not_in\x18\x04 \x03(\x05R\x05notIn\">\n\x0cMessageRules\x12\x12\n\x04skip\x18\x01 \x01(\x08R\x04skip\x12\x1a\n\x08required\x18\x02 \x01(\x08R\x08required\"\xb0\x01\n\rRepeatedRules\x12\x1b\n\tmin_items\x18\x01 \x01(\x04R\x08minItems\x12\x1b\n\tmax_items\x18\x02 \x01(\x04R\x08maxItems\x12\x16\n\x06unique\x18\x03 \x01(\x08R\x06unique\x12*\n\x05items\x18\x04 \x01(\x0b\x32\x14.validate.FieldRulesR\x05items\x12!\n\x0cignore_empty\x18\x05 \x01(\x08R\x0bignoreEmpty\"\xdc\x01\n\x08MapRules\x12\x1b\n\tmin_pairs\x18\x01 \x01(\x04R\x08minPairs\x12\x1b\n\tmax_pairs\x18\x02 \x01(\x04R\x08maxPairs\x12\x1b\n\tno_sparse\x18\x03 \x01(\x08R\x08noSparse\x12(\n\x04keys\x18\x04 \x01(\x0b\x32\x14.validate.FieldRulesR\x04keys\x12,\n\x06values\x18\x05 \x01(\x0b\x32\x14.validate.FieldRulesR\x06values\x12!\n\x0cignore_empty\x18\x06 \x01(\x08R\x0bignoreEmpty\"M\n\x08\x41nyRules\x12\x1a\n\x08required\x18\x01 \x01(\x08R\x08required\x12\x0e\n\x02in\x18\x02 \x03(\tR\x02in\x12\x15\n\x06not_in\x18\x03 \x03(\tR\x05notIn\"\xe9\x02\n\rDurationRules\x12\x1a\n\x08required\x18\x01 \x01(\x08R\x08required\x12/\n\x05\x63onst\x18\x02 \x01(\x0b\x32\x19.google.protobuf.DurationR\x05\x63onst\x12)\n\x02lt\x18\x03 \x01(\x0b\x32\x19.google.protobuf.DurationR\x02lt\x12+\n\x03lte\x18\x04 \x01(\x0b\x32\x19.google.protobuf.DurationR\x03lte\x12)\n\x02gt\x18\x05 \x01(\x0b\x32\x19.google.protobuf.DurationR\x02gt\x12+\n\x03gte\x18\x06 \x01(\x0b\x32\x19.google.protobuf.DurationR\x03gte\x12)\n\x02in\x18\x07 \x03(\x0b\x32\x19.google.protobuf.DurationR\x02in\x12\x30\n\x06not_in\x18\x08 \x03(\x0b\x32\x19.google.protobuf.DurationR\x05notIn\"\xf3\x02\n\x0eTimestampRules\x12\x1a\n\x08required\x18\x01 \x01(\x08R\x08required\x12\x30\n\x05\x63onst\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\x05\x63onst\x12*\n\x02lt\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\x02lt\x12,\n\x03lte\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\x03lte\x12*\n\x02gt\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\x02gt\x12,\n\x03gte\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\x03gte\x12\x15\n\x06lt_now\x18\x07 \x01(\x08R\x05ltNow\x12\x15\n\x06gt_now\x18\x08 \x01(\x08R\x05gtNow\x12\x31\n\x06within\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationR\x06within*F\n\nKnownRegex\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x14\n\x10HTTP_HEADER_NAME\x10\x01\x12\x15\n\x11HTTP_HEADER_VALUE\x10\x02:<\n\x08\x64isabled\x12\x1f.google.protobuf.MessageOptions\x18\xaf\x08 \x01(\x08R\x08\x64isabled::\n\x07ignored\x12\x1f.google.protobuf.MessageOptions\x18\xb0\x08 \x01(\x08R\x07ignored::\n\x08required\x12\x1d.google.protobuf.OneofOptions\x18\xaf\x08 \x01(\x08R\x08required:J\n\x05rules\x12\x1d.google.protobuf.FieldOptions\x18\xaf\x08 \x01(\x0b\x32\x14.validate.FieldRulesR\x05rulesB\x91\x01\n\x0c\x63om.validateB\rValidateProtoP\x01Z2github.com/envoyproxy/protoc-gen-validate/validate\xa2\x02\x03VXX\xaa\x02\x08Validate\xca\x02\x08Validate\xe2\x02\x14Validate\\GPBMetadata\xea\x02\x08Validate') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'validate.validate_pb2', _globals) +if not _descriptor._USE_C_DESCRIPTORS: + _globals['DESCRIPTOR']._loaded_options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\014com.validateB\rValidateProtoP\001Z2github.com/envoyproxy/protoc-gen-validate/validate\242\002\003VXX\252\002\010Validate\312\002\010Validate\342\002\024Validate\\GPBMetadata\352\002\010Validate' + _globals['_KNOWNREGEX']._serialized_start=5909 + _globals['_KNOWNREGEX']._serialized_end=5979 + _globals['_FIELDRULES']._serialized_start=137 + _globals['_FIELDRULES']._serialized_end=1233 + _globals['_FLOATRULES']._serialized_start=1236 + _globals['_FLOATRULES']._serialized_end=1412 + _globals['_DOUBLERULES']._serialized_start=1415 + _globals['_DOUBLERULES']._serialized_end=1592 + _globals['_INT32RULES']._serialized_start=1595 + _globals['_INT32RULES']._serialized_end=1771 + _globals['_INT64RULES']._serialized_start=1774 + _globals['_INT64RULES']._serialized_end=1950 + _globals['_UINT32RULES']._serialized_start=1953 + _globals['_UINT32RULES']._serialized_end=2130 + _globals['_UINT64RULES']._serialized_start=2133 + _globals['_UINT64RULES']._serialized_end=2310 + _globals['_SINT32RULES']._serialized_start=2313 + _globals['_SINT32RULES']._serialized_end=2490 + _globals['_SINT64RULES']._serialized_start=2493 + _globals['_SINT64RULES']._serialized_end=2670 + _globals['_FIXED32RULES']._serialized_start=2673 + _globals['_FIXED32RULES']._serialized_end=2851 + _globals['_FIXED64RULES']._serialized_start=2854 + _globals['_FIXED64RULES']._serialized_end=3032 + _globals['_SFIXED32RULES']._serialized_start=3035 + _globals['_SFIXED32RULES']._serialized_end=3214 + _globals['_SFIXED64RULES']._serialized_start=3217 + _globals['_SFIXED64RULES']._serialized_end=3396 + _globals['_BOOLRULES']._serialized_start=3398 + _globals['_BOOLRULES']._serialized_end=3431 + _globals['_STRINGRULES']._serialized_start=3434 + _globals['_STRINGRULES']._serialized_end=4158 + _globals['_BYTESRULES']._serialized_start=4161 + _globals['_BYTESRULES']._serialized_end=4515 + _globals['_ENUMRULES']._serialized_start=4517 + _globals['_ENUMRULES']._serialized_end=4624 + _globals['_MESSAGERULES']._serialized_start=4626 + _globals['_MESSAGERULES']._serialized_end=4688 + _globals['_REPEATEDRULES']._serialized_start=4691 + _globals['_REPEATEDRULES']._serialized_end=4867 + _globals['_MAPRULES']._serialized_start=4870 + _globals['_MAPRULES']._serialized_end=5090 + _globals['_ANYRULES']._serialized_start=5092 + _globals['_ANYRULES']._serialized_end=5169 + _globals['_DURATIONRULES']._serialized_start=5172 + _globals['_DURATIONRULES']._serialized_end=5533 + _globals['_TIMESTAMPRULES']._serialized_start=5536 + _globals['_TIMESTAMPRULES']._serialized_end=5907 +# @@protoc_insertion_point(module_scope) diff --git a/modules/workflow.py b/modules/workflow.py new file mode 100644 index 0000000..53a2e55 --- /dev/null +++ b/modules/workflow.py @@ -0,0 +1,23 @@ + +from typing import TypedDict, List, Dict +from enum import Enum +from functools import wraps +from modules.cloud.v1.cloud_pb2 import Workflow + +class WorkflowType(Enum): + PYTHON = "python" + +class WorkflowMetadata(TypedDict): + author: str + version: str + +class WorkflowSpec(TypedDict): + name: str + type: WorkflowType + description: str + dependencies: List[str] + metadata: WorkflowMetadata + base_image: str + entrypoint: str + args: List[str] + env: Dict[str, str] diff --git a/pkg/gen/cloud/v1/cloud.pb.go b/pkg/gen/cloud/v1/cloud.pb.go index fe53e14..2ef98be 100644 --- a/pkg/gen/cloud/v1/cloud.pb.go +++ b/pkg/gen/cloud/v1/cloud.pb.go @@ -11,6 +11,7 @@ import ( protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" emptypb "google.golang.org/protobuf/types/known/emptypb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" reflect "reflect" sync "sync" ) @@ -81,6 +82,62 @@ func (TaskStatusEnum) EnumDescriptor() ([]byte, []int) { return file_cloud_v1_cloud_proto_rawDescGZIP(), []int{0} } +// ExecutionStatus represents the current state of a task or workflow execution +type ExecutionStatus int32 + +const ( + ExecutionStatus_EXECUTION_STATUS_UNSPECIFIED ExecutionStatus = 0 + ExecutionStatus_EXECUTION_STATUS_PENDING ExecutionStatus = 1 + ExecutionStatus_EXECUTION_STATUS_RUNNING ExecutionStatus = 2 + ExecutionStatus_EXECUTION_STATUS_COMPLETED ExecutionStatus = 3 + ExecutionStatus_EXECUTION_STATUS_FAILED ExecutionStatus = 4 +) + +// Enum value maps for ExecutionStatus. +var ( + ExecutionStatus_name = map[int32]string{ + 0: "EXECUTION_STATUS_UNSPECIFIED", + 1: "EXECUTION_STATUS_PENDING", + 2: "EXECUTION_STATUS_RUNNING", + 3: "EXECUTION_STATUS_COMPLETED", + 4: "EXECUTION_STATUS_FAILED", + } + ExecutionStatus_value = map[string]int32{ + "EXECUTION_STATUS_UNSPECIFIED": 0, + "EXECUTION_STATUS_PENDING": 1, + "EXECUTION_STATUS_RUNNING": 2, + "EXECUTION_STATUS_COMPLETED": 3, + "EXECUTION_STATUS_FAILED": 4, + } +) + +func (x ExecutionStatus) Enum() *ExecutionStatus { + p := new(ExecutionStatus) + *p = x + return p +} + +func (x ExecutionStatus) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ExecutionStatus) Descriptor() protoreflect.EnumDescriptor { + return file_cloud_v1_cloud_proto_enumTypes[1].Descriptor() +} + +func (ExecutionStatus) Type() protoreflect.EnumType { + return &file_cloud_v1_cloud_proto_enumTypes[1] +} + +func (x ExecutionStatus) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ExecutionStatus.Descriptor instead. +func (ExecutionStatus) EnumDescriptor() ([]byte, []int) { + return file_cloud_v1_cloud_proto_rawDescGZIP(), []int{1} +} + // Message for Task Payload type Payload struct { state protoimpl.MessageState @@ -283,7 +340,12 @@ type Task struct { // Payload containing task parameters. This field is required. Payload *Payload `protobuf:"bytes,8,opt,name=payload,proto3" json:"payload,omitempty"` // Description of the task. A large text string with a maximum length of 5000 characters. - Description string `protobuf:"bytes,9,opt,name=description,proto3" json:"description,omitempty"` + Description string `protobuf:"bytes,9,opt,name=description,proto3" json:"description,omitempty"` + Dependencies []string `protobuf:"bytes,10,rep,name=dependencies,proto3" json:"dependencies,omitempty"` // IDs of tasks that must complete before this task + BaseImage string `protobuf:"bytes,11,opt,name=base_image,json=baseImage,proto3" json:"base_image,omitempty"` + Entrypoint string `protobuf:"bytes,12,opt,name=entrypoint,proto3" json:"entrypoint,omitempty"` + Args []string `protobuf:"bytes,13,rep,name=args,proto3" json:"args,omitempty"` + Env map[string]string `protobuf:"bytes,14,rep,name=env,proto3" json:"env,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *Task) Reset() { @@ -379,6 +441,283 @@ func (x *Task) GetDescription() string { return "" } +func (x *Task) GetDependencies() []string { + if x != nil { + return x.Dependencies + } + return nil +} + +func (x *Task) GetBaseImage() string { + if x != nil { + return x.BaseImage + } + return "" +} + +func (x *Task) GetEntrypoint() string { + if x != nil { + return x.Entrypoint + } + return "" +} + +func (x *Task) GetArgs() []string { + if x != nil { + return x.Args + } + return nil +} + +func (x *Task) GetEnv() map[string]string { + if x != nil { + return x.Env + } + return nil +} + +// Workflow represents a collection of tasks organized in a DAG +type Workflow struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + Tasks []*Task `protobuf:"bytes,4,rep,name=tasks,proto3" json:"tasks,omitempty"` + Metadata map[string]string `protobuf:"bytes,5,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *Workflow) Reset() { + *x = Workflow{} + mi := &file_cloud_v1_cloud_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Workflow) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Workflow) ProtoMessage() {} + +func (x *Workflow) ProtoReflect() protoreflect.Message { + mi := &file_cloud_v1_cloud_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Workflow.ProtoReflect.Descriptor instead. +func (*Workflow) Descriptor() ([]byte, []int) { + return file_cloud_v1_cloud_proto_rawDescGZIP(), []int{4} +} + +func (x *Workflow) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *Workflow) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Workflow) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Workflow) GetTasks() []*Task { + if x != nil { + return x.Tasks + } + return nil +} + +func (x *Workflow) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +// TaskExecution represents the execution of a task +type TaskExecution struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TaskId string `protobuf:"bytes,1,opt,name=task_id,json=taskId,proto3" json:"task_id,omitempty"` + Status ExecutionStatus `protobuf:"varint,2,opt,name=status,proto3,enum=cloud.v1.ExecutionStatus" json:"status,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + ExecutionMetadata map[string]string `protobuf:"bytes,5,rep,name=execution_metadata,json=executionMetadata,proto3" json:"execution_metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *TaskExecution) Reset() { + *x = TaskExecution{} + mi := &file_cloud_v1_cloud_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *TaskExecution) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TaskExecution) ProtoMessage() {} + +func (x *TaskExecution) ProtoReflect() protoreflect.Message { + mi := &file_cloud_v1_cloud_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TaskExecution.ProtoReflect.Descriptor instead. +func (*TaskExecution) Descriptor() ([]byte, []int) { + return file_cloud_v1_cloud_proto_rawDescGZIP(), []int{5} +} + +func (x *TaskExecution) GetTaskId() string { + if x != nil { + return x.TaskId + } + return "" +} + +func (x *TaskExecution) GetStatus() ExecutionStatus { + if x != nil { + return x.Status + } + return ExecutionStatus_EXECUTION_STATUS_UNSPECIFIED +} + +func (x *TaskExecution) GetCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.CreatedAt + } + return nil +} + +func (x *TaskExecution) GetUpdatedAt() *timestamppb.Timestamp { + if x != nil { + return x.UpdatedAt + } + return nil +} + +func (x *TaskExecution) GetExecutionMetadata() map[string]string { + if x != nil { + return x.ExecutionMetadata + } + return nil +} + +// WorkflowExecution represents the execution of a workflow +type WorkflowExecution struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + WorkflowId string `protobuf:"bytes,1,opt,name=workflow_id,json=workflowId,proto3" json:"workflow_id,omitempty"` + Status ExecutionStatus `protobuf:"varint,2,opt,name=status,proto3,enum=cloud.v1.ExecutionStatus" json:"status,omitempty"` + TaskExecutions []*TaskExecution `protobuf:"bytes,3,rep,name=task_executions,json=taskExecutions,proto3" json:"task_executions,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + ExecutionMetadata map[string]string `protobuf:"bytes,6,rep,name=execution_metadata,json=executionMetadata,proto3" json:"execution_metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *WorkflowExecution) Reset() { + *x = WorkflowExecution{} + mi := &file_cloud_v1_cloud_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *WorkflowExecution) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WorkflowExecution) ProtoMessage() {} + +func (x *WorkflowExecution) ProtoReflect() protoreflect.Message { + mi := &file_cloud_v1_cloud_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use WorkflowExecution.ProtoReflect.Descriptor instead. +func (*WorkflowExecution) Descriptor() ([]byte, []int) { + return file_cloud_v1_cloud_proto_rawDescGZIP(), []int{6} +} + +func (x *WorkflowExecution) GetWorkflowId() string { + if x != nil { + return x.WorkflowId + } + return "" +} + +func (x *WorkflowExecution) GetStatus() ExecutionStatus { + if x != nil { + return x.Status + } + return ExecutionStatus_EXECUTION_STATUS_UNSPECIFIED +} + +func (x *WorkflowExecution) GetTaskExecutions() []*TaskExecution { + if x != nil { + return x.TaskExecutions + } + return nil +} + +func (x *WorkflowExecution) GetCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.CreatedAt + } + return nil +} + +func (x *WorkflowExecution) GetUpdatedAt() *timestamppb.Timestamp { + if x != nil { + return x.UpdatedAt + } + return nil +} + +func (x *WorkflowExecution) GetExecutionMetadata() map[string]string { + if x != nil { + return x.ExecutionMetadata + } + return nil +} + // Message for Task history type TaskHistory struct { state protoimpl.MessageState @@ -398,7 +737,7 @@ type TaskHistory struct { func (x *TaskHistory) Reset() { *x = TaskHistory{} - mi := &file_cloud_v1_cloud_proto_msgTypes[4] + mi := &file_cloud_v1_cloud_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -410,7 +749,7 @@ func (x *TaskHistory) String() string { func (*TaskHistory) ProtoMessage() {} func (x *TaskHistory) ProtoReflect() protoreflect.Message { - mi := &file_cloud_v1_cloud_proto_msgTypes[4] + mi := &file_cloud_v1_cloud_proto_msgTypes[7] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -423,7 +762,7 @@ func (x *TaskHistory) ProtoReflect() protoreflect.Message { // Deprecated: Use TaskHistory.ProtoReflect.Descriptor instead. func (*TaskHistory) Descriptor() ([]byte, []int) { - return file_cloud_v1_cloud_proto_rawDescGZIP(), []int{4} + return file_cloud_v1_cloud_proto_rawDescGZIP(), []int{7} } func (x *TaskHistory) GetId() int32 { @@ -466,7 +805,7 @@ type GetTaskRequest struct { func (x *GetTaskRequest) Reset() { *x = GetTaskRequest{} - mi := &file_cloud_v1_cloud_proto_msgTypes[5] + mi := &file_cloud_v1_cloud_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -478,7 +817,7 @@ func (x *GetTaskRequest) String() string { func (*GetTaskRequest) ProtoMessage() {} func (x *GetTaskRequest) ProtoReflect() protoreflect.Message { - mi := &file_cloud_v1_cloud_proto_msgTypes[5] + mi := &file_cloud_v1_cloud_proto_msgTypes[8] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -491,7 +830,7 @@ func (x *GetTaskRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTaskRequest.ProtoReflect.Descriptor instead. func (*GetTaskRequest) Descriptor() ([]byte, []int) { - return file_cloud_v1_cloud_proto_rawDescGZIP(), []int{5} + return file_cloud_v1_cloud_proto_rawDescGZIP(), []int{8} } func (x *GetTaskRequest) GetId() int32 { @@ -513,7 +852,7 @@ type GetTaskHistoryRequest struct { func (x *GetTaskHistoryRequest) Reset() { *x = GetTaskHistoryRequest{} - mi := &file_cloud_v1_cloud_proto_msgTypes[6] + mi := &file_cloud_v1_cloud_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -525,7 +864,7 @@ func (x *GetTaskHistoryRequest) String() string { func (*GetTaskHistoryRequest) ProtoMessage() {} func (x *GetTaskHistoryRequest) ProtoReflect() protoreflect.Message { - mi := &file_cloud_v1_cloud_proto_msgTypes[6] + mi := &file_cloud_v1_cloud_proto_msgTypes[9] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -538,7 +877,7 @@ func (x *GetTaskHistoryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTaskHistoryRequest.ProtoReflect.Descriptor instead. func (*GetTaskHistoryRequest) Descriptor() ([]byte, []int) { - return file_cloud_v1_cloud_proto_rawDescGZIP(), []int{6} + return file_cloud_v1_cloud_proto_rawDescGZIP(), []int{9} } func (x *GetTaskHistoryRequest) GetId() int32 { @@ -561,7 +900,7 @@ type GetTaskHistoryResponse struct { func (x *GetTaskHistoryResponse) Reset() { *x = GetTaskHistoryResponse{} - mi := &file_cloud_v1_cloud_proto_msgTypes[7] + mi := &file_cloud_v1_cloud_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -573,7 +912,7 @@ func (x *GetTaskHistoryResponse) String() string { func (*GetTaskHistoryResponse) ProtoMessage() {} func (x *GetTaskHistoryResponse) ProtoReflect() protoreflect.Message { - mi := &file_cloud_v1_cloud_proto_msgTypes[7] + mi := &file_cloud_v1_cloud_proto_msgTypes[10] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -586,7 +925,7 @@ func (x *GetTaskHistoryResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTaskHistoryResponse.ProtoReflect.Descriptor instead. func (*GetTaskHistoryResponse) Descriptor() ([]byte, []int) { - return file_cloud_v1_cloud_proto_rawDescGZIP(), []int{7} + return file_cloud_v1_cloud_proto_rawDescGZIP(), []int{10} } func (x *GetTaskHistoryResponse) GetHistory() []*TaskHistory { @@ -612,7 +951,7 @@ type UpdateTaskStatusRequest struct { func (x *UpdateTaskStatusRequest) Reset() { *x = UpdateTaskStatusRequest{} - mi := &file_cloud_v1_cloud_proto_msgTypes[8] + mi := &file_cloud_v1_cloud_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -624,7 +963,7 @@ func (x *UpdateTaskStatusRequest) String() string { func (*UpdateTaskStatusRequest) ProtoMessage() {} func (x *UpdateTaskStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_cloud_v1_cloud_proto_msgTypes[8] + mi := &file_cloud_v1_cloud_proto_msgTypes[11] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -637,7 +976,7 @@ func (x *UpdateTaskStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateTaskStatusRequest.ProtoReflect.Descriptor instead. func (*UpdateTaskStatusRequest) Descriptor() ([]byte, []int) { - return file_cloud_v1_cloud_proto_rawDescGZIP(), []int{8} + return file_cloud_v1_cloud_proto_rawDescGZIP(), []int{11} } func (x *UpdateTaskStatusRequest) GetId() int32 { @@ -676,7 +1015,7 @@ type HeartbeatRequest struct { func (x *HeartbeatRequest) Reset() { *x = HeartbeatRequest{} - mi := &file_cloud_v1_cloud_proto_msgTypes[9] + mi := &file_cloud_v1_cloud_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -688,7 +1027,7 @@ func (x *HeartbeatRequest) String() string { func (*HeartbeatRequest) ProtoMessage() {} func (x *HeartbeatRequest) ProtoReflect() protoreflect.Message { - mi := &file_cloud_v1_cloud_proto_msgTypes[9] + mi := &file_cloud_v1_cloud_proto_msgTypes[12] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -701,7 +1040,7 @@ func (x *HeartbeatRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use HeartbeatRequest.ProtoReflect.Descriptor instead. func (*HeartbeatRequest) Descriptor() ([]byte, []int) { - return file_cloud_v1_cloud_proto_rawDescGZIP(), []int{9} + return file_cloud_v1_cloud_proto_rawDescGZIP(), []int{12} } func (x *HeartbeatRequest) GetTimestamp() string { @@ -726,7 +1065,7 @@ type HeartbeatResponse struct { func (x *HeartbeatResponse) Reset() { *x = HeartbeatResponse{} - mi := &file_cloud_v1_cloud_proto_msgTypes[10] + mi := &file_cloud_v1_cloud_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -738,7 +1077,7 @@ func (x *HeartbeatResponse) String() string { func (*HeartbeatResponse) ProtoMessage() {} func (x *HeartbeatResponse) ProtoReflect() protoreflect.Message { - mi := &file_cloud_v1_cloud_proto_msgTypes[10] + mi := &file_cloud_v1_cloud_proto_msgTypes[13] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -751,7 +1090,7 @@ func (x *HeartbeatResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use HeartbeatResponse.ProtoReflect.Descriptor instead. func (*HeartbeatResponse) Descriptor() ([]byte, []int) { - return file_cloud_v1_cloud_proto_rawDescGZIP(), []int{10} + return file_cloud_v1_cloud_proto_rawDescGZIP(), []int{13} } // Message for stream requests @@ -763,7 +1102,7 @@ type PullEventsRequest struct { func (x *PullEventsRequest) Reset() { *x = PullEventsRequest{} - mi := &file_cloud_v1_cloud_proto_msgTypes[11] + mi := &file_cloud_v1_cloud_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -775,7 +1114,7 @@ func (x *PullEventsRequest) String() string { func (*PullEventsRequest) ProtoMessage() {} func (x *PullEventsRequest) ProtoReflect() protoreflect.Message { - mi := &file_cloud_v1_cloud_proto_msgTypes[11] + mi := &file_cloud_v1_cloud_proto_msgTypes[14] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -788,7 +1127,7 @@ func (x *PullEventsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PullEventsRequest.ProtoReflect.Descriptor instead. func (*PullEventsRequest) Descriptor() ([]byte, []int) { - return file_cloud_v1_cloud_proto_rawDescGZIP(), []int{11} + return file_cloud_v1_cloud_proto_rawDescGZIP(), []int{14} } // Message for stream responses @@ -803,7 +1142,7 @@ type PullEventsResponse struct { func (x *PullEventsResponse) Reset() { *x = PullEventsResponse{} - mi := &file_cloud_v1_cloud_proto_msgTypes[12] + mi := &file_cloud_v1_cloud_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -815,7 +1154,7 @@ func (x *PullEventsResponse) String() string { func (*PullEventsResponse) ProtoMessage() {} func (x *PullEventsResponse) ProtoReflect() protoreflect.Message { - mi := &file_cloud_v1_cloud_proto_msgTypes[12] + mi := &file_cloud_v1_cloud_proto_msgTypes[15] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -828,7 +1167,7 @@ func (x *PullEventsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PullEventsResponse.ProtoReflect.Descriptor instead. func (*PullEventsResponse) Descriptor() ([]byte, []int) { - return file_cloud_v1_cloud_proto_rawDescGZIP(), []int{12} + return file_cloud_v1_cloud_proto_rawDescGZIP(), []int{15} } func (x *PullEventsResponse) GetWork() *WorkAssignment { @@ -852,7 +1191,7 @@ type WorkAssignment struct { func (x *WorkAssignment) Reset() { *x = WorkAssignment{} - mi := &file_cloud_v1_cloud_proto_msgTypes[13] + mi := &file_cloud_v1_cloud_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -864,7 +1203,7 @@ func (x *WorkAssignment) String() string { func (*WorkAssignment) ProtoMessage() {} func (x *WorkAssignment) ProtoReflect() protoreflect.Message { - mi := &file_cloud_v1_cloud_proto_msgTypes[13] + mi := &file_cloud_v1_cloud_proto_msgTypes[16] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -877,7 +1216,7 @@ func (x *WorkAssignment) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkAssignment.ProtoReflect.Descriptor instead. func (*WorkAssignment) Descriptor() ([]byte, []int) { - return file_cloud_v1_cloud_proto_rawDescGZIP(), []int{13} + return file_cloud_v1_cloud_proto_rawDescGZIP(), []int{16} } func (x *WorkAssignment) GetAssignmentId() int64 { @@ -903,7 +1242,7 @@ type GetStatusRequest struct { func (x *GetStatusRequest) Reset() { *x = GetStatusRequest{} - mi := &file_cloud_v1_cloud_proto_msgTypes[14] + mi := &file_cloud_v1_cloud_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -915,7 +1254,7 @@ func (x *GetStatusRequest) String() string { func (*GetStatusRequest) ProtoMessage() {} func (x *GetStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_cloud_v1_cloud_proto_msgTypes[14] + mi := &file_cloud_v1_cloud_proto_msgTypes[17] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -928,7 +1267,7 @@ func (x *GetStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetStatusRequest.ProtoReflect.Descriptor instead. func (*GetStatusRequest) Descriptor() ([]byte, []int) { - return file_cloud_v1_cloud_proto_rawDescGZIP(), []int{14} + return file_cloud_v1_cloud_proto_rawDescGZIP(), []int{17} } // Message for GetStatus response @@ -943,7 +1282,7 @@ type GetStatusResponse struct { func (x *GetStatusResponse) Reset() { *x = GetStatusResponse{} - mi := &file_cloud_v1_cloud_proto_msgTypes[15] + mi := &file_cloud_v1_cloud_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -955,7 +1294,7 @@ func (x *GetStatusResponse) String() string { func (*GetStatusResponse) ProtoMessage() {} func (x *GetStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_cloud_v1_cloud_proto_msgTypes[15] + mi := &file_cloud_v1_cloud_proto_msgTypes[18] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -968,7 +1307,7 @@ func (x *GetStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetStatusResponse.ProtoReflect.Descriptor instead. func (*GetStatusResponse) Descriptor() ([]byte, []int) { - return file_cloud_v1_cloud_proto_rawDescGZIP(), []int{15} + return file_cloud_v1_cloud_proto_rawDescGZIP(), []int{18} } func (x *GetStatusResponse) GetStatusCounts() map[int32]int64 { @@ -989,7 +1328,7 @@ type TaskList struct { func (x *TaskList) Reset() { *x = TaskList{} - mi := &file_cloud_v1_cloud_proto_msgTypes[16] + mi := &file_cloud_v1_cloud_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1001,7 +1340,7 @@ func (x *TaskList) String() string { func (*TaskList) ProtoMessage() {} func (x *TaskList) ProtoReflect() protoreflect.Message { - mi := &file_cloud_v1_cloud_proto_msgTypes[16] + mi := &file_cloud_v1_cloud_proto_msgTypes[19] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1014,7 +1353,7 @@ func (x *TaskList) ProtoReflect() protoreflect.Message { // Deprecated: Use TaskList.ProtoReflect.Descriptor instead. func (*TaskList) Descriptor() ([]byte, []int) { - return file_cloud_v1_cloud_proto_rawDescGZIP(), []int{16} + return file_cloud_v1_cloud_proto_rawDescGZIP(), []int{19} } func (x *TaskList) GetTasks() []*Task { @@ -1045,7 +1384,7 @@ type TaskListRequest struct { func (x *TaskListRequest) Reset() { *x = TaskListRequest{} - mi := &file_cloud_v1_cloud_proto_msgTypes[17] + mi := &file_cloud_v1_cloud_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1057,7 +1396,7 @@ func (x *TaskListRequest) String() string { func (*TaskListRequest) ProtoMessage() {} func (x *TaskListRequest) ProtoReflect() protoreflect.Message { - mi := &file_cloud_v1_cloud_proto_msgTypes[17] + mi := &file_cloud_v1_cloud_proto_msgTypes[20] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1070,7 +1409,7 @@ func (x *TaskListRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TaskListRequest.ProtoReflect.Descriptor instead. func (*TaskListRequest) Descriptor() ([]byte, []int) { - return file_cloud_v1_cloud_proto_rawDescGZIP(), []int{17} + return file_cloud_v1_cloud_proto_rawDescGZIP(), []int{20} } func (x *TaskListRequest) GetLimit() int32 { @@ -1109,201 +1448,295 @@ var file_cloud_v1_cloud_proto_rawDesc = []byte{ 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb0, 0x01, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, - 0x61, 0x64, 0x12, 0x66, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, - 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, - 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x23, 0xfa, 0x42, 0x20, 0x9a, 0x01, - 0x1d, 0x22, 0x14, 0x72, 0x12, 0x32, 0x10, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, - 0x2d, 0x39, 0x5f, 0x2d, 0x5d, 0x2b, 0x24, 0x2a, 0x05, 0x72, 0x03, 0x18, 0x80, 0x08, 0x52, 0x0a, - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb0, 0x01, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, + 0x6f, 0x61, 0x64, 0x12, 0x66, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, + 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x23, 0xfa, 0x42, 0x20, 0x9a, + 0x01, 0x1d, 0x22, 0x14, 0x72, 0x12, 0x32, 0x10, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, + 0x30, 0x2d, 0x39, 0x5f, 0x2d, 0x5d, 0x2b, 0x24, 0x2a, 0x05, 0x72, 0x03, 0x18, 0x80, 0x08, 0x52, + 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc4, 0x01, 0x0a, 0x11, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x2e, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x1a, + 0xfa, 0x42, 0x17, 0x72, 0x15, 0x18, 0xff, 0x01, 0x32, 0x10, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x41, + 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5f, 0x2d, 0x5d, 0x2b, 0x24, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x1c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, + 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x35, + 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, + 0x61, 0x64, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x07, 0x70, 0x61, + 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x2a, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, + 0x03, 0x18, 0x88, 0x27, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x2d, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x1a, 0x02, 0x28, 0x00, 0x52, 0x02, 0x69, 0x64, + 0x22, 0xfe, 0x04, 0x0a, 0x04, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x1a, 0x02, 0x28, 0x00, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x2e, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x1a, 0xfa, 0x42, 0x17, 0x72, 0x15, 0x18, 0xff, 0x01, 0x32, 0x10, 0x5e, 0x5b, 0x61, 0x2d, + 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5f, 0x2d, 0x5d, 0x2b, 0x24, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x3a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x73, 0x6b, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x45, 0x6e, 0x75, 0x6d, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, + 0x01, 0x02, 0x10, 0x01, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x23, 0x0a, 0x07, + 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x42, 0x09, 0xfa, + 0x42, 0x06, 0x1a, 0x04, 0x18, 0x0a, 0x28, 0x00, 0x52, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x12, 0x23, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x05, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x1a, 0x02, 0x28, 0x00, 0x52, 0x08, 0x70, 0x72, + 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2d, 0xfa, 0x42, 0x2a, 0x72, + 0x28, 0x32, 0x26, 0x5e, 0x5c, 0x64, 0x7b, 0x34, 0x7d, 0x2d, 0x5c, 0x64, 0x7b, 0x32, 0x7d, 0x2d, + 0x5c, 0x64, 0x7b, 0x32, 0x7d, 0x54, 0x5c, 0x64, 0x7b, 0x32, 0x7d, 0x3a, 0x5c, 0x64, 0x7b, 0x32, + 0x7d, 0x3a, 0x5c, 0x64, 0x7b, 0x32, 0x7d, 0x5a, 0x24, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x41, 0x74, 0x12, 0x35, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, + 0x10, 0x01, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x2a, 0x0a, 0x0b, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x18, 0x88, 0x27, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x70, 0x65, 0x6e, + 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x64, + 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x62, + 0x61, 0x73, 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x62, 0x61, 0x73, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x6e, + 0x74, 0x72, 0x79, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x65, 0x6e, 0x74, 0x72, 0x79, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x72, + 0x67, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x12, 0x29, + 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, + 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x2e, 0x45, 0x6e, 0x76, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x1a, 0x36, 0x0a, 0x08, 0x45, 0x6e, 0x76, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0xf1, 0x01, 0x0a, 0x08, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x54, + 0x61, 0x73, 0x6b, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x08, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x63, + 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xf6, 0x02, 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, + 0x12, 0x31, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, + 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x5d, 0x0a, 0x12, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, + 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x44, 0x0a, 0x16, 0x45, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc8, + 0x03, 0x0a, 0x11, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x45, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x49, 0x64, 0x12, 0x31, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, + 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x40, 0x0a, 0x0f, 0x74, 0x61, 0x73, 0x6b, + 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x73, + 0x6b, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x74, 0x61, 0x73, 0x6b, + 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, + 0x12, 0x61, 0x0a, 0x12, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x63, + 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x11, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x1a, 0x44, 0x0a, 0x16, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc4, 0x01, 0x0a, 0x11, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x2e, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x1a, 0xfa, - 0x42, 0x17, 0x72, 0x15, 0x18, 0xff, 0x01, 0x32, 0x10, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, - 0x5a, 0x30, 0x2d, 0x39, 0x5f, 0x2d, 0x5d, 0x2b, 0x24, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x1c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, - 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x35, 0x0a, - 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, - 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, - 0x64, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x07, 0x70, 0x61, 0x79, - 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x2a, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, 0x03, - 0x18, 0x88, 0x27, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x22, 0x2d, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x1a, 0x02, 0x28, 0x00, 0x52, 0x02, 0x69, 0x64, 0x22, - 0xa4, 0x03, 0x0a, 0x04, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x1a, 0x02, 0x28, 0x00, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x2e, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x1a, 0xfa, 0x42, 0x17, 0x72, 0x15, 0x18, 0xff, 0x01, 0x32, 0x10, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, - 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5f, 0x2d, 0x5d, 0x2b, 0x24, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x1c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, - 0x3a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x18, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x45, 0x6e, 0x75, 0x6d, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, - 0x02, 0x10, 0x01, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x23, 0x0a, 0x07, 0x72, - 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x42, 0x09, 0xfa, 0x42, - 0x06, 0x1a, 0x04, 0x18, 0x0a, 0x28, 0x00, 0x52, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x12, 0x23, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x05, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x1a, 0x02, 0x28, 0x00, 0x52, 0x08, 0x70, 0x72, 0x69, - 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2d, 0xfa, 0x42, 0x2a, 0x72, 0x28, - 0x32, 0x26, 0x5e, 0x5c, 0x64, 0x7b, 0x34, 0x7d, 0x2d, 0x5c, 0x64, 0x7b, 0x32, 0x7d, 0x2d, 0x5c, - 0x64, 0x7b, 0x32, 0x7d, 0x54, 0x5c, 0x64, 0x7b, 0x32, 0x7d, 0x3a, 0x5c, 0x64, 0x7b, 0x32, 0x7d, - 0x3a, 0x5c, 0x64, 0x7b, 0x32, 0x7d, 0x5a, 0x24, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x41, 0x74, 0x12, 0x35, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, 0x2e, - 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, - 0x01, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x2a, 0x0a, 0x0b, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x08, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x18, 0x88, 0x27, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xd4, 0x01, 0x0a, 0x0b, 0x54, 0x61, 0x73, 0x6b, 0x48, - 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x1a, 0x02, 0x28, 0x00, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x3a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x18, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x45, 0x6e, 0x75, 0x6d, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, - 0x02, 0x10, 0x01, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4c, 0x0a, 0x0a, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x2d, 0xfa, 0x42, 0x2a, 0x72, 0x28, 0x32, 0x26, 0x5e, 0x5c, 0x64, 0x7b, 0x34, 0x7d, 0x2d, 0x5c, - 0x64, 0x7b, 0x32, 0x7d, 0x2d, 0x5c, 0x64, 0x7b, 0x32, 0x7d, 0x54, 0x5c, 0x64, 0x7b, 0x32, 0x7d, - 0x3a, 0x5c, 0x64, 0x7b, 0x32, 0x7d, 0x3a, 0x5c, 0x64, 0x7b, 0x32, 0x7d, 0x5a, 0x24, 0x52, 0x09, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x22, 0x0a, 0x07, 0x64, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, - 0x03, 0x18, 0xd0, 0x0f, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x29, 0x0a, - 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x42, 0x07, 0xfa, 0x42, 0x04, - 0x1a, 0x02, 0x28, 0x00, 0x52, 0x02, 0x69, 0x64, 0x22, 0x30, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x54, - 0x61, 0x73, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd4, 0x01, 0x0a, 0x0b, 0x54, 0x61, + 0x73, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x1a, 0x02, 0x28, 0x00, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x3a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, + 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x45, 0x6e, 0x75, 0x6d, 0x42, 0x08, 0xfa, 0x42, + 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4c, + 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x2d, 0xfa, 0x42, 0x2a, 0x72, 0x28, 0x32, 0x26, 0x5e, 0x5c, 0x64, 0x7b, 0x34, + 0x7d, 0x2d, 0x5c, 0x64, 0x7b, 0x32, 0x7d, 0x2d, 0x5c, 0x64, 0x7b, 0x32, 0x7d, 0x54, 0x5c, 0x64, + 0x7b, 0x32, 0x7d, 0x3a, 0x5c, 0x64, 0x7b, 0x32, 0x7d, 0x3a, 0x5c, 0x64, 0x7b, 0x32, 0x7d, 0x5a, + 0x24, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x22, 0x0a, 0x07, + 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, + 0x42, 0x05, 0x72, 0x03, 0x18, 0xd0, 0x0f, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x22, 0x29, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x42, 0x07, + 0xfa, 0x42, 0x04, 0x1a, 0x02, 0x28, 0x00, 0x52, 0x02, 0x69, 0x64, 0x22, 0x30, 0x0a, 0x15, 0x47, + 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x42, 0x07, 0xfa, 0x42, 0x04, 0x1a, 0x02, 0x28, 0x00, 0x52, 0x02, 0x69, 0x64, 0x22, 0x56, 0x0a, + 0x16, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x07, 0x68, 0x69, 0x73, 0x74, 0x6f, + 0x72, 0x79, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, + 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x42, + 0x0b, 0xfa, 0x42, 0x08, 0x92, 0x01, 0x05, 0x08, 0x01, 0x10, 0xe8, 0x07, 0x52, 0x07, 0x68, 0x69, + 0x73, 0x74, 0x6f, 0x72, 0x79, 0x22, 0x92, 0x01, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x42, 0x07, 0xfa, - 0x42, 0x04, 0x1a, 0x02, 0x28, 0x00, 0x52, 0x02, 0x69, 0x64, 0x22, 0x56, 0x0a, 0x16, 0x47, 0x65, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x07, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, - 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x0b, 0xfa, 0x42, - 0x08, 0x92, 0x01, 0x05, 0x08, 0x01, 0x10, 0xe8, 0x07, 0x52, 0x07, 0x68, 0x69, 0x73, 0x74, 0x6f, - 0x72, 0x79, 0x22, 0x92, 0x01, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, - 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x1a, - 0x02, 0x28, 0x00, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, - 0x76, 0x31, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x45, 0x6e, 0x75, - 0x6d, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x22, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x18, 0xd0, 0x0f, 0x52, 0x07, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xd6, 0x01, 0x0a, 0x10, 0x48, 0x65, 0x61, 0x72, - 0x74, 0x62, 0x65, 0x61, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4b, 0x0a, 0x09, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x2d, 0xfa, 0x42, 0x2a, 0x72, 0x28, 0x32, 0x26, 0x5e, 0x5c, 0x64, 0x7b, 0x34, 0x7d, 0x2d, 0x5c, - 0x64, 0x7b, 0x32, 0x7d, 0x2d, 0x5c, 0x64, 0x7b, 0x32, 0x7d, 0x54, 0x5c, 0x64, 0x7b, 0x32, 0x7d, - 0x3a, 0x5c, 0x64, 0x7b, 0x32, 0x7d, 0x3a, 0x5c, 0x64, 0x7b, 0x32, 0x7d, 0x5a, 0x24, 0x52, 0x09, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x75, 0x0a, 0x04, 0x75, 0x75, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x61, 0xfa, 0x42, 0x5e, 0x72, 0x5c, 0x32, 0x5a, - 0x5e, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x5d, 0x7b, 0x38, 0x7d, 0x2d, - 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x5d, 0x7b, 0x34, 0x7d, 0x2d, 0x5b, - 0x31, 0x2d, 0x35, 0x5d, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x5d, 0x7b, - 0x33, 0x7d, 0x2d, 0x5b, 0x38, 0x39, 0x61, 0x62, 0x41, 0x42, 0x5d, 0x5b, 0x30, 0x2d, 0x39, 0x61, - 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x5d, 0x7b, 0x33, 0x7d, 0x2d, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, - 0x66, 0x41, 0x2d, 0x46, 0x5d, 0x7b, 0x31, 0x32, 0x7d, 0x24, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, - 0x22, 0x13, 0x0a, 0x11, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x0a, 0x11, 0x50, 0x75, 0x6c, 0x6c, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x42, 0x0a, 0x12, 0x50, 0x75, - 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x2c, 0x0a, 0x04, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x41, 0x73, - 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x04, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x63, - 0x0a, 0x0e, 0x57, 0x6f, 0x72, 0x6b, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x54, - 0x61, 0x73, 0x6b, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x04, 0x74, - 0x61, 0x73, 0x6b, 0x22, 0x12, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa8, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x52, 0x0a, - 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x30, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x24, - 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, - 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x05, 0x74, - 0x61, 0x73, 0x6b, 0x73, 0x22, 0xd5, 0x01, 0x0a, 0x0f, 0x54, 0x61, 0x73, 0x6b, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x42, 0x09, 0xfa, 0x42, 0x06, 0x1a, 0x04, 0x18, 0x64, - 0x28, 0x01, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1f, 0x0a, 0x06, 0x6f, 0x66, 0x66, - 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x1a, 0x02, - 0x28, 0x00, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x35, 0x0a, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x6f, + 0x42, 0x04, 0x1a, 0x02, 0x28, 0x00, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3a, 0x0a, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x45, 0x6e, 0x75, 0x6d, 0x48, 0x00, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x88, 0x01, - 0x01, 0x12, 0x35, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x1c, 0xfa, 0x42, 0x19, 0x72, 0x17, 0x52, 0x0a, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x65, 0x6d, 0x61, - 0x69, 0x6c, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x48, 0x01, 0x52, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2a, 0x5a, 0x0a, 0x0e, - 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x0a, - 0x0a, 0x06, 0x51, 0x55, 0x45, 0x55, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x55, - 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, - 0x44, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x55, 0x43, 0x43, 0x45, 0x45, 0x44, 0x45, 0x44, - 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x04, 0x12, - 0x07, 0x0a, 0x03, 0x41, 0x4c, 0x4c, 0x10, 0x05, 0x32, 0xdc, 0x04, 0x0a, 0x15, 0x54, 0x61, 0x73, - 0x6b, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x12, 0x49, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, - 0x12, 0x1b, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, - 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, - 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x35, 0x0a, - 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, - 0x73, 0x6b, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x73, - 0x6b, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x12, 0x2e, 0x63, - 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x4c, 0x69, 0x73, 0x74, - 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x69, 0x73, - 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x10, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x2e, - 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, - 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x09, 0x47, 0x65, - 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x45, 0x6e, 0x75, 0x6d, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x22, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x18, 0xd0, + 0x0f, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xd6, 0x01, 0x0a, 0x10, 0x48, + 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x4b, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x2d, 0xfa, 0x42, 0x2a, 0x72, 0x28, 0x32, 0x26, 0x5e, 0x5c, 0x64, 0x7b, 0x34, + 0x7d, 0x2d, 0x5c, 0x64, 0x7b, 0x32, 0x7d, 0x2d, 0x5c, 0x64, 0x7b, 0x32, 0x7d, 0x54, 0x5c, 0x64, + 0x7b, 0x32, 0x7d, 0x3a, 0x5c, 0x64, 0x7b, 0x32, 0x7d, 0x3a, 0x5c, 0x64, 0x7b, 0x32, 0x7d, 0x5a, + 0x24, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x75, 0x0a, 0x04, + 0x75, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x61, 0xfa, 0x42, 0x5e, 0x72, + 0x5c, 0x32, 0x5a, 0x5e, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x5d, 0x7b, + 0x38, 0x7d, 0x2d, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x5d, 0x7b, 0x34, + 0x7d, 0x2d, 0x5b, 0x31, 0x2d, 0x35, 0x5d, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x41, 0x2d, + 0x46, 0x5d, 0x7b, 0x33, 0x7d, 0x2d, 0x5b, 0x38, 0x39, 0x61, 0x62, 0x41, 0x42, 0x5d, 0x5b, 0x30, + 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x5d, 0x7b, 0x33, 0x7d, 0x2d, 0x5b, 0x30, 0x2d, + 0x39, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x5d, 0x7b, 0x31, 0x32, 0x7d, 0x24, 0x52, 0x04, 0x75, + 0x75, 0x69, 0x64, 0x22, 0x13, 0x0a, 0x11, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x0a, 0x11, 0x50, 0x75, 0x6c, 0x6c, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x42, 0x0a, + 0x12, 0x50, 0x75, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x04, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, + 0x6b, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x04, 0x77, 0x6f, 0x72, + 0x6b, 0x22, 0x63, 0x0a, 0x0e, 0x57, 0x6f, 0x72, 0x6b, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x61, 0x73, 0x73, 0x69, + 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, + 0x31, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, + 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x12, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa8, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x46, 0x0a, 0x09, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x12, - 0x1a, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, 0x61, 0x72, 0x74, - 0x62, 0x65, 0x61, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x63, 0x6c, - 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0a, 0x50, 0x75, - 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x1b, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, - 0x2e, 0x50, 0x75, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x42, 0x7a, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x2e, 0x63, - 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, 0x42, 0x0a, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x1d, 0x74, 0x61, 0x73, 0x6b, 0x2f, 0x70, 0x6b, 0x67, 0x2f, - 0x67, 0x65, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x76, 0x31, 0x3b, 0x63, 0x6c, 0x6f, - 0x75, 0x64, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x43, 0x58, 0x58, 0xaa, 0x02, 0x08, 0x43, 0x6c, 0x6f, - 0x75, 0x64, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x08, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x56, 0x31, - 0xe2, 0x02, 0x14, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x09, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x3a, - 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x12, 0x52, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x30, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x4c, 0x69, 0x73, + 0x74, 0x12, 0x24, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x0e, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x73, 0x6b, + 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0xd5, 0x01, 0x0a, 0x0f, 0x54, 0x61, 0x73, 0x6b, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x05, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x42, 0x09, 0xfa, 0x42, 0x06, 0x1a, + 0x04, 0x18, 0x64, 0x28, 0x01, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1f, 0x0a, 0x06, + 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x07, 0xfa, 0x42, + 0x04, 0x1a, 0x02, 0x28, 0x00, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x35, 0x0a, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, + 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x45, 0x6e, 0x75, 0x6d, 0x48, 0x00, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x88, 0x01, 0x01, 0x12, 0x35, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x1c, 0xfa, 0x42, 0x19, 0x72, 0x17, 0x52, 0x0a, 0x73, 0x65, 0x6e, 0x64, 0x5f, + 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x48, 0x01, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2a, + 0x5a, 0x0a, 0x0e, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x45, 0x6e, 0x75, + 0x6d, 0x12, 0x0a, 0x0a, 0x06, 0x51, 0x55, 0x45, 0x55, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, + 0x07, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, + 0x49, 0x4c, 0x45, 0x44, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x55, 0x43, 0x43, 0x45, 0x45, + 0x44, 0x45, 0x44, 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, + 0x10, 0x04, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4c, 0x4c, 0x10, 0x05, 0x2a, 0xac, 0x01, 0x0a, 0x0f, + 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x20, 0x0a, 0x1c, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, + 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, + 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, + 0x1c, 0x0a, 0x18, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, + 0x54, 0x55, 0x53, 0x5f, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x1e, 0x0a, + 0x1a, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, + 0x53, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x03, 0x12, 0x1b, 0x0a, + 0x17, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, + 0x53, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x04, 0x32, 0xdc, 0x04, 0x0a, 0x15, 0x54, + 0x61, 0x73, 0x6b, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x12, 0x49, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x61, + 0x73, 0x6b, 0x12, 0x1b, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1c, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x35, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, 0x2e, + 0x54, 0x61, 0x73, 0x6b, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x54, + 0x61, 0x73, 0x6b, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x12, + 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x4c, 0x69, + 0x73, 0x74, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x48, + 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, + 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x10, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x21, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x09, + 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x2e, 0x63, 0x6c, 0x6f, 0x75, + 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x09, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, + 0x74, 0x12, 0x1a, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, 0x61, + 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, + 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, + 0x61, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0a, + 0x50, 0x75, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x1b, 0x2e, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, + 0x76, 0x31, 0x2e, 0x50, 0x75, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x42, 0x7a, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, + 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x76, 0x31, 0x42, 0x0a, 0x43, 0x6c, 0x6f, 0x75, 0x64, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x1d, 0x74, 0x61, 0x73, 0x6b, 0x2f, 0x70, 0x6b, + 0x67, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x76, 0x31, 0x3b, 0x63, + 0x6c, 0x6f, 0x75, 0x64, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x43, 0x58, 0x58, 0xaa, 0x02, 0x08, 0x43, + 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x08, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, + 0x56, 0x31, 0xe2, 0x02, 0x14, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, + 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x09, 0x43, 0x6c, 0x6f, 0x75, + 0x64, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1318,66 +1751,87 @@ func file_cloud_v1_cloud_proto_rawDescGZIP() []byte { return file_cloud_v1_cloud_proto_rawDescData } -var file_cloud_v1_cloud_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_cloud_v1_cloud_proto_msgTypes = make([]protoimpl.MessageInfo, 20) +var file_cloud_v1_cloud_proto_enumTypes = make([]protoimpl.EnumInfo, 2) +var file_cloud_v1_cloud_proto_msgTypes = make([]protoimpl.MessageInfo, 27) var file_cloud_v1_cloud_proto_goTypes = []any{ (TaskStatusEnum)(0), // 0: cloud.v1.TaskStatusEnum - (*Payload)(nil), // 1: cloud.v1.Payload - (*CreateTaskRequest)(nil), // 2: cloud.v1.CreateTaskRequest - (*CreateTaskResponse)(nil), // 3: cloud.v1.CreateTaskResponse - (*Task)(nil), // 4: cloud.v1.Task - (*TaskHistory)(nil), // 5: cloud.v1.TaskHistory - (*GetTaskRequest)(nil), // 6: cloud.v1.GetTaskRequest - (*GetTaskHistoryRequest)(nil), // 7: cloud.v1.GetTaskHistoryRequest - (*GetTaskHistoryResponse)(nil), // 8: cloud.v1.GetTaskHistoryResponse - (*UpdateTaskStatusRequest)(nil), // 9: cloud.v1.UpdateTaskStatusRequest - (*HeartbeatRequest)(nil), // 10: cloud.v1.HeartbeatRequest - (*HeartbeatResponse)(nil), // 11: cloud.v1.HeartbeatResponse - (*PullEventsRequest)(nil), // 12: cloud.v1.PullEventsRequest - (*PullEventsResponse)(nil), // 13: cloud.v1.PullEventsResponse - (*WorkAssignment)(nil), // 14: cloud.v1.WorkAssignment - (*GetStatusRequest)(nil), // 15: cloud.v1.GetStatusRequest - (*GetStatusResponse)(nil), // 16: cloud.v1.GetStatusResponse - (*TaskList)(nil), // 17: cloud.v1.TaskList - (*TaskListRequest)(nil), // 18: cloud.v1.TaskListRequest - nil, // 19: cloud.v1.Payload.ParametersEntry - nil, // 20: cloud.v1.GetStatusResponse.StatusCountsEntry - (*emptypb.Empty)(nil), // 21: google.protobuf.Empty + (ExecutionStatus)(0), // 1: cloud.v1.ExecutionStatus + (*Payload)(nil), // 2: cloud.v1.Payload + (*CreateTaskRequest)(nil), // 3: cloud.v1.CreateTaskRequest + (*CreateTaskResponse)(nil), // 4: cloud.v1.CreateTaskResponse + (*Task)(nil), // 5: cloud.v1.Task + (*Workflow)(nil), // 6: cloud.v1.Workflow + (*TaskExecution)(nil), // 7: cloud.v1.TaskExecution + (*WorkflowExecution)(nil), // 8: cloud.v1.WorkflowExecution + (*TaskHistory)(nil), // 9: cloud.v1.TaskHistory + (*GetTaskRequest)(nil), // 10: cloud.v1.GetTaskRequest + (*GetTaskHistoryRequest)(nil), // 11: cloud.v1.GetTaskHistoryRequest + (*GetTaskHistoryResponse)(nil), // 12: cloud.v1.GetTaskHistoryResponse + (*UpdateTaskStatusRequest)(nil), // 13: cloud.v1.UpdateTaskStatusRequest + (*HeartbeatRequest)(nil), // 14: cloud.v1.HeartbeatRequest + (*HeartbeatResponse)(nil), // 15: cloud.v1.HeartbeatResponse + (*PullEventsRequest)(nil), // 16: cloud.v1.PullEventsRequest + (*PullEventsResponse)(nil), // 17: cloud.v1.PullEventsResponse + (*WorkAssignment)(nil), // 18: cloud.v1.WorkAssignment + (*GetStatusRequest)(nil), // 19: cloud.v1.GetStatusRequest + (*GetStatusResponse)(nil), // 20: cloud.v1.GetStatusResponse + (*TaskList)(nil), // 21: cloud.v1.TaskList + (*TaskListRequest)(nil), // 22: cloud.v1.TaskListRequest + nil, // 23: cloud.v1.Payload.ParametersEntry + nil, // 24: cloud.v1.Task.EnvEntry + nil, // 25: cloud.v1.Workflow.MetadataEntry + nil, // 26: cloud.v1.TaskExecution.ExecutionMetadataEntry + nil, // 27: cloud.v1.WorkflowExecution.ExecutionMetadataEntry + nil, // 28: cloud.v1.GetStatusResponse.StatusCountsEntry + (*timestamppb.Timestamp)(nil), // 29: google.protobuf.Timestamp + (*emptypb.Empty)(nil), // 30: google.protobuf.Empty } var file_cloud_v1_cloud_proto_depIdxs = []int32{ - 19, // 0: cloud.v1.Payload.parameters:type_name -> cloud.v1.Payload.ParametersEntry - 1, // 1: cloud.v1.CreateTaskRequest.payload:type_name -> cloud.v1.Payload + 23, // 0: cloud.v1.Payload.parameters:type_name -> cloud.v1.Payload.ParametersEntry + 2, // 1: cloud.v1.CreateTaskRequest.payload:type_name -> cloud.v1.Payload 0, // 2: cloud.v1.Task.status:type_name -> cloud.v1.TaskStatusEnum - 1, // 3: cloud.v1.Task.payload:type_name -> cloud.v1.Payload - 0, // 4: cloud.v1.TaskHistory.status:type_name -> cloud.v1.TaskStatusEnum - 5, // 5: cloud.v1.GetTaskHistoryResponse.history:type_name -> cloud.v1.TaskHistory - 0, // 6: cloud.v1.UpdateTaskStatusRequest.status:type_name -> cloud.v1.TaskStatusEnum - 14, // 7: cloud.v1.PullEventsResponse.work:type_name -> cloud.v1.WorkAssignment - 4, // 8: cloud.v1.WorkAssignment.task:type_name -> cloud.v1.Task - 20, // 9: cloud.v1.GetStatusResponse.status_counts:type_name -> cloud.v1.GetStatusResponse.StatusCountsEntry - 4, // 10: cloud.v1.TaskList.tasks:type_name -> cloud.v1.Task - 0, // 11: cloud.v1.TaskListRequest.status:type_name -> cloud.v1.TaskStatusEnum - 2, // 12: cloud.v1.TaskManagementService.CreateTask:input_type -> cloud.v1.CreateTaskRequest - 6, // 13: cloud.v1.TaskManagementService.GetTask:input_type -> cloud.v1.GetTaskRequest - 18, // 14: cloud.v1.TaskManagementService.ListTasks:input_type -> cloud.v1.TaskListRequest - 7, // 15: cloud.v1.TaskManagementService.GetTaskHistory:input_type -> cloud.v1.GetTaskHistoryRequest - 9, // 16: cloud.v1.TaskManagementService.UpdateTaskStatus:input_type -> cloud.v1.UpdateTaskStatusRequest - 15, // 17: cloud.v1.TaskManagementService.GetStatus:input_type -> cloud.v1.GetStatusRequest - 10, // 18: cloud.v1.TaskManagementService.Heartbeat:input_type -> cloud.v1.HeartbeatRequest - 12, // 19: cloud.v1.TaskManagementService.PullEvents:input_type -> cloud.v1.PullEventsRequest - 3, // 20: cloud.v1.TaskManagementService.CreateTask:output_type -> cloud.v1.CreateTaskResponse - 4, // 21: cloud.v1.TaskManagementService.GetTask:output_type -> cloud.v1.Task - 17, // 22: cloud.v1.TaskManagementService.ListTasks:output_type -> cloud.v1.TaskList - 8, // 23: cloud.v1.TaskManagementService.GetTaskHistory:output_type -> cloud.v1.GetTaskHistoryResponse - 21, // 24: cloud.v1.TaskManagementService.UpdateTaskStatus:output_type -> google.protobuf.Empty - 16, // 25: cloud.v1.TaskManagementService.GetStatus:output_type -> cloud.v1.GetStatusResponse - 11, // 26: cloud.v1.TaskManagementService.Heartbeat:output_type -> cloud.v1.HeartbeatResponse - 13, // 27: cloud.v1.TaskManagementService.PullEvents:output_type -> cloud.v1.PullEventsResponse - 20, // [20:28] is the sub-list for method output_type - 12, // [12:20] is the sub-list for method input_type - 12, // [12:12] is the sub-list for extension type_name - 12, // [12:12] is the sub-list for extension extendee - 0, // [0:12] is the sub-list for field type_name + 2, // 3: cloud.v1.Task.payload:type_name -> cloud.v1.Payload + 24, // 4: cloud.v1.Task.env:type_name -> cloud.v1.Task.EnvEntry + 5, // 5: cloud.v1.Workflow.tasks:type_name -> cloud.v1.Task + 25, // 6: cloud.v1.Workflow.metadata:type_name -> cloud.v1.Workflow.MetadataEntry + 1, // 7: cloud.v1.TaskExecution.status:type_name -> cloud.v1.ExecutionStatus + 29, // 8: cloud.v1.TaskExecution.created_at:type_name -> google.protobuf.Timestamp + 29, // 9: cloud.v1.TaskExecution.updated_at:type_name -> google.protobuf.Timestamp + 26, // 10: cloud.v1.TaskExecution.execution_metadata:type_name -> cloud.v1.TaskExecution.ExecutionMetadataEntry + 1, // 11: cloud.v1.WorkflowExecution.status:type_name -> cloud.v1.ExecutionStatus + 7, // 12: cloud.v1.WorkflowExecution.task_executions:type_name -> cloud.v1.TaskExecution + 29, // 13: cloud.v1.WorkflowExecution.created_at:type_name -> google.protobuf.Timestamp + 29, // 14: cloud.v1.WorkflowExecution.updated_at:type_name -> google.protobuf.Timestamp + 27, // 15: cloud.v1.WorkflowExecution.execution_metadata:type_name -> cloud.v1.WorkflowExecution.ExecutionMetadataEntry + 0, // 16: cloud.v1.TaskHistory.status:type_name -> cloud.v1.TaskStatusEnum + 9, // 17: cloud.v1.GetTaskHistoryResponse.history:type_name -> cloud.v1.TaskHistory + 0, // 18: cloud.v1.UpdateTaskStatusRequest.status:type_name -> cloud.v1.TaskStatusEnum + 18, // 19: cloud.v1.PullEventsResponse.work:type_name -> cloud.v1.WorkAssignment + 5, // 20: cloud.v1.WorkAssignment.task:type_name -> cloud.v1.Task + 28, // 21: cloud.v1.GetStatusResponse.status_counts:type_name -> cloud.v1.GetStatusResponse.StatusCountsEntry + 5, // 22: cloud.v1.TaskList.tasks:type_name -> cloud.v1.Task + 0, // 23: cloud.v1.TaskListRequest.status:type_name -> cloud.v1.TaskStatusEnum + 3, // 24: cloud.v1.TaskManagementService.CreateTask:input_type -> cloud.v1.CreateTaskRequest + 10, // 25: cloud.v1.TaskManagementService.GetTask:input_type -> cloud.v1.GetTaskRequest + 22, // 26: cloud.v1.TaskManagementService.ListTasks:input_type -> cloud.v1.TaskListRequest + 11, // 27: cloud.v1.TaskManagementService.GetTaskHistory:input_type -> cloud.v1.GetTaskHistoryRequest + 13, // 28: cloud.v1.TaskManagementService.UpdateTaskStatus:input_type -> cloud.v1.UpdateTaskStatusRequest + 19, // 29: cloud.v1.TaskManagementService.GetStatus:input_type -> cloud.v1.GetStatusRequest + 14, // 30: cloud.v1.TaskManagementService.Heartbeat:input_type -> cloud.v1.HeartbeatRequest + 16, // 31: cloud.v1.TaskManagementService.PullEvents:input_type -> cloud.v1.PullEventsRequest + 4, // 32: cloud.v1.TaskManagementService.CreateTask:output_type -> cloud.v1.CreateTaskResponse + 5, // 33: cloud.v1.TaskManagementService.GetTask:output_type -> cloud.v1.Task + 21, // 34: cloud.v1.TaskManagementService.ListTasks:output_type -> cloud.v1.TaskList + 12, // 35: cloud.v1.TaskManagementService.GetTaskHistory:output_type -> cloud.v1.GetTaskHistoryResponse + 30, // 36: cloud.v1.TaskManagementService.UpdateTaskStatus:output_type -> google.protobuf.Empty + 20, // 37: cloud.v1.TaskManagementService.GetStatus:output_type -> cloud.v1.GetStatusResponse + 15, // 38: cloud.v1.TaskManagementService.Heartbeat:output_type -> cloud.v1.HeartbeatResponse + 17, // 39: cloud.v1.TaskManagementService.PullEvents:output_type -> cloud.v1.PullEventsResponse + 32, // [32:40] is the sub-list for method output_type + 24, // [24:32] is the sub-list for method input_type + 24, // [24:24] is the sub-list for extension type_name + 24, // [24:24] is the sub-list for extension extendee + 0, // [0:24] is the sub-list for field type_name } func init() { file_cloud_v1_cloud_proto_init() } @@ -1385,14 +1839,14 @@ func file_cloud_v1_cloud_proto_init() { if File_cloud_v1_cloud_proto != nil { return } - file_cloud_v1_cloud_proto_msgTypes[17].OneofWrappers = []any{} + file_cloud_v1_cloud_proto_msgTypes[20].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_cloud_v1_cloud_proto_rawDesc, - NumEnums: 1, - NumMessages: 20, + NumEnums: 2, + NumMessages: 27, NumExtensions: 0, NumServices: 1, }, diff --git a/pkg/gen/cloud/v1/cloud.swagger.json b/pkg/gen/cloud/v1/cloud.swagger.json index e32c9a6..3fe7150 100644 --- a/pkg/gen/cloud/v1/cloud.swagger.json +++ b/pkg/gen/cloud/v1/cloud.swagger.json @@ -152,6 +152,31 @@ "description": { "type": "string", "description": "Description of the task. A large text string with a maximum length of 5000 characters." + }, + "dependencies": { + "type": "array", + "items": { + "type": "string" + }, + "title": "IDs of tasks that must complete before this task" + }, + "baseImage": { + "type": "string" + }, + "entrypoint": { + "type": "string" + }, + "args": { + "type": "array", + "items": { + "type": "string" + } + }, + "env": { + "type": "object", + "additionalProperties": { + "type": "string" + } } }, "title": "Message for Task status" diff --git a/pkg/gen/index.html b/pkg/gen/index.html index d933e10..1c87160 100644 --- a/pkg/gen/index.html +++ b/pkg/gen/index.html @@ -361,6 +361,18 @@

Table of Contents

MTask +
  • + MTask.EnvEntry +
  • + +
  • + MTaskExecution +
  • + +
  • + MTaskExecution.ExecutionMetadataEntry +
  • +
  • MTaskHistory
  • @@ -381,6 +393,26 @@

    Table of Contents

    MWorkAssignment +
  • + MWorkflow +
  • + +
  • + MWorkflow.MetadataEntry +
  • + +
  • + MWorkflowExecution +
  • + +
  • + MWorkflowExecution.ExecutionMetadataEntry +
  • + + +
  • + EExecutionStatus +
  • ETaskStatusEnum @@ -3098,6 +3130,41 @@

    Task

    Description of the task. A large text string with a maximum length of 5000 characters.

    + + dependencies + string + repeated +

    IDs of tasks that must complete before this task

    + + + + base_image + string + +

    + + + + entrypoint + string + +

    + + + + args + string + repeated +

    + + + + env + Task.EnvEntry + repeated +

    + + @@ -3224,6 +3291,120 @@

    Validated Fields

    +

    Task.EnvEntry

    +

    + + + + + + + + + + + + + + + + + + + + + + + +
    FieldTypeLabelDescription
    keystring

    valuestring

    + + + + + +

    TaskExecution

    +

    TaskExecution represents the execution of a task

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FieldTypeLabelDescription
    task_idstring

    statusExecutionStatus

    created_atgoogle.protobuf.Timestamp

    updated_atgoogle.protobuf.Timestamp

    execution_metadataTaskExecution.ExecutionMetadataEntryrepeated

    + + + + + +

    TaskExecution.ExecutionMetadataEntry

    +

    + + + + + + + + + + + + + + + + + + + + + + + +
    FieldTypeLabelDescription
    keystring

    valuestring

    + + + + +

    TaskHistory

    Message for Task history

    @@ -3598,7 +3779,221 @@

    Validated Fields

    +

    Workflow

    +

    Workflow represents a collection of tasks organized in a DAG

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FieldTypeLabelDescription
    idstring

    namestring

    descriptionstring

    tasksTaskrepeated

    metadataWorkflow.MetadataEntryrepeated

    + + + + + +

    Workflow.MetadataEntry

    +

    + + + + + + + + + + + + + + + + + + + + + + + +
    FieldTypeLabelDescription
    keystring

    valuestring

    + + + + + +

    WorkflowExecution

    +

    WorkflowExecution represents the execution of a workflow

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FieldTypeLabelDescription
    workflow_idstring

    statusExecutionStatus

    task_executionsTaskExecutionrepeated

    created_atgoogle.protobuf.Timestamp

    updated_atgoogle.protobuf.Timestamp

    execution_metadataWorkflowExecution.ExecutionMetadataEntryrepeated

    + + + + + +

    WorkflowExecution.ExecutionMetadataEntry

    +

    + + + + + + + + + + + + + + + + + + + + + + + +
    FieldTypeLabelDescription
    keystring

    valuestring

    + + + + + + + +

    ExecutionStatus

    +

    ExecutionStatus represents the current state of a task or workflow execution

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameNumberDescription
    EXECUTION_STATUS_UNSPECIFIED0

    EXECUTION_STATUS_PENDING1

    EXECUTION_STATUS_RUNNING2

    EXECUTION_STATUS_COMPLETED3

    EXECUTION_STATUS_FAILED4

    TaskStatusEnum

    Enum for Task statuses

    diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..da99612 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,5 @@ +click == 6.7 +requests==2.18.4 +setuptools == 39.2.0 +nose==1.3.7 +protobuf==3.19.4 \ No newline at end of file diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..dc5224c --- /dev/null +++ b/setup.py @@ -0,0 +1,22 @@ +from setuptools import setup, find_packages + + +setup(name='taskcli', + version='0.0.1', + py_modules=['modules'], + packages=find_packages(), + include_package_data=True, + install_requires=[ + 'Click', + 'requests', + 'nose', + 'protobuf' + ], + package_data={'': ['*.txt', '*.lst']}, + entry_points=''' + [console_scripts] + taskcli=taskcli:cli + ''', + test_suite='nose.collector', + tests_require=['nose'], + ) diff --git a/taskcli.py b/taskcli.py new file mode 100644 index 0000000..0aa9252 --- /dev/null +++ b/taskcli.py @@ -0,0 +1,225 @@ +import click +import os +import ast +import logging +from typing import List, Dict, Union, Any +from modules.task import TaskSpec +from modules.workflow import WorkflowSpec +from modules.cloud.v1.cloud_pb2 import Task, Workflow +import tarfile +import tempfile +import json +import fnmatch + +logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') +logger = logging.getLogger(__name__) + + +def parse_decorator_config(file_path: str) -> Dict[str, List[Dict[str, Union[str, Dict[str, Any]]]]]: + """ + Parse Python files for task and workflow decorators and extract their configurations. + + Args: + file_path (str): Path to the Python file to parse. + + Returns: + Dict[str, List[Dict[str, Union[str, Dict]]]]: Parsed configurations for tasks and workflows. + """ + with open(file_path, 'r') as file: + tree = ast.parse(file.read()) + + configs = { + 'tasks': [], + 'workflows': [] + } + + def get_value(node: ast.AST) -> Any: + """Recursively extract values from AST nodes.""" + if isinstance(node, ast.Constant): + return node.value + elif isinstance(node, ast.Name): + return node.id + elif isinstance(node, ast.Attribute): + return f"{get_value(node.value)}.{node.attr}" + elif isinstance(node, ast.Dict): + return {get_value(k): get_value(v) for k, v in zip(node.keys, node.values)} + elif isinstance(node, ast.List): + return [get_value(elt) for elt in node.elts] + elif isinstance(node, ast.Call): + func = get_value(node.func) + args = [get_value(arg) for arg in node.args] + kwargs = {arg.arg: get_value(arg.value) for arg in node.keywords} + return f"{func}({', '.join(map(str, args))}{', ' if args and kwargs else ''}{', '.join(f'{k}={v}' for k, v in kwargs.items())})" + elif isinstance(node, ast.BoolOp): + op = 'and' if isinstance(node.op, ast.And) else 'or' + return f" {op} ".join(get_value(value) for value in node.values) + else: + return str(node) # Fallback for other types + + def get_function_info(node: ast.FunctionDef) -> Dict[str, Any]: + """Extract function argument and return type information.""" + args = [] + for arg in node.args.args: + arg_info = {"name": arg.arg} + if arg.annotation: + arg_info["type"] = get_value(arg.annotation) + args.append(arg_info) + + returns = None + if node.returns: + returns = get_value(node.returns) + + return {"args": args, "returns": returns} + + for node in ast.walk(tree): + if isinstance(node, ast.FunctionDef): + for decorator in node.decorator_list: + if isinstance(decorator, ast.Call) and decorator.func.id in ['task', 'Workflow']: + config: Union[TaskSpec, WorkflowSpec] = {} + for kw in decorator.args[0].keywords: + config[kw.arg] = get_value(kw.value) + + function_info = get_function_info(node) + + item = { + 'name': node.name, + 'config': config, + 'input': function_info['args'], + 'output': function_info['returns'] + } + + if decorator.func.id == 'task': + configs['tasks'].append(item) + else: + configs['workflows'].append(item) + + return configs + +@click.group(invoke_without_command=True) +@click.argument('dir', type=click.Path(exists=True), nargs=1, required=False, default='.') +@click.option('--image', '-i', help='Specify a custom image') +@click.option('--verbose', '-v', is_flag=True, help='Enable verbose output') +def cli(dir: str, image: str, verbose: bool) -> None: + """ + Find Python files, read their content, and search for task and workflow decorators. + + Args: + dir (str): Directory to search for Python files (default: current directory). + verbose (bool): Enable verbose output. + """ + if verbose: + logger.setLevel(logging.DEBUG) + + logger.info(f"Searching for Python files in directory: {dir}") + python_files: List[str] = find_python_files(dir) + logger.info(f"Found {len(python_files)} Python files") + + for file_path in python_files: + process_file(file_path, image) + +def find_python_files(directory: str) -> List[str]: + """ + Find all Python files in the given directory and its subdirectories. + + Args: + directory (str): Directory to search for Python files. + + Returns: + List[str]: List of paths to Python files. + """ + python_files: List[str] = [] + for root, _, files in os.walk(directory): + for file in files: + if file.endswith('.py'): + python_files.append(os.path.join(root, file)) + return python_files + +def process_file(file_path: str, custom_image: str = None) -> None: + """ + Read the file content, search for task and workflow decorators, and store protos in a .tgz file. + + Args: + file_path (str): Path to the Python file to process. + custom_image (str): Custom image to use instead of base_image if provided. + """ + logger.info(f"Processing file: {file_path}") + parsed_configs = parse_decorator_config(file_path) + + with tempfile.TemporaryDirectory() as temp_dir: + task_protos = [] + workflow_protos = [] + + if parsed_configs['tasks']: + logger.info(f"Found {len(parsed_configs['tasks'])} tasks in {file_path}") + for task in parsed_configs['tasks']: + logger.debug(f"Task: {task['name']}") + logger.debug(f" Config: {task['config']}") + logger.debug(f" Input: {task['input']}") + logger.debug(f" Output: {task['output']}") + + task_proto = Task( + name=task['config']["name"], + type=task['config']["type"], + description=task['config']["description"], + dependencies=task['config']["dependencies"], + metadata=task['config']["metadata"], + base_image=custom_image if custom_image else task['config']["base_image"], + entrypoint=task['config']["entrypoint"], + args=task['config']["args"], + env=task['config']["env"] + ) + task_protos.append(task_proto) + + if parsed_configs['workflows']: + logger.info(f"Found {len(parsed_configs['workflows'])} workflows in {file_path}") + for workflow in parsed_configs['workflows']: + logger.debug(f"Workflow: {workflow['name']}") + logger.debug(f" Config: {workflow['config']}") + logger.debug(f" Input: {workflow['input']}") + logger.debug(f" Output: {workflow['output']}") + logger.debug(f" workflow: {workflow['workflow']}") + + workflow_proto = Workflow( + name=workflow['config']["name"], + description=workflow['config']["description"], + metadata=workflow['config']["metadata"], + ) + workflow_protos.append(workflow_proto) + + # Save protos in binary format + for i, task_proto in enumerate(task_protos): + with open(os.path.join(temp_dir, f'task_{i}.pb'), 'wb') as f: + f.write(task_proto.SerializeToString()) + + for i, workflow_proto in enumerate(workflow_protos): + with open(os.path.join(temp_dir, f'workflow_{i}.pb'), 'wb') as f: + f.write(workflow_proto.SerializeToString()) + + # Compress the entire code + code_tar_path = os.path.join(temp_dir, 'code.tar.gz') + with tarfile.open(code_tar_path, "w:gz") as code_tar: + for root, dirs, files in os.walk(os.path.dirname(file_path)): + # Read .gitignore patterns + gitignore_patterns = [] + gitignore_path = os.path.join(root, '.gitignore') + if os.path.exists(gitignore_path): + with open(gitignore_path, 'r') as gitignore_file: + gitignore_patterns = gitignore_file.read().splitlines() + + for file in files: + file_path = os.path.join(root, file) + relative_path = os.path.relpath(file_path, os.path.dirname(file_path)) + + # Check if the file should be ignored + if not any(fnmatch.fnmatch(relative_path, pattern) for pattern in gitignore_patterns): + code_tar.add(file_path, arcname=relative_path) + + # Create package.tgz file + output_filename = 'package.tgz' + with tarfile.open(output_filename, "w:gz") as tar: + tar.add(temp_dir, arcname="") + + logger.info(f"Stored task and workflow protos in {output_filename}") + +if __name__ == '__main__': + cli() \ No newline at end of file