dtlpy 1.115.44__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 -347
- 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 -292
- dtlpy/entities/collection.py +38 -38
- dtlpy/entities/command.py +169 -169
- dtlpy/entities/compute.py +449 -449
- dtlpy/entities/dataset.py +1299 -1299
- dtlpy/entities/directory_tree.py +44 -44
- dtlpy/entities/dpk.py +470 -470
- dtlpy/entities/driver.py +235 -235
- dtlpy/entities/execution.py +397 -397
- dtlpy/entities/feature.py +124 -124
- dtlpy/entities/feature_set.py +145 -145
- dtlpy/entities/filters.py +798 -798
- dtlpy/entities/gis_item.py +107 -107
- dtlpy/entities/integration.py +184 -184
- dtlpy/entities/item.py +959 -959
- 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 -505
- 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 -963
- 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 -1230
- 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 -152
- dtlpy/repositories/compositions.py +61 -61
- dtlpy/repositories/computes.py +439 -439
- dtlpy/repositories/datasets.py +1504 -1504
- dtlpy/repositories/downloader.py +976 -923
- dtlpy/repositories/dpks.py +433 -433
- dtlpy/repositories/drivers.py +482 -482
- dtlpy/repositories/executions.py +815 -815
- dtlpy/repositories/feature_sets.py +226 -226
- dtlpy/repositories/features.py +255 -255
- dtlpy/repositories/integrations.py +484 -484
- dtlpy/repositories/items.py +912 -912
- dtlpy/repositories/messages.py +94 -94
- dtlpy/repositories/models.py +1000 -1000
- 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 -661
- 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 -1785
- 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.115.44.data → dtlpy-1.116.6.data}/scripts/dlp +1 -1
- dtlpy-1.116.6.data/scripts/dlp.bat +2 -0
- {dtlpy-1.115.44.data → dtlpy-1.116.6.data}/scripts/dlp.py +128 -128
- {dtlpy-1.115.44.dist-info → dtlpy-1.116.6.dist-info}/METADATA +186 -186
- dtlpy-1.116.6.dist-info/RECORD +239 -0
- {dtlpy-1.115.44.dist-info → dtlpy-1.116.6.dist-info}/WHEEL +1 -1
- {dtlpy-1.115.44.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.115.44.data/scripts/dlp.bat +0 -2
- dtlpy-1.115.44.dist-info/RECORD +0 -240
- {dtlpy-1.115.44.dist-info → dtlpy-1.116.6.dist-info}/entry_points.txt +0 -0
- {dtlpy-1.115.44.dist-info → dtlpy-1.116.6.dist-info}/top_level.txt +0 -0
dtlpy/entities/command.py
CHANGED
|
@@ -1,169 +1,169 @@
|
|
|
1
|
-
import attr
|
|
2
|
-
import traceback
|
|
3
|
-
from enum import Enum
|
|
4
|
-
from collections import namedtuple
|
|
5
|
-
|
|
6
|
-
from .. import repositories, entities
|
|
7
|
-
from ..services.api_client import ApiClient
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class CommandsStatus(str, Enum):
|
|
11
|
-
CREATED = 'created'
|
|
12
|
-
MAKING_CHILDREN = 'making-children'
|
|
13
|
-
WAITING_CHILDREN = 'waiting-children'
|
|
14
|
-
IN_PROGRESS = 'in-progress'
|
|
15
|
-
ABORTED = 'aborted'
|
|
16
|
-
CANCELED = 'canceled'
|
|
17
|
-
FINALIZING = 'finalizing'
|
|
18
|
-
SUCCESS = 'success'
|
|
19
|
-
FAILED = 'failed'
|
|
20
|
-
TIMEOUT = 'timeout'
|
|
21
|
-
CLEANING_UP = 'cleaning-up'
|
|
22
|
-
ON_ERROR = 'on-error'
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
@attr.s
|
|
26
|
-
class Command(entities.BaseEntity):
|
|
27
|
-
"""
|
|
28
|
-
Com entity
|
|
29
|
-
"""
|
|
30
|
-
# platform
|
|
31
|
-
id = attr.ib()
|
|
32
|
-
url = attr.ib(repr=False)
|
|
33
|
-
status = attr.ib()
|
|
34
|
-
created_at = attr.ib()
|
|
35
|
-
updated_at = attr.ib()
|
|
36
|
-
type = attr.ib()
|
|
37
|
-
progress = attr.ib()
|
|
38
|
-
spec = attr.ib()
|
|
39
|
-
error = attr.ib()
|
|
40
|
-
|
|
41
|
-
# sdk
|
|
42
|
-
_client_api = attr.ib(type=ApiClient, repr=False)
|
|
43
|
-
_repositories = attr.ib(repr=False)
|
|
44
|
-
|
|
45
|
-
################
|
|
46
|
-
# repositories #
|
|
47
|
-
################
|
|
48
|
-
@_repositories.default
|
|
49
|
-
def set_repositories(self):
|
|
50
|
-
reps = namedtuple('repositories',
|
|
51
|
-
field_names=['commands'])
|
|
52
|
-
|
|
53
|
-
commands_repo = repositories.Commands(client_api=self._client_api)
|
|
54
|
-
|
|
55
|
-
r = reps(commands=commands_repo)
|
|
56
|
-
return r
|
|
57
|
-
|
|
58
|
-
@property
|
|
59
|
-
def commands(self):
|
|
60
|
-
assert isinstance(self._repositories.commands, repositories.Commands)
|
|
61
|
-
return self._repositories.commands
|
|
62
|
-
|
|
63
|
-
@staticmethod
|
|
64
|
-
def _protected_from_json(_json, client_api, is_fetched=True):
|
|
65
|
-
"""
|
|
66
|
-
Same as from_json but with try-except to catch if error
|
|
67
|
-
|
|
68
|
-
:param _json: platform json
|
|
69
|
-
:param client_api: ApiClient entity
|
|
70
|
-
:param is_fetched: is Entity fetched from Platform
|
|
71
|
-
:return:
|
|
72
|
-
"""
|
|
73
|
-
try:
|
|
74
|
-
command = Command.from_json(_json=_json,
|
|
75
|
-
client_api=client_api,
|
|
76
|
-
is_fetched=is_fetched)
|
|
77
|
-
status = True
|
|
78
|
-
except Exception:
|
|
79
|
-
command = traceback.format_exc()
|
|
80
|
-
status = False
|
|
81
|
-
return status, command
|
|
82
|
-
|
|
83
|
-
@classmethod
|
|
84
|
-
def from_json(cls, _json, client_api, is_fetched=True):
|
|
85
|
-
"""
|
|
86
|
-
Build a Command entity object from a json
|
|
87
|
-
|
|
88
|
-
:param _json: _json response from host
|
|
89
|
-
:param client_api: ApiClient entity
|
|
90
|
-
:param is_fetched: is Entity fetched from Platform
|
|
91
|
-
:return: Command object
|
|
92
|
-
"""
|
|
93
|
-
inst = cls(
|
|
94
|
-
id=_json.get('id', None),
|
|
95
|
-
url=_json.get('url', None),
|
|
96
|
-
status=_json.get('status', None),
|
|
97
|
-
created_at=_json.get('createdAt', None),
|
|
98
|
-
updated_at=_json.get('updatedAt', None),
|
|
99
|
-
type=_json.get('type', None),
|
|
100
|
-
progress=_json.get('progress', None),
|
|
101
|
-
spec=_json.get('spec', None),
|
|
102
|
-
error=_json.get('error', None),
|
|
103
|
-
client_api=client_api
|
|
104
|
-
)
|
|
105
|
-
inst.is_fetched = is_fetched
|
|
106
|
-
return inst
|
|
107
|
-
|
|
108
|
-
def to_json(self):
|
|
109
|
-
"""
|
|
110
|
-
Returns platform _json format of object
|
|
111
|
-
|
|
112
|
-
:return: platform json format of object
|
|
113
|
-
:rtype: dict
|
|
114
|
-
"""
|
|
115
|
-
# get excluded
|
|
116
|
-
_json = attr.asdict(self, filter=attr.filters.exclude(attr.fields(Command)._client_api,
|
|
117
|
-
attr.fields(Command).created_at,
|
|
118
|
-
attr.fields(Command).updated_at))
|
|
119
|
-
# rename
|
|
120
|
-
_json['createdAt'] = self.created_at
|
|
121
|
-
_json['updatedAt'] = self.updated_at
|
|
122
|
-
|
|
123
|
-
return _json
|
|
124
|
-
|
|
125
|
-
def abort(self):
|
|
126
|
-
"""
|
|
127
|
-
abort command
|
|
128
|
-
|
|
129
|
-
:return:
|
|
130
|
-
"""
|
|
131
|
-
return self.commands.abort(command_id=self.id)
|
|
132
|
-
|
|
133
|
-
def in_progress(self):
|
|
134
|
-
"""
|
|
135
|
-
Check if command is still in one of the in progress statuses
|
|
136
|
-
|
|
137
|
-
:return: True if command still in progress
|
|
138
|
-
:rtype: bool
|
|
139
|
-
"""
|
|
140
|
-
if self.status not in {status for status in entities.CommandsStatus}:
|
|
141
|
-
raise ValueError('status is not a valid CommandsStatus')
|
|
142
|
-
return self.status not in [entities.CommandsStatus.SUCCESS,
|
|
143
|
-
entities.CommandsStatus.FAILED,
|
|
144
|
-
entities.CommandsStatus.TIMEOUT,
|
|
145
|
-
entities.CommandsStatus.CANCELED,
|
|
146
|
-
entities.CommandsStatus.ABORTED
|
|
147
|
-
]
|
|
148
|
-
|
|
149
|
-
def wait(self, timeout=0, step=None, backoff_factor=1, iteration_callback=None):
|
|
150
|
-
"""
|
|
151
|
-
Wait for Command to finish
|
|
152
|
-
|
|
153
|
-
:param int timeout: int, seconds to wait until TimeoutError is raised. if 0 - wait until done
|
|
154
|
-
:param int step: int, seconds between polling
|
|
155
|
-
:param float backoff_factor: A backoff factor to apply between attempts after the second try
|
|
156
|
-
:param function iteration_callback: function to call on each iteration
|
|
157
|
-
:return: Command object
|
|
158
|
-
"""
|
|
159
|
-
if not self.in_progress():
|
|
160
|
-
return self
|
|
161
|
-
|
|
162
|
-
return self.commands.wait(
|
|
163
|
-
command_id=self.id,
|
|
164
|
-
timeout=timeout,
|
|
165
|
-
step=step,
|
|
166
|
-
url=self.url,
|
|
167
|
-
backoff_factor=backoff_factor,
|
|
168
|
-
iteration_callback=iteration_callback
|
|
169
|
-
)
|
|
1
|
+
import attr
|
|
2
|
+
import traceback
|
|
3
|
+
from enum import Enum
|
|
4
|
+
from collections import namedtuple
|
|
5
|
+
|
|
6
|
+
from .. import repositories, entities
|
|
7
|
+
from ..services.api_client import ApiClient
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class CommandsStatus(str, Enum):
|
|
11
|
+
CREATED = 'created'
|
|
12
|
+
MAKING_CHILDREN = 'making-children'
|
|
13
|
+
WAITING_CHILDREN = 'waiting-children'
|
|
14
|
+
IN_PROGRESS = 'in-progress'
|
|
15
|
+
ABORTED = 'aborted'
|
|
16
|
+
CANCELED = 'canceled'
|
|
17
|
+
FINALIZING = 'finalizing'
|
|
18
|
+
SUCCESS = 'success'
|
|
19
|
+
FAILED = 'failed'
|
|
20
|
+
TIMEOUT = 'timeout'
|
|
21
|
+
CLEANING_UP = 'cleaning-up'
|
|
22
|
+
ON_ERROR = 'on-error'
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@attr.s
|
|
26
|
+
class Command(entities.BaseEntity):
|
|
27
|
+
"""
|
|
28
|
+
Com entity
|
|
29
|
+
"""
|
|
30
|
+
# platform
|
|
31
|
+
id = attr.ib()
|
|
32
|
+
url = attr.ib(repr=False)
|
|
33
|
+
status = attr.ib()
|
|
34
|
+
created_at = attr.ib()
|
|
35
|
+
updated_at = attr.ib()
|
|
36
|
+
type = attr.ib()
|
|
37
|
+
progress = attr.ib()
|
|
38
|
+
spec = attr.ib()
|
|
39
|
+
error = attr.ib()
|
|
40
|
+
|
|
41
|
+
# sdk
|
|
42
|
+
_client_api = attr.ib(type=ApiClient, repr=False)
|
|
43
|
+
_repositories = attr.ib(repr=False)
|
|
44
|
+
|
|
45
|
+
################
|
|
46
|
+
# repositories #
|
|
47
|
+
################
|
|
48
|
+
@_repositories.default
|
|
49
|
+
def set_repositories(self):
|
|
50
|
+
reps = namedtuple('repositories',
|
|
51
|
+
field_names=['commands'])
|
|
52
|
+
|
|
53
|
+
commands_repo = repositories.Commands(client_api=self._client_api)
|
|
54
|
+
|
|
55
|
+
r = reps(commands=commands_repo)
|
|
56
|
+
return r
|
|
57
|
+
|
|
58
|
+
@property
|
|
59
|
+
def commands(self):
|
|
60
|
+
assert isinstance(self._repositories.commands, repositories.Commands)
|
|
61
|
+
return self._repositories.commands
|
|
62
|
+
|
|
63
|
+
@staticmethod
|
|
64
|
+
def _protected_from_json(_json, client_api, is_fetched=True):
|
|
65
|
+
"""
|
|
66
|
+
Same as from_json but with try-except to catch if error
|
|
67
|
+
|
|
68
|
+
:param _json: platform json
|
|
69
|
+
:param client_api: ApiClient entity
|
|
70
|
+
:param is_fetched: is Entity fetched from Platform
|
|
71
|
+
:return:
|
|
72
|
+
"""
|
|
73
|
+
try:
|
|
74
|
+
command = Command.from_json(_json=_json,
|
|
75
|
+
client_api=client_api,
|
|
76
|
+
is_fetched=is_fetched)
|
|
77
|
+
status = True
|
|
78
|
+
except Exception:
|
|
79
|
+
command = traceback.format_exc()
|
|
80
|
+
status = False
|
|
81
|
+
return status, command
|
|
82
|
+
|
|
83
|
+
@classmethod
|
|
84
|
+
def from_json(cls, _json, client_api, is_fetched=True):
|
|
85
|
+
"""
|
|
86
|
+
Build a Command entity object from a json
|
|
87
|
+
|
|
88
|
+
:param _json: _json response from host
|
|
89
|
+
:param client_api: ApiClient entity
|
|
90
|
+
:param is_fetched: is Entity fetched from Platform
|
|
91
|
+
:return: Command object
|
|
92
|
+
"""
|
|
93
|
+
inst = cls(
|
|
94
|
+
id=_json.get('id', None),
|
|
95
|
+
url=_json.get('url', None),
|
|
96
|
+
status=_json.get('status', None),
|
|
97
|
+
created_at=_json.get('createdAt', None),
|
|
98
|
+
updated_at=_json.get('updatedAt', None),
|
|
99
|
+
type=_json.get('type', None),
|
|
100
|
+
progress=_json.get('progress', None),
|
|
101
|
+
spec=_json.get('spec', None),
|
|
102
|
+
error=_json.get('error', None),
|
|
103
|
+
client_api=client_api
|
|
104
|
+
)
|
|
105
|
+
inst.is_fetched = is_fetched
|
|
106
|
+
return inst
|
|
107
|
+
|
|
108
|
+
def to_json(self):
|
|
109
|
+
"""
|
|
110
|
+
Returns platform _json format of object
|
|
111
|
+
|
|
112
|
+
:return: platform json format of object
|
|
113
|
+
:rtype: dict
|
|
114
|
+
"""
|
|
115
|
+
# get excluded
|
|
116
|
+
_json = attr.asdict(self, filter=attr.filters.exclude(attr.fields(Command)._client_api,
|
|
117
|
+
attr.fields(Command).created_at,
|
|
118
|
+
attr.fields(Command).updated_at))
|
|
119
|
+
# rename
|
|
120
|
+
_json['createdAt'] = self.created_at
|
|
121
|
+
_json['updatedAt'] = self.updated_at
|
|
122
|
+
|
|
123
|
+
return _json
|
|
124
|
+
|
|
125
|
+
def abort(self):
|
|
126
|
+
"""
|
|
127
|
+
abort command
|
|
128
|
+
|
|
129
|
+
:return:
|
|
130
|
+
"""
|
|
131
|
+
return self.commands.abort(command_id=self.id)
|
|
132
|
+
|
|
133
|
+
def in_progress(self):
|
|
134
|
+
"""
|
|
135
|
+
Check if command is still in one of the in progress statuses
|
|
136
|
+
|
|
137
|
+
:return: True if command still in progress
|
|
138
|
+
:rtype: bool
|
|
139
|
+
"""
|
|
140
|
+
if self.status not in {status for status in entities.CommandsStatus}:
|
|
141
|
+
raise ValueError('status is not a valid CommandsStatus')
|
|
142
|
+
return self.status not in [entities.CommandsStatus.SUCCESS,
|
|
143
|
+
entities.CommandsStatus.FAILED,
|
|
144
|
+
entities.CommandsStatus.TIMEOUT,
|
|
145
|
+
entities.CommandsStatus.CANCELED,
|
|
146
|
+
entities.CommandsStatus.ABORTED
|
|
147
|
+
]
|
|
148
|
+
|
|
149
|
+
def wait(self, timeout=0, step=None, backoff_factor=1, iteration_callback=None):
|
|
150
|
+
"""
|
|
151
|
+
Wait for Command to finish
|
|
152
|
+
|
|
153
|
+
:param int timeout: int, seconds to wait until TimeoutError is raised. if 0 - wait until done
|
|
154
|
+
:param int step: int, seconds between polling
|
|
155
|
+
:param float backoff_factor: A backoff factor to apply between attempts after the second try
|
|
156
|
+
:param function iteration_callback: function to call on each iteration
|
|
157
|
+
:return: Command object
|
|
158
|
+
"""
|
|
159
|
+
if not self.in_progress():
|
|
160
|
+
return self
|
|
161
|
+
|
|
162
|
+
return self.commands.wait(
|
|
163
|
+
command_id=self.id,
|
|
164
|
+
timeout=timeout,
|
|
165
|
+
step=step,
|
|
166
|
+
url=self.url,
|
|
167
|
+
backoff_factor=backoff_factor,
|
|
168
|
+
iteration_callback=iteration_callback
|
|
169
|
+
)
|