dtlpy 1.114.17__py3-none-any.whl → 1.116.6__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.
- dtlpy/__init__.py +491 -491
- dtlpy/__version__.py +1 -1
- dtlpy/assets/__init__.py +26 -26
- dtlpy/assets/code_server/config.yaml +2 -2
- dtlpy/assets/code_server/installation.sh +24 -24
- dtlpy/assets/code_server/launch.json +13 -13
- dtlpy/assets/code_server/settings.json +2 -2
- dtlpy/assets/main.py +53 -53
- dtlpy/assets/main_partial.py +18 -18
- dtlpy/assets/mock.json +11 -11
- dtlpy/assets/model_adapter.py +83 -83
- dtlpy/assets/package.json +61 -61
- dtlpy/assets/package_catalog.json +29 -29
- dtlpy/assets/package_gitignore +307 -307
- dtlpy/assets/service_runners/__init__.py +33 -33
- dtlpy/assets/service_runners/converter.py +96 -96
- dtlpy/assets/service_runners/multi_method.py +49 -49
- dtlpy/assets/service_runners/multi_method_annotation.py +54 -54
- dtlpy/assets/service_runners/multi_method_dataset.py +55 -55
- dtlpy/assets/service_runners/multi_method_item.py +52 -52
- dtlpy/assets/service_runners/multi_method_json.py +52 -52
- dtlpy/assets/service_runners/single_method.py +37 -37
- dtlpy/assets/service_runners/single_method_annotation.py +43 -43
- dtlpy/assets/service_runners/single_method_dataset.py +43 -43
- dtlpy/assets/service_runners/single_method_item.py +41 -41
- dtlpy/assets/service_runners/single_method_json.py +42 -42
- dtlpy/assets/service_runners/single_method_multi_input.py +45 -45
- dtlpy/assets/voc_annotation_template.xml +23 -23
- dtlpy/caches/base_cache.py +32 -32
- dtlpy/caches/cache.py +473 -473
- dtlpy/caches/dl_cache.py +201 -201
- dtlpy/caches/filesystem_cache.py +89 -89
- dtlpy/caches/redis_cache.py +84 -84
- dtlpy/dlp/__init__.py +20 -20
- dtlpy/dlp/cli_utilities.py +367 -367
- dtlpy/dlp/command_executor.py +764 -764
- dtlpy/dlp/dlp +1 -1
- dtlpy/dlp/dlp.bat +1 -1
- dtlpy/dlp/dlp.py +128 -128
- dtlpy/dlp/parser.py +651 -651
- dtlpy/entities/__init__.py +83 -83
- dtlpy/entities/analytic.py +347 -311
- dtlpy/entities/annotation.py +1879 -1879
- dtlpy/entities/annotation_collection.py +699 -699
- dtlpy/entities/annotation_definitions/__init__.py +20 -20
- dtlpy/entities/annotation_definitions/base_annotation_definition.py +100 -100
- dtlpy/entities/annotation_definitions/box.py +195 -195
- dtlpy/entities/annotation_definitions/classification.py +67 -67
- dtlpy/entities/annotation_definitions/comparison.py +72 -72
- dtlpy/entities/annotation_definitions/cube.py +204 -204
- dtlpy/entities/annotation_definitions/cube_3d.py +149 -149
- dtlpy/entities/annotation_definitions/description.py +32 -32
- dtlpy/entities/annotation_definitions/ellipse.py +124 -124
- dtlpy/entities/annotation_definitions/free_text.py +62 -62
- dtlpy/entities/annotation_definitions/gis.py +69 -69
- dtlpy/entities/annotation_definitions/note.py +139 -139
- dtlpy/entities/annotation_definitions/point.py +117 -117
- dtlpy/entities/annotation_definitions/polygon.py +182 -182
- dtlpy/entities/annotation_definitions/polyline.py +111 -111
- dtlpy/entities/annotation_definitions/pose.py +92 -92
- dtlpy/entities/annotation_definitions/ref_image.py +86 -86
- dtlpy/entities/annotation_definitions/segmentation.py +240 -240
- dtlpy/entities/annotation_definitions/subtitle.py +34 -34
- dtlpy/entities/annotation_definitions/text.py +85 -85
- dtlpy/entities/annotation_definitions/undefined_annotation.py +74 -74
- dtlpy/entities/app.py +220 -220
- dtlpy/entities/app_module.py +107 -107
- dtlpy/entities/artifact.py +174 -174
- dtlpy/entities/assignment.py +399 -399
- dtlpy/entities/base_entity.py +214 -214
- dtlpy/entities/bot.py +113 -113
- dtlpy/entities/codebase.py +292 -296
- dtlpy/entities/collection.py +38 -38
- dtlpy/entities/command.py +169 -169
- dtlpy/entities/compute.py +449 -442
- dtlpy/entities/dataset.py +1299 -1285
- dtlpy/entities/directory_tree.py +44 -44
- dtlpy/entities/dpk.py +470 -470
- dtlpy/entities/driver.py +235 -223
- dtlpy/entities/execution.py +397 -397
- dtlpy/entities/feature.py +124 -124
- dtlpy/entities/feature_set.py +145 -145
- dtlpy/entities/filters.py +798 -645
- dtlpy/entities/gis_item.py +107 -107
- dtlpy/entities/integration.py +184 -184
- dtlpy/entities/item.py +959 -953
- dtlpy/entities/label.py +123 -123
- dtlpy/entities/links.py +85 -85
- dtlpy/entities/message.py +175 -175
- dtlpy/entities/model.py +684 -684
- dtlpy/entities/node.py +1005 -1005
- dtlpy/entities/ontology.py +810 -803
- dtlpy/entities/organization.py +287 -287
- dtlpy/entities/package.py +657 -657
- dtlpy/entities/package_defaults.py +5 -5
- dtlpy/entities/package_function.py +185 -185
- dtlpy/entities/package_module.py +113 -113
- dtlpy/entities/package_slot.py +118 -118
- dtlpy/entities/paged_entities.py +299 -299
- dtlpy/entities/pipeline.py +624 -624
- dtlpy/entities/pipeline_execution.py +279 -279
- dtlpy/entities/project.py +394 -394
- dtlpy/entities/prompt_item.py +505 -499
- dtlpy/entities/recipe.py +301 -301
- dtlpy/entities/reflect_dict.py +102 -102
- dtlpy/entities/resource_execution.py +138 -138
- dtlpy/entities/service.py +963 -958
- dtlpy/entities/service_driver.py +117 -117
- dtlpy/entities/setting.py +294 -294
- dtlpy/entities/task.py +495 -495
- dtlpy/entities/time_series.py +143 -143
- dtlpy/entities/trigger.py +426 -426
- dtlpy/entities/user.py +118 -118
- dtlpy/entities/webhook.py +124 -124
- dtlpy/examples/__init__.py +19 -19
- dtlpy/examples/add_labels.py +135 -135
- dtlpy/examples/add_metadata_to_item.py +21 -21
- dtlpy/examples/annotate_items_using_model.py +65 -65
- dtlpy/examples/annotate_video_using_model_and_tracker.py +75 -75
- dtlpy/examples/annotations_convert_to_voc.py +9 -9
- dtlpy/examples/annotations_convert_to_yolo.py +9 -9
- dtlpy/examples/convert_annotation_types.py +51 -51
- dtlpy/examples/converter.py +143 -143
- dtlpy/examples/copy_annotations.py +22 -22
- dtlpy/examples/copy_folder.py +31 -31
- dtlpy/examples/create_annotations.py +51 -51
- dtlpy/examples/create_video_annotations.py +83 -83
- dtlpy/examples/delete_annotations.py +26 -26
- dtlpy/examples/filters.py +113 -113
- dtlpy/examples/move_item.py +23 -23
- dtlpy/examples/play_video_annotation.py +13 -13
- dtlpy/examples/show_item_and_mask.py +53 -53
- dtlpy/examples/triggers.py +49 -49
- dtlpy/examples/upload_batch_of_items.py +20 -20
- dtlpy/examples/upload_items_and_custom_format_annotations.py +55 -55
- dtlpy/examples/upload_items_with_modalities.py +43 -43
- dtlpy/examples/upload_segmentation_annotations_from_mask_image.py +44 -44
- dtlpy/examples/upload_yolo_format_annotations.py +70 -70
- dtlpy/exceptions.py +125 -125
- dtlpy/miscellaneous/__init__.py +20 -20
- dtlpy/miscellaneous/dict_differ.py +95 -95
- dtlpy/miscellaneous/git_utils.py +217 -217
- dtlpy/miscellaneous/json_utils.py +14 -14
- dtlpy/miscellaneous/list_print.py +105 -105
- dtlpy/miscellaneous/zipping.py +130 -130
- dtlpy/ml/__init__.py +20 -20
- dtlpy/ml/base_feature_extractor_adapter.py +27 -27
- dtlpy/ml/base_model_adapter.py +1257 -1086
- dtlpy/ml/metrics.py +461 -461
- dtlpy/ml/predictions_utils.py +274 -274
- dtlpy/ml/summary_writer.py +57 -57
- dtlpy/ml/train_utils.py +60 -60
- dtlpy/new_instance.py +252 -252
- dtlpy/repositories/__init__.py +56 -56
- dtlpy/repositories/analytics.py +85 -85
- dtlpy/repositories/annotations.py +916 -916
- dtlpy/repositories/apps.py +383 -383
- dtlpy/repositories/artifacts.py +452 -452
- dtlpy/repositories/assignments.py +599 -599
- dtlpy/repositories/bots.py +213 -213
- dtlpy/repositories/codebases.py +559 -559
- dtlpy/repositories/collections.py +332 -332
- dtlpy/repositories/commands.py +152 -158
- dtlpy/repositories/compositions.py +61 -61
- dtlpy/repositories/computes.py +439 -435
- dtlpy/repositories/datasets.py +1504 -1291
- dtlpy/repositories/downloader.py +976 -903
- dtlpy/repositories/dpks.py +433 -433
- dtlpy/repositories/drivers.py +482 -470
- dtlpy/repositories/executions.py +815 -817
- dtlpy/repositories/feature_sets.py +226 -226
- dtlpy/repositories/features.py +255 -238
- dtlpy/repositories/integrations.py +484 -484
- dtlpy/repositories/items.py +912 -909
- dtlpy/repositories/messages.py +94 -94
- dtlpy/repositories/models.py +1000 -988
- dtlpy/repositories/nodes.py +80 -80
- dtlpy/repositories/ontologies.py +511 -511
- dtlpy/repositories/organizations.py +525 -525
- dtlpy/repositories/packages.py +1941 -1941
- dtlpy/repositories/pipeline_executions.py +451 -451
- dtlpy/repositories/pipelines.py +640 -640
- dtlpy/repositories/projects.py +539 -539
- dtlpy/repositories/recipes.py +419 -399
- dtlpy/repositories/resource_executions.py +137 -137
- dtlpy/repositories/schema.py +120 -120
- dtlpy/repositories/service_drivers.py +213 -213
- dtlpy/repositories/services.py +1704 -1704
- dtlpy/repositories/settings.py +339 -339
- dtlpy/repositories/tasks.py +1477 -1477
- dtlpy/repositories/times_series.py +278 -278
- dtlpy/repositories/triggers.py +536 -536
- dtlpy/repositories/upload_element.py +257 -257
- dtlpy/repositories/uploader.py +661 -651
- dtlpy/repositories/webhooks.py +249 -249
- dtlpy/services/__init__.py +22 -22
- dtlpy/services/aihttp_retry.py +131 -131
- dtlpy/services/api_client.py +1785 -1782
- dtlpy/services/api_reference.py +40 -40
- dtlpy/services/async_utils.py +133 -133
- dtlpy/services/calls_counter.py +44 -44
- dtlpy/services/check_sdk.py +68 -68
- dtlpy/services/cookie.py +115 -115
- dtlpy/services/create_logger.py +156 -156
- dtlpy/services/events.py +84 -84
- dtlpy/services/logins.py +235 -235
- dtlpy/services/reporter.py +256 -256
- dtlpy/services/service_defaults.py +91 -91
- dtlpy/utilities/__init__.py +20 -20
- dtlpy/utilities/annotations/__init__.py +16 -16
- dtlpy/utilities/annotations/annotation_converters.py +269 -269
- dtlpy/utilities/base_package_runner.py +285 -264
- dtlpy/utilities/converter.py +1650 -1650
- dtlpy/utilities/dataset_generators/__init__.py +1 -1
- dtlpy/utilities/dataset_generators/dataset_generator.py +670 -670
- dtlpy/utilities/dataset_generators/dataset_generator_tensorflow.py +23 -23
- dtlpy/utilities/dataset_generators/dataset_generator_torch.py +21 -21
- dtlpy/utilities/local_development/__init__.py +1 -1
- dtlpy/utilities/local_development/local_session.py +179 -179
- dtlpy/utilities/reports/__init__.py +2 -2
- dtlpy/utilities/reports/figures.py +343 -343
- dtlpy/utilities/reports/report.py +71 -71
- dtlpy/utilities/videos/__init__.py +17 -17
- dtlpy/utilities/videos/video_player.py +598 -598
- dtlpy/utilities/videos/videos.py +470 -470
- {dtlpy-1.114.17.data → dtlpy-1.116.6.data}/scripts/dlp +1 -1
- dtlpy-1.116.6.data/scripts/dlp.bat +2 -0
- {dtlpy-1.114.17.data → dtlpy-1.116.6.data}/scripts/dlp.py +128 -128
- {dtlpy-1.114.17.dist-info → dtlpy-1.116.6.dist-info}/METADATA +186 -183
- dtlpy-1.116.6.dist-info/RECORD +239 -0
- {dtlpy-1.114.17.dist-info → dtlpy-1.116.6.dist-info}/WHEEL +1 -1
- {dtlpy-1.114.17.dist-info → dtlpy-1.116.6.dist-info}/licenses/LICENSE +200 -200
- tests/features/environment.py +551 -551
- dtlpy/assets/__pycache__/__init__.cpython-310.pyc +0 -0
- dtlpy-1.114.17.data/scripts/dlp.bat +0 -2
- dtlpy-1.114.17.dist-info/RECORD +0 -240
- {dtlpy-1.114.17.dist-info → dtlpy-1.116.6.dist-info}/entry_points.txt +0 -0
- {dtlpy-1.114.17.dist-info → dtlpy-1.116.6.dist-info}/top_level.txt +0 -0
dtlpy/entities/execution.py
CHANGED
|
@@ -1,397 +1,397 @@
|
|
|
1
|
-
import attr
|
|
2
|
-
import logging
|
|
3
|
-
import traceback
|
|
4
|
-
from enum import Enum
|
|
5
|
-
from collections import namedtuple
|
|
6
|
-
|
|
7
|
-
from .. import repositories, entities
|
|
8
|
-
from ..services.api_client import ApiClient
|
|
9
|
-
|
|
10
|
-
logger = logging.getLogger(name='dtlpy')
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
class ExecutionStatus(str, Enum):
|
|
14
|
-
SUCCESS = "success"
|
|
15
|
-
FAILED = "failed"
|
|
16
|
-
IN_PROGRESS = "in-progress"
|
|
17
|
-
CREATED = "created"
|
|
18
|
-
TERMINATED = 'terminated',
|
|
19
|
-
ABORTED = 'aborted'
|
|
20
|
-
CANCELED = 'canceled'
|
|
21
|
-
SYSTEM_FAILURE = 'system-failure'
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
@attr.s
|
|
25
|
-
class Execution(entities.BaseEntity):
|
|
26
|
-
"""
|
|
27
|
-
Service execution entity
|
|
28
|
-
"""
|
|
29
|
-
# platform
|
|
30
|
-
id = attr.ib()
|
|
31
|
-
url = attr.ib(repr=False)
|
|
32
|
-
creator = attr.ib()
|
|
33
|
-
created_at = attr.ib()
|
|
34
|
-
updated_at = attr.ib(repr=False)
|
|
35
|
-
input = attr.ib()
|
|
36
|
-
output = attr.ib(repr=False)
|
|
37
|
-
feedback_queue = attr.ib(repr=False)
|
|
38
|
-
_status = attr.ib(repr=False)
|
|
39
|
-
status_log = attr.ib(repr=False)
|
|
40
|
-
sync_reply_to = attr.ib(repr=False)
|
|
41
|
-
latest_status = attr.ib()
|
|
42
|
-
function_name = attr.ib()
|
|
43
|
-
duration = attr.ib()
|
|
44
|
-
attempts = attr.ib()
|
|
45
|
-
max_attempts = attr.ib()
|
|
46
|
-
to_terminate = attr.ib(type=bool)
|
|
47
|
-
|
|
48
|
-
# name changed
|
|
49
|
-
trigger_id = attr.ib()
|
|
50
|
-
service_id = attr.ib()
|
|
51
|
-
project_id = attr.ib()
|
|
52
|
-
service_version = attr.ib()
|
|
53
|
-
package_id = attr.ib()
|
|
54
|
-
package_name = attr.ib()
|
|
55
|
-
package_revision = attr.ib()
|
|
56
|
-
|
|
57
|
-
# sdk
|
|
58
|
-
_client_api = attr.ib(type=ApiClient, repr=False)
|
|
59
|
-
_service = attr.ib(repr=False)
|
|
60
|
-
_project = attr.ib(repr=False, default=None)
|
|
61
|
-
_repositories = attr.ib(repr=False)
|
|
62
|
-
|
|
63
|
-
# optional
|
|
64
|
-
pipeline = attr.ib(type=dict, default=None, repr=False)
|
|
65
|
-
model = attr.ib(type=dict, default=None, repr=False)
|
|
66
|
-
app = attr.ib(default=None)
|
|
67
|
-
driver_id = attr.ib(default=None)
|
|
68
|
-
|
|
69
|
-
################
|
|
70
|
-
# repositories #
|
|
71
|
-
################
|
|
72
|
-
@_repositories.default
|
|
73
|
-
def set_repositories(self):
|
|
74
|
-
reps = namedtuple('repositories',
|
|
75
|
-
field_names=['executions', 'services'])
|
|
76
|
-
|
|
77
|
-
if self._project is not None:
|
|
78
|
-
services_repo = self._project.services
|
|
79
|
-
executions_repo = self._project.executions
|
|
80
|
-
elif self._service is not None:
|
|
81
|
-
services_repo = self._service.services
|
|
82
|
-
executions_repo = self._service.executions
|
|
83
|
-
else:
|
|
84
|
-
services_repo = repositories.Services(client_api=self._client_api,
|
|
85
|
-
project=self._project,
|
|
86
|
-
package=None)
|
|
87
|
-
executions_repo = repositories.Executions(client_api=self._client_api,
|
|
88
|
-
project=self._project,
|
|
89
|
-
service=self._service)
|
|
90
|
-
|
|
91
|
-
r = reps(executions=executions_repo,
|
|
92
|
-
services=services_repo)
|
|
93
|
-
return r
|
|
94
|
-
|
|
95
|
-
@property
|
|
96
|
-
def createdAt(self):
|
|
97
|
-
return self.created_at
|
|
98
|
-
|
|
99
|
-
@property
|
|
100
|
-
def updatedAt(self):
|
|
101
|
-
return self.updated_at
|
|
102
|
-
|
|
103
|
-
@property
|
|
104
|
-
def syncReplyTo(self):
|
|
105
|
-
return self.sync_reply_to
|
|
106
|
-
|
|
107
|
-
@property
|
|
108
|
-
def feedbackQueue(self):
|
|
109
|
-
return self.feedback_queue
|
|
110
|
-
|
|
111
|
-
@property
|
|
112
|
-
def status(self):
|
|
113
|
-
return self._status
|
|
114
|
-
|
|
115
|
-
@property
|
|
116
|
-
def services(self):
|
|
117
|
-
assert isinstance(self._repositories.services, repositories.Services)
|
|
118
|
-
return self._repositories.services
|
|
119
|
-
|
|
120
|
-
@property
|
|
121
|
-
def executions(self):
|
|
122
|
-
assert isinstance(self._repositories.executions, repositories.Executions)
|
|
123
|
-
return self._repositories.executions
|
|
124
|
-
|
|
125
|
-
@staticmethod
|
|
126
|
-
def _protected_from_json(_json, client_api, project=None, service=None, is_fetched=True):
|
|
127
|
-
"""
|
|
128
|
-
Same as from_json but with try-except to catch if error
|
|
129
|
-
:param _json: platform json
|
|
130
|
-
:param client_api: ApiClient entity
|
|
131
|
-
:return:
|
|
132
|
-
"""
|
|
133
|
-
try:
|
|
134
|
-
execution = Execution.from_json(_json=_json,
|
|
135
|
-
client_api=client_api,
|
|
136
|
-
project=None,
|
|
137
|
-
service=service,
|
|
138
|
-
is_fetched=is_fetched)
|
|
139
|
-
status = True
|
|
140
|
-
except Exception:
|
|
141
|
-
execution = traceback.format_exc()
|
|
142
|
-
status = False
|
|
143
|
-
return status, execution
|
|
144
|
-
|
|
145
|
-
@classmethod
|
|
146
|
-
def from_json(cls, _json, client_api, project=None, service=None, is_fetched=True):
|
|
147
|
-
"""
|
|
148
|
-
:param dict _json: platform json
|
|
149
|
-
:param dl.ApiClient client_api: ApiClient entity
|
|
150
|
-
:param dtlpy.entities.project.Project project: project entity
|
|
151
|
-
:param dtlpy.entities.service.Service service:
|
|
152
|
-
:param is_fetched: is Entity fetched from Platform
|
|
153
|
-
"""
|
|
154
|
-
if project is not None:
|
|
155
|
-
if project.id != _json.get('projectId', None):
|
|
156
|
-
logger.warning('Execution has been fetched from a project that is not belong to it')
|
|
157
|
-
project = None
|
|
158
|
-
|
|
159
|
-
if service is not None:
|
|
160
|
-
if service.id != _json.get('serviceId', None):
|
|
161
|
-
logger.warning('Execution has been fetched from a service that is not belong to it')
|
|
162
|
-
service = None
|
|
163
|
-
|
|
164
|
-
inst = cls(
|
|
165
|
-
feedback_queue=_json.get('feedbackQueue', None),
|
|
166
|
-
service_id=_json.get('serviceId', None),
|
|
167
|
-
project_id=_json.get('projectId', None),
|
|
168
|
-
latest_status=_json.get('latestStatus', None),
|
|
169
|
-
sync_reply_to=_json.get('syncReplyTo', None),
|
|
170
|
-
created_at=_json.get('createdAt', None),
|
|
171
|
-
updated_at=_json.get('updatedAt', None),
|
|
172
|
-
creator=_json.get('creator', None),
|
|
173
|
-
trigger_id=_json.get('triggerId', None),
|
|
174
|
-
attempts=_json.get('attempts', None),
|
|
175
|
-
max_attempts=_json.get('maxAttempts', None),
|
|
176
|
-
output=_json.get('output', None),
|
|
177
|
-
status=_json.get('status', None),
|
|
178
|
-
status_log=_json.get('statusLog', None),
|
|
179
|
-
duration=_json.get('duration', None),
|
|
180
|
-
function_name=_json.get('functionName', entities.package_defaults.DEFAULT_PACKAGE_FUNCTION_NAME),
|
|
181
|
-
input=_json.get('input', None),
|
|
182
|
-
url=_json.get('url', None),
|
|
183
|
-
id=_json.get('id', None),
|
|
184
|
-
to_terminate=_json.get('toTerminate', False),
|
|
185
|
-
client_api=client_api,
|
|
186
|
-
project=project,
|
|
187
|
-
service=service,
|
|
188
|
-
service_version=_json.get('serviceVersion', False),
|
|
189
|
-
package_id=_json.get('packageId', None),
|
|
190
|
-
package_name=_json.get('packageName', None),
|
|
191
|
-
pipeline=_json.get('pipeline', None),
|
|
192
|
-
model=_json.get('model', None),
|
|
193
|
-
package_revision=_json.get('packageRevision', None),
|
|
194
|
-
app=_json.get('app', None),
|
|
195
|
-
driver_id=_json.get('driverId', None)
|
|
196
|
-
)
|
|
197
|
-
inst.is_fetched = is_fetched
|
|
198
|
-
return inst
|
|
199
|
-
|
|
200
|
-
def to_json(self):
|
|
201
|
-
"""
|
|
202
|
-
Returns platform _json format of object
|
|
203
|
-
|
|
204
|
-
:return: platform json format of object
|
|
205
|
-
:rtype: dict
|
|
206
|
-
"""
|
|
207
|
-
# get excluded
|
|
208
|
-
_json = attr.asdict(
|
|
209
|
-
self, filter=attr.filters.exclude(
|
|
210
|
-
attr.fields(Execution)._client_api,
|
|
211
|
-
attr.fields(Execution)._service,
|
|
212
|
-
attr.fields(Execution)._project,
|
|
213
|
-
attr.fields(Execution).to_terminate,
|
|
214
|
-
attr.fields(Execution)._repositories,
|
|
215
|
-
attr.fields(Execution).project_id,
|
|
216
|
-
attr.fields(Execution).service_id,
|
|
217
|
-
attr.fields(Execution).trigger_id,
|
|
218
|
-
attr.fields(Execution).function_name,
|
|
219
|
-
attr.fields(Execution).max_attempts,
|
|
220
|
-
attr.fields(Execution).latest_status,
|
|
221
|
-
attr.fields(Execution).service_version,
|
|
222
|
-
attr.fields(Execution).package_id,
|
|
223
|
-
attr.fields(Execution).package_name,
|
|
224
|
-
attr.fields(Execution).status_log,
|
|
225
|
-
attr.fields(Execution)._status,
|
|
226
|
-
attr.fields(Execution).created_at,
|
|
227
|
-
attr.fields(Execution).updated_at,
|
|
228
|
-
attr.fields(Execution).feedback_queue,
|
|
229
|
-
attr.fields(Execution).sync_reply_to,
|
|
230
|
-
attr.fields(Execution).pipeline,
|
|
231
|
-
attr.fields(Execution).model,
|
|
232
|
-
attr.fields(Execution).package_revision,
|
|
233
|
-
attr.fields(Execution).driver_id,
|
|
234
|
-
)
|
|
235
|
-
)
|
|
236
|
-
|
|
237
|
-
# rename
|
|
238
|
-
_json['projectId'] = self.project_id
|
|
239
|
-
_json['triggerId'] = self.trigger_id
|
|
240
|
-
_json['serviceId'] = self.service_id
|
|
241
|
-
_json['functionName'] = self.function_name
|
|
242
|
-
_json['latestStatus'] = self.latest_status
|
|
243
|
-
_json['maxAttempts'] = self.max_attempts
|
|
244
|
-
_json['toTerminate'] = self.to_terminate
|
|
245
|
-
_json['serviceVersion'] = self.service_version
|
|
246
|
-
_json['packageId'] = self.package_id
|
|
247
|
-
_json['packageName'] = self.package_name
|
|
248
|
-
_json['statusLog'] = self.status_log
|
|
249
|
-
_json['status'] = self._status
|
|
250
|
-
_json['createdAt'] = self.created_at
|
|
251
|
-
_json['updatedAt'] = self.updated_at
|
|
252
|
-
_json['feedbackQueue'] = self.feedback_queue
|
|
253
|
-
_json['syncReplyTo '] = self.sync_reply_to
|
|
254
|
-
_json['packageRevision'] = self.package_revision
|
|
255
|
-
_json['driverId'] = self.driver_id
|
|
256
|
-
|
|
257
|
-
if self.pipeline:
|
|
258
|
-
_json['pipeline'] = self.pipeline
|
|
259
|
-
if self.model:
|
|
260
|
-
_json['model'] = self.model
|
|
261
|
-
|
|
262
|
-
return _json
|
|
263
|
-
|
|
264
|
-
@property
|
|
265
|
-
def pipeline_id(self) -> str:
|
|
266
|
-
pipeline_id = None
|
|
267
|
-
if self.pipeline:
|
|
268
|
-
pipeline_id = self.pipeline.get('id', None)
|
|
269
|
-
return pipeline_id
|
|
270
|
-
|
|
271
|
-
@property
|
|
272
|
-
def node_id(self) -> str:
|
|
273
|
-
node_id = None
|
|
274
|
-
if self.pipeline:
|
|
275
|
-
node_id = self.pipeline.get('nodeId', None)
|
|
276
|
-
return node_id
|
|
277
|
-
|
|
278
|
-
@property
|
|
279
|
-
def pipeline_execution_id(self) -> str:
|
|
280
|
-
pipeline_execution_id = None
|
|
281
|
-
if self.pipeline:
|
|
282
|
-
pipeline_execution_id = self.pipeline.get('executionId', None)
|
|
283
|
-
return pipeline_execution_id
|
|
284
|
-
|
|
285
|
-
@property
|
|
286
|
-
def service(self):
|
|
287
|
-
if self._service is None:
|
|
288
|
-
self._service = self.services.get(service_id=self.service_id, fetch=None)
|
|
289
|
-
assert isinstance(self._service, entities.Service)
|
|
290
|
-
return self._service
|
|
291
|
-
|
|
292
|
-
@property
|
|
293
|
-
def project(self):
|
|
294
|
-
if self._project is None:
|
|
295
|
-
self._project = repositories.Projects(client_api=self._client_api).get(project_id=self.project_id,
|
|
296
|
-
fetch=None)
|
|
297
|
-
assert isinstance(self._project, entities.Project)
|
|
298
|
-
return self._project
|
|
299
|
-
|
|
300
|
-
def get_latest_status(self):
|
|
301
|
-
self.latest_status = self.executions.get(execution_id=self.id).latest_status
|
|
302
|
-
return self.latest_status
|
|
303
|
-
|
|
304
|
-
@service.setter
|
|
305
|
-
def service(self, service):
|
|
306
|
-
if not isinstance(service, entities.Service):
|
|
307
|
-
raise ValueError('Must input a valid service entity')
|
|
308
|
-
self._service = service
|
|
309
|
-
|
|
310
|
-
def progress_update(
|
|
311
|
-
self,
|
|
312
|
-
status: ExecutionStatus = None,
|
|
313
|
-
percent_complete: int = None,
|
|
314
|
-
message: str = None,
|
|
315
|
-
output: str = None,
|
|
316
|
-
service_version: str = None
|
|
317
|
-
):
|
|
318
|
-
"""
|
|
319
|
-
Update Execution Progress
|
|
320
|
-
|
|
321
|
-
:param str status: ExecutionStatus
|
|
322
|
-
:param int percent_complete: percent complete
|
|
323
|
-
:param str message: message to update the progress state
|
|
324
|
-
:param str output: output
|
|
325
|
-
:param str service_version: service version
|
|
326
|
-
:return: Service execution object
|
|
327
|
-
"""
|
|
328
|
-
return self.executions.progress_update(
|
|
329
|
-
execution_id=self.id,
|
|
330
|
-
status=status,
|
|
331
|
-
percent_complete=percent_complete,
|
|
332
|
-
message=message,
|
|
333
|
-
output=output,
|
|
334
|
-
service_version=service_version
|
|
335
|
-
)
|
|
336
|
-
|
|
337
|
-
def update(self):
|
|
338
|
-
"""
|
|
339
|
-
Update execution changes to platform
|
|
340
|
-
|
|
341
|
-
:return: execution entity
|
|
342
|
-
"""
|
|
343
|
-
return self.executions.update(execution=self)
|
|
344
|
-
|
|
345
|
-
def logs(self, follow=False, log_level='DEBUG'):
|
|
346
|
-
"""
|
|
347
|
-
Print logs for execution
|
|
348
|
-
|
|
349
|
-
:param follow: keep stream future logs
|
|
350
|
-
:param str log_level: the log level to display
|
|
351
|
-
"""
|
|
352
|
-
self.services.log(execution_id=self.id,
|
|
353
|
-
view=True,
|
|
354
|
-
service=self.service,
|
|
355
|
-
follow=follow,
|
|
356
|
-
start=self.created_at,
|
|
357
|
-
log_level=log_level)
|
|
358
|
-
|
|
359
|
-
def increment(self):
|
|
360
|
-
"""
|
|
361
|
-
Increment attempts
|
|
362
|
-
|
|
363
|
-
:return:
|
|
364
|
-
"""
|
|
365
|
-
self.attempts = self.executions.increment(execution=self)
|
|
366
|
-
|
|
367
|
-
def rerun(self, sync: bool = False):
|
|
368
|
-
"""
|
|
369
|
-
Re-run
|
|
370
|
-
|
|
371
|
-
:return: Execution object
|
|
372
|
-
"""
|
|
373
|
-
return self.executions.rerun(execution=self, sync=sync)
|
|
374
|
-
|
|
375
|
-
def terminate(self):
|
|
376
|
-
"""
|
|
377
|
-
Terminate execution
|
|
378
|
-
|
|
379
|
-
:return: execution object
|
|
380
|
-
"""
|
|
381
|
-
return self.executions.terminate(execution=self)
|
|
382
|
-
|
|
383
|
-
def wait(self):
|
|
384
|
-
"""
|
|
385
|
-
Wait for execution
|
|
386
|
-
|
|
387
|
-
:return: Service execution object
|
|
388
|
-
"""
|
|
389
|
-
return self.executions.wait(execution_id=self.id)
|
|
390
|
-
|
|
391
|
-
def in_progress(self):
|
|
392
|
-
return self.latest_status['status'] not in [ExecutionStatus.FAILED,
|
|
393
|
-
ExecutionStatus.SUCCESS,
|
|
394
|
-
ExecutionStatus.TERMINATED,
|
|
395
|
-
ExecutionStatus.ABORTED,
|
|
396
|
-
ExecutionStatus.CANCELED,
|
|
397
|
-
ExecutionStatus.SYSTEM_FAILURE]
|
|
1
|
+
import attr
|
|
2
|
+
import logging
|
|
3
|
+
import traceback
|
|
4
|
+
from enum import Enum
|
|
5
|
+
from collections import namedtuple
|
|
6
|
+
|
|
7
|
+
from .. import repositories, entities
|
|
8
|
+
from ..services.api_client import ApiClient
|
|
9
|
+
|
|
10
|
+
logger = logging.getLogger(name='dtlpy')
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class ExecutionStatus(str, Enum):
|
|
14
|
+
SUCCESS = "success"
|
|
15
|
+
FAILED = "failed"
|
|
16
|
+
IN_PROGRESS = "in-progress"
|
|
17
|
+
CREATED = "created"
|
|
18
|
+
TERMINATED = 'terminated',
|
|
19
|
+
ABORTED = 'aborted'
|
|
20
|
+
CANCELED = 'canceled'
|
|
21
|
+
SYSTEM_FAILURE = 'system-failure'
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@attr.s
|
|
25
|
+
class Execution(entities.BaseEntity):
|
|
26
|
+
"""
|
|
27
|
+
Service execution entity
|
|
28
|
+
"""
|
|
29
|
+
# platform
|
|
30
|
+
id = attr.ib()
|
|
31
|
+
url = attr.ib(repr=False)
|
|
32
|
+
creator = attr.ib()
|
|
33
|
+
created_at = attr.ib()
|
|
34
|
+
updated_at = attr.ib(repr=False)
|
|
35
|
+
input = attr.ib()
|
|
36
|
+
output = attr.ib(repr=False)
|
|
37
|
+
feedback_queue = attr.ib(repr=False)
|
|
38
|
+
_status = attr.ib(repr=False)
|
|
39
|
+
status_log = attr.ib(repr=False)
|
|
40
|
+
sync_reply_to = attr.ib(repr=False)
|
|
41
|
+
latest_status = attr.ib()
|
|
42
|
+
function_name = attr.ib()
|
|
43
|
+
duration = attr.ib()
|
|
44
|
+
attempts = attr.ib()
|
|
45
|
+
max_attempts = attr.ib()
|
|
46
|
+
to_terminate = attr.ib(type=bool)
|
|
47
|
+
|
|
48
|
+
# name changed
|
|
49
|
+
trigger_id = attr.ib()
|
|
50
|
+
service_id = attr.ib()
|
|
51
|
+
project_id = attr.ib()
|
|
52
|
+
service_version = attr.ib()
|
|
53
|
+
package_id = attr.ib()
|
|
54
|
+
package_name = attr.ib()
|
|
55
|
+
package_revision = attr.ib()
|
|
56
|
+
|
|
57
|
+
# sdk
|
|
58
|
+
_client_api = attr.ib(type=ApiClient, repr=False)
|
|
59
|
+
_service = attr.ib(repr=False)
|
|
60
|
+
_project = attr.ib(repr=False, default=None)
|
|
61
|
+
_repositories = attr.ib(repr=False)
|
|
62
|
+
|
|
63
|
+
# optional
|
|
64
|
+
pipeline = attr.ib(type=dict, default=None, repr=False)
|
|
65
|
+
model = attr.ib(type=dict, default=None, repr=False)
|
|
66
|
+
app = attr.ib(default=None)
|
|
67
|
+
driver_id = attr.ib(default=None)
|
|
68
|
+
|
|
69
|
+
################
|
|
70
|
+
# repositories #
|
|
71
|
+
################
|
|
72
|
+
@_repositories.default
|
|
73
|
+
def set_repositories(self):
|
|
74
|
+
reps = namedtuple('repositories',
|
|
75
|
+
field_names=['executions', 'services'])
|
|
76
|
+
|
|
77
|
+
if self._project is not None:
|
|
78
|
+
services_repo = self._project.services
|
|
79
|
+
executions_repo = self._project.executions
|
|
80
|
+
elif self._service is not None:
|
|
81
|
+
services_repo = self._service.services
|
|
82
|
+
executions_repo = self._service.executions
|
|
83
|
+
else:
|
|
84
|
+
services_repo = repositories.Services(client_api=self._client_api,
|
|
85
|
+
project=self._project,
|
|
86
|
+
package=None)
|
|
87
|
+
executions_repo = repositories.Executions(client_api=self._client_api,
|
|
88
|
+
project=self._project,
|
|
89
|
+
service=self._service)
|
|
90
|
+
|
|
91
|
+
r = reps(executions=executions_repo,
|
|
92
|
+
services=services_repo)
|
|
93
|
+
return r
|
|
94
|
+
|
|
95
|
+
@property
|
|
96
|
+
def createdAt(self):
|
|
97
|
+
return self.created_at
|
|
98
|
+
|
|
99
|
+
@property
|
|
100
|
+
def updatedAt(self):
|
|
101
|
+
return self.updated_at
|
|
102
|
+
|
|
103
|
+
@property
|
|
104
|
+
def syncReplyTo(self):
|
|
105
|
+
return self.sync_reply_to
|
|
106
|
+
|
|
107
|
+
@property
|
|
108
|
+
def feedbackQueue(self):
|
|
109
|
+
return self.feedback_queue
|
|
110
|
+
|
|
111
|
+
@property
|
|
112
|
+
def status(self):
|
|
113
|
+
return self._status
|
|
114
|
+
|
|
115
|
+
@property
|
|
116
|
+
def services(self):
|
|
117
|
+
assert isinstance(self._repositories.services, repositories.Services)
|
|
118
|
+
return self._repositories.services
|
|
119
|
+
|
|
120
|
+
@property
|
|
121
|
+
def executions(self):
|
|
122
|
+
assert isinstance(self._repositories.executions, repositories.Executions)
|
|
123
|
+
return self._repositories.executions
|
|
124
|
+
|
|
125
|
+
@staticmethod
|
|
126
|
+
def _protected_from_json(_json, client_api, project=None, service=None, is_fetched=True):
|
|
127
|
+
"""
|
|
128
|
+
Same as from_json but with try-except to catch if error
|
|
129
|
+
:param _json: platform json
|
|
130
|
+
:param client_api: ApiClient entity
|
|
131
|
+
:return:
|
|
132
|
+
"""
|
|
133
|
+
try:
|
|
134
|
+
execution = Execution.from_json(_json=_json,
|
|
135
|
+
client_api=client_api,
|
|
136
|
+
project=None,
|
|
137
|
+
service=service,
|
|
138
|
+
is_fetched=is_fetched)
|
|
139
|
+
status = True
|
|
140
|
+
except Exception:
|
|
141
|
+
execution = traceback.format_exc()
|
|
142
|
+
status = False
|
|
143
|
+
return status, execution
|
|
144
|
+
|
|
145
|
+
@classmethod
|
|
146
|
+
def from_json(cls, _json, client_api, project=None, service=None, is_fetched=True):
|
|
147
|
+
"""
|
|
148
|
+
:param dict _json: platform json
|
|
149
|
+
:param dl.ApiClient client_api: ApiClient entity
|
|
150
|
+
:param dtlpy.entities.project.Project project: project entity
|
|
151
|
+
:param dtlpy.entities.service.Service service:
|
|
152
|
+
:param is_fetched: is Entity fetched from Platform
|
|
153
|
+
"""
|
|
154
|
+
if project is not None:
|
|
155
|
+
if project.id != _json.get('projectId', None):
|
|
156
|
+
logger.warning('Execution has been fetched from a project that is not belong to it')
|
|
157
|
+
project = None
|
|
158
|
+
|
|
159
|
+
if service is not None:
|
|
160
|
+
if service.id != _json.get('serviceId', None):
|
|
161
|
+
logger.warning('Execution has been fetched from a service that is not belong to it')
|
|
162
|
+
service = None
|
|
163
|
+
|
|
164
|
+
inst = cls(
|
|
165
|
+
feedback_queue=_json.get('feedbackQueue', None),
|
|
166
|
+
service_id=_json.get('serviceId', None),
|
|
167
|
+
project_id=_json.get('projectId', None),
|
|
168
|
+
latest_status=_json.get('latestStatus', None),
|
|
169
|
+
sync_reply_to=_json.get('syncReplyTo', None),
|
|
170
|
+
created_at=_json.get('createdAt', None),
|
|
171
|
+
updated_at=_json.get('updatedAt', None),
|
|
172
|
+
creator=_json.get('creator', None),
|
|
173
|
+
trigger_id=_json.get('triggerId', None),
|
|
174
|
+
attempts=_json.get('attempts', None),
|
|
175
|
+
max_attempts=_json.get('maxAttempts', None),
|
|
176
|
+
output=_json.get('output', None),
|
|
177
|
+
status=_json.get('status', None),
|
|
178
|
+
status_log=_json.get('statusLog', None),
|
|
179
|
+
duration=_json.get('duration', None),
|
|
180
|
+
function_name=_json.get('functionName', entities.package_defaults.DEFAULT_PACKAGE_FUNCTION_NAME),
|
|
181
|
+
input=_json.get('input', None),
|
|
182
|
+
url=_json.get('url', None),
|
|
183
|
+
id=_json.get('id', None),
|
|
184
|
+
to_terminate=_json.get('toTerminate', False),
|
|
185
|
+
client_api=client_api,
|
|
186
|
+
project=project,
|
|
187
|
+
service=service,
|
|
188
|
+
service_version=_json.get('serviceVersion', False),
|
|
189
|
+
package_id=_json.get('packageId', None),
|
|
190
|
+
package_name=_json.get('packageName', None),
|
|
191
|
+
pipeline=_json.get('pipeline', None),
|
|
192
|
+
model=_json.get('model', None),
|
|
193
|
+
package_revision=_json.get('packageRevision', None),
|
|
194
|
+
app=_json.get('app', None),
|
|
195
|
+
driver_id=_json.get('driverId', None)
|
|
196
|
+
)
|
|
197
|
+
inst.is_fetched = is_fetched
|
|
198
|
+
return inst
|
|
199
|
+
|
|
200
|
+
def to_json(self):
|
|
201
|
+
"""
|
|
202
|
+
Returns platform _json format of object
|
|
203
|
+
|
|
204
|
+
:return: platform json format of object
|
|
205
|
+
:rtype: dict
|
|
206
|
+
"""
|
|
207
|
+
# get excluded
|
|
208
|
+
_json = attr.asdict(
|
|
209
|
+
self, filter=attr.filters.exclude(
|
|
210
|
+
attr.fields(Execution)._client_api,
|
|
211
|
+
attr.fields(Execution)._service,
|
|
212
|
+
attr.fields(Execution)._project,
|
|
213
|
+
attr.fields(Execution).to_terminate,
|
|
214
|
+
attr.fields(Execution)._repositories,
|
|
215
|
+
attr.fields(Execution).project_id,
|
|
216
|
+
attr.fields(Execution).service_id,
|
|
217
|
+
attr.fields(Execution).trigger_id,
|
|
218
|
+
attr.fields(Execution).function_name,
|
|
219
|
+
attr.fields(Execution).max_attempts,
|
|
220
|
+
attr.fields(Execution).latest_status,
|
|
221
|
+
attr.fields(Execution).service_version,
|
|
222
|
+
attr.fields(Execution).package_id,
|
|
223
|
+
attr.fields(Execution).package_name,
|
|
224
|
+
attr.fields(Execution).status_log,
|
|
225
|
+
attr.fields(Execution)._status,
|
|
226
|
+
attr.fields(Execution).created_at,
|
|
227
|
+
attr.fields(Execution).updated_at,
|
|
228
|
+
attr.fields(Execution).feedback_queue,
|
|
229
|
+
attr.fields(Execution).sync_reply_to,
|
|
230
|
+
attr.fields(Execution).pipeline,
|
|
231
|
+
attr.fields(Execution).model,
|
|
232
|
+
attr.fields(Execution).package_revision,
|
|
233
|
+
attr.fields(Execution).driver_id,
|
|
234
|
+
)
|
|
235
|
+
)
|
|
236
|
+
|
|
237
|
+
# rename
|
|
238
|
+
_json['projectId'] = self.project_id
|
|
239
|
+
_json['triggerId'] = self.trigger_id
|
|
240
|
+
_json['serviceId'] = self.service_id
|
|
241
|
+
_json['functionName'] = self.function_name
|
|
242
|
+
_json['latestStatus'] = self.latest_status
|
|
243
|
+
_json['maxAttempts'] = self.max_attempts
|
|
244
|
+
_json['toTerminate'] = self.to_terminate
|
|
245
|
+
_json['serviceVersion'] = self.service_version
|
|
246
|
+
_json['packageId'] = self.package_id
|
|
247
|
+
_json['packageName'] = self.package_name
|
|
248
|
+
_json['statusLog'] = self.status_log
|
|
249
|
+
_json['status'] = self._status
|
|
250
|
+
_json['createdAt'] = self.created_at
|
|
251
|
+
_json['updatedAt'] = self.updated_at
|
|
252
|
+
_json['feedbackQueue'] = self.feedback_queue
|
|
253
|
+
_json['syncReplyTo '] = self.sync_reply_to
|
|
254
|
+
_json['packageRevision'] = self.package_revision
|
|
255
|
+
_json['driverId'] = self.driver_id
|
|
256
|
+
|
|
257
|
+
if self.pipeline:
|
|
258
|
+
_json['pipeline'] = self.pipeline
|
|
259
|
+
if self.model:
|
|
260
|
+
_json['model'] = self.model
|
|
261
|
+
|
|
262
|
+
return _json
|
|
263
|
+
|
|
264
|
+
@property
|
|
265
|
+
def pipeline_id(self) -> str:
|
|
266
|
+
pipeline_id = None
|
|
267
|
+
if self.pipeline:
|
|
268
|
+
pipeline_id = self.pipeline.get('id', None)
|
|
269
|
+
return pipeline_id
|
|
270
|
+
|
|
271
|
+
@property
|
|
272
|
+
def node_id(self) -> str:
|
|
273
|
+
node_id = None
|
|
274
|
+
if self.pipeline:
|
|
275
|
+
node_id = self.pipeline.get('nodeId', None)
|
|
276
|
+
return node_id
|
|
277
|
+
|
|
278
|
+
@property
|
|
279
|
+
def pipeline_execution_id(self) -> str:
|
|
280
|
+
pipeline_execution_id = None
|
|
281
|
+
if self.pipeline:
|
|
282
|
+
pipeline_execution_id = self.pipeline.get('executionId', None)
|
|
283
|
+
return pipeline_execution_id
|
|
284
|
+
|
|
285
|
+
@property
|
|
286
|
+
def service(self):
|
|
287
|
+
if self._service is None:
|
|
288
|
+
self._service = self.services.get(service_id=self.service_id, fetch=None)
|
|
289
|
+
assert isinstance(self._service, entities.Service)
|
|
290
|
+
return self._service
|
|
291
|
+
|
|
292
|
+
@property
|
|
293
|
+
def project(self):
|
|
294
|
+
if self._project is None:
|
|
295
|
+
self._project = repositories.Projects(client_api=self._client_api).get(project_id=self.project_id,
|
|
296
|
+
fetch=None)
|
|
297
|
+
assert isinstance(self._project, entities.Project)
|
|
298
|
+
return self._project
|
|
299
|
+
|
|
300
|
+
def get_latest_status(self):
|
|
301
|
+
self.latest_status = self.executions.get(execution_id=self.id).latest_status
|
|
302
|
+
return self.latest_status
|
|
303
|
+
|
|
304
|
+
@service.setter
|
|
305
|
+
def service(self, service):
|
|
306
|
+
if not isinstance(service, entities.Service):
|
|
307
|
+
raise ValueError('Must input a valid service entity')
|
|
308
|
+
self._service = service
|
|
309
|
+
|
|
310
|
+
def progress_update(
|
|
311
|
+
self,
|
|
312
|
+
status: ExecutionStatus = None,
|
|
313
|
+
percent_complete: int = None,
|
|
314
|
+
message: str = None,
|
|
315
|
+
output: str = None,
|
|
316
|
+
service_version: str = None
|
|
317
|
+
):
|
|
318
|
+
"""
|
|
319
|
+
Update Execution Progress
|
|
320
|
+
|
|
321
|
+
:param str status: ExecutionStatus
|
|
322
|
+
:param int percent_complete: percent complete
|
|
323
|
+
:param str message: message to update the progress state
|
|
324
|
+
:param str output: output
|
|
325
|
+
:param str service_version: service version
|
|
326
|
+
:return: Service execution object
|
|
327
|
+
"""
|
|
328
|
+
return self.executions.progress_update(
|
|
329
|
+
execution_id=self.id,
|
|
330
|
+
status=status,
|
|
331
|
+
percent_complete=percent_complete,
|
|
332
|
+
message=message,
|
|
333
|
+
output=output,
|
|
334
|
+
service_version=service_version
|
|
335
|
+
)
|
|
336
|
+
|
|
337
|
+
def update(self):
|
|
338
|
+
"""
|
|
339
|
+
Update execution changes to platform
|
|
340
|
+
|
|
341
|
+
:return: execution entity
|
|
342
|
+
"""
|
|
343
|
+
return self.executions.update(execution=self)
|
|
344
|
+
|
|
345
|
+
def logs(self, follow=False, log_level='DEBUG'):
|
|
346
|
+
"""
|
|
347
|
+
Print logs for execution
|
|
348
|
+
|
|
349
|
+
:param follow: keep stream future logs
|
|
350
|
+
:param str log_level: the log level to display
|
|
351
|
+
"""
|
|
352
|
+
self.services.log(execution_id=self.id,
|
|
353
|
+
view=True,
|
|
354
|
+
service=self.service,
|
|
355
|
+
follow=follow,
|
|
356
|
+
start=self.created_at,
|
|
357
|
+
log_level=log_level)
|
|
358
|
+
|
|
359
|
+
def increment(self):
|
|
360
|
+
"""
|
|
361
|
+
Increment attempts
|
|
362
|
+
|
|
363
|
+
:return:
|
|
364
|
+
"""
|
|
365
|
+
self.attempts = self.executions.increment(execution=self)
|
|
366
|
+
|
|
367
|
+
def rerun(self, sync: bool = False):
|
|
368
|
+
"""
|
|
369
|
+
Re-run
|
|
370
|
+
|
|
371
|
+
:return: Execution object
|
|
372
|
+
"""
|
|
373
|
+
return self.executions.rerun(execution=self, sync=sync)
|
|
374
|
+
|
|
375
|
+
def terminate(self):
|
|
376
|
+
"""
|
|
377
|
+
Terminate execution
|
|
378
|
+
|
|
379
|
+
:return: execution object
|
|
380
|
+
"""
|
|
381
|
+
return self.executions.terminate(execution=self)
|
|
382
|
+
|
|
383
|
+
def wait(self):
|
|
384
|
+
"""
|
|
385
|
+
Wait for execution
|
|
386
|
+
|
|
387
|
+
:return: Service execution object
|
|
388
|
+
"""
|
|
389
|
+
return self.executions.wait(execution_id=self.id)
|
|
390
|
+
|
|
391
|
+
def in_progress(self):
|
|
392
|
+
return self.latest_status['status'] not in [ExecutionStatus.FAILED,
|
|
393
|
+
ExecutionStatus.SUCCESS,
|
|
394
|
+
ExecutionStatus.TERMINATED,
|
|
395
|
+
ExecutionStatus.ABORTED,
|
|
396
|
+
ExecutionStatus.CANCELED,
|
|
397
|
+
ExecutionStatus.SYSTEM_FAILURE]
|