mlrun 1.6.4rc2__py3-none-any.whl → 1.7.0rc20__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 (291) hide show
  1. mlrun/__init__.py +11 -1
  2. mlrun/__main__.py +26 -112
  3. mlrun/alerts/__init__.py +15 -0
  4. mlrun/alerts/alert.py +144 -0
  5. mlrun/api/schemas/__init__.py +5 -4
  6. mlrun/artifacts/__init__.py +8 -3
  7. mlrun/artifacts/base.py +46 -257
  8. mlrun/artifacts/dataset.py +11 -192
  9. mlrun/artifacts/manager.py +47 -48
  10. mlrun/artifacts/model.py +31 -159
  11. mlrun/artifacts/plots.py +23 -380
  12. mlrun/common/constants.py +69 -0
  13. mlrun/common/db/sql_session.py +2 -3
  14. mlrun/common/formatters/__init__.py +19 -0
  15. mlrun/common/formatters/artifact.py +21 -0
  16. mlrun/common/formatters/base.py +78 -0
  17. mlrun/common/formatters/function.py +41 -0
  18. mlrun/common/formatters/pipeline.py +53 -0
  19. mlrun/common/formatters/project.py +51 -0
  20. mlrun/common/helpers.py +1 -2
  21. mlrun/common/model_monitoring/helpers.py +9 -5
  22. mlrun/{runtimes → common/runtimes}/constants.py +37 -9
  23. mlrun/common/schemas/__init__.py +24 -4
  24. mlrun/common/schemas/alert.py +203 -0
  25. mlrun/common/schemas/api_gateway.py +148 -0
  26. mlrun/common/schemas/artifact.py +18 -8
  27. mlrun/common/schemas/auth.py +11 -5
  28. mlrun/common/schemas/background_task.py +1 -1
  29. mlrun/common/schemas/client_spec.py +4 -1
  30. mlrun/common/schemas/feature_store.py +16 -16
  31. mlrun/common/schemas/frontend_spec.py +8 -7
  32. mlrun/common/schemas/function.py +5 -1
  33. mlrun/common/schemas/hub.py +11 -18
  34. mlrun/common/schemas/memory_reports.py +2 -2
  35. mlrun/common/schemas/model_monitoring/__init__.py +18 -3
  36. mlrun/common/schemas/model_monitoring/constants.py +83 -26
  37. mlrun/common/schemas/model_monitoring/grafana.py +13 -9
  38. mlrun/common/schemas/model_monitoring/model_endpoints.py +99 -16
  39. mlrun/common/schemas/notification.py +4 -4
  40. mlrun/common/schemas/object.py +2 -2
  41. mlrun/{runtimes/mpijob/v1alpha1.py → common/schemas/pagination.py} +10 -13
  42. mlrun/common/schemas/pipeline.py +1 -10
  43. mlrun/common/schemas/project.py +24 -23
  44. mlrun/common/schemas/runtime_resource.py +8 -12
  45. mlrun/common/schemas/schedule.py +3 -3
  46. mlrun/common/schemas/tag.py +1 -2
  47. mlrun/common/schemas/workflow.py +2 -2
  48. mlrun/common/types.py +7 -1
  49. mlrun/config.py +54 -17
  50. mlrun/data_types/to_pandas.py +10 -12
  51. mlrun/datastore/__init__.py +5 -8
  52. mlrun/datastore/alibaba_oss.py +130 -0
  53. mlrun/datastore/azure_blob.py +17 -5
  54. mlrun/datastore/base.py +62 -39
  55. mlrun/datastore/datastore.py +28 -9
  56. mlrun/datastore/datastore_profile.py +146 -20
  57. mlrun/datastore/filestore.py +0 -1
  58. mlrun/datastore/google_cloud_storage.py +6 -2
  59. mlrun/datastore/hdfs.py +56 -0
  60. mlrun/datastore/inmem.py +2 -2
  61. mlrun/datastore/redis.py +6 -2
  62. mlrun/datastore/s3.py +9 -0
  63. mlrun/datastore/snowflake_utils.py +43 -0
  64. mlrun/datastore/sources.py +201 -96
  65. mlrun/datastore/spark_utils.py +1 -2
  66. mlrun/datastore/store_resources.py +7 -7
  67. mlrun/datastore/targets.py +358 -104
  68. mlrun/datastore/utils.py +72 -58
  69. mlrun/datastore/v3io.py +5 -1
  70. mlrun/db/base.py +185 -35
  71. mlrun/db/factory.py +1 -1
  72. mlrun/db/httpdb.py +614 -179
  73. mlrun/db/nopdb.py +210 -26
  74. mlrun/errors.py +12 -1
  75. mlrun/execution.py +41 -24
  76. mlrun/feature_store/__init__.py +0 -2
  77. mlrun/feature_store/api.py +40 -72
  78. mlrun/feature_store/common.py +1 -1
  79. mlrun/feature_store/feature_set.py +76 -55
  80. mlrun/feature_store/feature_vector.py +28 -30
  81. mlrun/feature_store/ingestion.py +7 -6
  82. mlrun/feature_store/retrieval/base.py +16 -11
  83. mlrun/feature_store/retrieval/conversion.py +11 -13
  84. mlrun/feature_store/retrieval/dask_merger.py +2 -0
  85. mlrun/feature_store/retrieval/job.py +9 -3
  86. mlrun/feature_store/retrieval/local_merger.py +2 -0
  87. mlrun/feature_store/retrieval/spark_merger.py +34 -24
  88. mlrun/feature_store/steps.py +37 -34
  89. mlrun/features.py +9 -20
  90. mlrun/frameworks/_common/artifacts_library.py +9 -9
  91. mlrun/frameworks/_common/mlrun_interface.py +5 -5
  92. mlrun/frameworks/_common/model_handler.py +48 -48
  93. mlrun/frameworks/_common/plan.py +2 -3
  94. mlrun/frameworks/_common/producer.py +3 -4
  95. mlrun/frameworks/_common/utils.py +5 -5
  96. mlrun/frameworks/_dl_common/loggers/logger.py +6 -7
  97. mlrun/frameworks/_dl_common/loggers/mlrun_logger.py +9 -9
  98. mlrun/frameworks/_dl_common/loggers/tensorboard_logger.py +23 -47
  99. mlrun/frameworks/_ml_common/artifacts_library.py +1 -2
  100. mlrun/frameworks/_ml_common/loggers/logger.py +3 -4
  101. mlrun/frameworks/_ml_common/loggers/mlrun_logger.py +4 -5
  102. mlrun/frameworks/_ml_common/model_handler.py +24 -24
  103. mlrun/frameworks/_ml_common/pkl_model_server.py +2 -2
  104. mlrun/frameworks/_ml_common/plan.py +1 -1
  105. mlrun/frameworks/_ml_common/plans/calibration_curve_plan.py +2 -3
  106. mlrun/frameworks/_ml_common/plans/confusion_matrix_plan.py +2 -3
  107. mlrun/frameworks/_ml_common/plans/dataset_plan.py +3 -3
  108. mlrun/frameworks/_ml_common/plans/feature_importance_plan.py +3 -3
  109. mlrun/frameworks/_ml_common/plans/roc_curve_plan.py +4 -4
  110. mlrun/frameworks/_ml_common/utils.py +4 -4
  111. mlrun/frameworks/auto_mlrun/auto_mlrun.py +9 -9
  112. mlrun/frameworks/huggingface/model_server.py +4 -4
  113. mlrun/frameworks/lgbm/__init__.py +33 -33
  114. mlrun/frameworks/lgbm/callbacks/callback.py +2 -4
  115. mlrun/frameworks/lgbm/callbacks/logging_callback.py +4 -5
  116. mlrun/frameworks/lgbm/callbacks/mlrun_logging_callback.py +4 -5
  117. mlrun/frameworks/lgbm/mlrun_interfaces/booster_mlrun_interface.py +1 -3
  118. mlrun/frameworks/lgbm/mlrun_interfaces/mlrun_interface.py +6 -6
  119. mlrun/frameworks/lgbm/model_handler.py +10 -10
  120. mlrun/frameworks/lgbm/model_server.py +6 -6
  121. mlrun/frameworks/lgbm/utils.py +5 -5
  122. mlrun/frameworks/onnx/dataset.py +8 -8
  123. mlrun/frameworks/onnx/mlrun_interface.py +3 -3
  124. mlrun/frameworks/onnx/model_handler.py +6 -6
  125. mlrun/frameworks/onnx/model_server.py +7 -7
  126. mlrun/frameworks/parallel_coordinates.py +4 -3
  127. mlrun/frameworks/pytorch/__init__.py +18 -18
  128. mlrun/frameworks/pytorch/callbacks/callback.py +4 -5
  129. mlrun/frameworks/pytorch/callbacks/logging_callback.py +17 -17
  130. mlrun/frameworks/pytorch/callbacks/mlrun_logging_callback.py +11 -11
  131. mlrun/frameworks/pytorch/callbacks/tensorboard_logging_callback.py +23 -29
  132. mlrun/frameworks/pytorch/callbacks_handler.py +38 -38
  133. mlrun/frameworks/pytorch/mlrun_interface.py +20 -20
  134. mlrun/frameworks/pytorch/model_handler.py +17 -17
  135. mlrun/frameworks/pytorch/model_server.py +7 -7
  136. mlrun/frameworks/sklearn/__init__.py +13 -13
  137. mlrun/frameworks/sklearn/estimator.py +4 -4
  138. mlrun/frameworks/sklearn/metrics_library.py +14 -14
  139. mlrun/frameworks/sklearn/mlrun_interface.py +3 -6
  140. mlrun/frameworks/sklearn/model_handler.py +2 -2
  141. mlrun/frameworks/tf_keras/__init__.py +10 -7
  142. mlrun/frameworks/tf_keras/callbacks/logging_callback.py +15 -15
  143. mlrun/frameworks/tf_keras/callbacks/mlrun_logging_callback.py +11 -11
  144. mlrun/frameworks/tf_keras/callbacks/tensorboard_logging_callback.py +19 -23
  145. mlrun/frameworks/tf_keras/mlrun_interface.py +9 -11
  146. mlrun/frameworks/tf_keras/model_handler.py +14 -14
  147. mlrun/frameworks/tf_keras/model_server.py +6 -6
  148. mlrun/frameworks/xgboost/__init__.py +13 -13
  149. mlrun/frameworks/xgboost/model_handler.py +6 -6
  150. mlrun/k8s_utils.py +14 -16
  151. mlrun/launcher/__init__.py +1 -1
  152. mlrun/launcher/base.py +16 -15
  153. mlrun/launcher/client.py +8 -6
  154. mlrun/launcher/factory.py +1 -1
  155. mlrun/launcher/local.py +17 -11
  156. mlrun/launcher/remote.py +16 -10
  157. mlrun/lists.py +7 -6
  158. mlrun/model.py +238 -73
  159. mlrun/model_monitoring/__init__.py +1 -1
  160. mlrun/model_monitoring/api.py +138 -315
  161. mlrun/model_monitoring/application.py +5 -296
  162. mlrun/model_monitoring/applications/__init__.py +24 -0
  163. mlrun/model_monitoring/applications/_application_steps.py +157 -0
  164. mlrun/model_monitoring/applications/base.py +282 -0
  165. mlrun/model_monitoring/applications/context.py +214 -0
  166. mlrun/model_monitoring/applications/evidently_base.py +211 -0
  167. mlrun/model_monitoring/applications/histogram_data_drift.py +349 -0
  168. mlrun/model_monitoring/applications/results.py +99 -0
  169. mlrun/model_monitoring/controller.py +104 -84
  170. mlrun/model_monitoring/controller_handler.py +13 -5
  171. mlrun/model_monitoring/db/__init__.py +18 -0
  172. mlrun/model_monitoring/{stores → db/stores}/__init__.py +43 -36
  173. mlrun/model_monitoring/db/stores/base/__init__.py +15 -0
  174. mlrun/model_monitoring/{stores/model_endpoint_store.py → db/stores/base/store.py} +64 -40
  175. mlrun/model_monitoring/db/stores/sqldb/__init__.py +13 -0
  176. mlrun/model_monitoring/db/stores/sqldb/models/__init__.py +71 -0
  177. mlrun/model_monitoring/{stores → db/stores/sqldb}/models/base.py +109 -5
  178. mlrun/model_monitoring/db/stores/sqldb/models/mysql.py +88 -0
  179. mlrun/model_monitoring/{stores/models/mysql.py → db/stores/sqldb/models/sqlite.py} +19 -13
  180. mlrun/model_monitoring/db/stores/sqldb/sql_store.py +684 -0
  181. mlrun/model_monitoring/db/stores/v3io_kv/__init__.py +13 -0
  182. mlrun/model_monitoring/{stores/kv_model_endpoint_store.py → db/stores/v3io_kv/kv_store.py} +310 -165
  183. mlrun/model_monitoring/db/tsdb/__init__.py +100 -0
  184. mlrun/model_monitoring/db/tsdb/base.py +329 -0
  185. mlrun/model_monitoring/db/tsdb/helpers.py +30 -0
  186. mlrun/model_monitoring/db/tsdb/tdengine/__init__.py +15 -0
  187. mlrun/model_monitoring/db/tsdb/tdengine/schemas.py +240 -0
  188. mlrun/model_monitoring/db/tsdb/tdengine/stream_graph_steps.py +45 -0
  189. mlrun/model_monitoring/db/tsdb/tdengine/tdengine_connector.py +397 -0
  190. mlrun/model_monitoring/db/tsdb/v3io/__init__.py +15 -0
  191. mlrun/model_monitoring/db/tsdb/v3io/stream_graph_steps.py +117 -0
  192. mlrun/model_monitoring/db/tsdb/v3io/v3io_connector.py +630 -0
  193. mlrun/model_monitoring/evidently_application.py +6 -118
  194. mlrun/model_monitoring/features_drift_table.py +134 -106
  195. mlrun/model_monitoring/helpers.py +127 -28
  196. mlrun/model_monitoring/metrics/__init__.py +13 -0
  197. mlrun/model_monitoring/metrics/histogram_distance.py +127 -0
  198. mlrun/model_monitoring/model_endpoint.py +3 -2
  199. mlrun/model_monitoring/prometheus.py +1 -4
  200. mlrun/model_monitoring/stream_processing.py +62 -231
  201. mlrun/model_monitoring/tracking_policy.py +9 -2
  202. mlrun/model_monitoring/writer.py +152 -124
  203. mlrun/package/__init__.py +6 -6
  204. mlrun/package/context_handler.py +5 -5
  205. mlrun/package/packager.py +7 -7
  206. mlrun/package/packagers/default_packager.py +6 -6
  207. mlrun/package/packagers/numpy_packagers.py +15 -15
  208. mlrun/package/packagers/pandas_packagers.py +5 -5
  209. mlrun/package/packagers/python_standard_library_packagers.py +10 -10
  210. mlrun/package/packagers_manager.py +19 -23
  211. mlrun/package/utils/_formatter.py +6 -6
  212. mlrun/package/utils/_pickler.py +2 -2
  213. mlrun/package/utils/_supported_format.py +4 -4
  214. mlrun/package/utils/log_hint_utils.py +2 -2
  215. mlrun/package/utils/type_hint_utils.py +4 -9
  216. mlrun/platforms/__init__.py +11 -10
  217. mlrun/platforms/iguazio.py +24 -203
  218. mlrun/projects/operations.py +35 -21
  219. mlrun/projects/pipelines.py +68 -99
  220. mlrun/projects/project.py +830 -266
  221. mlrun/render.py +3 -11
  222. mlrun/run.py +162 -166
  223. mlrun/runtimes/__init__.py +62 -7
  224. mlrun/runtimes/base.py +39 -32
  225. mlrun/runtimes/daskjob.py +8 -8
  226. mlrun/runtimes/databricks_job/databricks_cancel_task.py +1 -1
  227. mlrun/runtimes/databricks_job/databricks_runtime.py +7 -7
  228. mlrun/runtimes/databricks_job/databricks_wrapper.py +1 -1
  229. mlrun/runtimes/funcdoc.py +0 -28
  230. mlrun/runtimes/function_reference.py +1 -1
  231. mlrun/runtimes/kubejob.py +28 -122
  232. mlrun/runtimes/local.py +6 -3
  233. mlrun/runtimes/mpijob/__init__.py +0 -20
  234. mlrun/runtimes/mpijob/abstract.py +9 -10
  235. mlrun/runtimes/mpijob/v1.py +1 -1
  236. mlrun/{model_monitoring/stores/models/sqlite.py → runtimes/nuclio/__init__.py} +7 -9
  237. mlrun/runtimes/nuclio/api_gateway.py +709 -0
  238. mlrun/runtimes/nuclio/application/__init__.py +15 -0
  239. mlrun/runtimes/nuclio/application/application.py +523 -0
  240. mlrun/runtimes/nuclio/application/reverse_proxy.go +95 -0
  241. mlrun/runtimes/{function.py → nuclio/function.py} +112 -73
  242. mlrun/runtimes/{nuclio.py → nuclio/nuclio.py} +6 -6
  243. mlrun/runtimes/{serving.py → nuclio/serving.py} +45 -51
  244. mlrun/runtimes/pod.py +286 -88
  245. mlrun/runtimes/remotesparkjob.py +2 -2
  246. mlrun/runtimes/sparkjob/spark3job.py +51 -34
  247. mlrun/runtimes/utils.py +7 -75
  248. mlrun/secrets.py +9 -5
  249. mlrun/serving/remote.py +2 -7
  250. mlrun/serving/routers.py +13 -10
  251. mlrun/serving/server.py +22 -26
  252. mlrun/serving/states.py +99 -25
  253. mlrun/serving/utils.py +3 -3
  254. mlrun/serving/v1_serving.py +6 -7
  255. mlrun/serving/v2_serving.py +59 -20
  256. mlrun/track/tracker.py +2 -1
  257. mlrun/track/tracker_manager.py +3 -3
  258. mlrun/track/trackers/mlflow_tracker.py +1 -2
  259. mlrun/utils/async_http.py +5 -7
  260. mlrun/utils/azure_vault.py +1 -1
  261. mlrun/utils/clones.py +1 -2
  262. mlrun/utils/condition_evaluator.py +3 -3
  263. mlrun/utils/db.py +3 -3
  264. mlrun/utils/helpers.py +183 -197
  265. mlrun/utils/http.py +2 -5
  266. mlrun/utils/logger.py +76 -14
  267. mlrun/utils/notifications/notification/__init__.py +17 -12
  268. mlrun/utils/notifications/notification/base.py +14 -2
  269. mlrun/utils/notifications/notification/console.py +2 -0
  270. mlrun/utils/notifications/notification/git.py +3 -1
  271. mlrun/utils/notifications/notification/ipython.py +3 -1
  272. mlrun/utils/notifications/notification/slack.py +101 -21
  273. mlrun/utils/notifications/notification/webhook.py +11 -1
  274. mlrun/utils/notifications/notification_pusher.py +155 -30
  275. mlrun/utils/retryer.py +208 -0
  276. mlrun/utils/singleton.py +1 -1
  277. mlrun/utils/v3io_clients.py +2 -4
  278. mlrun/utils/version/version.json +2 -2
  279. mlrun/utils/version/version.py +2 -6
  280. {mlrun-1.6.4rc2.dist-info → mlrun-1.7.0rc20.dist-info}/METADATA +31 -19
  281. mlrun-1.7.0rc20.dist-info/RECORD +353 -0
  282. mlrun/kfpops.py +0 -868
  283. mlrun/model_monitoring/batch.py +0 -1095
  284. mlrun/model_monitoring/stores/models/__init__.py +0 -27
  285. mlrun/model_monitoring/stores/sql_model_endpoint_store.py +0 -384
  286. mlrun/platforms/other.py +0 -306
  287. mlrun-1.6.4rc2.dist-info/RECORD +0 -314
  288. {mlrun-1.6.4rc2.dist-info → mlrun-1.7.0rc20.dist-info}/LICENSE +0 -0
  289. {mlrun-1.6.4rc2.dist-info → mlrun-1.7.0rc20.dist-info}/WHEEL +0 -0
  290. {mlrun-1.6.4rc2.dist-info → mlrun-1.7.0rc20.dist-info}/entry_points.txt +0 -0
  291. {mlrun-1.6.4rc2.dist-info → mlrun-1.7.0rc20.dist-info}/top_level.txt +0 -0
