mlrun 1.7.2rc3__py3-none-any.whl → 1.8.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of mlrun might be problematic. Click here for more details.
- mlrun/__init__.py +26 -22
- mlrun/__main__.py +15 -16
- mlrun/alerts/alert.py +150 -15
- mlrun/api/schemas/__init__.py +1 -9
- mlrun/artifacts/__init__.py +2 -3
- mlrun/artifacts/base.py +62 -19
- mlrun/artifacts/dataset.py +17 -17
- mlrun/artifacts/document.py +454 -0
- mlrun/artifacts/manager.py +28 -18
- mlrun/artifacts/model.py +91 -59
- mlrun/artifacts/plots.py +2 -2
- mlrun/common/constants.py +8 -0
- mlrun/common/formatters/__init__.py +1 -0
- mlrun/common/formatters/artifact.py +1 -1
- mlrun/common/formatters/feature_set.py +2 -0
- mlrun/common/formatters/function.py +1 -0
- mlrun/{model_monitoring/db/stores/v3io_kv/__init__.py → common/formatters/model_endpoint.py} +17 -0
- mlrun/common/formatters/pipeline.py +1 -2
- mlrun/common/formatters/project.py +9 -0
- mlrun/common/model_monitoring/__init__.py +0 -5
- mlrun/common/model_monitoring/helpers.py +12 -62
- mlrun/common/runtimes/constants.py +25 -4
- mlrun/common/schemas/__init__.py +9 -5
- mlrun/common/schemas/alert.py +114 -19
- mlrun/common/schemas/api_gateway.py +3 -3
- mlrun/common/schemas/artifact.py +22 -9
- mlrun/common/schemas/auth.py +8 -4
- mlrun/common/schemas/background_task.py +7 -7
- mlrun/common/schemas/client_spec.py +4 -4
- mlrun/common/schemas/clusterization_spec.py +2 -2
- mlrun/common/schemas/common.py +53 -3
- mlrun/common/schemas/constants.py +15 -0
- mlrun/common/schemas/datastore_profile.py +1 -1
- mlrun/common/schemas/feature_store.py +9 -9
- mlrun/common/schemas/frontend_spec.py +4 -4
- mlrun/common/schemas/function.py +10 -10
- mlrun/common/schemas/hub.py +1 -1
- mlrun/common/schemas/k8s.py +3 -3
- mlrun/common/schemas/memory_reports.py +3 -3
- mlrun/common/schemas/model_monitoring/__init__.py +4 -8
- mlrun/common/schemas/model_monitoring/constants.py +127 -46
- mlrun/common/schemas/model_monitoring/grafana.py +18 -12
- mlrun/common/schemas/model_monitoring/model_endpoints.py +154 -160
- mlrun/common/schemas/notification.py +24 -3
- mlrun/common/schemas/object.py +1 -1
- mlrun/common/schemas/pagination.py +4 -4
- mlrun/common/schemas/partition.py +142 -0
- mlrun/common/schemas/pipeline.py +3 -3
- mlrun/common/schemas/project.py +26 -18
- mlrun/common/schemas/runs.py +3 -3
- mlrun/common/schemas/runtime_resource.py +5 -5
- mlrun/common/schemas/schedule.py +1 -1
- mlrun/common/schemas/secret.py +1 -1
- mlrun/{model_monitoring/db/stores/sqldb/__init__.py → common/schemas/serving.py} +10 -1
- mlrun/common/schemas/tag.py +3 -3
- mlrun/common/schemas/workflow.py +6 -5
- mlrun/common/types.py +1 -0
- mlrun/config.py +157 -89
- mlrun/data_types/__init__.py +5 -3
- mlrun/data_types/infer.py +13 -3
- mlrun/data_types/spark.py +2 -1
- mlrun/datastore/__init__.py +59 -18
- mlrun/datastore/alibaba_oss.py +4 -1
- mlrun/datastore/azure_blob.py +4 -1
- mlrun/datastore/base.py +19 -24
- mlrun/datastore/datastore.py +10 -4
- mlrun/datastore/datastore_profile.py +178 -45
- mlrun/datastore/dbfs_store.py +4 -1
- mlrun/datastore/filestore.py +4 -1
- mlrun/datastore/google_cloud_storage.py +4 -1
- mlrun/datastore/hdfs.py +4 -1
- mlrun/datastore/inmem.py +4 -1
- mlrun/datastore/redis.py +4 -1
- mlrun/datastore/s3.py +14 -3
- mlrun/datastore/sources.py +89 -92
- mlrun/datastore/store_resources.py +7 -4
- mlrun/datastore/storeytargets.py +51 -16
- mlrun/datastore/targets.py +38 -31
- mlrun/datastore/utils.py +87 -4
- mlrun/datastore/v3io.py +4 -1
- mlrun/datastore/vectorstore.py +291 -0
- mlrun/datastore/wasbfs/fs.py +13 -12
- mlrun/db/base.py +286 -100
- mlrun/db/httpdb.py +1562 -490
- mlrun/db/nopdb.py +250 -83
- mlrun/errors.py +6 -2
- mlrun/execution.py +194 -50
- mlrun/feature_store/__init__.py +2 -10
- mlrun/feature_store/api.py +20 -458
- mlrun/feature_store/common.py +9 -9
- mlrun/feature_store/feature_set.py +20 -18
- mlrun/feature_store/feature_vector.py +105 -479
- mlrun/feature_store/feature_vector_utils.py +466 -0
- mlrun/feature_store/retrieval/base.py +15 -11
- mlrun/feature_store/retrieval/job.py +2 -1
- mlrun/feature_store/retrieval/storey_merger.py +1 -1
- mlrun/feature_store/steps.py +3 -3
- mlrun/features.py +30 -13
- mlrun/frameworks/__init__.py +1 -2
- mlrun/frameworks/_common/__init__.py +1 -2
- mlrun/frameworks/_common/artifacts_library.py +2 -2
- mlrun/frameworks/_common/mlrun_interface.py +10 -6
- mlrun/frameworks/_common/model_handler.py +31 -31
- mlrun/frameworks/_common/producer.py +3 -1
- mlrun/frameworks/_dl_common/__init__.py +1 -2
- mlrun/frameworks/_dl_common/loggers/__init__.py +1 -2
- mlrun/frameworks/_dl_common/loggers/mlrun_logger.py +4 -4
- mlrun/frameworks/_dl_common/loggers/tensorboard_logger.py +3 -3
- mlrun/frameworks/_ml_common/__init__.py +1 -2
- mlrun/frameworks/_ml_common/loggers/__init__.py +1 -2
- mlrun/frameworks/_ml_common/model_handler.py +21 -21
- mlrun/frameworks/_ml_common/plans/__init__.py +1 -2
- mlrun/frameworks/_ml_common/plans/confusion_matrix_plan.py +3 -1
- mlrun/frameworks/_ml_common/plans/dataset_plan.py +3 -3
- mlrun/frameworks/_ml_common/plans/roc_curve_plan.py +4 -4
- mlrun/frameworks/auto_mlrun/__init__.py +1 -2
- mlrun/frameworks/auto_mlrun/auto_mlrun.py +22 -15
- mlrun/frameworks/huggingface/__init__.py +1 -2
- mlrun/frameworks/huggingface/model_server.py +9 -9
- mlrun/frameworks/lgbm/__init__.py +47 -44
- mlrun/frameworks/lgbm/callbacks/__init__.py +1 -2
- mlrun/frameworks/lgbm/callbacks/logging_callback.py +4 -2
- mlrun/frameworks/lgbm/callbacks/mlrun_logging_callback.py +4 -2
- mlrun/frameworks/lgbm/mlrun_interfaces/__init__.py +1 -2
- mlrun/frameworks/lgbm/mlrun_interfaces/mlrun_interface.py +5 -5
- mlrun/frameworks/lgbm/model_handler.py +15 -11
- mlrun/frameworks/lgbm/model_server.py +11 -7
- mlrun/frameworks/lgbm/utils.py +2 -2
- mlrun/frameworks/onnx/__init__.py +1 -2
- mlrun/frameworks/onnx/dataset.py +3 -3
- mlrun/frameworks/onnx/mlrun_interface.py +2 -2
- mlrun/frameworks/onnx/model_handler.py +7 -5
- mlrun/frameworks/onnx/model_server.py +8 -6
- mlrun/frameworks/parallel_coordinates.py +11 -11
- mlrun/frameworks/pytorch/__init__.py +22 -23
- mlrun/frameworks/pytorch/callbacks/__init__.py +1 -2
- mlrun/frameworks/pytorch/callbacks/callback.py +2 -1
- mlrun/frameworks/pytorch/callbacks/logging_callback.py +15 -8
- mlrun/frameworks/pytorch/callbacks/mlrun_logging_callback.py +19 -12
- mlrun/frameworks/pytorch/callbacks/tensorboard_logging_callback.py +22 -15
- mlrun/frameworks/pytorch/callbacks_handler.py +36 -30
- mlrun/frameworks/pytorch/mlrun_interface.py +17 -17
- mlrun/frameworks/pytorch/model_handler.py +21 -17
- mlrun/frameworks/pytorch/model_server.py +13 -9
- mlrun/frameworks/sklearn/__init__.py +19 -18
- mlrun/frameworks/sklearn/estimator.py +2 -2
- mlrun/frameworks/sklearn/metric.py +3 -3
- mlrun/frameworks/sklearn/metrics_library.py +8 -6
- mlrun/frameworks/sklearn/mlrun_interface.py +3 -2
- mlrun/frameworks/sklearn/model_handler.py +4 -3
- mlrun/frameworks/tf_keras/__init__.py +11 -12
- mlrun/frameworks/tf_keras/callbacks/__init__.py +1 -2
- mlrun/frameworks/tf_keras/callbacks/logging_callback.py +17 -14
- mlrun/frameworks/tf_keras/callbacks/mlrun_logging_callback.py +15 -12
- mlrun/frameworks/tf_keras/callbacks/tensorboard_logging_callback.py +21 -18
- mlrun/frameworks/tf_keras/model_handler.py +17 -13
- mlrun/frameworks/tf_keras/model_server.py +12 -8
- mlrun/frameworks/xgboost/__init__.py +19 -18
- mlrun/frameworks/xgboost/model_handler.py +13 -9
- mlrun/k8s_utils.py +2 -5
- mlrun/launcher/base.py +3 -4
- mlrun/launcher/client.py +2 -2
- mlrun/launcher/local.py +6 -2
- mlrun/launcher/remote.py +1 -1
- mlrun/lists.py +8 -4
- mlrun/model.py +132 -46
- mlrun/model_monitoring/__init__.py +3 -5
- mlrun/model_monitoring/api.py +113 -98
- mlrun/model_monitoring/applications/__init__.py +0 -5
- mlrun/model_monitoring/applications/_application_steps.py +81 -50
- mlrun/model_monitoring/applications/base.py +467 -14
- mlrun/model_monitoring/applications/context.py +212 -134
- mlrun/model_monitoring/{db/stores/base → applications/evidently}/__init__.py +6 -2
- mlrun/model_monitoring/applications/evidently/base.py +146 -0
- mlrun/model_monitoring/applications/histogram_data_drift.py +89 -56
- mlrun/model_monitoring/applications/results.py +67 -15
- mlrun/model_monitoring/controller.py +701 -315
- mlrun/model_monitoring/db/__init__.py +0 -2
- mlrun/model_monitoring/db/_schedules.py +242 -0
- mlrun/model_monitoring/db/_stats.py +189 -0
- mlrun/model_monitoring/db/tsdb/__init__.py +33 -22
- mlrun/model_monitoring/db/tsdb/base.py +243 -49
- mlrun/model_monitoring/db/tsdb/tdengine/schemas.py +76 -36
- mlrun/model_monitoring/db/tsdb/tdengine/stream_graph_steps.py +33 -0
- mlrun/model_monitoring/db/tsdb/tdengine/tdengine_connection.py +213 -0
- mlrun/model_monitoring/db/tsdb/tdengine/tdengine_connector.py +534 -88
- mlrun/model_monitoring/db/tsdb/v3io/stream_graph_steps.py +1 -0
- mlrun/model_monitoring/db/tsdb/v3io/v3io_connector.py +436 -106
- mlrun/model_monitoring/helpers.py +356 -114
- mlrun/model_monitoring/stream_processing.py +190 -345
- mlrun/model_monitoring/tracking_policy.py +11 -4
- mlrun/model_monitoring/writer.py +49 -90
- mlrun/package/__init__.py +3 -6
- mlrun/package/context_handler.py +2 -2
- mlrun/package/packager.py +12 -9
- mlrun/package/packagers/__init__.py +0 -2
- mlrun/package/packagers/default_packager.py +14 -11
- mlrun/package/packagers/numpy_packagers.py +16 -7
- mlrun/package/packagers/pandas_packagers.py +18 -18
- mlrun/package/packagers/python_standard_library_packagers.py +25 -11
- mlrun/package/packagers_manager.py +35 -32
- mlrun/package/utils/__init__.py +0 -3
- mlrun/package/utils/_pickler.py +6 -6
- mlrun/platforms/__init__.py +47 -16
- mlrun/platforms/iguazio.py +4 -1
- mlrun/projects/operations.py +30 -30
- mlrun/projects/pipelines.py +116 -47
- mlrun/projects/project.py +1292 -329
- mlrun/render.py +5 -9
- mlrun/run.py +57 -14
- mlrun/runtimes/__init__.py +1 -3
- mlrun/runtimes/base.py +30 -22
- mlrun/runtimes/daskjob.py +9 -9
- mlrun/runtimes/databricks_job/databricks_runtime.py +6 -5
- mlrun/runtimes/function_reference.py +5 -2
- mlrun/runtimes/generators.py +3 -2
- mlrun/runtimes/kubejob.py +6 -7
- mlrun/runtimes/mounts.py +574 -0
- mlrun/runtimes/mpijob/__init__.py +0 -2
- mlrun/runtimes/mpijob/abstract.py +7 -6
- mlrun/runtimes/nuclio/api_gateway.py +7 -7
- mlrun/runtimes/nuclio/application/application.py +11 -13
- mlrun/runtimes/nuclio/application/reverse_proxy.go +66 -64
- mlrun/runtimes/nuclio/function.py +127 -70
- mlrun/runtimes/nuclio/serving.py +105 -37
- mlrun/runtimes/pod.py +159 -54
- mlrun/runtimes/remotesparkjob.py +3 -2
- mlrun/runtimes/sparkjob/__init__.py +0 -2
- mlrun/runtimes/sparkjob/spark3job.py +22 -12
- mlrun/runtimes/utils.py +7 -6
- mlrun/secrets.py +2 -2
- mlrun/serving/__init__.py +8 -0
- mlrun/serving/merger.py +7 -5
- mlrun/serving/remote.py +35 -22
- mlrun/serving/routers.py +186 -240
- mlrun/serving/server.py +41 -10
- mlrun/serving/states.py +432 -118
- mlrun/serving/utils.py +13 -2
- mlrun/serving/v1_serving.py +3 -2
- mlrun/serving/v2_serving.py +161 -203
- mlrun/track/__init__.py +1 -1
- mlrun/track/tracker.py +2 -2
- mlrun/track/trackers/mlflow_tracker.py +6 -5
- mlrun/utils/async_http.py +35 -22
- mlrun/utils/clones.py +7 -4
- mlrun/utils/helpers.py +511 -58
- mlrun/utils/logger.py +119 -13
- mlrun/utils/notifications/notification/__init__.py +22 -19
- mlrun/utils/notifications/notification/base.py +39 -15
- mlrun/utils/notifications/notification/console.py +6 -6
- mlrun/utils/notifications/notification/git.py +11 -11
- mlrun/utils/notifications/notification/ipython.py +10 -9
- mlrun/utils/notifications/notification/mail.py +176 -0
- mlrun/utils/notifications/notification/slack.py +16 -8
- mlrun/utils/notifications/notification/webhook.py +24 -8
- mlrun/utils/notifications/notification_pusher.py +191 -200
- mlrun/utils/regex.py +12 -2
- mlrun/utils/version/version.json +2 -2
- {mlrun-1.7.2rc3.dist-info → mlrun-1.8.0.dist-info}/METADATA +81 -54
- mlrun-1.8.0.dist-info/RECORD +351 -0
- {mlrun-1.7.2rc3.dist-info → mlrun-1.8.0.dist-info}/WHEEL +1 -1
- mlrun/model_monitoring/applications/evidently_base.py +0 -137
- mlrun/model_monitoring/db/stores/__init__.py +0 -136
- mlrun/model_monitoring/db/stores/base/store.py +0 -213
- mlrun/model_monitoring/db/stores/sqldb/models/__init__.py +0 -71
- mlrun/model_monitoring/db/stores/sqldb/models/base.py +0 -190
- mlrun/model_monitoring/db/stores/sqldb/models/mysql.py +0 -103
- mlrun/model_monitoring/db/stores/sqldb/models/sqlite.py +0 -40
- mlrun/model_monitoring/db/stores/sqldb/sql_store.py +0 -659
- mlrun/model_monitoring/db/stores/v3io_kv/kv_store.py +0 -726
- mlrun/model_monitoring/model_endpoint.py +0 -118
- mlrun-1.7.2rc3.dist-info/RECORD +0 -351
- {mlrun-1.7.2rc3.dist-info → mlrun-1.8.0.dist-info}/entry_points.txt +0 -0
- {mlrun-1.7.2rc3.dist-info → mlrun-1.8.0.dist-info/licenses}/LICENSE +0 -0
- {mlrun-1.7.2rc3.dist-info → mlrun-1.8.0.dist-info}/top_level.txt +0 -0
mlrun/utils/async_http.py
CHANGED
|
@@ -24,9 +24,15 @@ from aiohttp_retry import ExponentialRetry, RequestParams, RetryClient, RetryOpt
|
|
|
24
24
|
from aiohttp_retry.client import _RequestContext
|
|
25
25
|
|
|
26
26
|
from mlrun.config import config
|
|
27
|
-
from mlrun.errors import err_to_str
|
|
27
|
+
from mlrun.errors import err_to_str
|
|
28
|
+
from mlrun.errors import raise_for_status as ml_raise_for_status
|
|
29
|
+
from mlrun.utils.helpers import logger as mlrun_logger
|
|
28
30
|
|
|
29
|
-
|
|
31
|
+
DEFAULT_BLACKLISTED_METHODS = [
|
|
32
|
+
"POST",
|
|
33
|
+
"PUT",
|
|
34
|
+
"PATCH",
|
|
35
|
+
]
|
|
30
36
|
|
|
31
37
|
|
|
32
38
|
class AsyncClientWithRetry(RetryClient):
|
|
@@ -42,20 +48,10 @@ class AsyncClientWithRetry(RetryClient):
|
|
|
42
48
|
retry_on_exception: bool = True,
|
|
43
49
|
raise_for_status: bool = True,
|
|
44
50
|
blacklisted_methods: typing.Optional[list[str]] = None,
|
|
45
|
-
logger: logging.Logger = None,
|
|
51
|
+
logger: Optional[logging.Logger] = None,
|
|
46
52
|
*args,
|
|
47
53
|
**kwargs,
|
|
48
54
|
):
|
|
49
|
-
# do not retry on PUT / PATCH as they might have side effects (not truly idempotent)
|
|
50
|
-
blacklisted_methods = (
|
|
51
|
-
blacklisted_methods
|
|
52
|
-
if blacklisted_methods is not None
|
|
53
|
-
else [
|
|
54
|
-
"POST",
|
|
55
|
-
"PUT",
|
|
56
|
-
"PATCH",
|
|
57
|
-
]
|
|
58
|
-
)
|
|
59
55
|
super().__init__(
|
|
60
56
|
*args,
|
|
61
57
|
retry_options=ExponentialRetryOverride(
|
|
@@ -72,9 +68,13 @@ class AsyncClientWithRetry(RetryClient):
|
|
|
72
68
|
**kwargs,
|
|
73
69
|
)
|
|
74
70
|
|
|
71
|
+
@property
|
|
72
|
+
def retry_options(self) -> "ExponentialRetryOverride":
|
|
73
|
+
return typing.cast(ExponentialRetryOverride, self._retry_options)
|
|
74
|
+
|
|
75
75
|
def methods_blacklist_update_required(self, new_blacklist: str):
|
|
76
76
|
self._retry_options: ExponentialRetryOverride
|
|
77
|
-
return set(self.
|
|
77
|
+
return set(self.retry_options.blacklisted_methods).difference(
|
|
78
78
|
set(new_blacklist)
|
|
79
79
|
)
|
|
80
80
|
|
|
@@ -110,12 +110,13 @@ class ExponentialRetryOverride(ExponentialRetry):
|
|
|
110
110
|
# aiohttp exceptions that can be raised during connection establishment
|
|
111
111
|
aiohttp.ClientConnectionError,
|
|
112
112
|
aiohttp.ServerDisconnectedError,
|
|
113
|
+
asyncio.exceptions.TimeoutError,
|
|
113
114
|
]
|
|
114
115
|
|
|
115
116
|
def __init__(
|
|
116
117
|
self,
|
|
117
|
-
retry_on_exception: bool,
|
|
118
|
-
blacklisted_methods: list[str],
|
|
118
|
+
retry_on_exception: typing.Optional[bool] = True,
|
|
119
|
+
blacklisted_methods: typing.Optional[list[str]] = None,
|
|
119
120
|
*args,
|
|
120
121
|
**kwargs,
|
|
121
122
|
):
|
|
@@ -123,7 +124,12 @@ class ExponentialRetryOverride(ExponentialRetry):
|
|
|
123
124
|
self.retry_on_exception = retry_on_exception
|
|
124
125
|
|
|
125
126
|
# methods that should not be retried
|
|
126
|
-
|
|
127
|
+
# do not retry on PUT / PATCH as they might have side effects (not truly idempotent)
|
|
128
|
+
self.blacklisted_methods = (
|
|
129
|
+
blacklisted_methods
|
|
130
|
+
if blacklisted_methods is not None
|
|
131
|
+
else DEFAULT_BLACKLISTED_METHODS
|
|
132
|
+
)
|
|
127
133
|
|
|
128
134
|
# default exceptions that should be retried on (when retry_on_exception is True)
|
|
129
135
|
if "exceptions" not in kwargs:
|
|
@@ -136,6 +142,10 @@ class _CustomRequestContext(_RequestContext):
|
|
|
136
142
|
Extends by adding retry logic on both error statuses and certain exceptions.
|
|
137
143
|
"""
|
|
138
144
|
|
|
145
|
+
@property
|
|
146
|
+
def retry_options(self) -> ExponentialRetryOverride:
|
|
147
|
+
return typing.cast(ExponentialRetryOverride, self._retry_options)
|
|
148
|
+
|
|
139
149
|
async def _do_request(self) -> aiohttp.ClientResponse:
|
|
140
150
|
current_attempt = 0
|
|
141
151
|
while True:
|
|
@@ -186,9 +196,9 @@ class _CustomRequestContext(_RequestContext):
|
|
|
186
196
|
return response
|
|
187
197
|
|
|
188
198
|
last_attempt = current_attempt == self._retry_options.attempts
|
|
189
|
-
if self.
|
|
199
|
+
if not self._is_status_retryable(response.status) or last_attempt:
|
|
190
200
|
if self._raise_for_status:
|
|
191
|
-
|
|
201
|
+
ml_raise_for_status(response)
|
|
192
202
|
|
|
193
203
|
self._response = response
|
|
194
204
|
return response
|
|
@@ -204,7 +214,7 @@ class _CustomRequestContext(_RequestContext):
|
|
|
204
214
|
)
|
|
205
215
|
|
|
206
216
|
except Exception as exc:
|
|
207
|
-
if not self.
|
|
217
|
+
if not self.retry_options.retry_on_exception:
|
|
208
218
|
self._logger.warning(
|
|
209
219
|
"Request failed, retry on exception is disabled",
|
|
210
220
|
method=params.method,
|
|
@@ -250,7 +260,10 @@ class _CustomRequestContext(_RequestContext):
|
|
|
250
260
|
await asyncio.sleep(retry_wait)
|
|
251
261
|
|
|
252
262
|
def _is_method_retryable(self, method: str):
|
|
253
|
-
return method not in self.
|
|
263
|
+
return method not in self.retry_options.blacklisted_methods
|
|
264
|
+
|
|
265
|
+
def _is_status_retryable(self, status: int):
|
|
266
|
+
return status in self._retry_options.statuses
|
|
254
267
|
|
|
255
268
|
async def _check_response_callback(
|
|
256
269
|
self,
|
|
@@ -290,7 +303,7 @@ class _CustomRequestContext(_RequestContext):
|
|
|
290
303
|
if isinstance(exc.os_error, exc_type):
|
|
291
304
|
return
|
|
292
305
|
if exc.__cause__:
|
|
293
|
-
# If the cause exception is
|
|
306
|
+
# If the cause exception is retryable, return, otherwise, raise the original exception
|
|
294
307
|
try:
|
|
295
308
|
self.verify_exception_type(exc.__cause__)
|
|
296
309
|
except Exception:
|
mlrun/utils/clones.py
CHANGED
|
@@ -122,7 +122,7 @@ def add_credentials_git_remote_url(url: str, secrets=None) -> tuple[str, bool]:
|
|
|
122
122
|
username, password = get_git_username_password_from_token(token)
|
|
123
123
|
|
|
124
124
|
if username:
|
|
125
|
-
return f"https://{username}:{password}@{url_obj.
|
|
125
|
+
return f"https://{username}:{password}@{url_obj.netloc}{url_obj.path}", True
|
|
126
126
|
return url, False
|
|
127
127
|
|
|
128
128
|
|
|
@@ -165,14 +165,17 @@ def clone_git(url: str, context: str, secrets=None, clone: bool = True):
|
|
|
165
165
|
|
|
166
166
|
branch = None
|
|
167
167
|
tag = None
|
|
168
|
+
commit = None
|
|
168
169
|
if url_obj.fragment:
|
|
169
170
|
refs = url_obj.fragment
|
|
170
171
|
if refs.startswith("refs/heads/"):
|
|
171
172
|
branch = refs.replace("refs/heads/", "")
|
|
172
173
|
elif refs.startswith("refs/tags/"):
|
|
173
174
|
tag = refs.replace("refs/tags/", "")
|
|
175
|
+
elif refs.startswith("refs/commits/"):
|
|
176
|
+
commit = refs.replace("refs/commits/", "")
|
|
174
177
|
else:
|
|
175
|
-
url = url.replace("#"
|
|
178
|
+
url = url.replace(f"#{refs}", f"#refs/heads/{refs}")
|
|
176
179
|
branch = refs
|
|
177
180
|
|
|
178
181
|
# when using the CLI and clone path was not enriched, username/password input will be requested via shell
|
|
@@ -182,8 +185,8 @@ def clone_git(url: str, context: str, secrets=None, clone: bool = True):
|
|
|
182
185
|
# override enriched clone path for security reasons
|
|
183
186
|
repo.remotes[0].set_url(clone_path, final_clone_path)
|
|
184
187
|
|
|
185
|
-
if tag:
|
|
186
|
-
repo.git.checkout(
|
|
188
|
+
if tag_or_commit := tag or commit:
|
|
189
|
+
repo.git.checkout(tag_or_commit)
|
|
187
190
|
|
|
188
191
|
return url, repo
|
|
189
192
|
|