hatchet-sdk 1.18.1__py3-none-any.whl → 1.19.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of hatchet-sdk might be problematic. Click here for more details.

Files changed (225) hide show
  1. {hatchet_sdk-1.18.1.dist-info → hatchet_sdk-1.19.0.dist-info}/METADATA +2 -3
  2. {hatchet_sdk-1.18.1.dist-info → hatchet_sdk-1.19.0.dist-info}/RECORD +4 -225
  3. hatchet_sdk/v0/__init__.py +0 -251
  4. hatchet_sdk/v0/client.py +0 -119
  5. hatchet_sdk/v0/clients/admin.py +0 -541
  6. hatchet_sdk/v0/clients/dispatcher/action_listener.py +0 -422
  7. hatchet_sdk/v0/clients/dispatcher/dispatcher.py +0 -204
  8. hatchet_sdk/v0/clients/event_ts.py +0 -28
  9. hatchet_sdk/v0/clients/events.py +0 -182
  10. hatchet_sdk/v0/clients/rest/__init__.py +0 -307
  11. hatchet_sdk/v0/clients/rest/api/__init__.py +0 -19
  12. hatchet_sdk/v0/clients/rest/api/api_token_api.py +0 -858
  13. hatchet_sdk/v0/clients/rest/api/default_api.py +0 -2259
  14. hatchet_sdk/v0/clients/rest/api/event_api.py +0 -2548
  15. hatchet_sdk/v0/clients/rest/api/github_api.py +0 -331
  16. hatchet_sdk/v0/clients/rest/api/healthcheck_api.py +0 -483
  17. hatchet_sdk/v0/clients/rest/api/log_api.py +0 -449
  18. hatchet_sdk/v0/clients/rest/api/metadata_api.py +0 -728
  19. hatchet_sdk/v0/clients/rest/api/rate_limits_api.py +0 -423
  20. hatchet_sdk/v0/clients/rest/api/slack_api.py +0 -577
  21. hatchet_sdk/v0/clients/rest/api/sns_api.py +0 -872
  22. hatchet_sdk/v0/clients/rest/api/step_run_api.py +0 -2202
  23. hatchet_sdk/v0/clients/rest/api/tenant_api.py +0 -4430
  24. hatchet_sdk/v0/clients/rest/api/user_api.py +0 -2888
  25. hatchet_sdk/v0/clients/rest/api/worker_api.py +0 -858
  26. hatchet_sdk/v0/clients/rest/api/workflow_api.py +0 -6312
  27. hatchet_sdk/v0/clients/rest/api/workflow_run_api.py +0 -1932
  28. hatchet_sdk/v0/clients/rest/api/workflow_runs_api.py +0 -610
  29. hatchet_sdk/v0/clients/rest/api_client.py +0 -759
  30. hatchet_sdk/v0/clients/rest/api_response.py +0 -22
  31. hatchet_sdk/v0/clients/rest/configuration.py +0 -611
  32. hatchet_sdk/v0/clients/rest/exceptions.py +0 -200
  33. hatchet_sdk/v0/clients/rest/models/__init__.py +0 -274
  34. hatchet_sdk/v0/clients/rest/models/accept_invite_request.py +0 -83
  35. hatchet_sdk/v0/clients/rest/models/api_error.py +0 -102
  36. hatchet_sdk/v0/clients/rest/models/api_errors.py +0 -100
  37. hatchet_sdk/v0/clients/rest/models/api_meta.py +0 -144
  38. hatchet_sdk/v0/clients/rest/models/api_meta_auth.py +0 -85
  39. hatchet_sdk/v0/clients/rest/models/api_meta_integration.py +0 -88
  40. hatchet_sdk/v0/clients/rest/models/api_meta_posthog.py +0 -90
  41. hatchet_sdk/v0/clients/rest/models/api_resource_meta.py +0 -98
  42. hatchet_sdk/v0/clients/rest/models/api_token.py +0 -105
  43. hatchet_sdk/v0/clients/rest/models/bulk_create_event_request.py +0 -100
  44. hatchet_sdk/v0/clients/rest/models/bulk_create_event_response.py +0 -110
  45. hatchet_sdk/v0/clients/rest/models/cancel_event_request.py +0 -85
  46. hatchet_sdk/v0/clients/rest/models/cancel_step_run_request.py +0 -83
  47. hatchet_sdk/v0/clients/rest/models/concurrency_limit_strategy.py +0 -39
  48. hatchet_sdk/v0/clients/rest/models/create_api_token_request.py +0 -92
  49. hatchet_sdk/v0/clients/rest/models/create_api_token_response.py +0 -83
  50. hatchet_sdk/v0/clients/rest/models/create_cron_workflow_trigger_request.py +0 -98
  51. hatchet_sdk/v0/clients/rest/models/create_event_request.py +0 -95
  52. hatchet_sdk/v0/clients/rest/models/create_pull_request_from_step_run.py +0 -83
  53. hatchet_sdk/v0/clients/rest/models/create_sns_integration_request.py +0 -85
  54. hatchet_sdk/v0/clients/rest/models/create_tenant_alert_email_group_request.py +0 -83
  55. hatchet_sdk/v0/clients/rest/models/create_tenant_invite_request.py +0 -86
  56. hatchet_sdk/v0/clients/rest/models/create_tenant_request.py +0 -84
  57. hatchet_sdk/v0/clients/rest/models/cron_workflows.py +0 -131
  58. hatchet_sdk/v0/clients/rest/models/cron_workflows_list.py +0 -110
  59. hatchet_sdk/v0/clients/rest/models/cron_workflows_method.py +0 -37
  60. hatchet_sdk/v0/clients/rest/models/cron_workflows_order_by_field.py +0 -37
  61. hatchet_sdk/v0/clients/rest/models/event.py +0 -143
  62. hatchet_sdk/v0/clients/rest/models/event_data.py +0 -83
  63. hatchet_sdk/v0/clients/rest/models/event_key_list.py +0 -98
  64. hatchet_sdk/v0/clients/rest/models/event_list.py +0 -110
  65. hatchet_sdk/v0/clients/rest/models/event_order_by_direction.py +0 -37
  66. hatchet_sdk/v0/clients/rest/models/event_order_by_field.py +0 -36
  67. hatchet_sdk/v0/clients/rest/models/event_update_cancel200_response.py +0 -85
  68. hatchet_sdk/v0/clients/rest/models/event_workflow_run_summary.py +0 -116
  69. hatchet_sdk/v0/clients/rest/models/events.py +0 -110
  70. hatchet_sdk/v0/clients/rest/models/get_step_run_diff_response.py +0 -100
  71. hatchet_sdk/v0/clients/rest/models/github_app_installation.py +0 -107
  72. hatchet_sdk/v0/clients/rest/models/github_branch.py +0 -86
  73. hatchet_sdk/v0/clients/rest/models/github_repo.py +0 -86
  74. hatchet_sdk/v0/clients/rest/models/info_get_version200_response.py +0 -83
  75. hatchet_sdk/v0/clients/rest/models/job.py +0 -132
  76. hatchet_sdk/v0/clients/rest/models/job_run.py +0 -176
  77. hatchet_sdk/v0/clients/rest/models/job_run_status.py +0 -41
  78. hatchet_sdk/v0/clients/rest/models/link_github_repository_request.py +0 -106
  79. hatchet_sdk/v0/clients/rest/models/list_api_tokens_response.py +0 -110
  80. hatchet_sdk/v0/clients/rest/models/list_github_app_installations_response.py +0 -112
  81. hatchet_sdk/v0/clients/rest/models/list_pull_requests_response.py +0 -100
  82. hatchet_sdk/v0/clients/rest/models/list_slack_webhooks.py +0 -110
  83. hatchet_sdk/v0/clients/rest/models/list_sns_integrations.py +0 -110
  84. hatchet_sdk/v0/clients/rest/models/log_line.py +0 -94
  85. hatchet_sdk/v0/clients/rest/models/log_line_level.py +0 -39
  86. hatchet_sdk/v0/clients/rest/models/log_line_list.py +0 -110
  87. hatchet_sdk/v0/clients/rest/models/log_line_order_by_direction.py +0 -37
  88. hatchet_sdk/v0/clients/rest/models/log_line_order_by_field.py +0 -36
  89. hatchet_sdk/v0/clients/rest/models/pagination_response.py +0 -95
  90. hatchet_sdk/v0/clients/rest/models/pull_request.py +0 -112
  91. hatchet_sdk/v0/clients/rest/models/pull_request_state.py +0 -37
  92. hatchet_sdk/v0/clients/rest/models/queue_metrics.py +0 -97
  93. hatchet_sdk/v0/clients/rest/models/rate_limit.py +0 -117
  94. hatchet_sdk/v0/clients/rest/models/rate_limit_list.py +0 -110
  95. hatchet_sdk/v0/clients/rest/models/rate_limit_order_by_direction.py +0 -37
  96. hatchet_sdk/v0/clients/rest/models/rate_limit_order_by_field.py +0 -38
  97. hatchet_sdk/v0/clients/rest/models/recent_step_runs.py +0 -118
  98. hatchet_sdk/v0/clients/rest/models/reject_invite_request.py +0 -83
  99. hatchet_sdk/v0/clients/rest/models/replay_event_request.py +0 -85
  100. hatchet_sdk/v0/clients/rest/models/replay_workflow_runs_request.py +0 -85
  101. hatchet_sdk/v0/clients/rest/models/replay_workflow_runs_response.py +0 -100
  102. hatchet_sdk/v0/clients/rest/models/rerun_step_run_request.py +0 -83
  103. hatchet_sdk/v0/clients/rest/models/schedule_workflow_run_request.py +0 -92
  104. hatchet_sdk/v0/clients/rest/models/scheduled_run_status.py +0 -42
  105. hatchet_sdk/v0/clients/rest/models/scheduled_workflows.py +0 -149
  106. hatchet_sdk/v0/clients/rest/models/scheduled_workflows_list.py +0 -110
  107. hatchet_sdk/v0/clients/rest/models/scheduled_workflows_method.py +0 -37
  108. hatchet_sdk/v0/clients/rest/models/scheduled_workflows_order_by_field.py +0 -37
  109. hatchet_sdk/v0/clients/rest/models/semaphore_slots.py +0 -113
  110. hatchet_sdk/v0/clients/rest/models/slack_webhook.py +0 -127
  111. hatchet_sdk/v0/clients/rest/models/sns_integration.py +0 -114
  112. hatchet_sdk/v0/clients/rest/models/step.py +0 -123
  113. hatchet_sdk/v0/clients/rest/models/step_run.py +0 -202
  114. hatchet_sdk/v0/clients/rest/models/step_run_archive.py +0 -142
  115. hatchet_sdk/v0/clients/rest/models/step_run_archive_list.py +0 -110
  116. hatchet_sdk/v0/clients/rest/models/step_run_diff.py +0 -91
  117. hatchet_sdk/v0/clients/rest/models/step_run_event.py +0 -122
  118. hatchet_sdk/v0/clients/rest/models/step_run_event_list.py +0 -110
  119. hatchet_sdk/v0/clients/rest/models/step_run_event_reason.py +0 -52
  120. hatchet_sdk/v0/clients/rest/models/step_run_event_severity.py +0 -38
  121. hatchet_sdk/v0/clients/rest/models/step_run_status.py +0 -44
  122. hatchet_sdk/v0/clients/rest/models/tenant.py +0 -118
  123. hatchet_sdk/v0/clients/rest/models/tenant_alert_email_group.py +0 -98
  124. hatchet_sdk/v0/clients/rest/models/tenant_alert_email_group_list.py +0 -112
  125. hatchet_sdk/v0/clients/rest/models/tenant_alerting_settings.py +0 -143
  126. hatchet_sdk/v0/clients/rest/models/tenant_invite.py +0 -120
  127. hatchet_sdk/v0/clients/rest/models/tenant_invite_list.py +0 -110
  128. hatchet_sdk/v0/clients/rest/models/tenant_list.py +0 -110
  129. hatchet_sdk/v0/clients/rest/models/tenant_member.py +0 -123
  130. hatchet_sdk/v0/clients/rest/models/tenant_member_list.py +0 -110
  131. hatchet_sdk/v0/clients/rest/models/tenant_member_role.py +0 -38
  132. hatchet_sdk/v0/clients/rest/models/tenant_queue_metrics.py +0 -116
  133. hatchet_sdk/v0/clients/rest/models/tenant_resource.py +0 -40
  134. hatchet_sdk/v0/clients/rest/models/tenant_resource_limit.py +0 -135
  135. hatchet_sdk/v0/clients/rest/models/tenant_resource_policy.py +0 -102
  136. hatchet_sdk/v0/clients/rest/models/tenant_step_run_queue_metrics.py +0 -83
  137. hatchet_sdk/v0/clients/rest/models/trigger_workflow_run_request.py +0 -91
  138. hatchet_sdk/v0/clients/rest/models/update_tenant_alert_email_group_request.py +0 -83
  139. hatchet_sdk/v0/clients/rest/models/update_tenant_invite_request.py +0 -85
  140. hatchet_sdk/v0/clients/rest/models/update_tenant_request.py +0 -137
  141. hatchet_sdk/v0/clients/rest/models/update_worker_request.py +0 -87
  142. hatchet_sdk/v0/clients/rest/models/user.py +0 -126
  143. hatchet_sdk/v0/clients/rest/models/user_change_password_request.py +0 -88
  144. hatchet_sdk/v0/clients/rest/models/user_login_request.py +0 -86
  145. hatchet_sdk/v0/clients/rest/models/user_register_request.py +0 -91
  146. hatchet_sdk/v0/clients/rest/models/user_tenant_memberships_list.py +0 -110
  147. hatchet_sdk/v0/clients/rest/models/user_tenant_public.py +0 -86
  148. hatchet_sdk/v0/clients/rest/models/webhook_worker.py +0 -100
  149. hatchet_sdk/v0/clients/rest/models/webhook_worker_create_request.py +0 -94
  150. hatchet_sdk/v0/clients/rest/models/webhook_worker_create_response.py +0 -98
  151. hatchet_sdk/v0/clients/rest/models/webhook_worker_created.py +0 -102
  152. hatchet_sdk/v0/clients/rest/models/webhook_worker_list_response.py +0 -110
  153. hatchet_sdk/v0/clients/rest/models/webhook_worker_request.py +0 -102
  154. hatchet_sdk/v0/clients/rest/models/webhook_worker_request_list_response.py +0 -104
  155. hatchet_sdk/v0/clients/rest/models/webhook_worker_request_method.py +0 -38
  156. hatchet_sdk/v0/clients/rest/models/worker.py +0 -239
  157. hatchet_sdk/v0/clients/rest/models/worker_label.py +0 -102
  158. hatchet_sdk/v0/clients/rest/models/worker_list.py +0 -110
  159. hatchet_sdk/v0/clients/rest/models/worker_runtime_info.py +0 -103
  160. hatchet_sdk/v0/clients/rest/models/worker_runtime_sdks.py +0 -38
  161. hatchet_sdk/v0/clients/rest/models/worker_type.py +0 -38
  162. hatchet_sdk/v0/clients/rest/models/workflow.py +0 -165
  163. hatchet_sdk/v0/clients/rest/models/workflow_concurrency.py +0 -107
  164. hatchet_sdk/v0/clients/rest/models/workflow_deployment_config.py +0 -136
  165. hatchet_sdk/v0/clients/rest/models/workflow_kind.py +0 -38
  166. hatchet_sdk/v0/clients/rest/models/workflow_list.py +0 -120
  167. hatchet_sdk/v0/clients/rest/models/workflow_metrics.py +0 -97
  168. hatchet_sdk/v0/clients/rest/models/workflow_run.py +0 -188
  169. hatchet_sdk/v0/clients/rest/models/workflow_run_cancel200_response.py +0 -85
  170. hatchet_sdk/v0/clients/rest/models/workflow_run_list.py +0 -110
  171. hatchet_sdk/v0/clients/rest/models/workflow_run_order_by_direction.py +0 -37
  172. hatchet_sdk/v0/clients/rest/models/workflow_run_order_by_field.py +0 -39
  173. hatchet_sdk/v0/clients/rest/models/workflow_run_shape.py +0 -186
  174. hatchet_sdk/v0/clients/rest/models/workflow_run_status.py +0 -42
  175. hatchet_sdk/v0/clients/rest/models/workflow_run_triggered_by.py +0 -112
  176. hatchet_sdk/v0/clients/rest/models/workflow_runs_cancel_request.py +0 -85
  177. hatchet_sdk/v0/clients/rest/models/workflow_runs_metrics.py +0 -94
  178. hatchet_sdk/v0/clients/rest/models/workflow_runs_metrics_counts.py +0 -104
  179. hatchet_sdk/v0/clients/rest/models/workflow_tag.py +0 -84
  180. hatchet_sdk/v0/clients/rest/models/workflow_trigger_cron_ref.py +0 -86
  181. hatchet_sdk/v0/clients/rest/models/workflow_trigger_event_ref.py +0 -86
  182. hatchet_sdk/v0/clients/rest/models/workflow_triggers.py +0 -141
  183. hatchet_sdk/v0/clients/rest/models/workflow_update_request.py +0 -85
  184. hatchet_sdk/v0/clients/rest/models/workflow_version.py +0 -170
  185. hatchet_sdk/v0/clients/rest/models/workflow_version_concurrency.py +0 -114
  186. hatchet_sdk/v0/clients/rest/models/workflow_version_definition.py +0 -85
  187. hatchet_sdk/v0/clients/rest/models/workflow_version_meta.py +0 -123
  188. hatchet_sdk/v0/clients/rest/models/workflow_workers_count.py +0 -95
  189. hatchet_sdk/v0/clients/rest/rest.py +0 -187
  190. hatchet_sdk/v0/clients/rest/tenacity_utils.py +0 -39
  191. hatchet_sdk/v0/clients/rest_client.py +0 -622
  192. hatchet_sdk/v0/clients/run_event_listener.py +0 -260
  193. hatchet_sdk/v0/clients/workflow_listener.py +0 -277
  194. hatchet_sdk/v0/connection.py +0 -63
  195. hatchet_sdk/v0/context/__init__.py +0 -1
  196. hatchet_sdk/v0/context/context.py +0 -446
  197. hatchet_sdk/v0/context/worker_context.py +0 -28
  198. hatchet_sdk/v0/features/cron.py +0 -286
  199. hatchet_sdk/v0/features/scheduled.py +0 -248
  200. hatchet_sdk/v0/hatchet.py +0 -310
  201. hatchet_sdk/v0/labels.py +0 -10
  202. hatchet_sdk/v0/loader.py +0 -244
  203. hatchet_sdk/v0/metadata.py +0 -2
  204. hatchet_sdk/v0/opentelemetry/instrumentor.py +0 -393
  205. hatchet_sdk/v0/rate_limit.py +0 -126
  206. hatchet_sdk/v0/semver.py +0 -30
  207. hatchet_sdk/v0/token.py +0 -27
  208. hatchet_sdk/v0/utils/aio_utils.py +0 -137
  209. hatchet_sdk/v0/utils/backoff.py +0 -9
  210. hatchet_sdk/v0/utils/types.py +0 -8
  211. hatchet_sdk/v0/utils/typing.py +0 -12
  212. hatchet_sdk/v0/v2/callable.py +0 -202
  213. hatchet_sdk/v0/v2/concurrency.py +0 -47
  214. hatchet_sdk/v0/v2/hatchet.py +0 -224
  215. hatchet_sdk/v0/worker/__init__.py +0 -1
  216. hatchet_sdk/v0/worker/action_listener_process.py +0 -294
  217. hatchet_sdk/v0/worker/runner/run_loop_manager.py +0 -112
  218. hatchet_sdk/v0/worker/runner/runner.py +0 -460
  219. hatchet_sdk/v0/worker/runner/utils/capture_logs.py +0 -81
  220. hatchet_sdk/v0/worker/runner/utils/error_with_traceback.py +0 -6
  221. hatchet_sdk/v0/worker/worker.py +0 -391
  222. hatchet_sdk/v0/workflow.py +0 -261
  223. hatchet_sdk/v0/workflow_run.py +0 -59
  224. {hatchet_sdk-1.18.1.dist-info → hatchet_sdk-1.19.0.dist-info}/WHEEL +0 -0
  225. {hatchet_sdk-1.18.1.dist-info → hatchet_sdk-1.19.0.dist-info}/entry_points.txt +0 -0