@@ -20,18 +20,19 @@ import tempfile
20
20
  import typing
21
21
  import uuid
22
22
 
23
- import kfp.compiler
24
- from kfp import dsl
23
+ import mlrun_pipelines.common.models
24
+ import mlrun_pipelines.patcher
25
25
  from kfp.compiler import compiler
26
+ from mlrun_pipelines.helpers import new_pipe_metadata
26
27
 
27
28
  import mlrun
29
+ import mlrun.common.runtimes.constants
28
30
  import mlrun.common.schemas
29
31
  import mlrun.utils.notifications
30
32
  from mlrun.errors import err_to_str
31
33
  from mlrun.utils import (
32
34
  get_ui_url,
33
35
  logger,
34
- new_pipe_metadata,
35
36
  normalize_workflow_name,
36
37
  retry_until_successful,
37
38
  )
@@ -301,72 +302,6 @@ def _enrich_kfp_pod_security_context(kfp_pod_template, function):
301
302
  }
302
303
 
303
304
 
304
- # When we run pipelines, the kfp.compile.Compile.compile() method takes the decorated function with @dsl.pipeline and
305
- # converts it to a k8s object. As part of the flow in the Compile.compile() method,
306
- # we call _create_and_write_workflow, which builds a dictionary from the workflow and then writes it to a file.
307
- # Unfortunately, the kfp sdk does not provide an API for configuring priority_class_name and other attributes.
308
- # I ran across the following problem when seeking for a method to set the priority_class_name:
309
- # https://github.com/kubeflow/pipelines/issues/3594
310
- # When we patch the _create_and_write_workflow, we can eventually obtain the dictionary right before we write it
311
- # to a file and enrich it with argo compatible fields, make sure you looking for the same argo version we use
312
- # https://github.com/argoproj/argo-workflows/blob/release-2.7/pkg/apis/workflow/v1alpha1/workflow_types.go
313
- def _create_enriched_mlrun_workflow(
314
- self,
315
- pipeline_func: typing.Callable,
316
- pipeline_name: typing.Optional[typing.Text] = None,
317
- pipeline_description: typing.Optional[typing.Text] = None,
318
- params_list: typing.Optional[typing.List[dsl.PipelineParam]] = None,
319
- pipeline_conf: typing.Optional[dsl.PipelineConf] = None,
320
- ):
321
- """Call internal implementation of create_workflow and enrich with mlrun functions attributes"""
322
- workflow = self._original_create_workflow(
323
- pipeline_func, pipeline_name, pipeline_description, params_list, pipeline_conf
324
- )
325
- # We don't want to interrupt the original flow and don't know all the scenarios the function could be called.
326
- # that's why we have try/except on all the code of the enrichment and also specific try/except for errors that
327
- # we know can be raised.
328
- try:
329
- functions = []
330
- if pipeline_context.functions:
331
- try:
332
- functions = pipeline_context.functions.values()
333
- except Exception as err:
334
- logger.debug(
335
- "Unable to retrieve project functions, not enriching workflow with mlrun",
336
- error=err_to_str(err),
337
- )
338
- return workflow
339
-
340
- # enrich each pipeline step with your desire k8s attribute
341
- for kfp_step_template in workflow["spec"]["templates"]:
342
- if kfp_step_template.get("container"):
343
- for function_obj in functions:
344
- # we condition within each function since the comparison between the function and
345
- # the kfp pod may change depending on the attribute type.
346
- _set_function_attribute_on_kfp_pod(
347
- kfp_step_template,
348
- function_obj,
349
- "PriorityClassName",
350
- "priority_class_name",
351
- )
352
- _enrich_kfp_pod_security_context(
353
- kfp_step_template,
354
- function_obj,
355
- )
356
- except mlrun.errors.MLRunInvalidArgumentError:
357
- raise
358
- except Exception as err:
359
- logger.debug(
360
- "Something in the enrichment of kfp pods failed", error=err_to_str(err)
361
- )
362
- return workflow
363
-
364
-
365
- # patching function as class method
366
- kfp.compiler.Compiler._original_create_workflow = kfp.compiler.Compiler._create_workflow
367
- kfp.compiler.Compiler._create_workflow = _create_enriched_mlrun_workflow
368
-
369
-
370
305
  def get_db_function(project, key) -> mlrun.runtimes.BaseRuntime:
