mlrun 1.7.2rc3__py3-none-any.whl → 1.8.0rc2__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.

Files changed (250) hide show
  1. mlrun/__init__.py +18 -18
  2. mlrun/__main__.py +3 -3
  3. mlrun/alerts/alert.py +19 -12
  4. mlrun/artifacts/__init__.py +0 -2
  5. mlrun/artifacts/base.py +34 -11
  6. mlrun/artifacts/dataset.py +16 -16
  7. mlrun/artifacts/manager.py +13 -13
  8. mlrun/artifacts/model.py +66 -53
  9. mlrun/common/constants.py +6 -0
  10. mlrun/common/formatters/__init__.py +1 -0
  11. mlrun/common/formatters/feature_set.py +1 -0
  12. mlrun/common/formatters/function.py +1 -0
  13. mlrun/common/formatters/model_endpoint.py +30 -0
  14. mlrun/common/formatters/pipeline.py +1 -2
  15. mlrun/common/formatters/project.py +9 -0
  16. mlrun/common/model_monitoring/__init__.py +0 -3
  17. mlrun/common/model_monitoring/helpers.py +1 -1
  18. mlrun/common/runtimes/constants.py +1 -2
  19. mlrun/common/schemas/__init__.py +7 -2
  20. mlrun/common/schemas/alert.py +31 -18
  21. mlrun/common/schemas/api_gateway.py +3 -3
  22. mlrun/common/schemas/artifact.py +7 -13
  23. mlrun/common/schemas/auth.py +6 -4
  24. mlrun/common/schemas/background_task.py +7 -7
  25. mlrun/common/schemas/client_spec.py +2 -2
  26. mlrun/common/schemas/clusterization_spec.py +2 -2
  27. mlrun/common/schemas/common.py +53 -3
  28. mlrun/common/schemas/datastore_profile.py +1 -1
  29. mlrun/common/schemas/feature_store.py +9 -9
  30. mlrun/common/schemas/frontend_spec.py +4 -4
  31. mlrun/common/schemas/function.py +10 -10
  32. mlrun/common/schemas/hub.py +1 -1
  33. mlrun/common/schemas/k8s.py +3 -3
  34. mlrun/common/schemas/memory_reports.py +3 -3
  35. mlrun/common/schemas/model_monitoring/__init__.py +8 -1
  36. mlrun/common/schemas/model_monitoring/constants.py +62 -12
  37. mlrun/common/schemas/model_monitoring/grafana.py +1 -1
  38. mlrun/common/schemas/model_monitoring/model_endpoint_v2.py +149 -0
  39. mlrun/common/schemas/model_monitoring/model_endpoints.py +22 -6
  40. mlrun/common/schemas/notification.py +18 -3
  41. mlrun/common/schemas/object.py +1 -1
  42. mlrun/common/schemas/pagination.py +4 -4
  43. mlrun/common/schemas/partition.py +137 -0
  44. mlrun/common/schemas/pipeline.py +2 -2
  45. mlrun/common/schemas/project.py +22 -17
  46. mlrun/common/schemas/runs.py +2 -2
  47. mlrun/common/schemas/runtime_resource.py +5 -5
  48. mlrun/common/schemas/schedule.py +1 -1
  49. mlrun/common/schemas/secret.py +1 -1
  50. mlrun/common/schemas/tag.py +3 -3
  51. mlrun/common/schemas/workflow.py +5 -5
  52. mlrun/config.py +65 -15
  53. mlrun/data_types/__init__.py +0 -2
  54. mlrun/data_types/data_types.py +0 -1
  55. mlrun/data_types/infer.py +3 -1
  56. mlrun/data_types/spark.py +4 -4
  57. mlrun/data_types/to_pandas.py +2 -11
  58. mlrun/datastore/__init__.py +0 -2
  59. mlrun/datastore/alibaba_oss.py +4 -1
  60. mlrun/datastore/azure_blob.py +4 -1
  61. mlrun/datastore/base.py +12 -4
  62. mlrun/datastore/datastore.py +9 -3
  63. mlrun/datastore/datastore_profile.py +20 -20
  64. mlrun/datastore/dbfs_store.py +4 -1
  65. mlrun/datastore/filestore.py +4 -1
  66. mlrun/datastore/google_cloud_storage.py +4 -1
  67. mlrun/datastore/hdfs.py +4 -1
  68. mlrun/datastore/inmem.py +4 -1
  69. mlrun/datastore/redis.py +4 -1
  70. mlrun/datastore/s3.py +4 -1
  71. mlrun/datastore/sources.py +51 -49
  72. mlrun/datastore/store_resources.py +0 -2
  73. mlrun/datastore/targets.py +22 -23
  74. mlrun/datastore/utils.py +2 -2
  75. mlrun/datastore/v3io.py +4 -1
  76. mlrun/datastore/wasbfs/fs.py +13 -12
  77. mlrun/db/base.py +170 -64
  78. mlrun/db/factory.py +3 -0
  79. mlrun/db/httpdb.py +986 -238
  80. mlrun/db/nopdb.py +155 -57
  81. mlrun/errors.py +2 -2
  82. mlrun/execution.py +55 -29
  83. mlrun/feature_store/__init__.py +0 -2
  84. mlrun/feature_store/api.py +40 -40
  85. mlrun/feature_store/common.py +9 -9
  86. mlrun/feature_store/feature_set.py +20 -18
  87. mlrun/feature_store/feature_vector.py +27 -24
  88. mlrun/feature_store/retrieval/base.py +14 -9
  89. mlrun/feature_store/retrieval/job.py +2 -1
  90. mlrun/feature_store/steps.py +2 -2
  91. mlrun/features.py +30 -13
  92. mlrun/frameworks/__init__.py +1 -2
  93. mlrun/frameworks/_common/__init__.py +1 -2
  94. mlrun/frameworks/_common/artifacts_library.py +2 -2
  95. mlrun/frameworks/_common/mlrun_interface.py +10 -6
  96. mlrun/frameworks/_common/model_handler.py +29 -27
  97. mlrun/frameworks/_common/producer.py +3 -1
  98. mlrun/frameworks/_dl_common/__init__.py +1 -2
  99. mlrun/frameworks/_dl_common/loggers/__init__.py +1 -2
  100. mlrun/frameworks/_dl_common/loggers/mlrun_logger.py +4 -4
  101. mlrun/frameworks/_dl_common/loggers/tensorboard_logger.py +3 -3
  102. mlrun/frameworks/_ml_common/__init__.py +1 -2
  103. mlrun/frameworks/_ml_common/loggers/__init__.py +1 -2
  104. mlrun/frameworks/_ml_common/model_handler.py +21 -21
  105. mlrun/frameworks/_ml_common/plans/__init__.py +1 -2
  106. mlrun/frameworks/_ml_common/plans/confusion_matrix_plan.py +3 -1
  107. mlrun/frameworks/_ml_common/plans/dataset_plan.py +3 -3
  108. mlrun/frameworks/_ml_common/plans/roc_curve_plan.py +4 -4
  109. mlrun/frameworks/auto_mlrun/__init__.py +1 -2
  110. mlrun/frameworks/auto_mlrun/auto_mlrun.py +22 -15
  111. mlrun/frameworks/huggingface/__init__.py +1 -2
  112. mlrun/frameworks/huggingface/model_server.py +9 -9
  113. mlrun/frameworks/lgbm/__init__.py +47 -44
  114. mlrun/frameworks/lgbm/callbacks/__init__.py +1 -2
  115. mlrun/frameworks/lgbm/callbacks/logging_callback.py +4 -2
  116. mlrun/frameworks/lgbm/callbacks/mlrun_logging_callback.py +4 -2
  117. mlrun/frameworks/lgbm/mlrun_interfaces/__init__.py +1 -2
  118. mlrun/frameworks/lgbm/mlrun_interfaces/mlrun_interface.py +5 -5
  119. mlrun/frameworks/lgbm/model_handler.py +15 -11
  120. mlrun/frameworks/lgbm/model_server.py +11 -7
  121. mlrun/frameworks/lgbm/utils.py +2 -2
  122. mlrun/frameworks/onnx/__init__.py +1 -2
  123. mlrun/frameworks/onnx/dataset.py +3 -3
  124. mlrun/frameworks/onnx/mlrun_interface.py +2 -2
  125. mlrun/frameworks/onnx/model_handler.py +7 -5
  126. mlrun/frameworks/onnx/model_server.py +8 -6
  127. mlrun/frameworks/parallel_coordinates.py +11 -11
  128. mlrun/frameworks/pytorch/__init__.py +22 -23
  129. mlrun/frameworks/pytorch/callbacks/__init__.py +1 -2
  130. mlrun/frameworks/pytorch/callbacks/callback.py +2 -1
  131. mlrun/frameworks/pytorch/callbacks/logging_callback.py +15 -8
  132. mlrun/frameworks/pytorch/callbacks/mlrun_logging_callback.py +19 -12
  133. mlrun/frameworks/pytorch/callbacks/tensorboard_logging_callback.py +22 -15
  134. mlrun/frameworks/pytorch/callbacks_handler.py +36 -30
  135. mlrun/frameworks/pytorch/mlrun_interface.py +17 -17
  136. mlrun/frameworks/pytorch/model_handler.py +21 -17
  137. mlrun/frameworks/pytorch/model_server.py +13 -9
  138. mlrun/frameworks/sklearn/__init__.py +19 -18
  139. mlrun/frameworks/sklearn/estimator.py +2 -2
  140. mlrun/frameworks/sklearn/metric.py +3 -3
  141. mlrun/frameworks/sklearn/metrics_library.py +8 -6
  142. mlrun/frameworks/sklearn/mlrun_interface.py +3 -2
  143. mlrun/frameworks/sklearn/model_handler.py +4 -3
  144. mlrun/frameworks/tf_keras/__init__.py +11 -12
  145. mlrun/frameworks/tf_keras/callbacks/__init__.py +1 -2
  146. mlrun/frameworks/tf_keras/callbacks/logging_callback.py +17 -14
  147. mlrun/frameworks/tf_keras/callbacks/mlrun_logging_callback.py +15 -12
  148. mlrun/frameworks/tf_keras/callbacks/tensorboard_logging_callback.py +21 -18
  149. mlrun/frameworks/tf_keras/model_handler.py +17 -13
  150. mlrun/frameworks/tf_keras/model_server.py +12 -8
  151. mlrun/frameworks/xgboost/__init__.py +19 -18
  152. mlrun/frameworks/xgboost/model_handler.py +13 -9
  153. mlrun/launcher/base.py +3 -4
  154. mlrun/launcher/local.py +1 -1
  155. mlrun/launcher/remote.py +1 -1
  156. mlrun/lists.py +4 -3
  157. mlrun/model.py +110 -46
  158. mlrun/model_monitoring/__init__.py +1 -2
  159. mlrun/model_monitoring/api.py +6 -6
  160. mlrun/model_monitoring/applications/_application_steps.py +13 -15
  161. mlrun/model_monitoring/applications/histogram_data_drift.py +41 -15
  162. mlrun/model_monitoring/applications/results.py +55 -3
  163. mlrun/model_monitoring/controller.py +185 -223
  164. mlrun/model_monitoring/db/_schedules.py +156 -0
  165. mlrun/model_monitoring/db/_stats.py +189 -0
  166. mlrun/model_monitoring/db/stores/__init__.py +1 -1
  167. mlrun/model_monitoring/db/stores/base/store.py +6 -65
  168. mlrun/model_monitoring/db/stores/sqldb/models/__init__.py +0 -25
  169. mlrun/model_monitoring/db/stores/sqldb/models/base.py +0 -97
  170. mlrun/model_monitoring/db/stores/sqldb/models/mysql.py +2 -58
  171. mlrun/model_monitoring/db/stores/sqldb/models/sqlite.py +0 -15
  172. mlrun/model_monitoring/db/stores/sqldb/sql_store.py +6 -257
  173. mlrun/model_monitoring/db/stores/v3io_kv/kv_store.py +9 -271
  174. mlrun/model_monitoring/db/tsdb/base.py +76 -24
  175. mlrun/model_monitoring/db/tsdb/tdengine/schemas.py +61 -6
  176. mlrun/model_monitoring/db/tsdb/tdengine/stream_graph_steps.py +33 -0
  177. mlrun/model_monitoring/db/tsdb/tdengine/tdengine_connector.py +253 -28
  178. mlrun/model_monitoring/db/tsdb/v3io/stream_graph_steps.py +1 -0
  179. mlrun/model_monitoring/db/tsdb/v3io/v3io_connector.py +35 -17
  180. mlrun/model_monitoring/helpers.py +91 -1
  181. mlrun/model_monitoring/model_endpoint.py +4 -2
  182. mlrun/model_monitoring/stream_processing.py +16 -13
  183. mlrun/model_monitoring/tracking_policy.py +10 -3
  184. mlrun/model_monitoring/writer.py +47 -26
  185. mlrun/package/__init__.py +3 -6
  186. mlrun/package/context_handler.py +1 -1
  187. mlrun/package/packager.py +12 -9
  188. mlrun/package/packagers/__init__.py +0 -2
  189. mlrun/package/packagers/default_packager.py +14 -11
  190. mlrun/package/packagers/numpy_packagers.py +16 -7
  191. mlrun/package/packagers/pandas_packagers.py +18 -18
  192. mlrun/package/packagers/python_standard_library_packagers.py +25 -11
  193. mlrun/package/packagers_manager.py +31 -14
  194. mlrun/package/utils/__init__.py +0 -3
  195. mlrun/package/utils/_pickler.py +6 -6
  196. mlrun/platforms/__init__.py +3 -16
  197. mlrun/platforms/iguazio.py +4 -1
  198. mlrun/projects/operations.py +27 -27
  199. mlrun/projects/pipelines.py +34 -35
  200. mlrun/projects/project.py +535 -182
  201. mlrun/run.py +13 -10
  202. mlrun/runtimes/__init__.py +1 -3
  203. mlrun/runtimes/base.py +15 -11
  204. mlrun/runtimes/daskjob.py +9 -9
  205. mlrun/runtimes/generators.py +2 -1
  206. mlrun/runtimes/kubejob.py +4 -5
  207. mlrun/runtimes/mounts.py +572 -0
  208. mlrun/runtimes/mpijob/__init__.py +0 -2
  209. mlrun/runtimes/mpijob/abstract.py +7 -6
  210. mlrun/runtimes/nuclio/api_gateway.py +7 -7
  211. mlrun/runtimes/nuclio/application/application.py +11 -11
  212. mlrun/runtimes/nuclio/function.py +13 -13
  213. mlrun/runtimes/nuclio/serving.py +9 -9
  214. mlrun/runtimes/pod.py +154 -45
  215. mlrun/runtimes/remotesparkjob.py +3 -2
  216. mlrun/runtimes/sparkjob/__init__.py +0 -2
  217. mlrun/runtimes/sparkjob/spark3job.py +21 -11
  218. mlrun/runtimes/utils.py +6 -5
  219. mlrun/serving/merger.py +6 -4
  220. mlrun/serving/remote.py +18 -17
  221. mlrun/serving/routers.py +27 -27
  222. mlrun/serving/server.py +1 -1
  223. mlrun/serving/states.py +76 -71
  224. mlrun/serving/utils.py +13 -2
  225. mlrun/serving/v1_serving.py +3 -2
  226. mlrun/serving/v2_serving.py +4 -4
  227. mlrun/track/__init__.py +1 -1
  228. mlrun/track/tracker.py +2 -2
  229. mlrun/track/trackers/mlflow_tracker.py +6 -5
  230. mlrun/utils/async_http.py +1 -1
  231. mlrun/utils/helpers.py +70 -16
  232. mlrun/utils/logger.py +106 -4
  233. mlrun/utils/notifications/notification/__init__.py +22 -19
  234. mlrun/utils/notifications/notification/base.py +33 -14
  235. mlrun/utils/notifications/notification/console.py +6 -6
  236. mlrun/utils/notifications/notification/git.py +11 -11
  237. mlrun/utils/notifications/notification/ipython.py +10 -9
  238. mlrun/utils/notifications/notification/mail.py +149 -0
  239. mlrun/utils/notifications/notification/slack.py +6 -6
  240. mlrun/utils/notifications/notification/webhook.py +18 -22
  241. mlrun/utils/notifications/notification_pusher.py +43 -31
  242. mlrun/utils/regex.py +3 -1
  243. mlrun/utils/version/version.json +2 -2
  244. {mlrun-1.7.2rc3.dist-info → mlrun-1.8.0rc2.dist-info}/METADATA +18 -14
  245. mlrun-1.8.0rc2.dist-info/RECORD +358 -0
  246. {mlrun-1.7.2rc3.dist-info → mlrun-1.8.0rc2.dist-info}/WHEEL +1 -1
  247. mlrun-1.7.2rc3.dist-info/RECORD +0 -351
  248. {mlrun-1.7.2rc3.dist-info → mlrun-1.8.0rc2.dist-info}/LICENSE +0 -0
  249. {mlrun-1.7.2rc3.dist-info → mlrun-1.8.0rc2.dist-info}/entry_points.txt +0 -0
  250. {mlrun-1.7.2rc3.dist-info → mlrun-1.8.0rc2.dist-info}/top_level.txt +0 -0
