tilebox-workflows 0.44.0__py3-none-any.whl → 0.46.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.
tilebox/workflows/task.py CHANGED
@@ -4,15 +4,16 @@ import json
4
4
  import typing
5
5
  from abc import ABC, ABCMeta, abstractmethod
6
6
  from base64 import b64decode, b64encode
7
+ from collections import defaultdict
7
8
  from collections.abc import Sequence
8
9
  from dataclasses import dataclass, field, fields, is_dataclass
9
10
  from types import NoneType, UnionType
10
- from typing import Any, cast, get_args, get_origin
11
+ from typing import Any, Generic, TypeVar, cast, get_args, get_origin
11
12
 
12
13
  # from python 3.11 onwards this is available as typing.dataclass_transform:
13
14
  from typing_extensions import dataclass_transform
14
15
 
15
- from tilebox.workflows.data import RunnerContext, TaskIdentifier, TaskSubmission
16
+ from tilebox.workflows.data import RunnerContext, TaskIdentifier, TaskSubmissionGroup, TaskSubmissions
16
17
 
17
18
  META_ATTR = "__tilebox_task_meta__" # the name of the attribute we use to store task metadata on the class
18
19
 
@@ -236,16 +237,96 @@ class FutureTask:
236
237
  def display(self) -> str:
237
238
  return self.task.__class__.__name__
238
239
 