371
306
  project_instance, name, tag, hash_key = parse_versioned_object_uri(
372
307
  key, project.metadata.name
@@ -413,6 +348,11 @@ def enrich_function_object(
413
348
  if decorator:
414
349
  decorator(f)
415
350
 
351
+ if project.spec.default_function_node_selector:
352
+ f.enrich_runtime_spec(
353
+ project.spec.default_function_node_selector,
354
+ )
355
+
416
356
  if try_auto_mount:
417
357
  if (
418
358
  decorator and AutoMountType.is_auto_modifier(decorator)
@@ -429,10 +369,10 @@ class _PipelineRunStatus:
429
369
  def __init__(
430
370
  self,
431
371
  run_id: str,
432
- engine: typing.Type["_PipelineRunner"],
372
+ engine: type["_PipelineRunner"],
433
373
  project: "mlrun.projects.MlrunProject",
434
374
  workflow: WorkflowSpec = None,
435
- state: str = "",
375
+ state: mlrun_pipelines.common.models.RunStatuses = "",
436
376
  exc: Exception = None,
437
377
  ):
438
378
  """
@@ -452,7 +392,10 @@ class _PipelineRunStatus:
452
392
 
453
393
  @property
454
394
  def state(self):
455
- if self._state not in mlrun.run.RunStatuses.stable_statuses():
395
+ if (
396
+ self._state
397
+ not in mlrun_pipelines.common.models.RunStatuses.stable_statuses()
398
+ ):
456
399
  self._state = self._engine.get_state(self.run_id, self.project)
457
400
  return self._state
458
401
 
@@ -500,7 +443,7 @@ class _PipelineRunner(abc.ABC):
500
443
  artifact_path=None,
501
444
  namespace=None,
502
445
  source=None,
503
- notifications: typing.List[mlrun.model.Notification] = None,
446
+ notifications: list[mlrun.model.Notification] = None,
504
447
  ) -> _PipelineRunStatus:
505
448
  pass
506
449
 
@@ -517,7 +460,7 @@ class _PipelineRunner(abc.ABC):
517
460
  @staticmethod
518
461
  def _get_handler(workflow_handler, workflow_spec, project, secrets):
519
462
  if not (workflow_handler and callable(workflow_handler)):
520
- workflow_file = workflow_spec.get_source_file(project.spec.context)
463
+ workflow_file = workflow_spec.get_source_file(project.spec.get_code_path())
521
464
  workflow_handler = create_pipeline(
522
465
  project,
523
466
  workflow_file,
@@ -537,6 +480,7 @@ class _PipelineRunner(abc.ABC):
537
480
  timeout=None,
538
481
  expected_statuses=None,
539
482
  notifiers: mlrun.utils.notifications.CustomNotificationPusher = None,
483
+ **kwargs,
540
484
  ):
541
485
  pass
542
486
 
@@ -549,7 +493,7 @@ class _KFPRunner(_PipelineRunner):
549
493
  @classmethod
550
494
  def save(cls, project, workflow_spec: WorkflowSpec, target, artifact_path=None):
551
495
  pipeline_context.set(project, workflow_spec)
552
- workflow_file = workflow_spec.get_source_file(project.spec.context)
496
+ workflow_file = workflow_spec.get_source_file(project.spec.get_code_path())
553
497
  functions = FunctionsDict(project)
554
498
  pipeline = create_pipeline(
555
499
  project,
@@ -578,7 +522,7 @@ class _KFPRunner(_PipelineRunner):
578
522
  artifact_path=None,
579
523
  namespace=None,
580
524
  source=None,
581
- notifications: typing.List[mlrun.model.Notification] = None,
525
+ notifications: list[mlrun.model.Notification] = None,
582
526
  ) -> _PipelineRunStatus:
583
527
  pipeline_context.set(project, workflow_spec)
584
528
  workflow_handler = _PipelineRunner._get_handler(
@@ -668,6 +612,7 @@ class _KFPRunner(_PipelineRunner):
668
612
  timeout=None,
669
613
  expected_statuses=None,
670
614
  notifiers: mlrun.utils.notifications.CustomNotificationPusher = None,
615
+ **kwargs,
671
616
  ):
672
617
  if timeout is None:
673
618
  timeout = 60 * 60
@@ -722,7 +667,7 @@ class _LocalRunner(_PipelineRunner):
722
667
  artifact_path=None,
723
668
  namespace=None,
724
669
  source=None,
725
- notifications: typing.List[mlrun.model.Notification] = None,
670
+ notifications: list[mlrun.model.Notification] = None,
726
671
  ) -> _PipelineRunStatus:
727
672
  pipeline_context.set(project, workflow_spec)
728
673
  workflow_handler = _PipelineRunner._get_handler(
@@ -749,7 +694,7 @@ class _LocalRunner(_PipelineRunner):
749
694
  err = None
750
695
  try:
751
696
  workflow_handler(**workflow_spec.args)
752
- state = mlrun.run.RunStatuses.succeeded
697
+ state = mlrun_pipelines.common.models.RunStatuses.succeeded
753
698
  except Exception as exc:
754
699
  err = exc
755
700
  logger.exception("Workflow run failed")
@@ -757,7 +702,7 @@ class _LocalRunner(_PipelineRunner):
757
702
  f":x: Workflow {workflow_id} run failed!, error: {err_to_str(exc)}",
758
703
  mlrun.common.schemas.NotificationSeverity.ERROR,
759
704
  )
760
- state = mlrun.run.RunStatuses.failed
705
+ state = mlrun_pipelines.common.models.RunStatuses.failed
761
706
  mlrun.run.wait_for_runs_completion(pipeline_context.runs_map.values())
762
707
  project.notifiers.push_pipeline_run_results(
763
708
  pipeline_context.runs_map.values(), state=state
@@ -791,6 +736,7 @@ class _LocalRunner(_PipelineRunner):
791
736
  timeout=None,
792
737
  expected_statuses=None,
793
738
  notifiers: mlrun.utils.notifications.CustomNotificationPusher = None,
739
+ **kwargs,
794
740
  ):
795
741
  pass
796
742
 
@@ -811,7 +757,7 @@ class _RemoteRunner(_PipelineRunner):
811
757
  artifact_path: str = None,
812
758
  namespace: str = None,
813
759
  source: str = None,
814
- notifications: typing.List[mlrun.model.Notification] = None,
760
+ notifications: list[mlrun.model.Notification] = None,
815
761
  ) -> typing.Optional[_PipelineRunStatus]:
816
762
  workflow_name = normalize_workflow_name(name=name, project_name=project.name)
817
763
  workflow_id = None
@@ -916,9 +862,9 @@ class _RemoteRunner(_PipelineRunner):
916
862
  f":x: Workflow {workflow_name} run failed!, error: {err_to_str(exc)}",
917
863
  mlrun.common.schemas.NotificationSeverity.ERROR,
918
864
  )
919
- state = mlrun.run.RunStatuses.failed
865
+ state = mlrun_pipelines.common.models.RunStatuses.failed
920
866
  else:
921
- state = mlrun.run.RunStatuses.succeeded
867
+ state = mlrun_pipelines.common.models.RunStatuses.running
922
868
  project.notifiers.push_pipeline_start_message(
923
869
  project.metadata.name,
924
870
  )
@@ -935,24 +881,47 @@ class _RemoteRunner(_PipelineRunner):
935
881
  @staticmethod
936
882
  def get_run_status(
937
883
  project,
938
- run,
884
+ run: _PipelineRunStatus,
939
885
  timeout=None,
940
886
  expected_statuses=None,
941
887
  notifiers: mlrun.utils.notifications.CustomNotificationPusher = None,
888
+ inner_engine: type[_PipelineRunner] = None,
942
889
  ):
943
- # ignore notifiers, as they are handled by the remote pipeline notifications,
944
- # so overriding with CustomNotificationPusher with empty list of notifiers
945
- state, had_errors, text = _KFPRunner.get_run_status(
946
- project,
947
- run,
948
- timeout,
949
- expected_statuses,
950
- notifiers=mlrun.utils.notifications.CustomNotificationPusher([]),
951
- )
890
+ inner_engine = inner_engine or _KFPRunner
891
+ if inner_engine.engine == _KFPRunner.engine:
892
+ # ignore notifiers for remote notifications, as they are handled by the remote pipeline notifications,
893
+ # so overriding with CustomNotificationPusher with empty list of notifiers or only local notifiers
894
+ local_project_notifiers = list(
895
+ set(mlrun.utils.notifications.NotificationTypes.local()).intersection(
896
+ set(project.notifiers.notifications.keys())
897
+ )
898
+ )
899
+ notifiers = mlrun.utils.notifications.CustomNotificationPusher(
900
+ local_project_notifiers
901
+ )
902
+ return _KFPRunner.get_run_status(
903
+ project,
904
+ run,
905
+ timeout,
906
+ expected_statuses,
907
+ notifiers=notifiers,
908
+ )
952
909
 
953
- # indicate the pipeline status since we don't push the notifications in the remote runner
954
- logger.info(text)
955
- return state, had_errors, text
910
+ elif inner_engine.engine == _LocalRunner.engine:
911
+ mldb = mlrun.db.get_run_db(secrets=project._secrets)
912
+ pipeline_runner_run = mldb.read_run(run.run_id, project=project.name)
913
+ pipeline_runner_run = mlrun.run.RunObject.from_dict(pipeline_runner_run)
914
+ pipeline_runner_run.logs(db=mldb)
915
+ pipeline_runner_run.refresh()
916
+ run._state = mlrun.common.runtimes.constants.RunStates.run_state_to_pipeline_run_status(
917
+ pipeline_runner_run.status.state
918
+ )
919
+ run._exc = pipeline_runner_run.status.error
920
+
921
+ else:
922
+ raise mlrun.errors.MLRunInvalidArgumentError(
923
+ f"Unsupported inner runner engine: {inner_engine.engine}"
924
+ )
956
925
 
957
926
 
958
927
  def create_pipeline(project, pipeline, functions, secrets=None, handler=None):
@@ -1008,7 +977,7 @@ def load_and_run(
1008
977
  save: bool = True,
1009
978
  workflow_name: str = None,
1010
979
  workflow_path: str = None,
1011
- workflow_arguments: typing.Dict[str, typing.Any] = None,
980
+ workflow_arguments: dict[str, typing.Any] = None,
1012
981
  artifact_path: str = None,
1013
982
  workflow_handler: typing.Union[str, typing.Callable] = None,
1014
983
  namespace: str = None,
@@ -1083,7 +1052,7 @@ def load_and_run(
1083
1052
  )
1084
1053
 
1085
1054
  except Exception as exc:
1086
- logger.error("Failed to send slack notification", exc=exc)
1055
+ logger.error("Failed to send slack notification", exc=err_to_str(exc))
1087
1056
 
1088
1057
  raise error
1089
1058
 
@@ -1111,7 +1080,7 @@ def load_and_run(
1111
1080
  context.log_result(key="workflow_id", value=run.run_id)
1112
1081
  context.log_result(key="engine", value=run._engine.engine, commit=True)
1113
1082
 
1114
- if run.state == mlrun.run.RunStatuses.failed:
1083
+ if run.state == mlrun_pipelines.common.models.RunStatuses.failed:
1115
1084
  raise RuntimeError(f"Workflow {workflow_log_message} failed") from run.exc
1116
1085
 
1117
1086
  if wait_for_completion:
@@ -1126,7 +1095,7 @@ def load_and_run(
1126
1095
 
1127
1096
  pipeline_state, _, _ = project.get_run_status(run)
1128
1097
  context.log_result(key="workflow_state", value=pipeline_state, commit=True)
1129
- if pipeline_state != mlrun.run.RunStatuses.succeeded:
1098
+ if pipeline_state != mlrun_pipelines.common.models.RunStatuses.succeeded:
1130
1099
  raise RuntimeError(
1131
1100
  f"Workflow {workflow_log_message} failed, state={pipeline_state}"
1132
1101
  )