@@ -275,7 +275,7 @@ class ApplicationRuntime(RemoteRuntime):
275
275
  tag="",
276
276
  verbose=False,
277
277
  auth_info: schemas.AuthInfo = None,
278
- builder_env: dict = None,
278
+ builder_env: typing.Optional[dict] = None,
279
279
  force_build: bool = False,
280
280
  with_mlrun=None,
281
281
  skip_deployed=False,
@@ -367,7 +367,7 @@ class ApplicationRuntime(RemoteRuntime):
367
367
  source,
368
368
  workdir=None,
369
369
  pull_at_runtime: bool = False,
370
- target_dir: str = None,
370
+ target_dir: typing.Optional[str] = None,
371
371
  ):
372
372
  """load the code from git/tar/zip archive at build
373
373
 
@@ -426,12 +426,12 @@ class ApplicationRuntime(RemoteRuntime):
426
426
 
427
427
  def create_api_gateway(
428
428
  self,
429
- name: str = None,
430
- path: str = None,
429
+ name: typing.Optional[str] = None,
430
+ path: typing.Optional[str] = None,
431
431
  direct_port_access: bool = False,
432
432
  authentication_mode: schemas.APIGatewayAuthenticationMode = None,
433
- authentication_creds: tuple[str, str] = None,
434
- ssl_redirect: bool = None,
433
+ authentication_creds: typing.Optional[tuple[str, str]] = None,
434
+ ssl_redirect: typing.Optional[bool] = None,
435
435
  set_as_default: bool = False,
436
436
  gateway_timeout: typing.Optional[int] = None,
437
437
  ):
@@ -540,13 +540,13 @@ class ApplicationRuntime(RemoteRuntime):
540
540
  self,
541
541
  path: str = "",
542
542
  body: typing.Optional[typing.Union[str, bytes, dict]] = None,
543
- method: str = None,
544
- headers: dict = None,
543
+ method: typing.Optional[str] = None,
544
+ headers: typing.Optional[dict] = None,
545
545
  dashboard: str = "",
546
546
  force_external_address: bool = False,
547
547
  auth_info: schemas.AuthInfo = None,
548
- mock: bool = None,
549
- credentials: tuple[str, str] = None,
548
+ mock: typing.Optional[bool] = None,
549
+ credentials: typing.Optional[tuple[str, str]] = None,
550
550
  **http_client_kwargs,
551
551
  ):
552
552
  self._sync_api_gateway()
@@ -653,7 +653,7 @@ class ApplicationRuntime(RemoteRuntime):
653
653
 
654
654
  def _build_application_image(
655
655
  self,
656
- builder_env: dict = None,
656
+ builder_env: typing.Optional[dict] = None,
657
657
  force_build: bool = False,
658
658
  watch=True,
659
659
  with_mlrun=None,
@@ -26,9 +26,6 @@ import requests
26
26
  import semver
27
27
  from aiohttp.client import ClientSession
28
28
  from kubernetes import client
29
- from mlrun_pipelines.common.mounts import VolumeMount
30
- from mlrun_pipelines.common.ops import deploy_op
31
- from mlrun_pipelines.mounts import mount_v3io, v3io_cred
32
29
  from nuclio.deploy import find_dashboard_url, get_deploy_status
33
30
  from nuclio.triggers import V3IOStreamTrigger
34
31
 
@@ -47,9 +44,11 @@ from mlrun.platforms.iguazio import (
47
44
  split_path,
48
45
  )
49
46
  from mlrun.runtimes.base import FunctionStatus, RunError
47
+ from mlrun.runtimes.mounts import VolumeMount, mount_v3io, v3io_cred
50
48
  from mlrun.runtimes.pod import KubeResource, KubeResourceSpec
51
49
  from mlrun.runtimes.utils import get_item_name, log_std
52
50
  from mlrun.utils import get_in, logger, update_in
51
+ from mlrun_pipelines.common.ops import deploy_op
53
52
 
54
53
 
55
54
  def validate_nuclio_version_compatibility(*min_versions):
@@ -554,7 +553,7 @@ class RemoteRuntime(KubeResource):
554
553
  tag="",
555
554
  verbose=False,
556
555
  auth_info: AuthInfo = None,
557
- builder_env: dict = None,
556
+ builder_env: typing.Optional[dict] = None,
558
557
  force_build: bool = False,
559
558
  ):
560
559
  """Deploy the nuclio function to the cluster