239
- def to_submission(self, fallback_cluster: str = "") -> TaskSubmission:
240
- return TaskSubmission(
241
- cluster_slug=self.cluster or fallback_cluster,
242
- identifier=self.identifier(),
243
- input=self.input(),
244
- display=self.display(),
245
- dependencies=self.depends_on,
246
- max_retries=self.max_retries,
240
+
241
+ _T = TypeVar("_T")
242
+
243
+
244
+ class _FastIndexLookupList(Generic[_T]):
245
+ """A list that provides fast lookup by index."""
246
+
247
+ def __init__(self) -> None:
248
+ super().__init__()
249
+ self.values = []
250
+ self._index_lookup: dict[_T, int] = {}
251
+
252
+ def __contains__(self, key: _T) -> bool:
253
+ return key in self._index_lookup
254
+
255
+ def __getitem__(self, key: _T) -> _T:
256
+ index = self._index_lookup[key]
257
+ return self.values[index]
258
+
259
+ def append_if_unique(self, value: _T) -> int:
260
+ if value in self._index_lookup:
261
+ return self._index_lookup[value]
262
+ index = len(self.values)
263
+ self.values.append(value)
264
+ self._index_lookup[value] = index
265
+ return index
266
+
267
+
268
+ def merge_future_tasks_to_submissions(future_tasks: list[FutureTask], fallback_cluster: str) -> TaskSubmissions | None:
269
+ if len(future_tasks) == 0:
270
+ return None
271
+
272
+ dependants = defaultdict(set)
273
+ for task in future_tasks:
274
+ for dep in task.depends_on:
275
+ dependants[dep].add(task.index)
276
+
277
+ dependants = {k: frozenset(v) for k, v in dependants.items()}
278
+
279
+ # we keep track of which task ends up in which group, so we can convert task dependencies to group dependencies
280
+ task_index_to_group = {}
281
+
282
+ group_keys = _FastIndexLookupList[_TaskGroupUniqueKey]()
283
+ groups: list[TaskSubmissionGroup] = []
284
+ # even though in python dicts preserve insertion order, we explicitly keep a list and an explicit lookup dict, to
285
+ # make the intent clear. This also allows us to more easily port this code to Tilebox clients in other languages.
286
+ cluster_slugs = _FastIndexLookupList[str]()
287
+ identifiers = _FastIndexLookupList[TaskIdentifier]()
288
+ displays = _FastIndexLookupList[str]()
289
+
290
+ for task in future_tasks:
291
+ group_key = _TaskGroupUniqueKey(
292
+ dependencies=frozenset(task.depends_on),
293
+ dependants=dependants.get(task.index, frozenset()),
294
+ )
295
+ group_index = group_keys.append_if_unique(group_key)
296
+ if group_index == len(groups): # it was a new unique group
297
+ groups.append(TaskSubmissionGroup(dependencies_on_other_groups=task.depends_on))
298
+ task_index_to_group[task.index] = group_index
299
+
300
+ for i in range(len(groups)):
301
+ group = groups[i]
302
+ group.dependencies_on_other_groups = list(
303
+ # convert the task dependencies to group dependencies, deduplicate and sort them
304
+ {task_index_to_group[dep] for dep in group.dependencies_on_other_groups}
247
305
  )
248
306
 
307
+ for task in future_tasks:
308
+ group_index = task_index_to_group[task.index]
309
+ group = groups[group_index]
310
+
311
+ group.inputs.append(task.input())
312
+ group.identifier_pointers.append(identifiers.append_if_unique(task.identifier()))
313
+ group.cluster_slug_pointers.append(cluster_slugs.append_if_unique(task.cluster or fallback_cluster))
314
+ group.display_pointers.append(displays.append_if_unique(task.display()))
315
+ group.max_retries_values.append(task.max_retries)
316
+
317
+ return TaskSubmissions(
318
+ task_groups=groups,
319
+ cluster_slug_lookup=cluster_slugs.values,
320
+ identifier_lookup=identifiers.values,
321
+ display_lookup=displays.values,
322
+ )
323
+
324
+
325
+ @dataclass(frozen=True, unsafe_hash=True)
326
+ class _TaskGroupUniqueKey:
327
+ dependencies: frozenset[int]
328
+ dependants: frozenset[int]
329
+
249
330
 
250
331
  class ProgressUpdate:
251
332
  def __init__(self, label: str | None) -> None:
@@ -29,7 +29,7 @@ from tilebox.datasets.tilebox.v1 import id_pb2 as tilebox_dot_v1_dot_id__pb2
29
29
  from tilebox.workflows.workflows.v1 import core_pb2 as workflows_dot_v1_dot_core__pb2
30
30
 
31
31
 
32
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1dworkflows/v1/automation.proto\x12\x0cworkflows.v1\x1a\x1b\x62uf/validate/validate.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x13tilebox/v1/id.proto\x1a\x17workflows/v1/core.proto\"\x9c\x01\n\x0fStorageLocation\x12&\n\x02id\x18\x01 \x01(\x0b\x32\x0e.tilebox.v1.IDB\x06\xbaH\x03\xc8\x01\x01R\x02id\x12&\n\x08location\x18\x02 \x01(\tB\n\xbaH\x07r\x05 \x01(\x80\x04R\x08location\x12\x39\n\x04type\x18\x03 \x01(\x0e\x32\x19.workflows.v1.StorageTypeB\n\xbaH\x07\x82\x01\x04\x10\x01 \x00R\x04type\"O\n\x10StorageLocations\x12;\n\tlocations\x18\x01 \x03(\x0b\x32\x1d.workflows.v1.StorageLocationR\tlocations\"\x8a\x03\n\x13\x41utomationPrototype\x12\x1e\n\x02id\x18\x01 \x01(\x0b\x32\x0e.tilebox.v1.IDR\x02id\x12\x1e\n\x04name\x18\x02 \x01(\tB\n\xbaH\x07r\x05 \x01(\x80\x08R\x04name\x12:\n\tprototype\x18\x03 \x01(\x0b\x32\x1c.workflows.v1.TaskSubmissionR\tprototype\x12\x61\n\x16storage_event_triggers\x18\x04 \x03(\x0b\x32!.workflows.v1.StorageEventTriggerB\x08\xbaH\x05\x92\x01\x02\x10 R\x14storageEventTriggers\x12H\n\rcron_triggers\x18\x05 \x03(\x0b\x32\x19.workflows.v1.CronTriggerB\x08\xbaH\x05\x92\x01\x02\x10 R\x0c\x63ronTriggers\x12\x1a\n\x08\x64isabled\x18\x06 \x01(\x08R\x08\x64isabled:.\xbaH+\")\n\x16storage_event_triggers\n\rcron_triggers\x10\x01\"R\n\x0b\x41utomations\x12\x43\n\x0b\x61utomations\x18\x01 \x03(\x0b\x32!.workflows.v1.AutomationPrototypeR\x0b\x61utomations\"\xab\x01\n\x13StorageEventTrigger\x12\x1e\n\x02id\x18\x01 \x01(\x0b\x32\x0e.tilebox.v1.IDR\x02id\x12H\n\x10storage_location\x18\x02 \x01(\x0b\x32\x1d.workflows.v1.StorageLocationR\x0fstorageLocation\x12*\n\x0cglob_pattern\x18\x03 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x0bglobPattern\"R\n\x0b\x43ronTrigger\x12\x1e\n\x02id\x18\x01 \x01(\x0b\x32\x0e.tilebox.v1.IDR\x02id\x12#\n\x08schedule\x18\x02 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x08schedule\"E\n\nAutomation\x12#\n\rtrigger_event\x18\x01 \x01(\x0cR\x0ctriggerEvent\x12\x12\n\x04\x61rgs\x18\x02 \x01(\x0cR\x04\x61rgs\"\xa7\x01\n\x15TriggeredStorageEvent\x12>\n\x13storage_location_id\x18\x01 \x01(\x0b\x32\x0e.tilebox.v1.IDR\x11storageLocationId\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32\x1e.workflows.v1.StorageEventTypeR\x04type\x12\x1a\n\x08location\x18\x03 \x01(\tR\x08location\"S\n\x12TriggeredCronEvent\x12=\n\x0ctrigger_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\x0btriggerTime\"w\n\x17\x44\x65leteAutomationRequest\x12;\n\rautomation_id\x18\x01 \x01(\x0b\x32\x0e.tilebox.v1.IDB\x06\xbaH\x03\xc8\x01\x01R\x0c\x61utomationId\x12\x1f\n\x0b\x63\x61ncel_jobs\x18\x02 \x01(\x08R\ncancelJobs*k\n\x0bStorageType\x12\x1c\n\x18STORAGE_TYPE_UNSPECIFIED\x10\x00\x12\x14\n\x10STORAGE_TYPE_GCS\x10\x01\x12\x13\n\x0fSTORAGE_TYPE_S3\x10\x02\x12\x13\n\x0fSTORAGE_TYPE_FS\x10\x03*V\n\x10StorageEventType\x12\"\n\x1eSTORAGE_EVENT_TYPE_UNSPECIFIED\x10\x00\x12\x1e\n\x1aSTORAGE_EVENT_TYPE_CREATED\x10\x01\x32\xd1\x05\n\x11\x41utomationService\x12N\n\x14ListStorageLocations\x12\x16.google.protobuf.Empty\x1a\x1e.workflows.v1.StorageLocations\x12\x43\n\x12GetStorageLocation\x12\x0e.tilebox.v1.ID\x1a\x1d.workflows.v1.StorageLocation\x12U\n\x15\x43reateStorageLocation\x12\x1d.workflows.v1.StorageLocation\x1a\x1d.workflows.v1.StorageLocation\x12?\n\x15\x44\x65leteStorageLocation\x12\x0e.tilebox.v1.ID\x1a\x16.google.protobuf.Empty\x12\x44\n\x0fListAutomations\x12\x16.google.protobuf.Empty\x1a\x19.workflows.v1.Automations\x12\x42\n\rGetAutomation\x12\x0e.tilebox.v1.ID\x1a!.workflows.v1.AutomationPrototype\x12X\n\x10\x43reateAutomation\x12!.workflows.v1.AutomationPrototype\x1a!.workflows.v1.AutomationPrototype\x12X\n\x10UpdateAutomation\x12!.workflows.v1.AutomationPrototype\x1a!.workflows.v1.AutomationPrototype\x12Q\n\x10\x44\x65leteAutomation\x12%.workflows.v1.DeleteAutomationRequest\x1a\x16.google.protobuf.EmptyBy\n\x10\x63om.workflows.v1B\x0f\x41utomationProtoP\x01\xa2\x02\x03WXX\xaa\x02\x0cWorkflows.V1\xca\x02\x0cWorkflows\\V1\xe2\x02\x18Workflows\\V1\\GPBMetadata\xea\x02\rWorkflows::V1\x92\x03\x02\x08\x02\x62\x08\x65\x64itionsp\xe8\x07')
32
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1dworkflows/v1/automation.proto\x12\x0cworkflows.v1\x1a\x1b\x62uf/validate/validate.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x13tilebox/v1/id.proto\x1a\x17workflows/v1/core.proto\"\x9c\x01\n\x0fStorageLocation\x12&\n\x02id\x18\x01 \x01(\x0b\x32\x0e.tilebox.v1.IDB\x06\xbaH\x03\xc8\x01\x01R\x02id\x12&\n\x08location\x18\x02 \x01(\tB\n\xbaH\x07r\x05 \x01(\x80\x04R\x08location\x12\x39\n\x04type\x18\x03 \x01(\x0e\x32\x19.workflows.v1.StorageTypeB\n\xbaH\x07\x82\x01\x04\x10\x01 \x00R\x04type\"O\n\x10StorageLocations\x12;\n\tlocations\x18\x01 \x03(\x0b\x32\x1d.workflows.v1.StorageLocationR\tlocations\"\x90\x03\n\x13\x41utomationPrototype\x12\x1e\n\x02id\x18\x01 \x01(\x0b\x32\x0e.tilebox.v1.IDR\x02id\x12\x1e\n\x04name\x18\x02 \x01(\tB\n\xbaH\x07r\x05 \x01(\x80\x08R\x04name\x12@\n\tprototype\x18\x03 \x01(\x0b\x32\".workflows.v1.SingleTaskSubmissionR\tprototype\x12\x61\n\x16storage_event_triggers\x18\x04 \x03(\x0b\x32!.workflows.v1.StorageEventTriggerB\x08\xbaH\x05\x92\x01\x02\x10 R\x14storageEventTriggers\x12H\n\rcron_triggers\x18\x05 \x03(\x0b\x32\x19.workflows.v1.CronTriggerB\x08\xbaH\x05\x92\x01\x02\x10 R\x0c\x63ronTriggers\x12\x1a\n\x08\x64isabled\x18\x06 \x01(\x08R\x08\x64isabled:.\xbaH+\")\n\x16storage_event_triggers\n\rcron_triggers\x10\x01\"R\n\x0b\x41utomations\x12\x43\n\x0b\x61utomations\x18\x01 \x03(\x0b\x32!.workflows.v1.AutomationPrototypeR\x0b\x61utomations\"\xab\x01\n\x13StorageEventTrigger\x12\x1e\n\x02id\x18\x01 \x01(\x0b\x32\x0e.tilebox.v1.IDR\x02id\x12H\n\x10storage_location\x18\x02 \x01(\x0b\x32\x1d.workflows.v1.StorageLocationR\x0fstorageLocation\x12*\n\x0cglob_pattern\x18\x03 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x0bglobPattern\"R\n\x0b\x43ronTrigger\x12\x1e\n\x02id\x18\x01 \x01(\x0b\x32\x0e.tilebox.v1.IDR\x02id\x12#\n\x08schedule\x18\x02 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x08schedule\"E\n\nAutomation\x12#\n\rtrigger_event\x18\x01 \x01(\x0cR\x0ctriggerEvent\x12\x12\n\x04\x61rgs\x18\x02 \x01(\x0cR\x04\x61rgs\"\xa7\x01\n\x15TriggeredStorageEvent\x12>\n\x13storage_location_id\x18\x01 \x01(\x0b\x32\x0e.tilebox.v1.IDR\x11storageLocationId\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32\x1e.workflows.v1.StorageEventTypeR\x04type\x12\x1a\n\x08location\x18\x03 \x01(\tR\x08location\"S\n\x12TriggeredCronEvent\x12=\n\x0ctrigger_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\x0btriggerTime\"w\n\x17\x44\x65leteAutomationRequest\x12;\n\rautomation_id\x18\x01 \x01(\x0b\x32\x0e.tilebox.v1.IDB\x06\xbaH\x03\xc8\x01\x01R\x0c\x61utomationId\x12\x1f\n\x0b\x63\x61ncel_jobs\x18\x02 \x01(\x08R\ncancelJobs*k\n\x0bStorageType\x12\x1c\n\x18STORAGE_TYPE_UNSPECIFIED\x10\x00\x12\x14\n\x10STORAGE_TYPE_GCS\x10\x01\x12\x13\n\x0fSTORAGE_TYPE_S3\x10\x02\x12\x13\n\x0fSTORAGE_TYPE_FS\x10\x03*V\n\x10StorageEventType\x12\"\n\x1eSTORAGE_EVENT_TYPE_UNSPECIFIED\x10\x00\x12\x1e\n\x1aSTORAGE_EVENT_TYPE_CREATED\x10\x01\x32\xd1\x05\n\x11\x41utomationService\x12N\n\x14ListStorageLocations\x12\x16.google.protobuf.Empty\x1a\x1e.workflows.v1.StorageLocations\x12\x43\n\x12GetStorageLocation\x12\x0e.tilebox.v1.ID\x1a\x1d.workflows.v1.StorageLocation\x12U\n\x15\x43reateStorageLocation\x12\x1d.workflows.v1.StorageLocation\x1a\x1d.workflows.v1.StorageLocation\x12?\n\x15\x44\x65leteStorageLocation\x12\x0e.tilebox.v1.ID\x1a\x16.google.protobuf.Empty\x12\x44\n\x0fListAutomations\x12\x16.google.protobuf.Empty\x1a\x19.workflows.v1.Automations\x12\x42\n\rGetAutomation\x12\x0e.tilebox.v1.ID\x1a!.workflows.v1.AutomationPrototype\x12X\n\x10\x43reateAutomation\x12!.workflows.v1.AutomationPrototype\x1a!.workflows.v1.AutomationPrototype\x12X\n\x10UpdateAutomation\x12!.workflows.v1.AutomationPrototype\x1a!.workflows.v1.AutomationPrototype\x12Q\n\x10\x44\x65leteAutomation\x12%.workflows.v1.DeleteAutomationRequest\x1a\x16.google.protobuf.EmptyBy\n\x10\x63om.workflows.v1B\x0f\x41utomationProtoP\x01\xa2\x02\x03WXX\xaa\x02\x0cWorkflows.V1\xca\x02\x0cWorkflows\\V1\xe2\x02\x18Workflows\\V1\\GPBMetadata\xea\x02\rWorkflows::V1\x92\x03\x02\x08\x02\x62\x08\x65\x64itionsp\xe8\x07')
33
33
 
34
34
  _globals = globals()
35
35
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -57,30 +57,30 @@ if not _descriptor._USE_C_DESCRIPTORS:
57
57
  _globals['_CRONTRIGGER'].fields_by_name['schedule']._serialized_options = b'\272H\004r\002\020\001'
58
58
  _globals['_DELETEAUTOMATIONREQUEST'].fields_by_name['automation_id']._loaded_options = None
59
59
  _globals['_DELETEAUTOMATIONREQUEST'].fields_by_name['automation_id']._serialized_options = b'\272H\003\310\001\001'
60
- _globals['_STORAGETYPE']._serialized_start=1610
61
- _globals['_STORAGETYPE']._serialized_end=1717
62
- _globals['_STORAGEEVENTTYPE']._serialized_start=1719
63
- _globals['_STORAGEEVENTTYPE']._serialized_end=1805
60
+ _globals['_STORAGETYPE']._serialized_start=1616
61
+ _globals['_STORAGETYPE']._serialized_end=1723
62
+ _globals['_STORAGEEVENTTYPE']._serialized_start=1725
63
+ _globals['_STORAGEEVENTTYPE']._serialized_end=1811
64
64
  _globals['_STORAGELOCATION']._serialized_start=185
65
65
  _globals['_STORAGELOCATION']._serialized_end=341
66
66
  _globals['_STORAGELOCATIONS']._serialized_start=343
67
67
  _globals['_STORAGELOCATIONS']._serialized_end=422
68
68
  _globals['_AUTOMATIONPROTOTYPE']._serialized_start=425
69
- _globals['_AUTOMATIONPROTOTYPE']._serialized_end=819
70
- _globals['_AUTOMATIONS']._serialized_start=821
71
- _globals['_AUTOMATIONS']._serialized_end=903
72
- _globals['_STORAGEEVENTTRIGGER']._serialized_start=906
73
- _globals['_STORAGEEVENTTRIGGER']._serialized_end=1077
74
- _globals['_CRONTRIGGER']._serialized_start=1079
75
- _globals['_CRONTRIGGER']._serialized_end=1161
76
- _globals['_AUTOMATION']._serialized_start=1163
77
- _globals['_AUTOMATION']._serialized_end=1232
78
- _globals['_TRIGGEREDSTORAGEEVENT']._serialized_start=1235
79
- _globals['_TRIGGEREDSTORAGEEVENT']._serialized_end=1402
80
- _globals['_TRIGGEREDCRONEVENT']._serialized_start=1404
81
- _globals['_TRIGGEREDCRONEVENT']._serialized_end=1487
82
- _globals['_DELETEAUTOMATIONREQUEST']._serialized_start=1489
83
- _globals['_DELETEAUTOMATIONREQUEST']._serialized_end=1608
84
- _globals['_AUTOMATIONSERVICE']._serialized_start=1808
85
- _globals['_AUTOMATIONSERVICE']._serialized_end=2529
69
+ _globals['_AUTOMATIONPROTOTYPE']._serialized_end=825
70
+ _globals['_AUTOMATIONS']._serialized_start=827
71
+ _globals['_AUTOMATIONS']._serialized_end=909
72
+ _globals['_STORAGEEVENTTRIGGER']._serialized_start=912
73
+ _globals['_STORAGEEVENTTRIGGER']._serialized_end=1083
74
+ _globals['_CRONTRIGGER']._serialized_start=1085
75
+ _globals['_CRONTRIGGER']._serialized_end=1167
76
+ _globals['_AUTOMATION']._serialized_start=1169
77
+ _globals['_AUTOMATION']._serialized_end=1238
78
+ _globals['_TRIGGEREDSTORAGEEVENT']._serialized_start=1241
79
+ _globals['_TRIGGEREDSTORAGEEVENT']._serialized_end=1408
80
+ _globals['_TRIGGEREDCRONEVENT']._serialized_start=1410
81
+ _globals['_TRIGGEREDCRONEVENT']._serialized_end=1493
82
+ _globals['_DELETEAUTOMATIONREQUEST']._serialized_start=1495
83
+ _globals['_DELETEAUTOMATIONREQUEST']._serialized_end=1614
84
+ _globals['_AUTOMATIONSERVICE']._serialized_start=1814
85
+ _globals['_AUTOMATIONSERVICE']._serialized_end=2535
86
86
  # @@protoc_insertion_point(module_scope)
@@ -56,11 +56,11 @@ class AutomationPrototype(_message.Message):
56
56
  DISABLED_FIELD_NUMBER: _ClassVar[int]
57
57
  id: _id_pb2.ID
58
58
  name: str
59
- prototype: _core_pb2.TaskSubmission
59
+ prototype: _core_pb2.SingleTaskSubmission
60
60
  storage_event_triggers: _containers.RepeatedCompositeFieldContainer[StorageEventTrigger]
61
61
  cron_triggers: _containers.RepeatedCompositeFieldContainer[CronTrigger]
62
62
  disabled: bool
63
- def __init__(self, id: _Optional[_Union[_id_pb2.ID, _Mapping]] = ..., name: _Optional[str] = ..., prototype: _Optional[_Union[_core_pb2.TaskSubmission, _Mapping]] = ..., storage_event_triggers: _Optional[_Iterable[_Union[StorageEventTrigger, _Mapping]]] = ..., cron_triggers: _Optional[_Iterable[_Union[CronTrigger, _Mapping]]] = ..., disabled: bool = ...) -> None: ...
63
+ def __init__(self, id: _Optional[_Union[_id_pb2.ID, _Mapping]] = ..., name: _Optional[str] = ..., prototype: _Optional[_Union[_core_pb2.SingleTaskSubmission, _Mapping]] = ..., storage_event_triggers: _Optional[_Iterable[_Union[StorageEventTrigger, _Mapping]]] = ..., cron_triggers: _Optional[_Iterable[_Union[CronTrigger, _Mapping]]] = ..., disabled: bool = ...) -> None: ...
64
64
 
65
65
  class Automations(_message.Message):
66
66
  __slots__ = ("automations",)
@@ -28,7 +28,7 @@ from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__
28
28
  from tilebox.datasets.tilebox.v1 import id_pb2 as tilebox_dot_v1_dot_id__pb2
29
29
 
30
30
 
31
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x17workflows/v1/core.proto\x12\x0cworkflows.v1\x1a\x1b\x62uf/validate/validate.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x13tilebox/v1/id.proto\"^\n\x07\x43luster\x12\x12\n\x04slug\x18\x02 \x01(\tR\x04slug\x12!\n\x0c\x64isplay_name\x18\x03 \x01(\tR\x0b\x64isplayName\x12\x1c\n\tdeletable\x18\x04 \x01(\x08R\tdeletable\"\xd1\x03\n\x03Job\x12\x1e\n\x02id\x18\x01 \x01(\x0b\x32\x0e.tilebox.v1.IDR\x02id\x12\x12\n\x04name\x18\x02 \x01(\tR\x04name\x12!\n\x0ctrace_parent\x18\x03 \x01(\tR\x0btraceParent\x12\x1a\n\x08\x63\x61nceled\x18\x05 \x01(\x08R\x08\x63\x61nceled\x12,\n\x05state\x18\x06 \x01(\x0e\x32\x16.workflows.v1.JobStateR\x05state\x12=\n\x0csubmitted_at\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\x0bsubmittedAt\x12\x39\n\nstarted_at\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tstartedAt\x12@\n\x0etask_summaries\x18\t \x03(\x0b\x32\x19.workflows.v1.TaskSummaryR\rtaskSummaries\x12\x33\n\rautomation_id\x18\n \x01(\x0b\x32\x0e.tilebox.v1.IDR\x0c\x61utomationId\x12\x32\n\x08progress\x18\x0b \x03(\x0b\x32\x16.workflows.v1.ProgressR\x08progressJ\x04\x08\x04\x10\x05\"\x9f\x02\n\x0bTaskSummary\x12\x1e\n\x02id\x18\x01 \x01(\x0b\x32\x0e.tilebox.v1.IDR\x02id\x12\x18\n\x07\x64isplay\x18\x02 \x01(\tR\x07\x64isplay\x12-\n\x05state\x18\x03 \x01(\x0e\x32\x17.workflows.v1.TaskStateR\x05state\x12+\n\tparent_id\x18\x04 \x01(\x0b\x32\x0e.tilebox.v1.IDR\x08parentId\x12\x39\n\nstarted_at\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tstartedAt\x12\x39\n\nstopped_at\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tstoppedAtJ\x04\x08\x05\x10\x06\"S\n\x08Progress\x12\x1d\n\x05label\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x18\x64R\x05label\x12\x14\n\x05total\x18\x02 \x01(\x04R\x05total\x12\x12\n\x04\x64one\x18\x03 \x01(\x04R\x04\x64one\"\xa2\x03\n\x04Task\x12\x1e\n\x02id\x18\x01 \x01(\x0b\x32\x0e.tilebox.v1.IDR\x02id\x12<\n\nidentifier\x18\x02 \x01(\x0b\x32\x1c.workflows.v1.TaskIdentifierR\nidentifier\x12-\n\x05state\x18\x03 \x01(\x0e\x32\x17.workflows.v1.TaskStateR\x05state\x12\x1b\n\x05input\x18\x04 \x01(\x0c\x42\x05\xaa\x01\x02\x08\x01R\x05input\x12\x1f\n\x07\x64isplay\x18\x05 \x01(\tB\x05\xaa\x01\x02\x08\x01R\x07\x64isplay\x12#\n\x03job\x18\x06 \x01(\x0b\x32\x11.workflows.v1.JobR\x03job\x12+\n\tparent_id\x18\x07 \x01(\x0b\x32\x0e.tilebox.v1.IDR\x08parentId\x12-\n\ndepends_on\x18\x08 \x03(\x0b\x32\x0e.tilebox.v1.IDR\tdependsOn\x12-\n\x05lease\x18\t \x01(\x0b\x32\x17.workflows.v1.TaskLeaseR\x05lease\x12\x1f\n\x0bretry_count\x18\n \x01(\x03R\nretryCount\"d\n\x0eTaskIdentifier\x12\x1e\n\x04name\x18\x01 \x01(\tB\n\xbaH\x07r\x05 \x01(\x80\x02R\x04name\x12\x32\n\x07version\x18\x02 \x01(\tB\x18\xbaH\x15r\x13 \x01\x32\x0f^v(\\d+)\\.(\\d+)$R\x07version\"1\n\x05Tasks\x12(\n\x05tasks\x18\x01 \x03(\x0b\x32\x12.workflows.v1.TaskR\x05tasks\"\x92\x02\n\x0eTaskSubmission\x12!\n\x0c\x63luster_slug\x18\x01 \x01(\tR\x0b\x63lusterSlug\x12<\n\nidentifier\x18\x02 \x01(\x0b\x32\x1c.workflows.v1.TaskIdentifierR\nidentifier\x12\x1e\n\x05input\x18\x03 \x01(\x0c\x42\x08\xbaH\x05z\x03\x18\x80\x08R\x05input\x12!\n\x07\x64isplay\x18\x04 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x07\x64isplay\x12\x32\n\x0c\x64\x65pendencies\x18\x05 \x03(\x03\x42\x0e\xbaH\x0b\x92\x01\x08\"\x06\"\x04\x18?(\x00R\x0c\x64\x65pendencies\x12(\n\x0bmax_retries\x18\x06 \x01(\x03\x42\x07\xbaH\x04\"\x02(\x00R\nmaxRetries\"\xa9\x01\n\tTaskLease\x12/\n\x05lease\x18\x01 \x01(\x0b\x32\x19.google.protobuf.DurationR\x05lease\x12k\n%recommended_wait_until_next_extension\x18\x02 \x01(\x0b\x32\x19.google.protobuf.DurationR!recommendedWaitUntilNextExtension*k\n\x08JobState\x12\x19\n\x15JOB_STATE_UNSPECIFIED\x10\x00\x12\x14\n\x10JOB_STATE_QUEUED\x10\x01\x12\x15\n\x11JOB_STATE_STARTED\x10\x02\x12\x17\n\x13JOB_STATE_COMPLETED\x10\x03*\xa0\x01\n\tTaskState\x12\x1a\n\x16TASK_STATE_UNSPECIFIED\x10\x00\x12\x15\n\x11TASK_STATE_QUEUED\x10\x01\x12\x16\n\x12TASK_STATE_RUNNING\x10\x02\x12\x17\n\x13TASK_STATE_COMPUTED\x10\x03\x12\x15\n\x11TASK_STATE_FAILED\x10\x04\x12\x18\n\x14TASK_STATE_CANCELLED\x10\x05\x42s\n\x10\x63om.workflows.v1B\tCoreProtoP\x01\xa2\x02\x03WXX\xaa\x02\x0cWorkflows.V1\xca\x02\x0cWorkflows\\V1\xe2\x02\x18Workflows\\V1\\GPBMetadata\xea\x02\rWorkflows::V1\x92\x03\x02\x08\x02\x62\x08\x65\x64itionsp\xe8\x07')
31
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x17workflows/v1/core.proto\x12\x0cworkflows.v1\x1a\x1b\x62uf/validate/validate.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x13tilebox/v1/id.proto\"^\n\x07\x43luster\x12\x12\n\x04slug\x18\x02 \x01(\tR\x04slug\x12!\n\x0c\x64isplay_name\x18\x03 \x01(\tR\x0b\x64isplayName\x12\x1c\n\tdeletable\x18\x04 \x01(\x08R\tdeletable\"\xe5\x04\n\x03Job\x12\x1e\n\x02id\x18\x01 \x01(\x0b\x32\x0e.tilebox.v1.IDR\x02id\x12\x12\n\x04name\x18\x02 \x01(\tR\x04name\x12!\n\x0ctrace_parent\x18\x03 \x01(\tR\x0btraceParent\x12\x1e\n\x08\x63\x61nceled\x18\x05 \x01(\x08\x42\x02\x18\x01R\x08\x63\x61nceled\x12\x43\n\x0clegacy_state\x18\x06 \x01(\x0e\x32\x1c.workflows.v1.LegacyJobStateB\x02\x18\x01R\x0blegacyState\x12=\n\x0csubmitted_at\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\x0bsubmittedAt\x12=\n\nstarted_at\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x02\x18\x01R\tstartedAt\x12@\n\x0etask_summaries\x18\t \x03(\x0b\x32\x19.workflows.v1.TaskSummaryR\rtaskSummaries\x12\x33\n\rautomation_id\x18\n \x01(\x0b\x32\x0e.tilebox.v1.IDR\x0c\x61utomationId\x12\x32\n\x08progress\x18\x0b \x03(\x0b\x32\x16.workflows.v1.ProgressR\x08progress\x12,\n\x05state\x18\x0c \x01(\x0e\x32\x16.workflows.v1.JobStateR\x05state\x12\x45\n\x0f\x65xecution_stats\x18\r \x01(\x0b\x32\x1c.workflows.v1.ExecutionStatsR\x0e\x65xecutionStatsJ\x04\x08\x04\x10\x05\"\xaf\x03\n\x0e\x45xecutionStats\x12M\n\x15\x66irst_task_started_at\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\x12\x66irstTaskStartedAt\x12K\n\x14last_task_stopped_at\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\x11lastTaskStoppedAt\x12<\n\x0c\x63ompute_time\x18\x03 \x01(\x0b\x32\x19.google.protobuf.DurationR\x0b\x63omputeTime\x12<\n\x0c\x65lapsed_time\x18\x04 \x01(\x0b\x32\x19.google.protobuf.DurationR\x0b\x65lapsedTime\x12 \n\x0bparallelism\x18\x05 \x01(\x01R\x0bparallelism\x12\x1f\n\x0btotal_tasks\x18\x06 \x01(\x04R\ntotalTasks\x12\x42\n\x0etasks_by_state\x18\x07 \x03(\x0b\x32\x1c.workflows.v1.TaskStateCountR\x0ctasksByState\"U\n\x0eTaskStateCount\x12-\n\x05state\x18\x01 \x01(\x0e\x32\x17.workflows.v1.TaskStateR\x05state\x12\x14\n\x05\x63ount\x18\x02 \x01(\x04R\x05\x63ount\"\x9f\x02\n\x0bTaskSummary\x12\x1e\n\x02id\x18\x01 \x01(\x0b\x32\x0e.tilebox.v1.IDR\x02id\x12\x18\n\x07\x64isplay\x18\x02 \x01(\tR\x07\x64isplay\x12-\n\x05state\x18\x03 \x01(\x0e\x32\x17.workflows.v1.TaskStateR\x05state\x12+\n\tparent_id\x18\x04 \x01(\x0b\x32\x0e.tilebox.v1.IDR\x08parentId\x12\x39\n\nstarted_at\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tstartedAt\x12\x39\n\nstopped_at\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tstoppedAtJ\x04\x08\x05\x10\x06\"S\n\x08Progress\x12\x1d\n\x05label\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x18\x64R\x05label\x12\x14\n\x05total\x18\x02 \x01(\x04R\x05total\x12\x12\n\x04\x64one\x18\x03 \x01(\x04R\x04\x64one\"\xa2\x03\n\x04Task\x12\x1e\n\x02id\x18\x01 \x01(\x0b\x32\x0e.tilebox.v1.IDR\x02id\x12<\n\nidentifier\x18\x02 \x01(\x0b\x32\x1c.workflows.v1.TaskIdentifierR\nidentifier\x12-\n\x05state\x18\x03 \x01(\x0e\x32\x17.workflows.v1.TaskStateR\x05state\x12\x1b\n\x05input\x18\x04 \x01(\x0c\x42\x05\xaa\x01\x02\x08\x01R\x05input\x12\x1f\n\x07\x64isplay\x18\x05 \x01(\tB\x05\xaa\x01\x02\x08\x01R\x07\x64isplay\x12#\n\x03job\x18\x06 \x01(\x0b\x32\x11.workflows.v1.JobR\x03job\x12+\n\tparent_id\x18\x07 \x01(\x0b\x32\x0e.tilebox.v1.IDR\x08parentId\x12-\n\ndepends_on\x18\x08 \x03(\x0b\x32\x0e.tilebox.v1.IDR\tdependsOn\x12-\n\x05lease\x18\t \x01(\x0b\x32\x17.workflows.v1.TaskLeaseR\x05lease\x12\x1f\n\x0bretry_count\x18\n \x01(\x03R\nretryCount\"d\n\x0eTaskIdentifier\x12\x1e\n\x04name\x18\x01 \x01(\tB\n\xbaH\x07r\x05 \x01(\x80\x02R\x04name\x12\x32\n\x07version\x18\x02 \x01(\tB\x18\xbaH\x15r\x13 \x01\x32\x0f^v(\\d+)\\.(\\d+)$R\x07version\"1\n\x05Tasks\x12(\n\x05tasks\x18\x01 \x03(\x0b\x32\x12.workflows.v1.TaskR\x05tasks\"\x98\x02\n\x14SingleTaskSubmission\x12!\n\x0c\x63luster_slug\x18\x01 \x01(\tR\x0b\x63lusterSlug\x12<\n\nidentifier\x18\x02 \x01(\x0b\x32\x1c.workflows.v1.TaskIdentifierR\nidentifier\x12!\n\x07\x64isplay\x18\x04 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x07\x64isplay\x12\x32\n\x0c\x64\x65pendencies\x18\x05 \x03(\x03\x42\x0e\xbaH\x0b\x92\x01\x08\"\x06\"\x04\x18?(\x00R\x0c\x64\x65pendencies\x12(\n\x0bmax_retries\x18\x06 \x01(\x03\x42\x07\xbaH\x04\"\x02(\x00R\nmaxRetries\x12\x1e\n\x05input\x18\x03 \x01(\x0c\x42\x08\xbaH\x05z\x03\x18\x80\x10R\x05input\"\x91\x02\n\x0fTaskSubmissions\x12N\n\x0btask_groups\x18\x01 \x03(\x0b\x32!.workflows.v1.TaskSubmissionGroupB\n\xbaH\x07\x92\x01\x04\x08\x01\x10@R\ntaskGroups\x12.\n\x13\x63luster_slug_lookup\x18\x02 \x03(\tR\x11\x63lusterSlugLookup\x12I\n\x11identifier_lookup\x18\x03 \x03(\x0b\x32\x1c.workflows.v1.TaskIdentifierR\x10identifierLookup\x12\x33\n\x0e\x64isplay_lookup\x18\x04 \x03(\tB\x0c\xbaH\t\x92\x01\x06\"\x04r\x02\x10\x01R\rdisplayLookup\"\xe2\x07\n\x13TaskSubmissionGroup\x12?\n\x1c\x64\x65pendencies_on_other_groups\x18\x01 \x03(\rR\x19\x64\x65pendenciesOnOtherGroups\x12%\n\x06inputs\x18\x02 \x03(\x0c\x42\r\xbaH\n\x92\x01\x07\"\x05z\x03\x18\x80\x10R\x06inputs\x12/\n\x13identifier_pointers\x18\x03 \x03(\x04R\x12identifierPointers\x12\x32\n\x15\x63luster_slug_pointers\x18\x04 \x03(\x04R\x13\x63lusterSlugPointers\x12)\n\x10\x64isplay_pointers\x18\x05 \x03(\x04R\x0f\x64isplayPointers\x12,\n\x12max_retries_values\x18\x06 \x03(\x03R\x10maxRetriesValues:\xa4\x05\xbaH\xa0\x05\x1a\xa6\x01\n,task_submission_group.identifiers_size_match\x12?The number of inputs must match the number of task identifiers.\x1a\x35this.inputs.size() == this.identifier_pointers.size()\x1a\xa7\x01\n.task_submission_group.cluster_slugs_size_match\x12<The number of cluster slugs must match the number of inputs.\x1a\x37this.inputs.size() == this.cluster_slug_pointers.size()\x1a\xa0\x01\n)task_submission_group.displays_size_match\x12?The number of display pointers must match the number of inputs.\x1a\x32this.inputs.size() == this.display_pointers.size()\x1a\xa7\x01\n,task_submission_group.max_retries_size_match\x12\x41The number of max_retries_values must match the number of inputs.\x1a\x34this.inputs.size() == this.max_retries_values.size()\"\xa9\x01\n\tTaskLease\x12/\n\x05lease\x18\x01 \x01(\x0b\x32\x19.google.protobuf.DurationR\x05lease\x12k\n%recommended_wait_until_next_extension\x18\x02 \x01(\x0b\x32\x19.google.protobuf.DurationR!recommendedWaitUntilNextExtension*\x8d\x01\n\x0eLegacyJobState\x12 \n\x1cLEGACY_JOB_STATE_UNSPECIFIED\x10\x00\x12\x1b\n\x17LEGACY_JOB_STATE_QUEUED\x10\x01\x12\x1c\n\x18LEGACY_JOB_STATE_STARTED\x10\x02\x12\x1e\n\x1aLEGACY_JOB_STATE_COMPLETED\x10\x03*\xb3\x01\n\x08JobState\x12\x19\n\x15JOB_STATE_UNSPECIFIED\x10\x00\x12\x17\n\x13JOB_STATE_SUBMITTED\x10\x01\x12\x15\n\x11JOB_STATE_RUNNING\x10\x02\x12\x15\n\x11JOB_STATE_STARTED\x10\x03\x12\x17\n\x13JOB_STATE_COMPLETED\x10\x04\x12\x14\n\x10JOB_STATE_FAILED\x10\x05\x12\x16\n\x12JOB_STATE_CANCELED\x10\x06*\x86\x01\n\tTaskState\x12\x1a\n\x16TASK_STATE_UNSPECIFIED\x10\x00\x12\x15\n\x11TASK_STATE_QUEUED\x10\x01\x12\x16\n\x12TASK_STATE_RUNNING\x10\x02\x12\x17\n\x13TASK_STATE_COMPUTED\x10\x03\x12\x15\n\x11TASK_STATE_FAILED\x10\x04\x42s\n\x10\x63om.workflows.v1B\tCoreProtoP\x01\xa2\x02\x03WXX\xaa\x02\x0cWorkflows.V1\xca\x02\x0cWorkflows\\V1\xe2\x02\x18Workflows\\V1\\GPBMetadata\xea\x02\rWorkflows::V1\x92\x03\x02\x08\x02\x62\x08\x65\x64itionsp\xe8\x07')
32
32
 
33
33
  _globals = globals()
34
34
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -36,6 +36,12 @@ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'workflows.v1.core_pb2', _gl
36
36
  if not _descriptor._USE_C_DESCRIPTORS:
37
37
  _globals['DESCRIPTOR']._loaded_options = None
38
38
  _globals['DESCRIPTOR']._serialized_options = b'\n\020com.workflows.v1B\tCoreProtoP\001\242\002\003WXX\252\002\014Workflows.V1\312\002\014Workflows\\V1\342\002\030Workflows\\V1\\GPBMetadata\352\002\rWorkflows::V1\222\003\002\010\002'
39
+ _globals['_JOB'].fields_by_name['canceled']._loaded_options = None
40
+ _globals['_JOB'].fields_by_name['canceled']._serialized_options = b'\030\001'
41
+ _globals['_JOB'].fields_by_name['legacy_state']._loaded_options = None
42
+ _globals['_JOB'].fields_by_name['legacy_state']._serialized_options = b'\030\001'
43
+ _globals['_JOB'].fields_by_name['started_at']._loaded_options = None
44
+ _globals['_JOB'].fields_by_name['started_at']._serialized_options = b'\030\001'
39
45
  _globals['_PROGRESS'].fields_by_name['label']._loaded_options = None
40
46
  _globals['_PROGRESS'].fields_by_name['label']._serialized_options = b'\272H\004r\002\030d'
41
47
  _globals['_TASK'].fields_by_name['input']._loaded_options = None
@@ -46,34 +52,52 @@ if not _descriptor._USE_C_DESCRIPTORS:
46
52
  _globals['_TASKIDENTIFIER'].fields_by_name['name']._serialized_options = b'\272H\007r\005 \001(\200\002'
47
53
  _globals['_TASKIDENTIFIER'].fields_by_name['version']._loaded_options = None
48
54
  _globals['_TASKIDENTIFIER'].fields_by_name['version']._serialized_options = b'\272H\025r\023 \0012\017^v(\\d+)\\.(\\d+)$'
49
- _globals['_TASKSUBMISSION'].fields_by_name['input']._loaded_options = None
50
- _globals['_TASKSUBMISSION'].fields_by_name['input']._serialized_options = b'\272H\005z\003\030\200\010'
51
- _globals['_TASKSUBMISSION'].fields_by_name['display']._loaded_options = None
52
- _globals['_TASKSUBMISSION'].fields_by_name['display']._serialized_options = b'\272H\004r\002\020\001'
53
- _globals['_TASKSUBMISSION'].fields_by_name['dependencies']._loaded_options = None
54
- _globals['_TASKSUBMISSION'].fields_by_name['dependencies']._serialized_options = b'\272H\013\222\001\010\"\006\"\004\030?(\000'
55
- _globals['_TASKSUBMISSION'].fields_by_name['max_retries']._loaded_options = None
56
- _globals['_TASKSUBMISSION'].fields_by_name['max_retries']._serialized_options = b'\272H\004\"\002(\000'
57
- _globals['_JOBSTATE']._serialized_start=2118
58
- _globals['_JOBSTATE']._serialized_end=2225
59
- _globals['_TASKSTATE']._serialized_start=2228
60
- _globals['_TASKSTATE']._serialized_end=2388
55
+ _globals['_SINGLETASKSUBMISSION'].fields_by_name['display']._loaded_options = None
56
+ _globals['_SINGLETASKSUBMISSION'].fields_by_name['display']._serialized_options = b'\272H\004r\002\020\001'
57
+ _globals['_SINGLETASKSUBMISSION'].fields_by_name['dependencies']._loaded_options = None
58
+ _globals['_SINGLETASKSUBMISSION'].fields_by_name['dependencies']._serialized_options = b'\272H\013\222\001\010\"\006\"\004\030?(\000'
59
+ _globals['_SINGLETASKSUBMISSION'].fields_by_name['max_retries']._loaded_options = None
60
+ _globals['_SINGLETASKSUBMISSION'].fields_by_name['max_retries']._serialized_options = b'\272H\004\"\002(\000'
61
+ _globals['_SINGLETASKSUBMISSION'].fields_by_name['input']._loaded_options = None
62
+ _globals['_SINGLETASKSUBMISSION'].fields_by_name['input']._serialized_options = b'\272H\005z\003\030\200\020'
63
+ _globals['_TASKSUBMISSIONS'].fields_by_name['task_groups']._loaded_options = None
64
+ _globals['_TASKSUBMISSIONS'].fields_by_name['task_groups']._serialized_options = b'\272H\007\222\001\004\010\001\020@'
65
+ _globals['_TASKSUBMISSIONS'].fields_by_name['display_lookup']._loaded_options = None
66
+ _globals['_TASKSUBMISSIONS'].fields_by_name['display_lookup']._serialized_options = b'\272H\t\222\001\006\"\004r\002\020\001'
67
+ _globals['_TASKSUBMISSIONGROUP'].fields_by_name['inputs']._loaded_options = None
68
+ _globals['_TASKSUBMISSIONGROUP'].fields_by_name['inputs']._serialized_options = b'\272H\n\222\001\007\"\005z\003\030\200\020'
69
+ _globals['_TASKSUBMISSIONGROUP']._loaded_options = None
70
+ _globals['_TASKSUBMISSIONGROUP']._serialized_options = b'\272H\240\005\032\246\001\n,task_submission_group.identifiers_size_match\022?The number of inputs must match the number of task identifiers.\0325this.inputs.size() == this.identifier_pointers.size()\032\247\001\n.task_submission_group.cluster_slugs_size_match\022<The number of cluster slugs must match the number of inputs.\0327this.inputs.size() == this.cluster_slug_pointers.size()\032\240\001\n)task_submission_group.displays_size_match\022?The number of display pointers must match the number of inputs.\0322this.inputs.size() == this.display_pointers.size()\032\247\001\n,task_submission_group.max_retries_size_match\022AThe number of max_retries_values must match the number of inputs.\0324this.inputs.size() == this.max_retries_values.size()'
71
+ _globals['_LEGACYJOBSTATE']._serialized_start=4067
72
+ _globals['_LEGACYJOBSTATE']._serialized_end=4208
73
+ _globals['_JOBSTATE']._serialized_start=4211
74
+ _globals['_JOBSTATE']._serialized_end=4390
75
+ _globals['_TASKSTATE']._serialized_start=4393
76
+ _globals['_TASKSTATE']._serialized_end=4527
61
77
  _globals['_CLUSTER']._serialized_start=156
62
78
  _globals['_CLUSTER']._serialized_end=250
63
79
  _globals['_JOB']._serialized_start=253
64
- _globals['_JOB']._serialized_end=718
65
- _globals['_TASKSUMMARY']._serialized_start=721
66
- _globals['_TASKSUMMARY']._serialized_end=1008
67
- _globals['_PROGRESS']._serialized_start=1010
68
- _globals['_PROGRESS']._serialized_end=1093
69
- _globals['_TASK']._serialized_start=1096
70
- _globals['_TASK']._serialized_end=1514
71
- _globals['_TASKIDENTIFIER']._serialized_start=1516
72
- _globals['_TASKIDENTIFIER']._serialized_end=1616
73
- _globals['_TASKS']._serialized_start=1618
74
- _globals['_TASKS']._serialized_end=1667
75
- _globals['_TASKSUBMISSION']._serialized_start=1670
76
- _globals['_TASKSUBMISSION']._serialized_end=1944
77
- _globals['_TASKLEASE']._serialized_start=1947
78
- _globals['_TASKLEASE']._serialized_end=2116
80
+ _globals['_JOB']._serialized_end=866
81
+ _globals['_EXECUTIONSTATS']._serialized_start=869
82
+ _globals['_EXECUTIONSTATS']._serialized_end=1300
83
+ _globals['_TASKSTATECOUNT']._serialized_start=1302
84
+ _globals['_TASKSTATECOUNT']._serialized_end=1387
85
+ _globals['_TASKSUMMARY']._serialized_start=1390
86
+ _globals['_TASKSUMMARY']._serialized_end=1677
87
+ _globals['_PROGRESS']._serialized_start=1679
88
+ _globals['_PROGRESS']._serialized_end=1762
89
+ _globals['_TASK']._serialized_start=1765
90
+ _globals['_TASK']._serialized_end=2183
91
+ _globals['_TASKIDENTIFIER']._serialized_start=2185
92
+ _globals['_TASKIDENTIFIER']._serialized_end=2285
93
+ _globals['_TASKS']._serialized_start=2287
94
+ _globals['_TASKS']._serialized_end=2336
95
+ _globals['_SINGLETASKSUBMISSION']._serialized_start=2339
96
+ _globals['_SINGLETASKSUBMISSION']._serialized_end=2619
97
+ _globals['_TASKSUBMISSIONS']._serialized_start=2622
98
+ _globals['_TASKSUBMISSIONS']._serialized_end=2895
99
+ _globals['_TASKSUBMISSIONGROUP']._serialized_start=2898
100
+ _globals['_TASKSUBMISSIONGROUP']._serialized_end=3892
101
+ _globals['_TASKLEASE']._serialized_start=3895
102
+ _globals['_TASKLEASE']._serialized_end=4064
79
103
  # @@protoc_insertion_point(module_scope)
@@ -11,12 +11,22 @@ from typing import ClassVar as _ClassVar, Optional as _Optional, Union as _Union
11
11
 
12
12
  DESCRIPTOR: _descriptor.FileDescriptor
13
13
 
14
+ class LegacyJobState(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
15
+ __slots__ = ()
16
+ LEGACY_JOB_STATE_UNSPECIFIED: _ClassVar[LegacyJobState]
17
+ LEGACY_JOB_STATE_QUEUED: _ClassVar[LegacyJobState]
18
+ LEGACY_JOB_STATE_STARTED: _ClassVar[LegacyJobState]
19
+ LEGACY_JOB_STATE_COMPLETED: _ClassVar[LegacyJobState]
20
+
14
21
  class JobState(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
15
22
  __slots__ = ()
16
23
  JOB_STATE_UNSPECIFIED: _ClassVar[JobState]
17
- JOB_STATE_QUEUED: _ClassVar[JobState]
24
+ JOB_STATE_SUBMITTED: _ClassVar[JobState]
25
+ JOB_STATE_RUNNING: _ClassVar[JobState]
18
26
  JOB_STATE_STARTED: _ClassVar[JobState]
19
27
  JOB_STATE_COMPLETED: _ClassVar[JobState]
28
+ JOB_STATE_FAILED: _ClassVar[JobState]
29
+ JOB_STATE_CANCELED: _ClassVar[JobState]
20
30
 
21
31
  class TaskState(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
22
32
  __slots__ = ()
@@ -25,17 +35,22 @@ class TaskState(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
25
35
  TASK_STATE_RUNNING: _ClassVar[TaskState]
26
36
  TASK_STATE_COMPUTED: _ClassVar[TaskState]
27
37
  TASK_STATE_FAILED: _ClassVar[TaskState]
28
- TASK_STATE_CANCELLED: _ClassVar[TaskState]
38
+ LEGACY_JOB_STATE_UNSPECIFIED: LegacyJobState
39
+ LEGACY_JOB_STATE_QUEUED: LegacyJobState
40
+ LEGACY_JOB_STATE_STARTED: LegacyJobState
41
+ LEGACY_JOB_STATE_COMPLETED: LegacyJobState
29
42
  JOB_STATE_UNSPECIFIED: JobState
30
- JOB_STATE_QUEUED: JobState
43
+ JOB_STATE_SUBMITTED: JobState
44
+ JOB_STATE_RUNNING: JobState
31
45
  JOB_STATE_STARTED: JobState
32
46
  JOB_STATE_COMPLETED: JobState
47
+ JOB_STATE_FAILED: JobState
48
+ JOB_STATE_CANCELED: JobState
33
49
  TASK_STATE_UNSPECIFIED: TaskState
34
50
  TASK_STATE_QUEUED: TaskState
35
51
  TASK_STATE_RUNNING: TaskState
36
52
  TASK_STATE_COMPUTED: TaskState
37
53
  TASK_STATE_FAILED: TaskState
38
- TASK_STATE_CANCELLED: TaskState
39
54
 
40
55
  class Cluster(_message.Message):
41
56
  __slots__ = ("slug", "display_name", "deletable")
@@ -48,28 +63,58 @@ class Cluster(_message.Message):
48
63
  def __init__(self, slug: _Optional[str] = ..., display_name: _Optional[str] = ..., deletable: bool = ...) -> None: ...
49
64
 
50
65
  class Job(_message.Message):
51
- __slots__ = ("id", "name", "trace_parent", "canceled", "state", "submitted_at", "started_at", "task_summaries", "automation_id", "progress")
66
+ __slots__ = ("id", "name", "trace_parent", "canceled", "legacy_state", "submitted_at", "started_at", "task_summaries", "automation_id", "progress", "state", "execution_stats")
52
67
  ID_FIELD_NUMBER: _ClassVar[int]
53
68
  NAME_FIELD_NUMBER: _ClassVar[int]
54
69
  TRACE_PARENT_FIELD_NUMBER: _ClassVar[int]
55
70
  CANCELED_FIELD_NUMBER: _ClassVar[int]
56
- STATE_FIELD_NUMBER: _ClassVar[int]
71
+ LEGACY_STATE_FIELD_NUMBER: _ClassVar[int]
57
72
  SUBMITTED_AT_FIELD_NUMBER: _ClassVar[int]
58
73
  STARTED_AT_FIELD_NUMBER: _ClassVar[int]
59
74
  TASK_SUMMARIES_FIELD_NUMBER: _ClassVar[int]
60
75
  AUTOMATION_ID_FIELD_NUMBER: _ClassVar[int]
61
76
  PROGRESS_FIELD_NUMBER: _ClassVar[int]
77
+ STATE_FIELD_NUMBER: _ClassVar[int]
78
+ EXECUTION_STATS_FIELD_NUMBER: _ClassVar[int]
62
79
  id: _id_pb2.ID
63
80
  name: str
64
81
  trace_parent: str
65
82
  canceled: bool
66
- state: JobState
83
+ legacy_state: LegacyJobState
67
84
  submitted_at: _timestamp_pb2.Timestamp
68
85
  started_at: _timestamp_pb2.Timestamp
69
86
  task_summaries: _containers.RepeatedCompositeFieldContainer[TaskSummary]
70
87
  automation_id: _id_pb2.ID
71
88
  progress: _containers.RepeatedCompositeFieldContainer[Progress]
72
- def __init__(self, id: _Optional[_Union[_id_pb2.ID, _Mapping]] = ..., name: _Optional[str] = ..., trace_parent: _Optional[str] = ..., canceled: bool = ..., state: _Optional[_Union[JobState, str]] = ..., submitted_at: _Optional[_Union[_timestamp_pb2.Timestamp, _Mapping]] = ..., started_at: _Optional[_Union[_timestamp_pb2.Timestamp, _Mapping]] = ..., task_summaries: _Optional[_Iterable[_Union[TaskSummary, _Mapping]]] = ..., automation_id: _Optional[_Union[_id_pb2.ID, _Mapping]] = ..., progress: _Optional[_Iterable[_Union[Progress, _Mapping]]] = ...) -> None: ...
89
+ state: JobState
90
+ execution_stats: ExecutionStats
91
+ def __init__(self, id: _Optional[_Union[_id_pb2.ID, _Mapping]] = ..., name: _Optional[str] = ..., trace_parent: _Optional[str] = ..., canceled: bool = ..., legacy_state: _Optional[_Union[LegacyJobState, str]] = ..., submitted_at: _Optional[_Union[_timestamp_pb2.Timestamp, _Mapping]] = ..., started_at: _Optional[_Union[_timestamp_pb2.Timestamp, _Mapping]] = ..., task_summaries: _Optional[_Iterable[_Union[TaskSummary, _Mapping]]] = ..., automation_id: _Optional[_Union[_id_pb2.ID, _Mapping]] = ..., progress: _Optional[_Iterable[_Union[Progress, _Mapping]]] = ..., state: _Optional[_Union[JobState, str]] = ..., execution_stats: _Optional[_Union[ExecutionStats, _Mapping]] = ...) -> None: ...
92
+
93
+ class ExecutionStats(_message.Message):
94
+ __slots__ = ("first_task_started_at", "last_task_stopped_at", "compute_time", "elapsed_time", "parallelism", "total_tasks", "tasks_by_state")
95
+ FIRST_TASK_STARTED_AT_FIELD_NUMBER: _ClassVar[int]
96
+ LAST_TASK_STOPPED_AT_FIELD_NUMBER: _ClassVar[int]
97
+ COMPUTE_TIME_FIELD_NUMBER: _ClassVar[int]
98
+ ELAPSED_TIME_FIELD_NUMBER: _ClassVar[int]
99
+ PARALLELISM_FIELD_NUMBER: _ClassVar[int]
100
+ TOTAL_TASKS_FIELD_NUMBER: _ClassVar[int]
101
+ TASKS_BY_STATE_FIELD_NUMBER: _ClassVar[int]
102
+ first_task_started_at: _timestamp_pb2.Timestamp
103
+ last_task_stopped_at: _timestamp_pb2.Timestamp
104
+ compute_time: _duration_pb2.Duration
105
+ elapsed_time: _duration_pb2.Duration
106
+ parallelism: float
107
+ total_tasks: int
108
+ tasks_by_state: _containers.RepeatedCompositeFieldContainer[TaskStateCount]
109
+ def __init__(self, first_task_started_at: _Optional[_Union[_timestamp_pb2.Timestamp, _Mapping]] = ..., last_task_stopped_at: _Optional[_Union[_timestamp_pb2.Timestamp, _Mapping]] = ..., compute_time: _Optional[_Union[_duration_pb2.Duration, _Mapping]] = ..., elapsed_time: _Optional[_Union[_duration_pb2.Duration, _Mapping]] = ..., parallelism: _Optional[float] = ..., total_tasks: _Optional[int] = ..., tasks_by_state: _Optional[_Iterable[_Union[TaskStateCount, _Mapping]]] = ...) -> None: ...
110
+
111
+ class TaskStateCount(_message.Message):
112
+ __slots__ = ("state", "count")
113
+ STATE_FIELD_NUMBER: _ClassVar[int]
114
+ COUNT_FIELD_NUMBER: _ClassVar[int]
115
+ state: TaskState
116
+ count: int
117
+ def __init__(self, state: _Optional[_Union[TaskState, str]] = ..., count: _Optional[int] = ...) -> None: ...
73
118
 
74
119
  class TaskSummary(_message.Message):
75
120
  __slots__ = ("id", "display", "state", "parent_id", "started_at", "stopped_at")
@@ -135,21 +180,49 @@ class Tasks(_message.Message):
135
180
  tasks: _containers.RepeatedCompositeFieldContainer[Task]
136
181
  def __init__(self, tasks: _Optional[_Iterable[_Union[Task, _Mapping]]] = ...) -> None: ...
137
182
 
138
- class TaskSubmission(_message.Message):
139
- __slots__ = ("cluster_slug", "identifier", "input", "display", "dependencies", "max_retries")
183
+ class SingleTaskSubmission(_message.Message):
184
+ __slots__ = ("cluster_slug", "identifier", "display", "dependencies", "max_retries", "input")
140
185
  CLUSTER_SLUG_FIELD_NUMBER: _ClassVar[int]
141
186
  IDENTIFIER_FIELD_NUMBER: _ClassVar[int]
142
- INPUT_FIELD_NUMBER: _ClassVar[int]
143
187
  DISPLAY_FIELD_NUMBER: _ClassVar[int]
144
188
  DEPENDENCIES_FIELD_NUMBER: _ClassVar[int]
145
189
  MAX_RETRIES_FIELD_NUMBER: _ClassVar[int]
190
+ INPUT_FIELD_NUMBER: _ClassVar[int]
146
191
  cluster_slug: str
147
192
  identifier: TaskIdentifier
148
- input: bytes
149
193
  display: str
150
194
  dependencies: _containers.RepeatedScalarFieldContainer[int]
151
195
  max_retries: int
152
- def __init__(self, cluster_slug: _Optional[str] = ..., identifier: _Optional[_Union[TaskIdentifier, _Mapping]] = ..., input: _Optional[bytes] = ..., display: _Optional[str] = ..., dependencies: _Optional[_Iterable[int]] = ..., max_retries: _Optional[int] = ...) -> None: ...
196
+ input: bytes
197
+ def __init__(self, cluster_slug: _Optional[str] = ..., identifier: _Optional[_Union[TaskIdentifier, _Mapping]] = ..., display: _Optional[str] = ..., dependencies: _Optional[_Iterable[int]] = ..., max_retries: _Optional[int] = ..., input: _Optional[bytes] = ...) -> None: ...
198
+
199
+ class TaskSubmissions(_message.Message):
200
+ __slots__ = ("task_groups", "cluster_slug_lookup", "identifier_lookup", "display_lookup")
201
+ TASK_GROUPS_FIELD_NUMBER: _ClassVar[int]
202
+ CLUSTER_SLUG_LOOKUP_FIELD_NUMBER: _ClassVar[int]
203
+ IDENTIFIER_LOOKUP_FIELD_NUMBER: _ClassVar[int]
204
+ DISPLAY_LOOKUP_FIELD_NUMBER: _ClassVar[int]
205
+ task_groups: _containers.RepeatedCompositeFieldContainer[TaskSubmissionGroup]
206
+ cluster_slug_lookup: _containers.RepeatedScalarFieldContainer[str]
207
+ identifier_lookup: _containers.RepeatedCompositeFieldContainer[TaskIdentifier]
208
+ display_lookup: _containers.RepeatedScalarFieldContainer[str]
209
+ def __init__(self, task_groups: _Optional[_Iterable[_Union[TaskSubmissionGroup, _Mapping]]] = ..., cluster_slug_lookup: _Optional[_Iterable[str]] = ..., identifier_lookup: _Optional[_Iterable[_Union[TaskIdentifier, _Mapping]]] = ..., display_lookup: _Optional[_Iterable[str]] = ...) -> None: ...
210
+
211
+ class TaskSubmissionGroup(_message.Message):
212
+ __slots__ = ("dependencies_on_other_groups", "inputs", "identifier_pointers", "cluster_slug_pointers", "display_pointers", "max_retries_values")
213
+ DEPENDENCIES_ON_OTHER_GROUPS_FIELD_NUMBER: _ClassVar[int]
214
+ INPUTS_FIELD_NUMBER: _ClassVar[int]
215
+ IDENTIFIER_POINTERS_FIELD_NUMBER: _ClassVar[int]
216
+ CLUSTER_SLUG_POINTERS_FIELD_NUMBER: _ClassVar[int]
217
+ DISPLAY_POINTERS_FIELD_NUMBER: _ClassVar[int]
218
+ MAX_RETRIES_VALUES_FIELD_NUMBER: _ClassVar[int]
219
+ dependencies_on_other_groups: _containers.RepeatedScalarFieldContainer[int]
220
+ inputs: _containers.RepeatedScalarFieldContainer[bytes]
221
+ identifier_pointers: _containers.RepeatedScalarFieldContainer[int]
222
+ cluster_slug_pointers: _containers.RepeatedScalarFieldContainer[int]
223
+ display_pointers: _containers.RepeatedScalarFieldContainer[int]
224
+ max_retries_values: _containers.RepeatedScalarFieldContainer[int]
225
+ def __init__(self, dependencies_on_other_groups: _Optional[_Iterable[int]] = ..., inputs: _Optional[_Iterable[bytes]] = ..., identifier_pointers: _Optional[_Iterable[int]] = ..., cluster_slug_pointers: _Optional[_Iterable[int]] = ..., display_pointers: _Optional[_Iterable[int]] = ..., max_retries_values: _Optional[_Iterable[int]] = ...) -> None: ...
153
226
 
154
227
  class TaskLease(_message.Message):
155
228
  __slots__ = ("lease", "recommended_wait_until_next_extension")