@@ -1,541 +0,0 @@
1
- import json
2
- from datetime import datetime
3
- from typing import Any, Callable, Dict, List, Optional, TypedDict, TypeVar, Union
4
-
5
- import grpc
6
- from google.protobuf import timestamp_pb2
7
-
8
- from hatchet_sdk.contracts.workflows_pb2 import (
9
- BulkTriggerWorkflowRequest,
10
- BulkTriggerWorkflowResponse,
11
- CreateWorkflowVersionOpts,
12
- PutRateLimitRequest,
13
- PutWorkflowRequest,
14
- RateLimitDuration,
15
- ScheduleWorkflowRequest,
16
- TriggerWorkflowRequest,
17
- TriggerWorkflowResponse,
18
- WorkflowVersion,
19
- )
20
- from hatchet_sdk.contracts.workflows_pb2_grpc import WorkflowServiceStub
21
- from hatchet_sdk.v0.clients.rest.models.workflow_run import WorkflowRun
22
- from hatchet_sdk.v0.clients.rest.tenacity_utils import tenacity_retry
23
- from hatchet_sdk.v0.clients.run_event_listener import new_listener
24
- from hatchet_sdk.v0.clients.workflow_listener import PooledWorkflowRunListener
25
- from hatchet_sdk.v0.connection import new_conn
26
- from hatchet_sdk.v0.workflow_run import RunRef, WorkflowRunRef
27
-
28
- from ..loader import ClientConfig
29
- from ..metadata import get_metadata
30
- from ..workflow import WorkflowMeta
31
-
32
-
33
- def new_admin(config: ClientConfig):
34
- return AdminClient(config)
35
-
36
-
37
- class ScheduleTriggerWorkflowOptions(TypedDict, total=False):
38
- parent_id: Optional[str]
39
- parent_step_run_id: Optional[str]
40
- child_index: Optional[int]
41
- child_key: Optional[str]
42
- namespace: Optional[str]
43
-
44
-
45
- class ChildTriggerWorkflowOptions(TypedDict, total=False):
46
- additional_metadata: Dict[str, str] | None = None
47
- sticky: bool | None = None
48
-
49
-
50
- class ChildWorkflowRunDict(TypedDict, total=False):
51
- workflow_name: str
52
- input: Any
53
- options: ChildTriggerWorkflowOptions
54
- key: str | None = None
55
-
56
-
57
- class TriggerWorkflowOptions(ScheduleTriggerWorkflowOptions, total=False):
58
- additional_metadata: Dict[str, str] | None = None
59
- desired_worker_id: str | None = None
60
- namespace: str | None = None
61
-
62
-
63
- class WorkflowRunDict(TypedDict, total=False):
64
- workflow_name: str
65
- input: Any
66
- options: TriggerWorkflowOptions | None
67
-
68
-
69
- class DedupeViolationErr(Exception):
70
- """Raised by the Hatchet library to indicate that a workflow has already been run with this deduplication value."""
71
-
72
- pass
73
-
74
-
75
- class AdminClientBase:
76
- pooled_workflow_listener: PooledWorkflowRunListener | None = None
77
-
78
- def _prepare_workflow_request(
79
- self, workflow_name: str, input: any, options: TriggerWorkflowOptions = None
80
- ):
81
- try:
82
- payload_data = json.dumps(input)
83
-
84
- try:
85
- meta = (
86
- None
87
- if options is None or "additional_metadata" not in options
88
- else options["additional_metadata"]
89
- )
90
- if meta is not None:
91
- options = {
92
- **options,
93
- "additional_metadata": json.dumps(meta).encode("utf-8"),
94
- }
95
- except json.JSONDecodeError as e:
96
- raise ValueError(f"Error encoding payload: {e}")
97
-
98
- return TriggerWorkflowRequest(
99
- name=workflow_name, input=payload_data, **(options or {})
100
- )
101
- except json.JSONDecodeError as e:
102
- raise ValueError(f"Error encoding payload: {e}")
103
-
104
- def _prepare_put_workflow_request(
105
- self,
106
- name: str,
107
- workflow: CreateWorkflowVersionOpts | WorkflowMeta,
108
- overrides: CreateWorkflowVersionOpts | None = None,
109
- ):
110
- try:
111
- opts: CreateWorkflowVersionOpts
112
-
113
- if isinstance(workflow, CreateWorkflowVersionOpts):
114
- opts = workflow
115
- else:
116
- opts = workflow.get_create_opts(self.client.config.namespace)
117
-
118
- if overrides is not None:
119
- opts.MergeFrom(overrides)
120
-
121
- opts.name = name
122
-
123
- return PutWorkflowRequest(
124
- opts=opts,
125
- )
126
- except grpc.RpcError as e:
127
- raise ValueError(f"Could not put workflow: {e}")
128
-
129
- def _prepare_schedule_workflow_request(
130
- self,
131
- name: str,
132
- schedules: List[Union[datetime, timestamp_pb2.Timestamp]],
133
- input={},
134
- options: ScheduleTriggerWorkflowOptions = None,
135
- ):
136
- timestamp_schedules = []
137
- for schedule in schedules:
138
- if isinstance(schedule, datetime):
139
- t = schedule.timestamp()
140
- seconds = int(t)
141
- nanos = int(t % 1 * 1e9)
142
- timestamp = timestamp_pb2.Timestamp(seconds=seconds, nanos=nanos)
143
- timestamp_schedules.append(timestamp)
144
- elif isinstance(schedule, timestamp_pb2.Timestamp):
145
- timestamp_schedules.append(schedule)
146
- else:
147
- raise ValueError(
148
- "Invalid schedule type. Must be datetime or timestamp_pb2.Timestamp."
149
- )
150
-
151
- return ScheduleWorkflowRequest(
152
- name=name,
153
- schedules=timestamp_schedules,
154
- input=json.dumps(input),
155
- **(options or {}),
156
- )
157
-
158
-
159
- T = TypeVar("T")
160
-
161
-
162
- class AdminClientAioImpl(AdminClientBase):
163
- def __init__(self, config: ClientConfig):
164
- aio_conn = new_conn(config, True)
165
- self.config = config
166
- self.aio_client = WorkflowServiceStub(aio_conn)
167
- self.token = config.token
168
- self.listener_client = new_listener(config)
169
- self.namespace = config.namespace
170
-
171
- async def run(
172
- self,
173
- function: Union[str, Callable[[Any], T]],
174
- input: any,
175
- options: TriggerWorkflowOptions = None,
176
- ) -> "RunRef[T]":
177
- workflow_name = function
178
-
179
- if not isinstance(function, str):
180
- workflow_name = function.function_name
181
-
182
- wrr = await self.run_workflow(workflow_name, input, options)
183
-
184
- return RunRef[T](
185
- wrr.workflow_run_id, wrr.workflow_listener, wrr.workflow_run_event_listener
186
- )
187
-
188
- ## IMPORTANT: Keep this method's signature in sync with the wrapper in the OTel instrumentor
189
- @tenacity_retry
190
- async def run_workflow(
191
- self, workflow_name: str, input: any, options: TriggerWorkflowOptions = None
192
- ) -> WorkflowRunRef:
193
- try:
194
- if not self.pooled_workflow_listener:
195
- self.pooled_workflow_listener = PooledWorkflowRunListener(self.config)
196
-
197
- namespace = self.namespace
198
-
199
- if (
200
- options is not None
201
- and "namespace" in options
202
- and options["namespace"] is not None
203
- ):
204
- namespace = options.pop("namespace")
205
-
206
- if namespace != "" and not workflow_name.startswith(self.namespace):
207
- workflow_name = f"{namespace}{workflow_name}"
208
-
209
- request = self._prepare_workflow_request(workflow_name, input, options)
210
-
211
- resp: TriggerWorkflowResponse = await self.aio_client.TriggerWorkflow(
212
- request,
213
- metadata=get_metadata(self.token),
214
- )
215
-
216
- return WorkflowRunRef(
217
- workflow_run_id=resp.workflow_run_id,
218
- workflow_listener=self.pooled_workflow_listener,
219
- workflow_run_event_listener=self.listener_client,
220
- )
221
- except (grpc.RpcError, grpc.aio.AioRpcError) as e:
222
- if e.code() == grpc.StatusCode.ALREADY_EXISTS:
223
- raise DedupeViolationErr(e.details())
224
-
225
- raise e
226
-
227
- ## IMPORTANT: Keep this method's signature in sync with the wrapper in the OTel instrumentor
228
- @tenacity_retry
229
- async def run_workflows(
230
- self,
231
- workflows: list[WorkflowRunDict],
232
- options: TriggerWorkflowOptions | None = None,
233
- ) -> List[WorkflowRunRef]:
234
- if len(workflows) == 0:
235
- raise ValueError("No workflows to run")
236
-
237
- if not self.pooled_workflow_listener:
238
- self.pooled_workflow_listener = PooledWorkflowRunListener(self.config)
239
-
240
- namespace = self.namespace
241
-
242
- if (
243
- options is not None
244
- and "namespace" in options
245
- and options["namespace"] is not None
246
- ):
247
- namespace = options["namespace"]
248
- del options["namespace"]
249
-
250
- workflow_run_requests: TriggerWorkflowRequest = []
251
-
252
- for workflow in workflows:
253
- workflow_name = workflow["workflow_name"]
254
- input_data = workflow["input"]
255
- options = workflow["options"]
256
-
257
- if namespace != "" and not workflow_name.startswith(self.namespace):
258
- workflow_name = f"{namespace}{workflow_name}"
259
-
260
- # Prepare and trigger workflow for each workflow name and input
261
- request = self._prepare_workflow_request(workflow_name, input_data, options)
262
- workflow_run_requests.append(request)
263
-
264
- request = BulkTriggerWorkflowRequest(workflows=workflow_run_requests)
265
-
266
- resp: BulkTriggerWorkflowResponse = await self.aio_client.BulkTriggerWorkflow(
267
- request,
268
- metadata=get_metadata(self.token),
269
- )
270
-
271
- return [
272
- WorkflowRunRef(
273
- workflow_run_id=workflow_run_id,
274
- workflow_listener=self.pooled_workflow_listener,
275
- workflow_run_event_listener=self.listener_client,
276
- )
277
- for workflow_run_id in resp.workflow_run_ids
278
- ]
279
-
280
- @tenacity_retry
281
- async def put_workflow(
282
- self,
283
- name: str,
284
- workflow: CreateWorkflowVersionOpts | WorkflowMeta,
285
- overrides: CreateWorkflowVersionOpts | None = None,
286
- ) -> WorkflowVersion:
287
- opts = self._prepare_put_workflow_request(name, workflow, overrides)
288
-
289
- return await self.aio_client.PutWorkflow(
290
- opts,
291
- metadata=get_metadata(self.token),
292
- )
293
-
294
- @tenacity_retry
295
- async def put_rate_limit(
296
- self,
297
- key: str,
298
- limit: int,
299
- duration: RateLimitDuration = RateLimitDuration.SECOND,
300
- ):
301
- await self.aio_client.PutRateLimit(
302
- PutRateLimitRequest(
303
- key=key,
304
- limit=limit,
305
- duration=duration,
306
- ),
307
- metadata=get_metadata(self.token),
308
- )
309
-
310
- @tenacity_retry
311
- async def schedule_workflow(
312
- self,
313
- name: str,
314
- schedules: List[Union[datetime, timestamp_pb2.Timestamp]],
315
- input={},
316
- options: ScheduleTriggerWorkflowOptions = None,
317
- ) -> WorkflowVersion:
318
- try:
319
- namespace = self.namespace
320
-
321
- if (
322
- options is not None
323
- and "namespace" in options
324
- and options["namespace"] is not None
325
- ):
326
- namespace = options["namespace"]
327
- del options["namespace"]
328
-
329
- if namespace != "" and not name.startswith(self.namespace):
330
- name = f"{namespace}{name}"
331
-
332
- request = self._prepare_schedule_workflow_request(
333
- name, schedules, input, options
334
- )
335
-
336
- return await self.aio_client.ScheduleWorkflow(
337
- request,
338
- metadata=get_metadata(self.token),
339
- )
340
- except (grpc.aio.AioRpcError, grpc.RpcError) as e:
341
- if e.code() == grpc.StatusCode.ALREADY_EXISTS:
342
- raise DedupeViolationErr(e.details())
343
-
344
- raise e
345
-
346
-
347
- class AdminClient(AdminClientBase):
348
- def __init__(self, config: ClientConfig):
349
- conn = new_conn(config)
350
- self.config = config
351
- self.client = WorkflowServiceStub(conn)
352
- self.aio = AdminClientAioImpl(config)
353
- self.token = config.token
354
- self.listener_client = new_listener(config)
355
- self.namespace = config.namespace
356
-
357
- @tenacity_retry
358
- def put_workflow(
359
- self,
360
- name: str,
361
- workflow: CreateWorkflowVersionOpts | WorkflowMeta,
362
- overrides: CreateWorkflowVersionOpts | None = None,
363
- ) -> WorkflowVersion:
364
- opts = self._prepare_put_workflow_request(name, workflow, overrides)
365
-
366
- resp: WorkflowVersion = self.client.PutWorkflow(
367
- opts,
368
- metadata=get_metadata(self.token),
369
- )
370
-
371
- return resp
372
-
373
- @tenacity_retry
374
- def put_rate_limit(
375
- self,
376
- key: str,
377
- limit: int,
378
- duration: Union[RateLimitDuration.Value, str] = RateLimitDuration.SECOND,
379
- ):
380
- self.client.PutRateLimit(
381
- PutRateLimitRequest(
382
- key=key,
383
- limit=limit,
384
- duration=duration,
385
- ),
386
- metadata=get_metadata(self.token),
387
- )
388
-
389
- @tenacity_retry
390
- def schedule_workflow(
391
- self,
392
- name: str,
393
- schedules: List[Union[datetime, timestamp_pb2.Timestamp]],
394
- input={},
395
- options: ScheduleTriggerWorkflowOptions = None,
396
- ) -> WorkflowVersion:
397
- try:
398
- namespace = self.namespace
399
-
400
- if (
401
- options is not None
402
- and "namespace" in options
403
- and options["namespace"] is not None
404
- ):
405
- namespace = options["namespace"]
406
- del options["namespace"]
407
-
408
- if namespace != "" and not name.startswith(self.namespace):
409
- name = f"{namespace}{name}"
410
-
411
- request = self._prepare_schedule_workflow_request(
412
- name, schedules, input, options
413
- )
414
-
415
- return self.client.ScheduleWorkflow(
416
- request,
417
- metadata=get_metadata(self.token),
418
- )
419
- except (grpc.RpcError, grpc.aio.AioRpcError) as e:
420
- if e.code() == grpc.StatusCode.ALREADY_EXISTS:
421
- raise DedupeViolationErr(e.details())
422
-
423
- raise e
424
-
425
- ## IMPORTANT: Keep this method's signature in sync with the wrapper in the OTel instrumentor
426
- @tenacity_retry
427
- def run_workflow(
428
- self, workflow_name: str, input: any, options: TriggerWorkflowOptions = None
429
- ) -> WorkflowRunRef:
430
- try:
431
- if not self.pooled_workflow_listener:
432
- self.pooled_workflow_listener = PooledWorkflowRunListener(self.config)
433
-
434
- namespace = self.namespace
435
-
436
- ## TODO: Factor this out - it's repeated a lot of places
437
- if (
438
- options is not None
439
- and "namespace" in options
440
- and options["namespace"] is not None
441
- ):
442
- namespace = options.pop("namespace")
443
-
444
- if namespace != "" and not workflow_name.startswith(self.namespace):
445
- workflow_name = f"{namespace}{workflow_name}"
446
-
447
- request = self._prepare_workflow_request(workflow_name, input, options)
448
-
449
- resp: TriggerWorkflowResponse = self.client.TriggerWorkflow(
450
- request,
451
- metadata=get_metadata(self.token),
452
- )
453
-
454
- return WorkflowRunRef(
455
- workflow_run_id=resp.workflow_run_id,
456
- workflow_listener=self.pooled_workflow_listener,
457
- workflow_run_event_listener=self.listener_client,
458
- )
459
- except (grpc.RpcError, grpc.aio.AioRpcError) as e:
460
- if e.code() == grpc.StatusCode.ALREADY_EXISTS:
461
- raise DedupeViolationErr(e.details())
462
-
463
- raise e
464
-
465
- ## IMPORTANT: Keep this method's signature in sync with the wrapper in the OTel instrumentor
466
- @tenacity_retry
467
- def run_workflows(
468
- self, workflows: List[WorkflowRunDict], options: TriggerWorkflowOptions = None
469
- ) -> list[WorkflowRunRef]:
470
- workflow_run_requests: TriggerWorkflowRequest = []
471
- if not self.pooled_workflow_listener:
472
- self.pooled_workflow_listener = PooledWorkflowRunListener(self.config)
473
-
474
- for workflow in workflows:
475
- workflow_name = workflow["workflow_name"]
476
- input_data = workflow["input"]
477
- options = workflow["options"]
478
-
479
- namespace = self.namespace
480
-
481
- if (
482
- options is not None
483
- and "namespace" in options
484
- and options["namespace"] is not None
485
- ):
486
- namespace = options["namespace"]
487
- del options["namespace"]
488
-
489
- if namespace != "" and not workflow_name.startswith(self.namespace):
490
- workflow_name = f"{namespace}{workflow_name}"
491
-
492
- # Prepare and trigger workflow for each workflow name and input
493
- request = self._prepare_workflow_request(workflow_name, input_data, options)
494
-
495
- workflow_run_requests.append(request)
496
-
497
- request = BulkTriggerWorkflowRequest(workflows=workflow_run_requests)
498
-
499
- resp: BulkTriggerWorkflowResponse = self.client.BulkTriggerWorkflow(
500
- request,
501
- metadata=get_metadata(self.token),
502
- )
503
-
504
- return [
505
- WorkflowRunRef(
506
- workflow_run_id=workflow_run_id,
507
- workflow_listener=self.pooled_workflow_listener,
508
- workflow_run_event_listener=self.listener_client,
509
- )
510
- for workflow_run_id in resp.workflow_run_ids
511
- ]
512
-
513
- def run(
514
- self,
515
- function: Union[str, Callable[[Any], T]],
516
- input: any,
517
- options: TriggerWorkflowOptions = None,
518
- ) -> "RunRef[T]":
519
- workflow_name = function
520
-
521
- if not isinstance(function, str):
522
- workflow_name = function.function_name
523
-
524
- wrr = self.run_workflow(workflow_name, input, options)
525
-
526
- return RunRef[T](
527
- wrr.workflow_run_id, wrr.workflow_listener, wrr.workflow_run_event_listener
528
- )
529
-
530
- def get_workflow_run(self, workflow_run_id: str) -> WorkflowRunRef:
531
- try:
532
- if not self.pooled_workflow_listener:
533
- self.pooled_workflow_listener = PooledWorkflowRunListener(self.config)
534
-
535
- return WorkflowRunRef(
536
- workflow_run_id=workflow_run_id,
537
- workflow_listener=self.pooled_workflow_listener,
538
- workflow_run_event_listener=self.listener_client,
539
- )
540
- except grpc.RpcError as e:
541
- raise ValueError(f"Could not get workflow run: {e}")