@@ -693,7 +692,9 @@ class RemoteRuntime(KubeResource):
693
692
  super().with_priority_class(name)
694
693
 
695
694
  def with_service_type(
696
- self, service_type: str, add_templated_ingress_host_mode: str = None
695
+ self,
696
+ service_type: str,
697
+ add_templated_ingress_host_mode: typing.Optional[str] = None,
697
698
  ):
698
699
  """
699
700
  Enables to control the service type of the pod and the addition of templated ingress host
@@ -887,13 +888,13 @@ class RemoteRuntime(KubeResource):
887
888
  def invoke(
888
889
  self,
889
890
  path: str,
890
- body: typing.Union[str, bytes, dict] = None,
891
- method: str = None,
892
- headers: dict = None,
891
+ body: typing.Optional[typing.Union[str, bytes, dict]] = None,
892
+ method: typing.Optional[str] = None,
893
+ headers: typing.Optional[dict] = None,
893
894
  dashboard: str = "",
894
895
  force_external_address: bool = False,
895
896
  auth_info: AuthInfo = None,
896
- mock: bool = None,
897
+ mock: typing.Optional[bool] = None,
897
898
  **http_client_kwargs,
898
899
  ):
899
900
  """Invoke the remote (live) function and return the results
@@ -995,8 +996,8 @@ class RemoteRuntime(KubeResource):
995
996
 
