mlrun 1.7.0rc42__py3-none-any.whl → 1.7.0rc43__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.

@@ -72,7 +72,12 @@ class ArtifactProducer:
72
72
  self.inputs = {}
73
73
 
74
74
  def get_meta(self) -> dict:
75
- return {"kind": self.kind, "name": self.name, "tag": self.tag}
75
+ return {
76
+ "kind": self.kind,
77
+ "name": self.name,
78
+ "tag": self.tag,
79
+ "owner": self.owner,
80
+ }
76
81
 
77
82
  @property
78
83
  def uid(self):
@@ -108,6 +108,7 @@ from .feature_store import (
108
108
  FeatureVectorsTagsOutput,
109
109
  )
110
110
  from .frontend_spec import (
111
+ ArtifactLimits,
111
112
  AuthenticationFeatureFlag,
112
113
  FeatureFlags,
113
114
  FrontendSpec,
@@ -50,6 +50,12 @@ class FeatureFlags(pydantic.BaseModel):
50
50
  preemption_nodes: PreemptionNodesFeatureFlag
51
51
 
52
52
 
53
+ class ArtifactLimits(pydantic.BaseModel):
54
+ max_chunk_size: int
55
+ max_preview_size: int
56
+ max_download_size: int
57
+
58
+
53
59
  class FrontendSpec(pydantic.BaseModel):
54
60
  jobs_dashboard_url: typing.Optional[str]
55
61
  model_monitoring_dashboard_url: typing.Optional[str]
@@ -71,3 +77,4 @@ class FrontendSpec(pydantic.BaseModel):
71
77
  allowed_artifact_path_prefixes_list: list[str]
72
78
  ce: typing.Optional[dict]
73
79
  internal_labels: list[str] = []
80
+ artifact_limits: ArtifactLimits
@@ -22,11 +22,38 @@ import mlrun.common.types
22
22
 
23
23
 
24
24
  class NotificationKind(mlrun.common.types.StrEnum):
25
- console = "console"
26
- git = "git"
27
- ipython = "ipython"
28
- slack = "slack"
29
- webhook = "webhook"
25
+ """Currently, the supported notification kinds and their params are as follows:"""
26
+
27
+ console: str = "console"
28
+ """no params, local only"""
29
+
30
+ git: str = "git"
31
+ """
32
+ **token** - The git token to use for the git notification.\n
33
+ **repo** - The git repo to which to send the notification.\n
34
+ **issue** - The git issue to which to send the notification.\n
35
+ **merge_request** -
36
+ In GitLab (as opposed to GitHub), merge requests and issues are separate entities.
37
+ If using merge request, the issue will be ignored, and vice versa.\n
38
+ **server** - The git server to which to send the notification.\n
39
+ **gitlab** - (bool) Whether the git server is GitLab or not.\n
40
+ """
41
+
42
+ ipython: str = "ipython"
43
+ """no params, local only"""
44
+
45
+ slack: str = "slack"
46
+ """**webhook** - The slack webhook to which to send the notification."""
47
+
48
+ webhook: str = "webhook"
49
+ """
50
+ **url** - The webhook url to which to send the notification.\n
51
+ **method** - The http method to use when sending the notification (GET, POST, PUT, etc…).\n
52
+ **headers** - (dict) The http headers to send with the notification.\n
53
+ **override_body** - (dict) The body to send with the notification.\n
54
+ **verify_ssl** -
55
+ (bool) Whether SSL certificates are validated during HTTP requests or not, The default is set to True.
56
+ """
30
57
 
31
58
 
32
59
  class NotificationSeverity(mlrun.common.types.StrEnum):
mlrun/config.py CHANGED
@@ -27,6 +27,7 @@ import copy
27
27
  import json
28
28
  import os
29
29
  import typing
30
+ import warnings
30
31
  from collections.abc import Mapping
31
32
  from datetime import timedelta
32
33
  from distutils.util import strtobool
@@ -35,6 +36,7 @@ from threading import Lock
35
36
 
36
37
  import dotenv
37
38
  import semver
39
+ import urllib3.exceptions
38
40
  import yaml
39
41
 
40
42
  import mlrun.common.constants
@@ -152,6 +154,11 @@ default_config = {
152
154
  "datasets": {
153
155
  "max_preview_columns": 100,
154
156
  },
157
+ "limits": {
158
+ "max_chunk_size": 1024 * 1024 * 1, # 1MB
159
+ "max_preview_size": 1024 * 1024 * 10, # 10MB
160
+ "max_download_size": 1024 * 1024 * 100, # 100MB
161
+ },
155
162
  },
156
163
  # FIXME: Adding these defaults here so we won't need to patch the "installing component" (provazio-controller) to
157
164
  # configure this values on field systems, for newer system this will be configured correctly
@@ -326,7 +333,7 @@ default_config = {
326
333
  "http": {
327
334
  # when True, the client will verify the server's TLS
328
335
  # set to False for backwards compatibility.
329
- "verify": False,
336
+ "verify": True,
330
337
  },
331
338
  "db": {
332
339
  "commit_retry_timeout": 30,
@@ -1292,6 +1299,7 @@ def _do_populate(env=None, skip_errors=False):
1292
1299
  if data:
1293
1300
  config.update(data, skip_errors=skip_errors)
1294
1301
 
1302
+ _configure_ssl_verification(config.httpdb.http.verify)
1295
1303
  _validate_config(config)
1296
1304
 
1297
1305
 
@@ -1351,6 +1359,16 @@ def _convert_str(value, typ):
1351
1359
  return typ(value)
1352
1360
 
1353
1361
 
1362
+ def _configure_ssl_verification(verify_ssl: bool) -> None:
1363
+ """Configure SSL verification warnings based on the setting."""
1364
+ if not verify_ssl:
1365
+ urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
1366
+ else:
1367
+ # If the user changes the `verify` setting to `True` at runtime using `mlrun.set_env_from_file` after
1368
+ # importing `mlrun`, we need to reload the `mlrun` configuration and enable this warning.
1369
+ warnings.simplefilter("default", urllib3.exceptions.InsecureRequestWarning)
1370
+
1371
+
1354
1372
  def read_env(env=None, prefix=env_prefix):
1355
1373
  """Read configuration from environment"""
1356
1374
  env = os.environ if env is None else env
mlrun/datastore/base.py CHANGED
@@ -24,7 +24,6 @@ import pandas as pd
24
24
  import pyarrow
25
25
  import pytz
26
26
  import requests
27
- import urllib3
28
27
  from deprecated import deprecated
29
28
 
30
29
  import mlrun.config
@@ -745,8 +744,6 @@ class HttpStore(DataStore):
745
744
 
746
745
  verify_ssl = mlconf.httpdb.http.verify
747
746
  try:
748
- if not verify_ssl:
749
- urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
750
747
  response = requests.get(url, headers=headers, auth=auth, verify=verify_ssl)
751
748
  except OSError as exc:
752
749
  raise OSError(f"error: cannot connect to {url}: {err_to_str(exc)}")
@@ -137,7 +137,8 @@ class RedisNoSqlStoreyTarget(storey.NoSqlTarget):
137
137
  def __init__(self, *args, **kwargs):
138
138
  path = kwargs.pop("path")
139
139
  endpoint, uri = mlrun.datastore.targets.RedisNoSqlTarget.get_server_endpoint(
140
- path
140
+ path,
141
+ kwargs.pop("credentials_prefix", None),
141
142
  )
142
143
  kwargs["path"] = endpoint + "/" + uri
143
144
  super().__init__(*args, **kwargs)
@@ -439,6 +439,12 @@ class BaseStoreTarget(DataTargetBase):
439
439
  self.storage_options = storage_options
440
440
  self.schema = schema or {}
441
441
  self.credentials_prefix = credentials_prefix
442
+ if credentials_prefix:
443
+ warnings.warn(
444
+ "The 'credentials_prefix' parameter is deprecated and will be removed in "
445
+ "1.9.0. Please use datastore profiles instead.",
446
+ FutureWarning,
447
+ )
442
448
 
443
449
  self._target = None
444
450
  self._resource = None
@@ -1479,7 +1485,7 @@ class RedisNoSqlTarget(NoSqlBaseTarget):
1479
1485
  writer_step_name = "RedisNoSqlTarget"
1480
1486
 
1481
1487
  @staticmethod
1482
- def get_server_endpoint(path):
1488
+ def get_server_endpoint(path, credentials_prefix=None):
1483
1489
  endpoint, uri = parse_path(path)
1484
1490
  endpoint = endpoint or mlrun.mlconf.redis.url
1485
1491
  if endpoint.startswith("ds://"):
@@ -1497,7 +1503,9 @@ class RedisNoSqlTarget(NoSqlBaseTarget):
1497
1503
  raise mlrun.errors.MLRunInvalidArgumentError(
1498
1504
  "Provide Redis username and password only via secrets"
1499
1505
  )
1500
- credentials_prefix = mlrun.get_secret_or_env(key="CREDENTIALS_PREFIX")
1506
+ credentials_prefix = credentials_prefix or mlrun.get_secret_or_env(
1507
+ key="CREDENTIALS_PREFIX"
1508
+ )
1501
1509
  user = mlrun.get_secret_or_env(
1502
1510
  "REDIS_USER", default="", prefix=credentials_prefix
1503
1511
  )
@@ -1517,7 +1525,9 @@ class RedisNoSqlTarget(NoSqlBaseTarget):
1517
1525
  from storey import Table
1518
1526
  from storey.redis_driver import RedisDriver
1519
1527
 
1520
- endpoint, uri = self.get_server_endpoint(self.get_target_path())
1528
+ endpoint, uri = self.get_server_endpoint(
1529
+ self.get_target_path(), self.credentials_prefix
1530
+ )
1521
1531
 
1522
1532
  return Table(
1523
1533
  uri,
@@ -1526,7 +1536,9 @@ class RedisNoSqlTarget(NoSqlBaseTarget):
1526
1536
  )
1527
1537
 
1528
1538
  def get_spark_options(self, key_column=None, timestamp_key=None, overwrite=True):
1529
- endpoint, uri = self.get_server_endpoint(self.get_target_path())
1539
+ endpoint, uri = self.get_server_endpoint(
1540
+ self.get_target_path(), self.credentials_prefix
1541
+ )
1530
1542
  parsed_endpoint = urlparse(endpoint)
1531
1543
  store, path_in_store, path = self._get_store_and_path()
1532
1544
  return {
@@ -1577,6 +1589,7 @@ class RedisNoSqlTarget(NoSqlBaseTarget):
1577
1589
  class_name="mlrun.datastore.storeytargets.RedisNoSqlStoreyTarget",
1578
1590
  columns=column_list,
1579
1591
  table=table,
1592
+ credentials_prefix=self.credentials_prefix,
1580
1593
  **self.attributes,
1581
1594
  )
1582
1595
 
mlrun/execution.py CHANGED
@@ -12,6 +12,7 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ import logging
15
16
  import os
16
17
  import uuid
17
18
  from copy import deepcopy
@@ -168,6 +169,8 @@ class MLClientCtx:
168
169
  @log_level.setter
169
170
  def log_level(self, value: str):
170
171
  """Set the logging level, e.g. 'debug', 'info', 'error'"""
172
+ level = logging.getLevelName(value.upper())
173
+ self._logger.set_logger_level(level)
171
174
  self._log_level = value
172
175
 
173
176
  @property
@@ -335,7 +338,7 @@ class MLClientCtx:
335
338
  "name": self.name,
336
339
  "kind": "run",
337
340
  "uri": uri,
338
- "owner": get_in(self._labels, "owner"),
341
+ "owner": get_in(self._labels, mlrun_constants.MLRunInternalLabels.owner),
339
342
  }
340
343
  if mlrun_constants.MLRunInternalLabels.workflow in self._labels:
341
344
  resp[mlrun_constants.MLRunInternalLabels.workflow] = self._labels[
mlrun/k8s_utils.py CHANGED
@@ -12,6 +12,7 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
  import re
15
+ import warnings
15
16
 
16
17
  import kubernetes.client
17
18
 
@@ -133,7 +134,7 @@ def sanitize_label_value(value: str) -> str:
133
134
  return re.sub(r"([^a-zA-Z0-9_.-]|^[^a-zA-Z0-9]|[^a-zA-Z0-9]$)", "-", value[:63])
134
135
 
135
136
 
136
- def verify_label_key(key: str):
137
+ def verify_label_key(key: str, allow_k8s_prefix: bool = False):
137
138
  """
138
139
  Verify that the label key is valid for Kubernetes.
139
140
  Refer to https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#syntax-and-character-set
@@ -146,6 +147,10 @@ def verify_label_key(key: str):
146
147
  name = parts[0]
147
148
  elif len(parts) == 2:
148
149
  prefix, name = parts
150
+ if len(name) == 0:
151
+ raise mlrun.errors.MLRunInvalidArgumentError(
152
+ "Label key name cannot be empty when a prefix is set"
153
+ )
149
154
  if len(prefix) == 0:
150
155
  raise mlrun.errors.MLRunInvalidArgumentError(
151
156
  "Label key prefix cannot be empty"
@@ -173,7 +178,13 @@ def verify_label_key(key: str):
173
178
  mlrun.utils.regex.qualified_name,
174
179
  )
175
180
 
176
- if key.startswith("k8s.io/") or key.startswith("kubernetes.io/"):
181
+ # Allow the use of Kubernetes reserved prefixes ('k8s.io/' or 'kubernetes.io/')
182
+ # only when setting node selectors, not when adding new labels.
183
+ if (
184
+ key.startswith("k8s.io/")
185
+ or key.startswith("kubernetes.io/")
186
+ and not allow_k8s_prefix
187
+ ):
177
188
  raise mlrun.errors.MLRunInvalidArgumentError(
178
189
  "Labels cannot start with 'k8s.io/' or 'kubernetes.io/'"
179
190
  )
@@ -185,3 +196,38 @@ def verify_label_value(value, label_key):
185
196
  value,
186
197
  mlrun.utils.regex.label_value,
187
198
  )
199
+
200
+
201
+ def validate_node_selectors(
202
+ node_selectors: dict[str, str], raise_on_error: bool = True
203
+ ) -> bool:
204
+ """
205
+ Ensures that user-defined node selectors adhere to Kubernetes label standards:
206
+ - Validates that each key conforms to Kubernetes naming conventions, with specific rules for name and prefix.
207
+ - Ensures values comply with Kubernetes label value rules.
208
+ - If raise_on_error is True, raises errors for invalid selectors.
209
+ - If raise_on_error is False, logs warnings for invalid selectors.
210
+ """
211
+
212
+ # Helper function for handling errors or warnings
213
+ def handle_invalid(message):
214
+ if raise_on_error:
215
+ raise
216
+ else:
217
+ warnings.warn(
218
+ f"{message}\n"
219
+ f"The node selector you’ve set does not meet the validation rules for the current Kubernetes version. "
220
+ f"Please note that invalid node selectors may cause issues with function scheduling."
221
+ )
222
+
223
+ node_selectors = node_selectors or {}
224
+ for key, value in node_selectors.items():
225
+ try:
226
+ verify_label_key(key, allow_k8s_prefix=True)
227
+ verify_label_value(value, label_key=key)
228
+ except mlrun.errors.MLRunInvalidArgumentError as err:
229
+ # An error or warning is raised by handle_invalid due to validation failure.
230
+ # Returning False indicates validation failed, allowing us to exit the function.
231
+ handle_invalid(str(err))
232
+ return False
233
+ return True
mlrun/model.py CHANGED
@@ -681,7 +681,8 @@ class ImageBuilder(ModelObj):
681
681
  class Notification(ModelObj):
682
682
  """Notification object
683
683
 
684
- :param kind: notification implementation kind - slack, webhook, etc.
684
+ :param kind: notification implementation kind - slack, webhook, etc. See
685
+ :py:class:`mlrun.common.schemas.notification.NotificationKind`
685
686
  :param name: for logging and identification
686
687
  :param message: message content in the notification
687
688
  :param severity: severity to display in the notification
@@ -265,13 +265,6 @@ def calculate_inputs_statistics(
265
265
  counts.tolist(),
266
266
  bins.tolist(),
267
267
  ]
268
- elif "hist" in inputs_statistics[feature]:
269
- # Comply with the other common features' histogram length
270
- mlrun.common.model_monitoring.helpers.pad_hist(
271
- mlrun.common.model_monitoring.helpers.Histogram(
272
- inputs_statistics[feature]["hist"]
273
- )
274
- )
275
268
  else:
276
269
  # If the feature is not in the sample set and doesn't have a histogram, remove it from the statistics:
277
270
  inputs_statistics.pop(feature)
@@ -258,9 +258,13 @@ class ModelMonitoringWriter(StepToDict):
258
258
  "data drift app",
259
259
  endpoint_id=endpoint_id,
260
260
  )
261
+ attributes = json.loads(event[ResultData.RESULT_EXTRA_DATA])
262
+ attributes[EventFieldType.DRIFT_STATUS] = str(
263
+ attributes[EventFieldType.DRIFT_STATUS]
264
+ )
261
265
  self._app_result_store.update_model_endpoint(
262
266
  endpoint_id=endpoint_id,
263
- attributes=json.loads(event[ResultData.RESULT_EXTRA_DATA]),
267
+ attributes=attributes,
264
268
  )
265
269
 
266
270
  logger.info("Model monitoring writer finished handling event")
mlrun/projects/project.py CHANGED
@@ -18,6 +18,7 @@ import glob
18
18
  import http
19
19
  import importlib.util as imputil
20
20
  import json
21
+ import os
21
22
  import pathlib
22
23
  import shutil
23
24
  import tempfile
@@ -25,6 +26,7 @@ import typing
25
26
  import uuid
26
27
  import warnings
27
28
  import zipfile
29
+ from copy import deepcopy
28
30
  from os import environ, makedirs, path
29
31
  from typing import Callable, Optional, Union
30
32
 
@@ -251,8 +253,7 @@ def new_project(
251
253
  project.spec.description = description
252
254
 
253
255
  if default_function_node_selector:
254
- for key, val in default_function_node_selector.items():
255
- project.spec.default_function_node_selector[key] = val
256
+ project.spec.default_function_node_selector = default_function_node_selector
256
257
 
257
258
  if parameters:
258
259
  # Enable setting project parameters at load time, can be used to customize the project_setup
@@ -874,7 +875,7 @@ class ProjectSpec(ModelObj):
874
875
  # in a tuple where the first index is the packager module's path (str) and the second is a flag (bool) for
875
876
  # whether it is mandatory for a run (raise exception on collection error) or not.
876
877
  self.custom_packagers = custom_packagers or []
877
- self.default_function_node_selector = default_function_node_selector or {}
878
+ self._default_function_node_selector = default_function_node_selector or None
878
879
 
879
880
  @property
880
881
  def source(self) -> str:
@@ -1049,6 +1050,14 @@ class ProjectSpec(ModelObj):
1049
1050
  if key in self._artifacts:
1050
1051
  del self._artifacts[key]
1051
1052
 
1053
+ @property
1054
+ def default_function_node_selector(self):
1055
+ return self._default_function_node_selector
1056
+
1057
+ @default_function_node_selector.setter
1058
+ def default_function_node_selector(self, node_selector: dict[str, str]):
1059
+ self._default_function_node_selector = deepcopy(node_selector)
1060
+
1052
1061
  @property
1053
1062
  def build(self) -> ImageBuilder:
1054
1063
  return self._build
@@ -2325,31 +2334,51 @@ class MlrunProject(ModelObj):
2325
2334
  requirements: typing.Union[str, list[str]] = None,
2326
2335
  requirements_file: str = "",
2327
2336
  ) -> mlrun.runtimes.BaseRuntime:
2328
- """update or add a function object to the project
2337
+ """
2338
+ | Update or add a function object to the project.
2339
+ | Function can be provided as an object (func) or a .py/.ipynb/.yaml URL.
2329
2340
 
2330
- function can be provided as an object (func) or a .py/.ipynb/.yaml url
2331
- support url prefixes::
2341
+ | Creating a function from a single file is done by specifying ``func`` and disabling ``with_repo``.
2342
+ | Creating a function with project source (specify ``with_repo=True``):
2343
+ | 1. Specify a relative ``func`` path.
2344
+ | 2. Specify a module ``handler`` (e.g. ``handler=package.package.func``) without ``func``.
2345
+ | Creating a function with non project source is done by specifying a module ``handler`` and on the
2346
+ returned function set the source with ``function.with_source_archive(<source>)``.
2332
2347
 
2333
- object (s3://, v3io://, ..)
2334
- MLRun DB e.g. db://project/func:ver
2335
- functions hub/market: e.g. hub://auto-trainer:master
2348
+ Support URL prefixes:
2336
2349
 
2337
- examples::
2350
+ | Object (s3://, v3io://, ..)
2351
+ | MLRun DB e.g. db://project/func:ver
2352
+ | Functions hub/market: e.g. hub://auto-trainer:master
2353
+
2354
+ Examples::
2338
2355
 
2339
2356
  proj.set_function(func_object)
2340
- proj.set_function(
2341
- "./src/mycode.py", "ingest", image="myrepo/ing:latest", with_repo=True
2342
- )
2343
2357
  proj.set_function("http://.../mynb.ipynb", "train")
2344
2358
  proj.set_function("./func.yaml")
2345
2359
  proj.set_function("hub://get_toy_data", "getdata")
2346
2360
 
2347
- # set function requirements
2361
+ # Create a function from a single file
2362
+ proj.set_function("./src/mycode.py", "ingest")
2348
2363
 
2349
- # by providing a list of packages
2364
+ # Creating a function with project source
2365
+ proj.set_function(
2366
+ "./src/mycode.py", "ingest", image="myrepo/ing:latest", with_repo=True
2367
+ )
2368
+ proj.set_function("ingest", handler="package.package.func", with_repo=True)
2369
+
2370
+ # Creating a function with non project source
2371
+ func = proj.set_function(
2372
+ "ingest", handler="package.package.func", with_repo=False
2373
+ )
2374
+ func.with_source_archive("git://github.com/mlrun/something.git")
2375
+
2376
+ # Set function requirements
2377
+
2378
+ # By providing a list of packages
2350
2379
  proj.set_function("my.py", requirements=["requests", "pandas"])
2351
2380
 
2352
- # by providing a path to a pip requirements file
2381
+ # By providing a path to a pip requirements file
2353
2382
  proj.set_function("my.py", requirements="requirements.txt")
2354
2383
 
2355
2384
  :param func: Function object or spec/code url, None refers to current Notebook
@@ -2369,7 +2398,7 @@ class MlrunProject(ModelObj):
2369
2398
  :param requirements: A list of python packages
2370
2399
  :param requirements_file: Path to a python requirements file
2371
2400
 
2372
- :returns: function object
2401
+ :returns: :py:class:`~mlrun.runtimes.BaseRuntime`
2373
2402
  """
2374
2403
  (
2375
2404
  resolved_function_name,
@@ -2801,47 +2830,92 @@ class MlrunProject(ModelObj):
2801
2830
  secrets=secrets or {},
2802
2831
  )
2803
2832
 
2804
- def sync_functions(self, names: list = None, always=True, save=False):
2805
- """reload function objects from specs and files"""
2833
+ def sync_functions(
2834
+ self,
2835
+ names: list = None,
2836
+ always: bool = True,
2837
+ save: bool = False,
2838
+ silent: bool = False,
2839
+ ):
2840
+ """
2841
+ Reload function objects from specs and files.
2842
+ The function objects are synced against the definitions spec in `self.spec._function_definitions`.
2843
+ Referenced files/URLs in the function spec will be reloaded.
2844
+ Function definitions are parsed by the following precedence:
2845
+ 1. Contains runtime spec.
2846
+ 2. Contains module in the project's context.
2847
+ 3. Contains path to function definition (yaml, DB, Hub).
2848
+ 4. Contains path to .ipynb or .py files.
2849
+ 5. Contains a Nuclio/Serving function image / an 'Application' kind definition.
2850
+ If function definition is already an object, some project metadata updates will apply however,
2851
+ it will not be reloaded.
2852
+
2853
+ :param names: Names of functions to reload, defaults to `self.spec._function_definitions.keys()`.
2854
+ :param always: Force reloading the functions.
2855
+ :param save: Whether to save the loaded functions or not.
2856
+ :param silent: Whether to raise an exception when a function fails to load.
2857
+
2858
+ :returns: Dictionary of function objects
2859
+ """
2806
2860
  if self._initialized and not always:
2807
2861
  return self.spec._function_objects
2808
2862
 
2809
- funcs = self.spec._function_objects
2863
+ functions = self.spec._function_objects
2810
2864
  if not names:
2811
2865
  names = self.spec._function_definitions.keys()
2812
- funcs = {}
2866
+ functions = {}
2867
+
2813
2868
  origin = mlrun.runtimes.utils.add_code_metadata(self.spec.context)
2814
2869
  for name in names:
2815
- f = self.spec._function_definitions.get(name)
2816
- if not f:
2817
- raise ValueError(f"function named {name} not found")
2870
+ function_definition = self.spec._function_definitions.get(name)
2871
+ if not function_definition:
2872
+ if silent:
2873
+ logger.warn(
2874
+ "Function definition was not found, skipping reload", name=name
2875
+ )
2876
+ continue
2877
+
2878
+ raise ValueError(f"Function named {name} not found")
2879
+
2880
+ function_object = self.spec._function_objects.get(name, None)
2881
+ is_base_runtime = isinstance(
2882
+ function_object, mlrun.runtimes.base.BaseRuntime
2883
+ )
2818
2884
  # If this function is already available locally, don't recreate it unless always=True
2819
- if (
2820
- isinstance(
2821
- self.spec._function_objects.get(name, None),
2822
- mlrun.runtimes.base.BaseRuntime,
2823
- )
2824
- and not always
2825
- ):
2826
- funcs[name] = self.spec._function_objects[name]
2885
+ if is_base_runtime and not always:
2886
+ functions[name] = function_object
2827
2887
  continue
2828
- if hasattr(f, "to_dict"):
2829
- name, func = _init_function_from_obj(f, self, name)
2830
- else:
2831
- if not isinstance(f, dict):
2832
- raise ValueError("function must be an object or dict")
2888
+
2889
+ # Reload the function
2890
+ if hasattr(function_definition, "to_dict"):
2891
+ name, func = _init_function_from_obj(function_definition, self, name)
2892
+ elif isinstance(function_definition, dict):
2833
2893
  try:
2834
- name, func = _init_function_from_dict(f, self, name)
2894
+ name, func = _init_function_from_dict(
2895
+ function_definition, self, name
2896
+ )
2835
2897
  except FileNotFoundError as exc:
2836
- raise mlrun.errors.MLRunMissingDependencyError(
2837
- f"File {exc.filename} not found while syncing project functions"
2838
- ) from exc
2898
+ message = f"File {exc.filename} not found while syncing project functions."
2899
+ if silent:
2900
+ message += " Skipping function reload"
2901
+ logger.warn(message, name=name)
2902
+ continue
2903
+
2904
+ raise mlrun.errors.MLRunMissingDependencyError(message) from exc
2905
+ else:
2906
+ message = f"Function {name} must be an object or dict."
2907
+ if silent:
2908
+ message += " Skipping function reload"
2909
+ logger.warn(message, name=name)
2910
+ continue
2911
+ raise ValueError(message)
2912
+
2839
2913
  func.spec.build.code_origin = origin
2840
- funcs[name] = func
2914
+ functions[name] = func
2841
2915
  if save:
2842
2916
  func.save(versioned=False)
2843
2917
 
2844
- self.spec._function_objects = funcs
2918
+ self.spec._function_objects = functions
2845
2919
  self._initialized = True
2846
2920
  return self.spec._function_objects
2847
2921
 
@@ -3041,11 +3115,10 @@ class MlrunProject(ModelObj):
3041
3115
  )
3042
3116
 
3043
3117
  if engine not in ["remote"] and not schedule:
3044
- # For remote/scheduled runs we don't require the functions to be synced as they can be loaded dynamically
3045
- # during run
3046
- self.sync_functions(always=sync)
3118
+ # For remote/scheduled runs there is no need to sync functions as they can be loaded dynamically during run
3119
+ self.sync_functions(always=sync, silent=True)
3047
3120
  if not self.spec._function_objects:
3048
- raise ValueError(
3121
+ logger.warn(
3049
3122
  "There are no functions in the project."
3050
3123
  " Make sure you've set your functions with project.set_function()."
3051
3124
  )
@@ -4289,6 +4362,7 @@ class MlrunProject(ModelObj):
4289
4362
  kind=producer_dict.get("kind", ""),
4290
4363
  project=producer_project,
4291
4364
  tag=producer_tag,
4365
+ owner=producer_dict.get("owner", ""),
4292
4366
  ), True
4293
4367
 
4294
4368
  # do not retain the artifact's producer, replace it with the project as the producer
@@ -4298,6 +4372,7 @@ class MlrunProject(ModelObj):
4298
4372
  name=self.metadata.name,
4299
4373
  project=self.metadata.name,
4300
4374
  tag=project_producer_tag,
4375
+ owner=self._resolve_artifact_owner(),
4301
4376
  ), False
4302
4377
 
4303
4378
  def _resolve_existing_artifact(
@@ -4337,6 +4412,9 @@ class MlrunProject(ModelObj):
4337
4412
  def _get_project_tag(self):
4338
4413
  return self._get_hexsha() or str(uuid.uuid4())
4339
4414
 
4415
+ def _resolve_artifact_owner(self):
4416
+ return os.getenv("V3IO_USERNAME") or self.spec.owner
4417
+
4340
4418
 
4341
4419
  def _set_as_current_default_project(project: MlrunProject):
4342
4420
  mlrun.mlconf.default_project = project.metadata.name
mlrun/runtimes/local.py CHANGED
@@ -145,7 +145,10 @@ class ParallelRunner:
145
145
  if function_name and generator.options.teardown_dask:
146
146
  logger.info("Tearing down the dask cluster..")
147
147
  mlrun.get_run_db().delete_runtime_resources(
148
- kind="dask", object_id=function_name, force=True
148
+ project=self.metadata.project,
149
+ kind=mlrun.runtimes.RuntimeKinds.dask,
150
+ object_id=function_name,
151
+ force=True,
149
152
  )
150
153
 
151
154
  return results
@@ -438,8 +438,9 @@ class ApplicationRuntime(RemoteRuntime):
438
438
  """
439
439
  Create the application API gateway. Once the application is deployed, the API gateway can be created.
440
440
  An application without an API gateway is not accessible.
441
- :param name: The name of the API gateway, defaults to <function-name>-<function-tag>
442
- :param path: Optional path of the API gateway, default value is "/"
441
+ :param name: The name of the API gateway
442
+ :param path: Optional path of the API gateway, default value is "/".
443
+ The given path should be supported by the deployed application
443
444
  :param direct_port_access: Set True to allow direct port access to the application sidecar
444
445
  :param authentication_mode: API Gateway authentication mode
445
446
  :param authentication_creds: API Gateway basic authentication credentials as a tuple (username, password)
mlrun/runtimes/pod.py CHANGED
@@ -38,6 +38,7 @@ from ..k8s_utils import (
38
38
  generate_preemptible_nodes_affinity_terms,
39
39
  generate_preemptible_nodes_anti_affinity_terms,
40
40
  generate_preemptible_tolerations,
41
+ validate_node_selectors,
41
42
  )
42
43
  from ..utils import logger, update_in
43
44
  from .base import BaseRuntime, FunctionSpec, spec_fields
@@ -1175,6 +1176,7 @@ class KubeResource(BaseRuntime, KfpAdapterMixin):
1175
1176
  if node_name:
1176
1177
  self.spec.node_name = node_name
1177
1178
  if node_selector is not None:
1179
+ validate_node_selectors(node_selectors=node_selector, raise_on_error=False)
1178
1180
  self.spec.node_selector = node_selector
1179
1181
  if affinity is not None:
1180
1182
  self.spec.affinity = affinity
@@ -18,6 +18,7 @@ from mlrun_pipelines.mounts import mount_v3io, mount_v3iod
18
18
 
19
19
  import mlrun.common.schemas.function
20
20
  import mlrun.errors
21
+ import mlrun.k8s_utils
21
22
  import mlrun.runtimes.pod
22
23
  from mlrun.config import config
23
24
 
@@ -505,6 +506,7 @@ class Spark3Runtime(KubejobRuntime):
505
506
  raise NotImplementedError(
506
507
  "Setting node name is not supported for spark runtime"
507
508
  )
509
+ mlrun.k8s_utils.validate_node_selectors(node_selector, raise_on_error=False)
508
510
  self.with_driver_node_selection(node_name, node_selector, affinity, tolerations)
509
511
  self.with_executor_node_selection(
510
512
  node_name, node_selector, affinity, tolerations
@@ -537,6 +539,7 @@ class Spark3Runtime(KubejobRuntime):
537
539
  if affinity is not None:
538
540
  self.spec.driver_affinity = affinity
539
541
  if node_selector is not None:
542
+ mlrun.k8s_utils.validate_node_selectors(node_selector, raise_on_error=False)
540
543
  self.spec.driver_node_selector = node_selector
541
544
  if tolerations is not None:
542
545
  self.spec.driver_tolerations = tolerations
@@ -568,6 +571,7 @@ class Spark3Runtime(KubejobRuntime):
568
571
  if affinity is not None:
569
572
  self.spec.executor_affinity = affinity
570
573
  if node_selector is not None:
574
+ mlrun.k8s_utils.validate_node_selectors(node_selector, raise_on_error=False)
571
575
  self.spec.executor_node_selector = node_selector
572
576
  if tolerations is not None:
573
577
  self.spec.executor_tolerations = tolerations
mlrun/utils/async_http.py CHANGED
@@ -237,7 +237,7 @@ class _CustomRequestContext(_RequestContext):
237
237
  retry_wait = self._retry_options.get_timeout(
238
238
  attempt=current_attempt, response=None
239
239
  )
240
- self._logger.debug(
240
+ self._logger.warning(
241
241
  "Request failed on retryable exception, retrying",
242
242
  retry_wait_secs=retry_wait,
243
243
  method=params.method,
mlrun/utils/helpers.py CHANGED
@@ -1007,6 +1007,23 @@ def get_workflow_url(project, id=None):
1007
1007
  return url
1008
1008
 
1009
1009
 
1010
+ def get_kfp_project_filter(project_name: str) -> str:
1011
+ """
1012
+ Generates a filter string for KFP runs, using a substring predicate
1013
+ on the run's 'name' field. This is used as a heuristic to retrieve runs that are associated
1014
+ with a specific project. The 'op: 9' operator indicates that the filter checks if the
1015
+ project name appears as a substring in the run's name, ensuring that we can identify
1016
+ runs belonging to the desired project.
1017
+ """
1018
+ is_substring_op = 9
1019
+ project_name_filter = {
1020
+ "predicates": [
1021
+ {"key": "name", "op": is_substring_op, "string_value": project_name}
1022
+ ]
1023
+ }
1024
+ return json.dumps(project_name_filter)
1025
+
1026
+
1010
1027
  def are_strings_in_exception_chain_messages(
1011
1028
  exception: Exception, strings_list: list[str]
1012
1029
  ) -> bool:
@@ -13,7 +13,6 @@
13
13
  # limitations under the License.
14
14
 
15
15
  import enum
16
- import typing
17
16
 
18
17
  from mlrun.common.schemas.notification import NotificationKind
19
18
 
@@ -1,4 +1,4 @@
1
1
  {
2
- "git_commit": "4029300162894b90ff3b3a732f627cc20dd33257",
3
- "version": "1.7.0-rc42"
2
+ "git_commit": "13896619ed9e935aab2e08c075dc12ae6f3e449f",
3
+ "version": "1.7.0-rc43"
4
4
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mlrun
3
- Version: 1.7.0rc42
3
+ Version: 1.7.0rc43
4
4
  Summary: Tracking and config of machine learning runs
5
5
  Home-page: https://github.com/mlrun/mlrun
6
6
  Author: Yaron Haviv
@@ -41,7 +41,7 @@ Requires-Dist: mergedeep ~=1.3
41
41
  Requires-Dist: v3io-frames ~=0.10.14
42
42
  Requires-Dist: semver ~=3.0
43
43
  Requires-Dist: dependency-injector ~=4.41
44
- Requires-Dist: fsspec <2024.4,>=2023.9.2
44
+ Requires-Dist: fsspec <2024.7,>=2023.9.2
45
45
  Requires-Dist: v3iofs ~=0.1.17
46
46
  Requires-Dist: storey ~=1.7.24
47
47
  Requires-Dist: inflection ~=0.5.0
@@ -67,7 +67,7 @@ Requires-Dist: boto3 <1.29.0,>=1.28.0 ; extra == 'all'
67
67
  Requires-Dist: dask ~=2023.9.0 ; extra == 'all'
68
68
  Requires-Dist: databricks-sdk ~=0.13.0 ; extra == 'all'
69
69
  Requires-Dist: distributed ~=2023.9.0 ; extra == 'all'
70
- Requires-Dist: gcsfs <2024.4,>=2023.9.2 ; extra == 'all'
70
+ Requires-Dist: gcsfs <2024.7,>=2023.9.2 ; extra == 'all'
71
71
  Requires-Dist: google-cloud-bigquery-storage ~=2.17 ; extra == 'all'
72
72
  Requires-Dist: google-cloud-bigquery[bqstorage,pandas] ==3.14.1 ; extra == 'all'
73
73
  Requires-Dist: google-cloud-storage ==2.14.0 ; extra == 'all'
@@ -81,7 +81,7 @@ Requires-Dist: ossfs ==2023.12.0 ; extra == 'all'
81
81
  Requires-Dist: plotly ~=5.23 ; extra == 'all'
82
82
  Requires-Dist: pyopenssl >=23 ; extra == 'all'
83
83
  Requires-Dist: redis ~=4.3 ; extra == 'all'
84
- Requires-Dist: s3fs <2024.4,>=2023.9.2 ; extra == 'all'
84
+ Requires-Dist: s3fs <2024.7,>=2023.9.2 ; extra == 'all'
85
85
  Requires-Dist: snowflake-connector-python ~=3.7 ; extra == 'all'
86
86
  Requires-Dist: sqlalchemy ~=1.4 ; extra == 'all'
87
87
  Requires-Dist: taos-ws-py ~=0.3.2 ; extra == 'all'
@@ -120,7 +120,7 @@ Requires-Dist: boto3 <1.29.0,>=1.28.0 ; extra == 'complete'
120
120
  Requires-Dist: dask ~=2023.9.0 ; extra == 'complete'
121
121
  Requires-Dist: databricks-sdk ~=0.13.0 ; extra == 'complete'
122
122
  Requires-Dist: distributed ~=2023.9.0 ; extra == 'complete'
123
- Requires-Dist: gcsfs <2024.4,>=2023.9.2 ; extra == 'complete'
123
+ Requires-Dist: gcsfs <2024.7,>=2023.9.2 ; extra == 'complete'
124
124
  Requires-Dist: google-cloud-bigquery-storage ~=2.17 ; extra == 'complete'
125
125
  Requires-Dist: google-cloud-bigquery[bqstorage,pandas] ==3.14.1 ; extra == 'complete'
126
126
  Requires-Dist: google-cloud-storage ==2.14.0 ; extra == 'complete'
@@ -134,7 +134,7 @@ Requires-Dist: ossfs ==2023.12.0 ; extra == 'complete'
134
134
  Requires-Dist: plotly ~=5.23 ; extra == 'complete'
135
135
  Requires-Dist: pyopenssl >=23 ; extra == 'complete'
136
136
  Requires-Dist: redis ~=4.3 ; extra == 'complete'
137
- Requires-Dist: s3fs <2024.4,>=2023.9.2 ; extra == 'complete'
137
+ Requires-Dist: s3fs <2024.7,>=2023.9.2 ; extra == 'complete'
138
138
  Requires-Dist: snowflake-connector-python ~=3.7 ; extra == 'complete'
139
139
  Requires-Dist: sqlalchemy ~=1.4 ; extra == 'complete'
140
140
  Requires-Dist: taos-ws-py ~=0.3.2 ; extra == 'complete'
@@ -153,7 +153,7 @@ Requires-Dist: dask ~=2023.9.0 ; extra == 'complete-api'
153
153
  Requires-Dist: databricks-sdk ~=0.13.0 ; extra == 'complete-api'
154
154
  Requires-Dist: distributed ~=2023.9.0 ; extra == 'complete-api'
155
155
  Requires-Dist: fastapi ~=0.110.0 ; extra == 'complete-api'
156
- Requires-Dist: gcsfs <2024.4,>=2023.9.2 ; extra == 'complete-api'
156
+ Requires-Dist: gcsfs <2024.7,>=2023.9.2 ; extra == 'complete-api'
157
157
  Requires-Dist: google-cloud-bigquery-storage ~=2.17 ; extra == 'complete-api'
158
158
  Requires-Dist: google-cloud-bigquery[bqstorage,pandas] ==3.14.1 ; extra == 'complete-api'
159
159
  Requires-Dist: google-cloud-storage ==2.14.0 ; extra == 'complete-api'
@@ -171,7 +171,7 @@ Requires-Dist: plotly ~=5.23 ; extra == 'complete-api'
171
171
  Requires-Dist: pymysql ~=1.0 ; extra == 'complete-api'
172
172
  Requires-Dist: pyopenssl >=23 ; extra == 'complete-api'
173
173
  Requires-Dist: redis ~=4.3 ; extra == 'complete-api'
174
- Requires-Dist: s3fs <2024.4,>=2023.9.2 ; extra == 'complete-api'
174
+ Requires-Dist: s3fs <2024.7,>=2023.9.2 ; extra == 'complete-api'
175
175
  Requires-Dist: snowflake-connector-python ~=3.7 ; extra == 'complete-api'
176
176
  Requires-Dist: sqlalchemy ~=1.4 ; extra == 'complete-api'
177
177
  Requires-Dist: taos-ws-py ~=0.3.2 ; extra == 'complete-api'
@@ -188,7 +188,7 @@ Requires-Dist: google-cloud-storage ==2.14.0 ; extra == 'google-cloud'
188
188
  Requires-Dist: google-cloud-bigquery[bqstorage,pandas] ==3.14.1 ; extra == 'google-cloud'
189
189
  Requires-Dist: google-cloud-bigquery-storage ~=2.17 ; extra == 'google-cloud'
190
190
  Requires-Dist: google-cloud ==0.34 ; extra == 'google-cloud'
191
- Requires-Dist: gcsfs <2024.4,>=2023.9.2 ; extra == 'google-cloud'
191
+ Requires-Dist: gcsfs <2024.7,>=2023.9.2 ; extra == 'google-cloud'
192
192
  Provides-Extra: graphviz
193
193
  Requires-Dist: graphviz ~=0.20.0 ; extra == 'graphviz'
194
194
  Provides-Extra: kafka
@@ -203,7 +203,7 @@ Requires-Dist: redis ~=4.3 ; extra == 'redis'
203
203
  Provides-Extra: s3
204
204
  Requires-Dist: boto3 <1.29.0,>=1.28.0 ; extra == 's3'
205
205
  Requires-Dist: aiobotocore <2.8,>=2.5.0 ; extra == 's3'
206
- Requires-Dist: s3fs <2024.4,>=2023.9.2 ; extra == 's3'
206
+ Requires-Dist: s3fs <2024.7,>=2023.9.2 ; extra == 's3'
207
207
  Provides-Extra: snowflake
208
208
  Requires-Dist: snowflake-connector-python ~=3.7 ; extra == 'snowflake'
209
209
  Provides-Extra: sqlalchemy
@@ -1,12 +1,12 @@
1
1
  mlrun/__init__.py,sha256=y08M1JcKXy5-9_5WaI9fn5aV5BxIQ5QkbduJK0OxWbA,7470
2
2
  mlrun/__main__.py,sha256=iAifncsrQQx6ozXXmz7GH1OiNl8PA7KS3TnwlxnHGeo,45890
3
- mlrun/config.py,sha256=5JqxZh9rbxdBV3yRyRbAzYkDVjwgvMOenaXHAlQZejY,66137
3
+ mlrun/config.py,sha256=Qr6ToS9ryv0ivaKrbC3rnWMwL8ptbqXDFVxJzXRRg5s,66971
4
4
  mlrun/errors.py,sha256=nY23dns_kTzbOrelJf0FyxLw5mglv7jo4Sx3efKS9Fs,7798
5
- mlrun/execution.py,sha256=o64-PAdOnLnT_CAHwyxpj7uJJVn7fh8tR5dpy1OnqBg,42188
5
+ mlrun/execution.py,sha256=5MG-B8KVS_7OqkVw-SCuQqNAeULegwo3y0JW36uSb54,42334
6
6
  mlrun/features.py,sha256=m17K_3l9Jktwb9dOwlHLTAPTlemsWrRF7dJhXUX0iJU,15429
7
- mlrun/k8s_utils.py,sha256=WdUajadvAhTR7sAMQdwFqKeJMimuTyqm02VdwK1A4xU,7023
7
+ mlrun/k8s_utils.py,sha256=mRQMs6NzPq36vx1n5_2BfFapXysc8wv3NcrZ77_2ANA,8949
8
8
  mlrun/lists.py,sha256=3PqBdcajdwhTe1XuFsAaHTuFVM2kjwepf31qqE82apg,8384
9
- mlrun/model.py,sha256=SE4WEGa8f1DrC-GQicErllrGtb6od-p37oripm09UfA,80619
9
+ mlrun/model.py,sha256=WcRg13FSww_4YLpL-WDRnfoBnfiEHXRFTMLEMJIeICk,80694
10
10
  mlrun/render.py,sha256=n8SeY3ogVrsV02-7-H0lt1RmpkxGpbI-11RQx61Vq9E,13267
11
11
  mlrun/run.py,sha256=hNxV-TnixbH8MCos2jqz8jdTDlK7dBSvJMil_QoGKQI,43616
12
12
  mlrun/secrets.py,sha256=ibtCK79u7JVBZF6F0SP1-xXXF5MyrLEUs_TCWiJAnlc,7798
@@ -16,7 +16,7 @@ mlrun/api/schemas/__init__.py,sha256=fEWH4I8hr5AdRJ7yoW44RlFB6NHkYDxyomP5J6ct1z4
16
16
  mlrun/artifacts/__init__.py,sha256=daGrLqltI1nE3ES30nm-tanUnxReRzfyxyaxNRx2zbc,1168
17
17
  mlrun/artifacts/base.py,sha256=EystjLta4XVdZP2x4nz1ZNlDUYKTIcFNfMVfBVseCHw,29168
18
18
  mlrun/artifacts/dataset.py,sha256=O_2g2RFHYEAXIBX86mgyc0wBNOhWLT7NlYvxFeLNTuw,16505
19
- mlrun/artifacts/manager.py,sha256=I_1mgQ0M8j9JgryFJsB2yN3Pv47oQM6Jfg1fotTPDX0,15323
19
+ mlrun/artifacts/manager.py,sha256=sHRPJmE60Zot2CNj8Qg-IjVShJ1H6dcFgsWffczgSgA,15403
20
20
  mlrun/artifacts/model.py,sha256=ObUkqFMejYOtq0CDFdpYwzwhQ5bsHv0dHTysuVPJnbs,21102
21
21
  mlrun/artifacts/plots.py,sha256=dS0mHGt1b20tN2JyEH9H5o5I0oMKZkzn3Uz_3Hf4WjU,4813
22
22
  mlrun/common/__init__.py,sha256=xY3wHC4TEJgez7qtnn1pQvHosi8-5UJOCtyGBS7FcGE,571
@@ -36,7 +36,7 @@ mlrun/common/formatters/run.py,sha256=eEBy1NEwGT9b98TWS2OetEbDnDrnHBIBVMrlXsxveo
36
36
  mlrun/common/model_monitoring/__init__.py,sha256=x0EMEvxVjHsm858J1t6IEA9dtKTdFpJ9sKhss10ld8A,721
37
37
  mlrun/common/model_monitoring/helpers.py,sha256=1CpxIDQPumFnpUB1eqcvCpLlyPFVeW2sL6prM-N5A1A,4405
38
38
  mlrun/common/runtimes/constants.py,sha256=Rl0Sd8n_L7Imo-uF1LL9CJ5Szi0W1gUm36yrF8PXfSc,10989
39
- mlrun/common/schemas/__init__.py,sha256=CUX4F6VeowqX5PzakB7xgGs2lJZAN42RMm1asB-kf1c,5227
39
+ mlrun/common/schemas/__init__.py,sha256=xCRh98GdHfB6Tzb7_lrOhgoO9UnkUfTcsjStLZll8tc,5247
40
40
  mlrun/common/schemas/alert.py,sha256=NIotUCJjtw5aYA3CmxiDo2ch-Ba8r1Sj1WkJfYCtluM,6749
41
41
  mlrun/common/schemas/api_gateway.py,sha256=9ilorgLOiWxFZbv89-dbPNfVdaChlGOIdC4SLTxQwNI,7118
42
42
  mlrun/common/schemas/artifact.py,sha256=V3ngobnzI1v2eoOroWBEedjAZu0ntCSIQ-LzsOK1Z9k,3570
@@ -49,13 +49,13 @@ mlrun/common/schemas/constants.py,sha256=sTNCimttd7ytSZ3jxbftItw_HDGxPwY96Ub86Ov
49
49
  mlrun/common/schemas/datastore_profile.py,sha256=hJ8q54A8VZKsnOvSIjcllj4MZ1bBhb_EmBgsqpwSF_Y,750
50
50
  mlrun/common/schemas/events.py,sha256=ROHJLo_fqYjc96pek7yhAUPpPRIuAR76lwxvNz8LIr8,1026
51
51
  mlrun/common/schemas/feature_store.py,sha256=T0yKYcv6cb3ZwgY5Jh9kWp94zLv2ImxAQUy6x68Imd0,4776
52
- mlrun/common/schemas/frontend_spec.py,sha256=CNPq3YV0U1jCbCMbb84_Oid2Snow5EXYt1F5wsuhgD8,2454
52
+ mlrun/common/schemas/frontend_spec.py,sha256=Xos6Jagj0ayqJXw0OrFIFMhSOkuKZcHE3ijB9l6-Kg0,2611
53
53
  mlrun/common/schemas/function.py,sha256=fZZBZroj6Ok0giRn2pYSzR40bx037v9pIWvSagPA2fE,4820
54
54
  mlrun/common/schemas/http.py,sha256=1PtYFhF6sqLSBRcuPMtYcUGmroBhaleqLmYidSdL9LM,705
55
55
  mlrun/common/schemas/hub.py,sha256=cuv_vpkO27XNCZzfytnUyi0k0ZA4wf_QRn5B0ZPoK-Y,4116
56
56
  mlrun/common/schemas/k8s.py,sha256=nmMnhgjVMLem5jyumoG2eQKioGK9eUVhQnOSb3hG7yw,1395
57
57
  mlrun/common/schemas/memory_reports.py,sha256=tpS3fpvxa6VcBpzCRzcZTt0fCF0h6ReUetYs7j6kdps,892
58
- mlrun/common/schemas/notification.py,sha256=H7HL1qAQ1gvta28ebYLnD-xsSNncGeDcJ92BXa5n80U,3153
58
+ mlrun/common/schemas/notification.py,sha256=BsDjHHH1k8OW2bTi49ww77LIfvjVFde7Btv9vILxcvs,4404
59
59
  mlrun/common/schemas/object.py,sha256=VleJSUmDJMl92knLgaDE8SWCi3ky0UaHcwcwOIapPQ8,1980
60
60
  mlrun/common/schemas/pagination.py,sha256=q7nk6bipkDiE7HExIVqhy5ANl-zv0x8QC9Kg6AkLtDA,887
61
61
  mlrun/common/schemas/pipeline.py,sha256=MhH07_fAQXNAnmf5j6oXZp8qh9cxGcZlReMdt-ZJf40,1429
@@ -79,7 +79,7 @@ mlrun/data_types/to_pandas.py,sha256=-ZbJBg00x4xxyqqqu3AVbEh-HaO2--DrChyPuedRhHA
79
79
  mlrun/datastore/__init__.py,sha256=8WvgHF245fvU9u98ctRqosvEmQ9iAKKIIS_dSgj_fmU,4153
80
80
  mlrun/datastore/alibaba_oss.py,sha256=-RMA4vCE4rar-D57Niy3tY_6bXKHLFpMp28z5YR7-jI,4888
81
81
  mlrun/datastore/azure_blob.py,sha256=9qkgrEMXGiuYYcc6b6HkuHlRHDbl0p7tIzeWxAAcEVs,12724
82
- mlrun/datastore/base.py,sha256=v4Ah80lg26stKhZ8-i60tj72N5Ap_tFJlgGwHOxcph0,26345
82
+ mlrun/datastore/base.py,sha256=4GWgPB7t1wHYxdfc3mdpbL5Lq9W-ahCgy0ckgMUP6DI,26215
83
83
  mlrun/datastore/datastore.py,sha256=F2i8XI2hkQwf51OjqdFZ8179oHvDfQtaT5pvfkvMV9U,9389
84
84
  mlrun/datastore/datastore_profile.py,sha256=ZCU-brdRNXNE8EnknzFljtWjciEJ9sGZnoahFxbdEt4,18940
85
85
  mlrun/datastore/dbfs_store.py,sha256=mylyl-evK3CVe5fx6rwawITxPIc2YVbw5WHGbL24jtM,6516
@@ -94,8 +94,8 @@ mlrun/datastore/sources.py,sha256=op90ksx95wqaBtoiORpHnqEgw4iGEDPsJ3_lI8ftS-E,48
94
94
  mlrun/datastore/spark_udf.py,sha256=NnnB3DZxZb-rqpRy7b-NC7QWXuuqFn3XkBDc86tU4mQ,1498
95
95
  mlrun/datastore/spark_utils.py,sha256=_AsVoU5Ix_-W7Gyq8io8V-2GTk0m8THJNDP3WGGaWJY,2865
96
96
  mlrun/datastore/store_resources.py,sha256=rcLoG506AMmR8qPJU_gE-G5d34VJVV_vNlZ3VHqho6c,6869
97
- mlrun/datastore/storeytargets.py,sha256=W26CoeM5q6GjJbUBH4h-Q3T9Lu7xFNxev2ZZpvEOQQE,4965
98
- mlrun/datastore/targets.py,sha256=SuTMhXLGKgeDf1oRCoG6H6Ej1yMxiQS-CKKk4TznTfI,79964
97
+ mlrun/datastore/storeytargets.py,sha256=a7a_fmp5JiSOO-f0fB9hx0aeaGsLGs4SvlRQ4sA564g,5018
98
+ mlrun/datastore/targets.py,sha256=TkG2HG4h7SaQ3qG2sKAHAuJJyj_gnE-eChaIsyjlq1o,80450
99
99
  mlrun/datastore/utils.py,sha256=l9dLZb_VCbHs_htqMFRv4qiestZ8z8K-4eY1MxHS8wE,7720
100
100
  mlrun/datastore/v3io.py,sha256=HxP6mygiYM6leDAbQ9KdTxObLCt9yGMro0YhfdU6KUo,8157
101
101
  mlrun/datastore/wasbfs/__init__.py,sha256=s5Ul-0kAhYqFjKDR2X0O2vDGDbLQQduElb32Ev56Te4,1343
@@ -216,11 +216,11 @@ mlrun/model_monitoring/application.py,sha256=RJ8HeAPfGO3P2A_dEZYNg60c1wKTADh2YSv
216
216
  mlrun/model_monitoring/controller.py,sha256=HFyVNNikoxEd3X5aL3y88rLktH_gZtbCOqPs7qdUsCg,27969
217
217
  mlrun/model_monitoring/evidently_application.py,sha256=iOc42IVjj8m6PDBmVcKIMWm46Bu0EdO9SDcH40Eqhyo,769
218
218
  mlrun/model_monitoring/features_drift_table.py,sha256=c6GpKtpOJbuT1u5uMWDL_S-6N4YPOmlktWMqPme3KFY,25308
219
- mlrun/model_monitoring/helpers.py,sha256=GBir6pkaA3i6OTcOD-SOUIbRR-tCk6wPajKPMXqcMF4,13122
219
+ mlrun/model_monitoring/helpers.py,sha256=GY36xkOSL6opdjBLMvkN3xx24DX7H1JI83C3eSNykKU,12789
220
220
  mlrun/model_monitoring/model_endpoint.py,sha256=7VX0cBATqLsA4sSinDzouf41ndxqh2mf5bO9BW0G5Z4,4017
221
221
  mlrun/model_monitoring/stream_processing.py,sha256=0eu1Gq1Obq87LFno6eIZ55poXoFaeloqYTLiQgyfd0k,38687
222
222
  mlrun/model_monitoring/tracking_policy.py,sha256=sQq956akAQpntkrJwIgFWcEq-JpyVcg0FxgNa4h3V70,5502
223
- mlrun/model_monitoring/writer.py,sha256=FsSmzF9fjb2mk-pmByOB1SZJ_NMBjCw4tGGXhkF3OJU,9954
223
+ mlrun/model_monitoring/writer.py,sha256=cLhxAwVfCWEx16vhhXCwxf1do9SbHjDtVUSOtJuX9Rg,10119
224
224
  mlrun/model_monitoring/applications/__init__.py,sha256=i793GqYee01mRh_KD6GShvX7UbPBgdJDO4qf9Z3BXEQ,970
225
225
  mlrun/model_monitoring/applications/_application_steps.py,sha256=fvZbtat7eXe5mo927_jyhq4BqWCapKZn7OVjptepIAI,7055
226
226
  mlrun/model_monitoring/applications/base.py,sha256=snr3xYdqv6Po19yS0Z1VktyoLrbl88lljSFQyjnKjR0,11616
@@ -274,7 +274,7 @@ mlrun/platforms/iguazio.py,sha256=1h5BpdAEQJBg2vIt7ySjUADU0ip5OkaMYr0_VREi9ys,13
274
274
  mlrun/projects/__init__.py,sha256=Lv5rfxyXJrw6WGOWJKhBz66M6t3_zsNMCfUD6waPwx4,1153
275
275
  mlrun/projects/operations.py,sha256=UEpiW4bDscth4pwWcLWF1xz-IU7bnZfckPR7sXp3O-g,19441
276
276
  mlrun/projects/pipelines.py,sha256=iFa0iy4iYk3yUH4Nx-sq7VVJhXW8LlR3Hsbjx_KLL5Y,40019
277
- mlrun/projects/project.py,sha256=prN4TlZnuQlsEy4z6FxCtcSSwWZH3T5ASFu-79lPkKo,185527
277
+ mlrun/projects/project.py,sha256=qJXhB78CtIAxyT6SNZByWhL6Q2-nn4_HLLK2hYSJ6bw,189067
278
278
  mlrun/runtimes/__init__.py,sha256=egLM94cDMUyQ1GVABdFGXUQcDhU70lP3k7qSnM_UnHY,9008
279
279
  mlrun/runtimes/base.py,sha256=JXWmTIcm3b0klGUOHDlyFNa3bUgsNzQIgWhUQpSZoE0,37692
280
280
  mlrun/runtimes/daskjob.py,sha256=JfK8rSPY-0SYnLJdtp_ts3oKyad0pA98th-2VntYzK0,19387
@@ -282,8 +282,8 @@ mlrun/runtimes/funcdoc.py,sha256=zRFHrJsV8rhDLJwoUhcfZ7Cs0j-tQ76DxwUqdXV_Wyc,981
282
282
  mlrun/runtimes/function_reference.py,sha256=iWKRe4r2GTc5S8FOIASYUNLwwne8NqIui51PFr8Q4mg,4918
283
283
  mlrun/runtimes/generators.py,sha256=v28HdNgxdHvj888G1dTnUeQZz-D9iTO0hoGeZbCdiuQ,7241
284
284
  mlrun/runtimes/kubejob.py,sha256=ptBnMTIjukbEznkdixmbGvBqzujXrRzqNfP7ze6M76M,8660
285
- mlrun/runtimes/local.py,sha256=h_w0tzCfF1_tZZEjw-FJHqYmoxK-AhN2skpK7cdU1JI,22611
286
- mlrun/runtimes/pod.py,sha256=GtLrxQE28MWlbnOJPiT3oYqBy-wzDHCCmbhm5zms6pQ,63208
285
+ mlrun/runtimes/local.py,sha256=yedo3R1c46cB1mX7aOz8zORXswQPvX86U-_fYxXoqTY,22717
286
+ mlrun/runtimes/pod.py,sha256=yNgfluaS5ZcyPGGdFhn9js9E8NXtpuVFzci9uBWZ_3Y,63325
287
287
  mlrun/runtimes/remotesparkjob.py,sha256=3ggRVNod67TRnsM2-Ilr9Sw5OWqkRwHWaiBkGvmWU2c,7357
288
288
  mlrun/runtimes/utils.py,sha256=9RnfpZxZEuE2bFVLSaUxBxi2IWsnKoaWF-eljP2FpbA,15637
289
289
  mlrun/runtimes/databricks_job/__init__.py,sha256=kXGBqhLN0rlAx0kTXhozGzFsIdSqW0uTSKMmsLgq_is,569
@@ -299,10 +299,10 @@ mlrun/runtimes/nuclio/function.py,sha256=tK7INPTtYFOJRCzKLUELd0mE_U9w-wt5nCA0Hae
299
299
  mlrun/runtimes/nuclio/nuclio.py,sha256=sLK8KdGO1LbftlL3HqPZlFOFTAAuxJACZCVl1c0Ha6E,2942
300
300
  mlrun/runtimes/nuclio/serving.py,sha256=X0fYJnidH0S5xrupoTC74OhZz7Tym34iw6hFSzahMCk,29720
301
301
  mlrun/runtimes/nuclio/application/__init__.py,sha256=rRs5vasy_G9IyoTpYIjYDafGoL6ifFBKgBtsXn31Atw,614
302
- mlrun/runtimes/nuclio/application/application.py,sha256=TbS3l8dZcIp4JouO0_g4tBbyw7oDpUql_cTLhBsBOWc,28975
302
+ mlrun/runtimes/nuclio/application/application.py,sha256=PVuzcuC7pWG4KJmC1Gi2E5oVANRZgaBGCcpiTamzhUg,29007
303
303
  mlrun/runtimes/nuclio/application/reverse_proxy.go,sha256=JIIYae6bXzCLf3jXuu49KWPQYoXr_FDQ2Rbo1OWKAd0,3150
304
304
  mlrun/runtimes/sparkjob/__init__.py,sha256=_KPvk0qefeLtHO6lxQE_AMOGiMTG_OT48eRCE4Z2ldw,709
305
- mlrun/runtimes/sparkjob/spark3job.py,sha256=LjQgNpszpUUEN6qDT13N5AbbzadzV96plU_6hPjyRw4,41041
305
+ mlrun/runtimes/sparkjob/spark3job.py,sha256=RuwO9Pk1IFaUCFz8zoYLaK3pYT7w07uAjoucYDVtwL8,41327
306
306
  mlrun/serving/__init__.py,sha256=-SMRV3q_5cGVPDxRslXPU0zGYZIygs0cSj7WKlOJJUc,1163
307
307
  mlrun/serving/merger.py,sha256=PXLn3A21FiLteJHaDSLm5xKNT-80eTTjfHUJnBX1gKY,6116
308
308
  mlrun/serving/remote.py,sha256=MrFByphQWmIsKXqw-MOwl2Q1hbtWReYVRKvlcKj9pfw,17980
@@ -319,12 +319,12 @@ mlrun/track/tracker_manager.py,sha256=IYBl99I62IC6VCCmG1yt6JoHNOQXa53C4DURJ2sWgi
319
319
  mlrun/track/trackers/__init__.py,sha256=9xft8YjJnblwqt8f05htmOt_eDzVBVQN07RfY_SYLCs,569
320
320
  mlrun/track/trackers/mlflow_tracker.py,sha256=O3ROZh6NZ92Ghga8c2FGaYmWLdgTs33GchNJVa8ypkY,23469
321
321
  mlrun/utils/__init__.py,sha256=g2pbT3loDw0GWELOC_rBq1NojSMCFnWrD-TYcDgAZiI,826
322
- mlrun/utils/async_http.py,sha256=CZY8hNBMQaWrT6PLplyocCFbzaKrJnknFUP0e6kcDBw,11724
322
+ mlrun/utils/async_http.py,sha256=EitI8ndS3kKkB1oAfZ5RvlGMtE4ktzyEuCJd5K9QvSs,11726
323
323
  mlrun/utils/azure_vault.py,sha256=IEFizrDGDbAaoWwDr1WoA88S_EZ0T--vjYtY-i0cvYQ,3450
324
324
  mlrun/utils/clones.py,sha256=mJpx4nyFiY6jlBCvFABsNuyi_mr1mvfPWn81vlafpOU,7361
325
325
  mlrun/utils/condition_evaluator.py,sha256=-nGfRmZzivn01rHTroiGY4rqEv8T1irMyhzxEei-sKc,1897
326
326
  mlrun/utils/db.py,sha256=blQgkWMfFH9lcN4sgJQcPQgEETz2Dl_zwbVA0SslpFg,2186
327
- mlrun/utils/helpers.py,sha256=WUD4fd2B18CAoCx-8CebHVwJOPzzL1i0HoOdGrMBvnQ,58984
327
+ mlrun/utils/helpers.py,sha256=6Ds8trOm4AEZtD2gUO4rwzAYeS394LIlcPTNqqmuWT0,59662
328
328
  mlrun/utils/http.py,sha256=t6FrXQstZm9xVVjxqIGiLzrwZNCR4CSienSOuVgNIcI,8706
329
329
  mlrun/utils/logger.py,sha256=cag2J30-jynIHmHZ2J8RYmVMNhYBGgAoimc5sbk-A1U,10016
330
330
  mlrun/utils/regex.py,sha256=b0AUa2THS-ELzJj0grl5b8Stq609F2XomTZkD9SB1fQ,4900
@@ -334,7 +334,7 @@ mlrun/utils/v3io_clients.py,sha256=0aCFiQFBmgdSeLzJr_nEP6SG-zyieSgH8RdtcUq4dc0,1
334
334
  mlrun/utils/vault.py,sha256=xUiKL17dCXjwQJ33YRzQj0oadUXATlFWPzKKYAESoQk,10447
335
335
  mlrun/utils/notifications/__init__.py,sha256=eUzQDBxSQmMZASRY-YAnYS6tL5801P0wEjycp3Dvoe0,990
336
336
  mlrun/utils/notifications/notification_pusher.py,sha256=4ecV6JfCtvYpb0kl1-sdg4Cw6XTrAjmmh2olhUenesY,26752
337
- mlrun/utils/notifications/notification/__init__.py,sha256=2in3F2q8gtYDiDoQ4i9BIIE2I06OokT2EW49vs2krRA,2168
337
+ mlrun/utils/notifications/notification/__init__.py,sha256=o1OgBKFSQoD6g8Lh20Cw-_CLa-FPVaL33Kv6YwKiLGA,2154
338
338
  mlrun/utils/notifications/notification/base.py,sha256=hf3BDZ4-bq92MsqofQHt8DZqqlcKbWHscZFvzHdMcw4,4265
339
339
  mlrun/utils/notifications/notification/console.py,sha256=MAVk7v5PJ52vdGRv76YcEPixWgV0licBPWGpR01uR40,2643
340
340
  mlrun/utils/notifications/notification/git.py,sha256=g_8RksjCboGrKKjyhkePk5nSWrfdT61JkhMeg9EeGcY,6119
@@ -342,11 +342,11 @@ mlrun/utils/notifications/notification/ipython.py,sha256=ZtVL30B_Ha0VGoo4LxO-voT
342
342
  mlrun/utils/notifications/notification/slack.py,sha256=wqpFGr5BTvFO5KuUSzFfxsgmyU1Ohq7fbrGeNe9TXOk,7006
343
343
  mlrun/utils/notifications/notification/webhook.py,sha256=cb9w1Mc8ENfJBdgan7iiVHK9eVls4-R3tUxmXM-P-8I,4746
344
344
  mlrun/utils/version/__init__.py,sha256=7kkrB7hEZ3cLXoWj1kPoDwo4MaswsI2JVOBpbKgPAgc,614
345
- mlrun/utils/version/version.json,sha256=mqkEUfdwFUqf_3Ele0tr9V8oeJRjKdz3MtgI3-7hidU,89
345
+ mlrun/utils/version/version.json,sha256=n_L3px_MlIp2dW2njEFmMLcqoSQpwpmC7RlrOEtxtCg,89
346
346
  mlrun/utils/version/version.py,sha256=eEW0tqIAkU9Xifxv8Z9_qsYnNhn3YH7NRAfM-pPLt1g,1878
347
- mlrun-1.7.0rc42.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
348
- mlrun-1.7.0rc42.dist-info/METADATA,sha256=MBWiwfqpQkEbVJrHrfM0teH0Syf5gRPf9ufgSyrYoXo,19939
349
- mlrun-1.7.0rc42.dist-info/WHEEL,sha256=cVxcB9AmuTcXqmwrtPhNK88dr7IR_b6qagTj0UvIEbY,91
350
- mlrun-1.7.0rc42.dist-info/entry_points.txt,sha256=1Owd16eAclD5pfRCoJpYC2ZJSyGNTtUr0nCELMioMmU,46
351
- mlrun-1.7.0rc42.dist-info/top_level.txt,sha256=NObLzw3maSF9wVrgSeYBv-fgnHkAJ1kEkh12DLdd5KM,6
352
- mlrun-1.7.0rc42.dist-info/RECORD,,
347
+ mlrun-1.7.0rc43.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
348
+ mlrun-1.7.0rc43.dist-info/METADATA,sha256=LNIpVyKhu5PFy26lN3HB0fZ_SZzt_i2mnw1ETL7Bvfo,19939
349
+ mlrun-1.7.0rc43.dist-info/WHEEL,sha256=cVxcB9AmuTcXqmwrtPhNK88dr7IR_b6qagTj0UvIEbY,91
350
+ mlrun-1.7.0rc43.dist-info/entry_points.txt,sha256=1Owd16eAclD5pfRCoJpYC2ZJSyGNTtUr0nCELMioMmU,46
351
+ mlrun-1.7.0rc43.dist-info/top_level.txt,sha256=NObLzw3maSF9wVrgSeYBv-fgnHkAJ1kEkh12DLdd5KM,6
352
+ mlrun-1.7.0rc43.dist-info/RECORD,,