996
997
  def with_sidecar(
997
998
  self,
998
- name: str = None,
999
- image: str = None,
999
+ name: typing.Optional[str] = None,
1000
+ image: typing.Optional[str] = None,
1000
1001
  ports: typing.Optional[typing.Union[int, list[int]]] = None,
1001
1002
  command: typing.Optional[str] = None,
1002
1003
  args: typing.Optional[list[str]] = None,
@@ -1035,10 +1036,9 @@ class RemoteRuntime(KubeResource):
1035
1036
  if args and sidecar.get("command"):
1036
1037
  sidecar["args"] = mlrun.utils.helpers.as_list(args)
1037
1038
 
1038
- # put the configured resources on the sidecar container instead of the reverse proxy container
1039
+ # populate the sidecar resources from the function spec
1039
1040
  if self.spec.resources:
1040
1041
  sidecar["resources"] = self.spec.resources
1041
- self.spec.resources = None
1042
1042
 
1043
1043
  def _set_sidecar(self, name: str) -> dict:
1044
1044
  self.spec.config.setdefault("spec.sidecars", [])
@@ -51,7 +51,7 @@ if TYPE_CHECKING:
51
51
  def new_v2_model_server(
52
52
  name,
53
53
  model_class: str,
54
- models: dict = None,
54
+ models: Optional[dict] = None,
55
55
  filename="",
56
56
  protocol="",
57
57
  image="",
@@ -356,12 +356,12 @@ class ServingRuntime(RemoteRuntime):
356
356
  def add_model(
357
357
  self,
358
358
  key: str,
359
- model_path: str = None,
360
- class_name: str = None,
361
- model_url: str = None,
362
- handler: str = None,
363
- router_step: str = None,
364
- child_function: str = None,
359
+ model_path: Optional[str] = None,
360
+ class_name: Optional[str] = None,
361
+ model_url: Optional[str] = None,
362
+ handler: Optional[str] = None,
363
+ router_step: Optional[str] = None,
364
+ child_function: Optional[str] = None,
365
365
  **class_args,
366
366
  ):
367
367
  """add ml model and/or route to the function.
@@ -509,7 +509,7 @@ class ServingRuntime(RemoteRuntime):
509
509
  stream.path, group=group, shards=stream.shards, **trigger_args
510
510
  )
511
511
 
512
- def _deploy_function_refs(self, builder_env: dict = None):
512
+ def _deploy_function_refs(self, builder_env: Optional[dict] = None):
513
513
  """set metadata and deploy child functions"""
514
514
  for function_ref in self._spec.function_refs.values():
515
515
  logger.info(f"deploy child function {function_ref.name} ...")
@@ -583,7 +583,7 @@ class ServingRuntime(RemoteRuntime):
583
583
  tag="",
584
584
  verbose=False,
585
585
  auth_info: mlrun.common.schemas.AuthInfo = None,
586
- builder_env: dict = None,
586
+ builder_env: Optional[dict] = None,
587
587
  force_build: bool = False,
588
588
  ):
589
589
  """deploy model serving function to a local/remote cluster
mlrun/runtimes/pod.py CHANGED
@@ -17,14 +17,16 @@ import os
17
17
  import re
18
18
  import time
19
19
  import typing
20
+ from collections.abc import Iterable
20
21
  from enum import Enum
21
22
 
22
23
  import dotenv
23
24
  import kubernetes.client as k8s_client
24
- import mlrun_pipelines.mounts
25
- from mlrun_pipelines.mixins import KfpAdapterMixin
25
+ from kubernetes.client import V1Volume, V1VolumeMount
26
26
 
27
+ import mlrun.common.constants
27
28
  import mlrun.errors
29
+ import mlrun.runtimes.mounts
28
30
  import mlrun.utils.regex
29
31
  from mlrun.common.schemas import (
30
32
  NodeSelectorOperator,
@@ -309,7 +311,7 @@ class KubeResourceSpec(FunctionSpec):
309
311
  return self._termination_grace_period_seconds
310
312
 
311
313
  def _serialize_field(
312
- self, struct: dict, field_name: str = None, strip: bool = False
314
+ self, struct: dict, field_name: typing.Optional[str] = None, strip: bool = False
313
315
  ) -> typing.Any:
314
316
  """
315
317
  Serialize a field to a dict, list, or primitive type.
@@ -321,7 +323,7 @@ class KubeResourceSpec(FunctionSpec):
321
323
  return super()._serialize_field(struct, field_name, strip)
322
324
 
323
325
  def _enrich_field(
324
- self, struct: dict, field_name: str = None, strip: bool = False
326
+ self, struct: dict, field_name: typing.Optional[str] = None, strip: bool = False
325
327
  ) -> typing.Any:
326
328
  k8s_api = k8s_client.ApiClient()
327
329
  if strip:
@@ -366,6 +368,35 @@ class KubeResourceSpec(FunctionSpec):
366
368
  + f"service accounts {allowed_service_accounts}"
367
369
  )
368
370
 
371
+ def with_volumes(
372
+ self,
373
+ volumes: typing.Union[list[dict], dict, V1Volume],
374
+ ) -> "KubeResourceSpec":
375
+ """Add volumes to the volumes dictionary, only used as part of the mlrun_pipelines mount functions."""
376
+ if isinstance(volumes, dict):
377
+ set_named_item(self._volumes, volumes)
378
+ elif isinstance(volumes, Iterable):
379
+ for volume in volumes:
380
+ set_named_item(self._volumes, volume)
381
+ else:
382
+ set_named_item(self._volumes, volumes)
383
+ return self
384
+
385
+ def with_volume_mounts(
386
+ self,
387
+ volume_mounts: typing.Union[list[dict], dict, V1VolumeMount],
388
+ ) -> "KubeResourceSpec":
389
+ """Add volume mounts to the volume mounts dictionary,
390
+ only used as part of the mlrun_pipelines mount functions."""
391
+ if isinstance(volume_mounts, dict):
392
+ self._set_volume_mount(volume_mounts)
393
+ elif isinstance(volume_mounts, Iterable):
394
+ for volume_mount in volume_mounts:
395
+ self._set_volume_mount(volume_mount)
396
+ else:
397
+ self._set_volume_mount(volume_mounts)
398
+ return self
399
+
369
400
  def _set_volume_mount(
370
401
  self, volume_mount, volume_mounts_field_name="_volume_mounts"
371
402
  ):
@@ -380,9 +411,9 @@ class KubeResourceSpec(FunctionSpec):
380
411
  def _verify_and_set_limits(
381
412
  self,
382
413
  resources_field_name,
383
- mem: str = None,
384
- cpu: str = None,
385
- gpus: int = None,
414
+ mem: typing.Optional[str] = None,
415
+ cpu: typing.Optional[str] = None,
416
+ gpus: typing.Optional[int] = None,
386
417
  gpu_type: str = "nvidia.com/gpu",
387
418
  patch: bool = False,
388
419
  ):
@@ -430,8 +461,8 @@ class KubeResourceSpec(FunctionSpec):
430
461
  def _verify_and_set_requests(
431
462
  self,
432
463
  resources_field_name,
433
- mem: str = None,
434
- cpu: str = None,
464
+ mem: typing.Optional[str] = None,
465
+ cpu: typing.Optional[str] = None,
435
466
  patch: bool = False,
436
467
  ):
437
468
  resources = verify_requests(resources_field_name, mem=mem, cpu=cpu)
@@ -456,9 +487,9 @@ class KubeResourceSpec(FunctionSpec):
456
487
 
457
488
  def with_limits(
458
489
  self,
459
- mem: str = None,
460
- cpu: str = None,
461
- gpus: int = None,
490
+ mem: typing.Optional[str] = None,
491
+ cpu: typing.Optional[str] = None,
492
+ gpus: typing.Optional[int] = None,
462
493
  gpu_type: str = "nvidia.com/gpu",
463
494
  patch: bool = False,
464
495
  ):
@@ -474,7 +505,12 @@ class KubeResourceSpec(FunctionSpec):
474
505
  """
475
506
  self._verify_and_set_limits("resources", mem, cpu, gpus, gpu_type, patch=patch)
476
507
 
477
- def with_requests(self, mem: str = None, cpu: str = None, patch: bool = False):
508
+ def with_requests(
509
+ self,
510
+ mem: typing.Optional[str] = None,
511
+ cpu: typing.Optional[str] = None,
512
+ patch: bool = False,
513
+ ):
478
514
  """
479
515
  Set requested (desired) pod cpu/memory resources
480
516
 
@@ -936,12 +972,12 @@ class AutoMountType(str, Enum):
936
972
  @classmethod
937
973
  def all_mount_modifiers(cls):
938
974
  return [
939
- mlrun_pipelines.mounts.v3io_cred.__name__,
940
- mlrun_pipelines.mounts.mount_v3io.__name__,
941
- mlrun_pipelines.mounts.mount_pvc.__name__,
942
- mlrun_pipelines.mounts.auto_mount.__name__,
943
- mlrun_pipelines.mounts.mount_s3.__name__,
944
- mlrun_pipelines.mounts.set_env_variables.__name__,
975
+ mlrun.runtimes.mounts.v3io_cred.__name__,
976
+ mlrun.runtimes.mounts.mount_v3io.__name__,
977
+ mlrun.runtimes.mounts.mount_pvc.__name__,
978
+ mlrun.runtimes.mounts.auto_mount.__name__,
979
+ mlrun.runtimes.mounts.mount_s3.__name__,
980
+ mlrun.runtimes.mounts.set_env_variables.__name__,
945
981
  ]
946
982
 
947
983
  @classmethod
@@ -958,27 +994,27 @@ class AutoMountType(str, Enum):
958
994
  def _get_auto_modifier():
959
995
  # If we're running on Iguazio - use v3io_cred
960
996
  if mlconf.igz_version != "":
961
- return mlrun_pipelines.mounts.v3io_cred
997
+ return mlrun.runtimes.mounts.v3io_cred
962
998
  # Else, either pvc mount if it's configured or do nothing otherwise
963
999
  pvc_configured = (
964
1000
  "MLRUN_PVC_MOUNT" in os.environ
965
1001
  or "pvc_name" in mlconf.get_storage_auto_mount_params()
966
1002
  )
967
- return mlrun_pipelines.mounts.mount_pvc if pvc_configured else None
1003
+ return mlrun.runtimes.mounts.mount_pvc if pvc_configured else None
968
1004
 
969
1005
  def get_modifier(self):
970
1006
  return {
971
1007
  AutoMountType.none: None,
972
- AutoMountType.v3io_credentials: mlrun_pipelines.mounts.v3io_cred,
973
- AutoMountType.v3io_fuse: mlrun_pipelines.mounts.mount_v3io,
974
- AutoMountType.pvc: mlrun_pipelines.mounts.mount_pvc,
1008
+ AutoMountType.v3io_credentials: mlrun.runtimes.mounts.v3io_cred,
1009
+ AutoMountType.v3io_fuse: mlrun.runtimes.mounts.mount_v3io,
1010
+ AutoMountType.pvc: mlrun.runtimes.mounts.mount_pvc,
975
1011
  AutoMountType.auto: self._get_auto_modifier(),
976
- AutoMountType.s3: mlrun_pipelines.mounts.mount_s3,
977
- AutoMountType.env: mlrun_pipelines.mounts.set_env_variables,
1012
+ AutoMountType.s3: mlrun.runtimes.mounts.mount_s3,
1013
+ AutoMountType.env: mlrun.runtimes.mounts.set_env_variables,
978
1014
  }[self]
979
1015
 
980
1016
 
981
- class KubeResource(BaseRuntime, KfpAdapterMixin):
1017
+ class KubeResource(BaseRuntime):
982
1018
  """
983
1019
  A parent class for runtimes that generate k8s resources when executing.
984
1020
  """
@@ -1020,7 +1056,8 @@ class KubeResource(BaseRuntime, KfpAdapterMixin):
1020
1056
 
1021
1057
  def get_env(self, name, default=None):
1022
1058
  """Get the pod environment variable for the given name, if not found return the default
1023
- If it's a scalar value, will return it, if the value is from source, return the k8s struct (V1EnvVarSource)"""
1059
+ If it's a scalar value, will return it, if the value is from source, return the k8s struct (V1EnvVarSource)
1060
+ """
1024
1061
  for env_var in self.spec.env:
1025
1062
  if get_item_name(env_var) == name:
1026
1063
  # valueFrom is a workaround for now, for some reason the envs aren't getting sanitized
@@ -1050,7 +1087,11 @@ class KubeResource(BaseRuntime, KfpAdapterMixin):
1050
1087
  self.spec.env.append(new_var)
1051
1088
  return self
1052
1089
 
1053
- def set_envs(self, env_vars: dict = None, file_path: str = None):
1090
+ def set_envs(
1091
+ self,
1092
+ env_vars: typing.Optional[dict] = None,
1093
+ file_path: typing.Optional[str] = None,
1094
+ ):
1054
1095
  """set pod environment var from key/value dict or .env file
1055
1096
 
1056
1097
  :param env_vars: dict with env key/values
@@ -1070,11 +1111,16 @@ class KubeResource(BaseRuntime, KfpAdapterMixin):
1070
1111
  else:
1071
1112
  raise mlrun.errors.MLRunNotFoundError(f"{file_path} does not exist")
1072
1113
  for name, value in env_vars.items():
1073
- self.set_env(name, value)
1114
+ if isinstance(value, dict) and "valueFrom" in value:
1115
+ self.set_env(name, value_from=value["valueFrom"])
1116
+ else:
1117
+ self.set_env(name, value)
1074
1118
  return self
1075
1119
 
1076
1120
  def set_image_pull_configuration(
1077
- self, image_pull_policy: str = None, image_pull_secret_name: str = None
1121
+ self,
1122
+ image_pull_policy: typing.Optional[str] = None,
1123
+ image_pull_secret_name: typing.Optional[str] = None,
1078
1124
  ):
1079
1125
  """
1080
1126
  Configure the image pull parameters for the runtime.
@@ -1123,9 +1169,9 @@ class KubeResource(BaseRuntime, KfpAdapterMixin):
1123
1169
 
1124
1170
  def with_limits(
1125
1171
  self,
1126
- mem: str = None,
1127
- cpu: str = None,
1128
- gpus: int = None,
1172
+ mem: typing.Optional[str] = None,
1173
+ cpu: typing.Optional[str] = None,
1174
+ gpus: typing.Optional[int] = None,
1129
1175
  gpu_type: str = "nvidia.com/gpu",
1130
1176
  patch: bool = False,
1131
1177
  ):
@@ -1141,7 +1187,12 @@ class KubeResource(BaseRuntime, KfpAdapterMixin):
1141
1187
  """
1142
1188
  self.spec.with_limits(mem, cpu, gpus, gpu_type, patch=patch)
1143
1189
 
1144
- def with_requests(self, mem: str = None, cpu: str = None, patch: bool = False):
1190
+ def with_requests(
1191
+ self,
1192
+ mem: typing.Optional[str] = None,
1193
+ cpu: typing.Optional[str] = None,
1194
+ patch: bool = False,
1195
+ ):
1145
1196
  """
1146
1197
  Set requested (desired) pod cpu/memory resources
1147
1198
 
@@ -1253,6 +1304,36 @@ class KubeResource(BaseRuntime, KfpAdapterMixin):
1253
1304
  )
1254
1305
  self.spec.security_context = security_context
1255
1306
 
1307
+ def apply(
1308
+ self,
1309
+ modifier: typing.Callable[["KubeResource"], "KubeResource"],
1310
+ ) -> "KubeResource":
1311
+ """
1312
+ Apply a modifier to the runtime which is used to change the runtimes k8s object's spec.
1313
+ All modifiers accept Kube, apply some changes on its spec and return it so modifiers can be chained
1314
+ one after the other.
1315
+
1316
+ :param modifier: a modifier callable object
1317
+ :return: the runtime (self) after the modifications
1318
+ """
1319
+ modifier(self)
1320
+ if AutoMountType.is_auto_modifier(modifier):
1321
+ self.spec.disable_auto_mount = True
1322
+
1323
+ api_client = k8s_client.ApiClient()
1324
+ if self.spec.env:
1325
+ for index, env in enumerate(
1326
+ api_client.sanitize_for_serialization(self.spec.env)
1327
+ ):
1328
+ self.spec.env[index] = env
1329
+
1330
+ if self.spec.volumes and self.spec.volume_mounts:
1331
+ vols = api_client.sanitize_for_serialization(self.spec.volumes)
1332
+ mounts = api_client.sanitize_for_serialization(self.spec.volume_mounts)
1333
+ self.spec.update_vols_and_mounts(vols, mounts)
1334
+
1335
+ return self
1336
+
1256
1337
  def list_valid_priority_class_names(self):
1257
1338
  return mlconf.get_valid_function_priority_class_names()
1258
1339
 
@@ -1412,20 +1493,32 @@ class KubeResource(BaseRuntime, KfpAdapterMixin):
1412
1493
  ):
1413
1494
  db = self._get_db()
1414
1495
  offset = 0
1496
+ events_offset = 0
1415
1497
  try:
1416
- text, _ = db.get_builder_status(self, 0, logs=logs)
1498
+ text, _, deploy_status_text_kind = db.get_builder_status(
1499
+ self,
1500
+ offset=0,
1501
+ logs=logs,
1502
+ events_offset=0,
1503
+ )
1417
1504
  except mlrun.db.RunDBError:
1418
- raise ValueError("function or build process not found")
1505
+ raise ValueError("Function or build process not found")
1419
1506
 
1420
- def print_log(text):
1421
- if text and (
1507
+ def print_log(_text):
1508
+ if _text and (
1422
1509
  not show_on_failure
1423
1510
  or self.status.state == mlrun.common.schemas.FunctionState.error
1424
1511
  ):
1425
- print(text, end="")
1512
+ print(_text, end="")
1426
1513
 
1427
1514
  print_log(text)
1428
- offset += len(text)
1515
+ if (
1516
+ deploy_status_text_kind
1517
+ == mlrun.common.constants.DeployStatusTextKind.events
1518
+ ):
1519
+ events_offset += len(text)
1520
+ else:
1521
+ offset += len(text)
1429
1522
  if watch:
1430
1523
  while self.status.state in [
1431
1524
  mlrun.common.schemas.FunctionState.pending,
@@ -1434,14 +1527,30 @@ class KubeResource(BaseRuntime, KfpAdapterMixin):
1434
1527
  time.sleep(2)
1435
1528
  if show_on_failure:
1436
1529
  text = ""
1437
- db.get_builder_status(self, 0, logs=False)
1530
+ db.get_builder_status(self, offset=0, logs=False, events_offset=0)
1438
1531
  if self.status.state == mlrun.common.schemas.FunctionState.error:
1439
1532
  # re-read the full log on failure
1440
- text, _ = db.get_builder_status(self, offset, logs=logs)
1533
+ text, _, deploy_status_text_kind = db.get_builder_status(
1534
+ self,
1535
+ offset=offset,
1536
+ logs=logs,
1537
+ events_offset=events_offset,
1538
+ )
1441
1539
  else:
1442
- text, _ = db.get_builder_status(self, offset, logs=logs)
1540
+ text, _, deploy_status_text_kind = db.get_builder_status(
1541
+ self,
1542
+ offset=offset,
1543
+ logs=logs,
1544
+ events_offset=events_offset,
1545
+ )
1443
1546
  print_log(text)
1444
- offset += len(text)
1547
+ if (
1548
+ deploy_status_text_kind
1549
+ == mlrun.common.constants.DeployStatusTextKind.events
1550
+ ):
1551
+ events_offset += len(text)
1552
+ else:
1553
+ offset += len(text)
1445
1554
 
1446
1555
  return self.status.state
1447
1556
 
@@ -13,12 +13,13 @@
13
13
  # limitations under the License.
14
14
  import re
15
15
  from subprocess import run
16
+ from typing import Optional
16
17
 
17
18
  import kubernetes.client
18
- from mlrun_pipelines.mounts import mount_v3io, mount_v3iod
19
19
 
20
20
  import mlrun.errors
21
21
  from mlrun.config import config
22
+ from mlrun.runtimes.mounts import mount_v3io, mount_v3iod
22
23
 
23
24
  from .kubejob import KubejobRuntime
24
25
  from .pod import KubeResourceSpec
@@ -179,7 +180,7 @@ class RemoteSparkRuntime(KubejobRuntime):
179
180
  skip_deployed=False,
180
181
  is_kfp=False,
181
182
  mlrun_version_specifier=None,
182
- builder_env: dict = None,
183
+ builder_env: Optional[dict] = None,
183
184
  show_on_failure: bool = False,
184
185
  force_build: bool = False,
185
186
  ):
@@ -12,6 +12,4 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- # flake8: noqa - this is until we take care of the F401 violations with respect to __all__ & sphinx
16
-
17
15
  from .spark3job import Spark3Runtime
@@ -14,13 +14,13 @@
14
14
  import typing
15
15
 
16
16
  import kubernetes.client
17
- from mlrun_pipelines.mounts import mount_v3io, mount_v3iod
18
17
 
19
18
  import mlrun.common.schemas.function
20
19
  import mlrun.errors
21
20
  import mlrun.k8s_utils
22
21
  import mlrun.runtimes.pod
23
22
  from mlrun.config import config
23
+ from mlrun.runtimes.mounts import mount_v3io, mount_v3iod
24
24
 
25
25
  from ...execution import MLClientCtx
26
26
  from ...model import RunObject
@@ -405,8 +405,8 @@ class Spark3JobSpec(KubeResourceSpec):
405
405
  def _verify_and_set_requests(
406
406
  self,
407
407
  resources_field_name,
408
- mem: str = None,
409
- cpu: str = None,
408
+ mem: typing.Optional[str] = None,
409
+ cpu: typing.Optional[str] = None,
410
410
  patch: bool = False,
411
411
  ):
412
412
  # Spark operator uses JVM notation for memory, so we must verify it separately
@@ -774,7 +774,11 @@ class Spark3Runtime(KubejobRuntime):
774
774
  exporter_jar="/spark/jars/jmx_prometheus_javaagent-0.16.1.jar",
775
775
  )
776
776
 
777
- def with_cores(self, executor_cores: int = None, driver_cores: int = None):
777
+ def with_cores(
778
+ self,
779
+ executor_cores: typing.Optional[int] = None,
780
+ driver_cores: typing.Optional[int] = None,
781
+ ):
778
782
  """
779
783
  Allows to configure spark.executor.cores and spark.driver.cores parameters. The values must be integers
780
784
  greater than or equal to 1. If a parameter is not specified, it defaults to 1.
@@ -853,7 +857,7 @@ class Spark3Runtime(KubejobRuntime):
853
857
  skip_deployed=False,
854
858
  is_kfp=False,
855
859
  mlrun_version_specifier=None,
856
- builder_env: dict = None,
860
+ builder_env: typing.Optional[dict] = None,
857
861
  show_on_failure: bool = False,
858
862
  force_build: bool = False,
859
863
  ):
@@ -944,7 +948,10 @@ class Spark3Runtime(KubejobRuntime):
944
948
  )
945
949
 
946
950
  def with_executor_requests(
947
- self, mem: str = None, cpu: str = None, patch: bool = False
951
+ self,
952
+ mem: typing.Optional[str] = None,
953
+ cpu: typing.Optional[str] = None,
954
+ patch: bool = False,
948
955
  ):
949
956
  """
950
957
  set executor pod required cpu/memory/gpu resources
@@ -954,8 +961,8 @@ class Spark3Runtime(KubejobRuntime):
954
961
 
955
962
  def with_executor_limits(
956
963
  self,
957
- cpu: str = None,
958
- gpus: int = None,
964
+ cpu: typing.Optional[str] = None,
965
+ gpus: typing.Optional[int] = None,
959
966
  gpu_type: str = "nvidia.com/gpu",
960
967
  patch: bool = False,
961
968
  ):
@@ -970,7 +977,10 @@ class Spark3Runtime(KubejobRuntime):
970
977
  )
971
978
 
972
979
  def with_driver_requests(
973
- self, mem: str = None, cpu: str = None, patch: bool = False
980
+ self,
981
+ mem: typing.Optional[str] = None,
982
+ cpu: typing.Optional[str] = None,
983
+ patch: bool = False,
974
984
  ):
975
985
  """
976
986
  set driver pod required cpu/memory/gpu resources
@@ -980,8 +990,8 @@ class Spark3Runtime(KubejobRuntime):
980
990
 
981
991
  def with_driver_limits(
982
992
  self,
983
- cpu: str = None,
984
- gpus: int = None,
993
+ cpu: typing.Optional[str] = None,
994
+ gpus: typing.Optional[int] = None,
985
995
  gpu_type: str = "nvidia.com/gpu",
986
996
  patch: bool = False,
987
997
  ):