mlrun 1.6.4rc7__py3-none-any.whl → 1.7.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of mlrun might be problematic. Click here for more details.

Files changed (305) hide show
  1. mlrun/__init__.py +11 -1
  2. mlrun/__main__.py +40 -122
  3. mlrun/alerts/__init__.py +15 -0
  4. mlrun/alerts/alert.py +248 -0
  5. mlrun/api/schemas/__init__.py +5 -4
  6. mlrun/artifacts/__init__.py +8 -3
  7. mlrun/artifacts/base.py +47 -257
  8. mlrun/artifacts/dataset.py +11 -192
  9. mlrun/artifacts/manager.py +79 -47
  10. mlrun/artifacts/model.py +31 -159
  11. mlrun/artifacts/plots.py +23 -380
  12. mlrun/common/constants.py +74 -1
  13. mlrun/common/db/sql_session.py +5 -5
  14. mlrun/common/formatters/__init__.py +21 -0
  15. mlrun/common/formatters/artifact.py +45 -0
  16. mlrun/common/formatters/base.py +113 -0
  17. mlrun/common/formatters/feature_set.py +33 -0
  18. mlrun/common/formatters/function.py +46 -0
  19. mlrun/common/formatters/pipeline.py +53 -0
  20. mlrun/common/formatters/project.py +51 -0
  21. mlrun/common/formatters/run.py +29 -0
  22. mlrun/common/helpers.py +12 -3
  23. mlrun/common/model_monitoring/helpers.py +9 -5
  24. mlrun/{runtimes → common/runtimes}/constants.py +37 -9
  25. mlrun/common/schemas/__init__.py +31 -5
  26. mlrun/common/schemas/alert.py +202 -0
  27. mlrun/common/schemas/api_gateway.py +196 -0
  28. mlrun/common/schemas/artifact.py +25 -4
  29. mlrun/common/schemas/auth.py +16 -5
  30. mlrun/common/schemas/background_task.py +1 -1
  31. mlrun/common/schemas/client_spec.py +4 -2
  32. mlrun/common/schemas/common.py +7 -4
  33. mlrun/common/schemas/constants.py +3 -0
  34. mlrun/common/schemas/feature_store.py +74 -44
  35. mlrun/common/schemas/frontend_spec.py +15 -7
  36. mlrun/common/schemas/function.py +12 -1
  37. mlrun/common/schemas/hub.py +11 -18
  38. mlrun/common/schemas/memory_reports.py +2 -2
  39. mlrun/common/schemas/model_monitoring/__init__.py +20 -4
  40. mlrun/common/schemas/model_monitoring/constants.py +123 -42
  41. mlrun/common/schemas/model_monitoring/grafana.py +13 -9
  42. mlrun/common/schemas/model_monitoring/model_endpoints.py +101 -54
  43. mlrun/common/schemas/notification.py +71 -14
  44. mlrun/common/schemas/object.py +2 -2
  45. mlrun/{model_monitoring/controller_handler.py → common/schemas/pagination.py} +9 -12
  46. mlrun/common/schemas/pipeline.py +8 -1
  47. mlrun/common/schemas/project.py +69 -18
  48. mlrun/common/schemas/runs.py +7 -1
  49. mlrun/common/schemas/runtime_resource.py +8 -12
  50. mlrun/common/schemas/schedule.py +4 -4
  51. mlrun/common/schemas/tag.py +1 -2
  52. mlrun/common/schemas/workflow.py +12 -4
  53. mlrun/common/types.py +14 -1
  54. mlrun/config.py +154 -69
  55. mlrun/data_types/data_types.py +6 -1
  56. mlrun/data_types/spark.py +2 -2
  57. mlrun/data_types/to_pandas.py +67 -37
  58. mlrun/datastore/__init__.py +6 -8
  59. mlrun/datastore/alibaba_oss.py +131 -0
  60. mlrun/datastore/azure_blob.py +143 -42
  61. mlrun/datastore/base.py +102 -58
  62. mlrun/datastore/datastore.py +34 -13
  63. mlrun/datastore/datastore_profile.py +146 -20
  64. mlrun/datastore/dbfs_store.py +3 -7
  65. mlrun/datastore/filestore.py +1 -4
  66. mlrun/datastore/google_cloud_storage.py +97 -33
  67. mlrun/datastore/hdfs.py +56 -0
  68. mlrun/datastore/inmem.py +6 -3
  69. mlrun/datastore/redis.py +7 -2
  70. mlrun/datastore/s3.py +34 -12
  71. mlrun/datastore/snowflake_utils.py +45 -0
  72. mlrun/datastore/sources.py +303 -111
  73. mlrun/datastore/spark_utils.py +31 -2
  74. mlrun/datastore/store_resources.py +9 -7
  75. mlrun/datastore/storeytargets.py +151 -0
  76. mlrun/datastore/targets.py +453 -176
  77. mlrun/datastore/utils.py +72 -58
  78. mlrun/datastore/v3io.py +6 -1
  79. mlrun/db/base.py +274 -41
  80. mlrun/db/factory.py +1 -1
  81. mlrun/db/httpdb.py +893 -225
  82. mlrun/db/nopdb.py +291 -33
  83. mlrun/errors.py +36 -6
  84. mlrun/execution.py +115 -42
  85. mlrun/feature_store/__init__.py +0 -2
  86. mlrun/feature_store/api.py +65 -73
  87. mlrun/feature_store/common.py +7 -12
  88. mlrun/feature_store/feature_set.py +76 -55
  89. mlrun/feature_store/feature_vector.py +39 -31
  90. mlrun/feature_store/ingestion.py +7 -6
  91. mlrun/feature_store/retrieval/base.py +16 -11
  92. mlrun/feature_store/retrieval/dask_merger.py +2 -0
  93. mlrun/feature_store/retrieval/job.py +13 -4
  94. mlrun/feature_store/retrieval/local_merger.py +2 -0
  95. mlrun/feature_store/retrieval/spark_merger.py +24 -32
  96. mlrun/feature_store/steps.py +45 -34
  97. mlrun/features.py +11 -21
  98. mlrun/frameworks/_common/artifacts_library.py +9 -9
  99. mlrun/frameworks/_common/mlrun_interface.py +5 -5
  100. mlrun/frameworks/_common/model_handler.py +48 -48
  101. mlrun/frameworks/_common/plan.py +5 -6
  102. mlrun/frameworks/_common/producer.py +3 -4
  103. mlrun/frameworks/_common/utils.py +5 -5
  104. mlrun/frameworks/_dl_common/loggers/logger.py +6 -7
  105. mlrun/frameworks/_dl_common/loggers/mlrun_logger.py +9 -9
  106. mlrun/frameworks/_dl_common/loggers/tensorboard_logger.py +23 -47
  107. mlrun/frameworks/_ml_common/artifacts_library.py +1 -2
  108. mlrun/frameworks/_ml_common/loggers/logger.py +3 -4
  109. mlrun/frameworks/_ml_common/loggers/mlrun_logger.py +4 -5
  110. mlrun/frameworks/_ml_common/model_handler.py +24 -24
  111. mlrun/frameworks/_ml_common/pkl_model_server.py +2 -2
  112. mlrun/frameworks/_ml_common/plan.py +2 -2
  113. mlrun/frameworks/_ml_common/plans/calibration_curve_plan.py +2 -3
  114. mlrun/frameworks/_ml_common/plans/confusion_matrix_plan.py +2 -3
  115. mlrun/frameworks/_ml_common/plans/dataset_plan.py +3 -3
  116. mlrun/frameworks/_ml_common/plans/feature_importance_plan.py +3 -3
  117. mlrun/frameworks/_ml_common/plans/roc_curve_plan.py +4 -4
  118. mlrun/frameworks/_ml_common/utils.py +4 -4
  119. mlrun/frameworks/auto_mlrun/auto_mlrun.py +9 -9
  120. mlrun/frameworks/huggingface/model_server.py +4 -4
  121. mlrun/frameworks/lgbm/__init__.py +33 -33
  122. mlrun/frameworks/lgbm/callbacks/callback.py +2 -4
  123. mlrun/frameworks/lgbm/callbacks/logging_callback.py +4 -5
  124. mlrun/frameworks/lgbm/callbacks/mlrun_logging_callback.py +4 -5
  125. mlrun/frameworks/lgbm/mlrun_interfaces/booster_mlrun_interface.py +1 -3
  126. mlrun/frameworks/lgbm/mlrun_interfaces/mlrun_interface.py +6 -6
  127. mlrun/frameworks/lgbm/model_handler.py +10 -10
  128. mlrun/frameworks/lgbm/model_server.py +6 -6
  129. mlrun/frameworks/lgbm/utils.py +5 -5
  130. mlrun/frameworks/onnx/dataset.py +8 -8
  131. mlrun/frameworks/onnx/mlrun_interface.py +3 -3
  132. mlrun/frameworks/onnx/model_handler.py +6 -6
  133. mlrun/frameworks/onnx/model_server.py +7 -7
  134. mlrun/frameworks/parallel_coordinates.py +6 -6
  135. mlrun/frameworks/pytorch/__init__.py +18 -18
  136. mlrun/frameworks/pytorch/callbacks/callback.py +4 -5
  137. mlrun/frameworks/pytorch/callbacks/logging_callback.py +17 -17
  138. mlrun/frameworks/pytorch/callbacks/mlrun_logging_callback.py +11 -11
  139. mlrun/frameworks/pytorch/callbacks/tensorboard_logging_callback.py +23 -29
  140. mlrun/frameworks/pytorch/callbacks_handler.py +38 -38
  141. mlrun/frameworks/pytorch/mlrun_interface.py +20 -20
  142. mlrun/frameworks/pytorch/model_handler.py +17 -17
  143. mlrun/frameworks/pytorch/model_server.py +7 -7
  144. mlrun/frameworks/sklearn/__init__.py +13 -13
  145. mlrun/frameworks/sklearn/estimator.py +4 -4
  146. mlrun/frameworks/sklearn/metrics_library.py +14 -14
  147. mlrun/frameworks/sklearn/mlrun_interface.py +16 -9
  148. mlrun/frameworks/sklearn/model_handler.py +2 -2
  149. mlrun/frameworks/tf_keras/__init__.py +10 -7
  150. mlrun/frameworks/tf_keras/callbacks/logging_callback.py +15 -15
  151. mlrun/frameworks/tf_keras/callbacks/mlrun_logging_callback.py +11 -11
  152. mlrun/frameworks/tf_keras/callbacks/tensorboard_logging_callback.py +19 -23
  153. mlrun/frameworks/tf_keras/mlrun_interface.py +9 -11
  154. mlrun/frameworks/tf_keras/model_handler.py +14 -14
  155. mlrun/frameworks/tf_keras/model_server.py +6 -6
  156. mlrun/frameworks/xgboost/__init__.py +13 -13
  157. mlrun/frameworks/xgboost/model_handler.py +6 -6
  158. mlrun/k8s_utils.py +61 -17
  159. mlrun/launcher/__init__.py +1 -1
  160. mlrun/launcher/base.py +16 -15
  161. mlrun/launcher/client.py +13 -11
  162. mlrun/launcher/factory.py +1 -1
  163. mlrun/launcher/local.py +23 -13
  164. mlrun/launcher/remote.py +17 -10
  165. mlrun/lists.py +7 -6
  166. mlrun/model.py +478 -103
  167. mlrun/model_monitoring/__init__.py +1 -1
  168. mlrun/model_monitoring/api.py +163 -371
  169. mlrun/{runtimes/mpijob/v1alpha1.py → model_monitoring/applications/__init__.py} +9 -15
  170. mlrun/model_monitoring/applications/_application_steps.py +188 -0
  171. mlrun/model_monitoring/applications/base.py +108 -0
  172. mlrun/model_monitoring/applications/context.py +341 -0
  173. mlrun/model_monitoring/{evidently_application.py → applications/evidently_base.py} +27 -22
  174. mlrun/model_monitoring/applications/histogram_data_drift.py +354 -0
  175. mlrun/model_monitoring/applications/results.py +99 -0
  176. mlrun/model_monitoring/controller.py +131 -278
  177. mlrun/model_monitoring/db/__init__.py +18 -0
  178. mlrun/model_monitoring/db/stores/__init__.py +136 -0
  179. mlrun/model_monitoring/db/stores/base/__init__.py +15 -0
  180. mlrun/model_monitoring/db/stores/base/store.py +213 -0
  181. mlrun/model_monitoring/db/stores/sqldb/__init__.py +13 -0
  182. mlrun/model_monitoring/db/stores/sqldb/models/__init__.py +71 -0
  183. mlrun/model_monitoring/db/stores/sqldb/models/base.py +190 -0
  184. mlrun/model_monitoring/db/stores/sqldb/models/mysql.py +103 -0
  185. mlrun/model_monitoring/{stores/models/mysql.py → db/stores/sqldb/models/sqlite.py} +19 -13
  186. mlrun/model_monitoring/db/stores/sqldb/sql_store.py +659 -0
  187. mlrun/model_monitoring/db/stores/v3io_kv/__init__.py +13 -0
  188. mlrun/model_monitoring/db/stores/v3io_kv/kv_store.py +726 -0
  189. mlrun/model_monitoring/db/tsdb/__init__.py +105 -0
  190. mlrun/model_monitoring/db/tsdb/base.py +448 -0
  191. mlrun/model_monitoring/db/tsdb/helpers.py +30 -0
  192. mlrun/model_monitoring/db/tsdb/tdengine/__init__.py +15 -0
  193. mlrun/model_monitoring/db/tsdb/tdengine/schemas.py +279 -0
  194. mlrun/model_monitoring/db/tsdb/tdengine/stream_graph_steps.py +42 -0
  195. mlrun/model_monitoring/db/tsdb/tdengine/tdengine_connector.py +507 -0
  196. mlrun/model_monitoring/db/tsdb/v3io/__init__.py +15 -0
  197. mlrun/model_monitoring/db/tsdb/v3io/stream_graph_steps.py +158 -0
  198. mlrun/model_monitoring/db/tsdb/v3io/v3io_connector.py +849 -0
  199. mlrun/model_monitoring/features_drift_table.py +134 -106
  200. mlrun/model_monitoring/helpers.py +199 -55
  201. mlrun/model_monitoring/metrics/__init__.py +13 -0
  202. mlrun/model_monitoring/metrics/histogram_distance.py +127 -0
  203. mlrun/model_monitoring/model_endpoint.py +3 -2
  204. mlrun/model_monitoring/stream_processing.py +131 -398
  205. mlrun/model_monitoring/tracking_policy.py +9 -2
  206. mlrun/model_monitoring/writer.py +161 -125
  207. mlrun/package/__init__.py +6 -6
  208. mlrun/package/context_handler.py +5 -5
  209. mlrun/package/packager.py +7 -7
  210. mlrun/package/packagers/default_packager.py +8 -8
  211. mlrun/package/packagers/numpy_packagers.py +15 -15
  212. mlrun/package/packagers/pandas_packagers.py +5 -5
  213. mlrun/package/packagers/python_standard_library_packagers.py +10 -10
  214. mlrun/package/packagers_manager.py +19 -23
  215. mlrun/package/utils/_formatter.py +6 -6
  216. mlrun/package/utils/_pickler.py +2 -2
  217. mlrun/package/utils/_supported_format.py +4 -4
  218. mlrun/package/utils/log_hint_utils.py +2 -2
  219. mlrun/package/utils/type_hint_utils.py +4 -9
  220. mlrun/platforms/__init__.py +11 -10
  221. mlrun/platforms/iguazio.py +24 -203
  222. mlrun/projects/operations.py +52 -25
  223. mlrun/projects/pipelines.py +191 -197
  224. mlrun/projects/project.py +1227 -400
  225. mlrun/render.py +16 -19
  226. mlrun/run.py +209 -184
  227. mlrun/runtimes/__init__.py +83 -15
  228. mlrun/runtimes/base.py +51 -35
  229. mlrun/runtimes/daskjob.py +17 -10
  230. mlrun/runtimes/databricks_job/databricks_cancel_task.py +1 -1
  231. mlrun/runtimes/databricks_job/databricks_runtime.py +8 -7
  232. mlrun/runtimes/databricks_job/databricks_wrapper.py +1 -1
  233. mlrun/runtimes/funcdoc.py +1 -29
  234. mlrun/runtimes/function_reference.py +1 -1
  235. mlrun/runtimes/kubejob.py +34 -128
  236. mlrun/runtimes/local.py +40 -11
  237. mlrun/runtimes/mpijob/__init__.py +0 -20
  238. mlrun/runtimes/mpijob/abstract.py +9 -10
  239. mlrun/runtimes/mpijob/v1.py +1 -1
  240. mlrun/{model_monitoring/stores/models/sqlite.py → runtimes/nuclio/__init__.py} +7 -9
  241. mlrun/runtimes/nuclio/api_gateway.py +769 -0
  242. mlrun/runtimes/nuclio/application/__init__.py +15 -0
  243. mlrun/runtimes/nuclio/application/application.py +758 -0
  244. mlrun/runtimes/nuclio/application/reverse_proxy.go +95 -0
  245. mlrun/runtimes/{function.py → nuclio/function.py} +200 -83
  246. mlrun/runtimes/{nuclio.py → nuclio/nuclio.py} +6 -6
  247. mlrun/runtimes/{serving.py → nuclio/serving.py} +65 -68
  248. mlrun/runtimes/pod.py +281 -101
  249. mlrun/runtimes/remotesparkjob.py +12 -9
  250. mlrun/runtimes/sparkjob/spark3job.py +67 -51
  251. mlrun/runtimes/utils.py +41 -75
  252. mlrun/secrets.py +9 -5
  253. mlrun/serving/__init__.py +8 -1
  254. mlrun/serving/remote.py +2 -7
  255. mlrun/serving/routers.py +85 -69
  256. mlrun/serving/server.py +69 -44
  257. mlrun/serving/states.py +209 -36
  258. mlrun/serving/utils.py +22 -14
  259. mlrun/serving/v1_serving.py +6 -7
  260. mlrun/serving/v2_serving.py +129 -54
  261. mlrun/track/tracker.py +2 -1
  262. mlrun/track/tracker_manager.py +3 -3
  263. mlrun/track/trackers/mlflow_tracker.py +6 -2
  264. mlrun/utils/async_http.py +6 -8
  265. mlrun/utils/azure_vault.py +1 -1
  266. mlrun/utils/clones.py +1 -2
  267. mlrun/utils/condition_evaluator.py +3 -3
  268. mlrun/utils/db.py +21 -3
  269. mlrun/utils/helpers.py +405 -225
  270. mlrun/utils/http.py +3 -6
  271. mlrun/utils/logger.py +112 -16
  272. mlrun/utils/notifications/notification/__init__.py +17 -13
  273. mlrun/utils/notifications/notification/base.py +50 -2
  274. mlrun/utils/notifications/notification/console.py +2 -0
  275. mlrun/utils/notifications/notification/git.py +24 -1
  276. mlrun/utils/notifications/notification/ipython.py +3 -1
  277. mlrun/utils/notifications/notification/slack.py +96 -21
  278. mlrun/utils/notifications/notification/webhook.py +59 -2
  279. mlrun/utils/notifications/notification_pusher.py +149 -30
  280. mlrun/utils/regex.py +9 -0
  281. mlrun/utils/retryer.py +208 -0
  282. mlrun/utils/singleton.py +1 -1
  283. mlrun/utils/v3io_clients.py +4 -6
  284. mlrun/utils/version/version.json +2 -2
  285. mlrun/utils/version/version.py +2 -6
  286. mlrun-1.7.0.dist-info/METADATA +378 -0
  287. mlrun-1.7.0.dist-info/RECORD +351 -0
  288. {mlrun-1.6.4rc7.dist-info → mlrun-1.7.0.dist-info}/WHEEL +1 -1
  289. mlrun/feature_store/retrieval/conversion.py +0 -273
  290. mlrun/kfpops.py +0 -868
  291. mlrun/model_monitoring/application.py +0 -310
  292. mlrun/model_monitoring/batch.py +0 -1095
  293. mlrun/model_monitoring/prometheus.py +0 -219
  294. mlrun/model_monitoring/stores/__init__.py +0 -111
  295. mlrun/model_monitoring/stores/kv_model_endpoint_store.py +0 -576
  296. mlrun/model_monitoring/stores/model_endpoint_store.py +0 -147
  297. mlrun/model_monitoring/stores/models/__init__.py +0 -27
  298. mlrun/model_monitoring/stores/models/base.py +0 -84
  299. mlrun/model_monitoring/stores/sql_model_endpoint_store.py +0 -384
  300. mlrun/platforms/other.py +0 -306
  301. mlrun-1.6.4rc7.dist-info/METADATA +0 -272
  302. mlrun-1.6.4rc7.dist-info/RECORD +0 -314
  303. {mlrun-1.6.4rc7.dist-info → mlrun-1.7.0.dist-info}/LICENSE +0 -0
  304. {mlrun-1.6.4rc7.dist-info → mlrun-1.7.0.dist-info}/entry_points.txt +0 -0
  305. {mlrun-1.6.4rc7.dist-info → mlrun-1.7.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,113 @@
1
+ # Copyright 2024 Iguazio
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ #
15
+
16
+ import typing
17
+
18
+ import mlrun.errors
19
+
20
+
21
+ class ObjectFormat:
22
+ """
23
+ MLRun object formatter. Any class that inherits from this class should implement the `format_method` method
24
+ to specify the formatting method for each format.
25
+ A `filter_obj_method` utility method is provided to filter the object based on a list of keys.
26
+ """
27
+
28
+ full = "full"
29
+
30
+ @staticmethod
31
+ def format_method(format_: str) -> typing.Optional[typing.Callable]:
32
+ """
33
+ Get the formatting method for the provided format.
34
+ A `None` value signifies a pass-through formatting method (no formatting).
35
+ :param format_: The format as a string representation.
36
+ :return: The formatting method.
37
+ """
38
+ return {
39
+ ObjectFormat.full: None,
40
+ }[format_]
41
+
42
+ @classmethod
43
+ def format_obj(
44
+ cls,
45
+ obj: typing.Any,
46
+ format_: str,
47
+ exclude_formats: typing.Optional[list[str]] = None,
48
+ ) -> typing.Any:
49
+ """
50
+ Format the provided object based on the provided format.
51
+ :param obj: The object to format.
52
+ :param format_: The format as a string representation.
53
+ :param exclude_formats: A list of formats to exclude from the formatting process. If the provided format is in
54
+ this list, an invalid format exception will be raised.
55
+ """
56
+ exclude_formats = exclude_formats or []
57
+ format_ = format_ or cls.full
58
+ invalid_format_exc = mlrun.errors.MLRunBadRequestError(
59
+ f"Provided format is not supported. format={format_}"
60
+ )
61
+
62
+ if format_ in exclude_formats:
63
+ raise invalid_format_exc
64
+
65
+ try:
66
+ format_method = cls.format_method(format_)
67
+ except KeyError:
68
+ raise invalid_format_exc
69
+
70
+ if not format_method:
71
+ return obj
72
+
73
+ return format_method(obj)
74
+
75
+ @staticmethod
76
+ def filter_obj_method(_filter: list[str]) -> typing.Callable:
77
+ """
78
+ Returns a method that filters the object based on the provided list of keys.
79
+ The keys should be in a dot-separated format, denoting the path within the dictionary to the desired key.
80
+ The object maintains its structure, with the filtered keys and their values, while all other keys are removed.
81
+ :param _filter: The list of keys to filter by.
82
+ Example:
83
+ [
84
+ "kind",
85
+ "metadata.name",
86
+ "spec.something.else",
87
+ ]
88
+
89
+ :return: The filtering method.
90
+ """
91
+
92
+ def _filter_method(obj: dict) -> dict:
93
+ formatted_obj = {}
94
+ for key in _filter:
95
+ key_list = key.split(".")
96
+ obj_recursive_iterator = obj
97
+ formatted_obj_recursive_iterator = formatted_obj
98
+ for idx, key in enumerate(key_list):
99
+ if key not in obj_recursive_iterator:
100
+ break
101
+ value = (
102
+ {} if idx < len(key_list) - 1 else obj_recursive_iterator[key]
103
+ )
104
+ formatted_obj_recursive_iterator.setdefault(key, value)
105
+
106
+ obj_recursive_iterator = obj_recursive_iterator[key]
107
+ formatted_obj_recursive_iterator = formatted_obj_recursive_iterator[
108
+ key
109
+ ]
110
+
111
+ return formatted_obj
112
+
113
+ return _filter_method
@@ -0,0 +1,33 @@
1
+ # Copyright 2024 Iguazio
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ #
15
+
16
+ import typing
17
+
18
+ import mlrun.common.types
19
+
20
+ from .base import ObjectFormat
21
+
22
+
23
+ class FeatureSetFormat(ObjectFormat, mlrun.common.types.StrEnum):
24
+ minimal = "minimal"
25
+
26
+ @staticmethod
27
+ def format_method(_format: str) -> typing.Optional[typing.Callable]:
28
+ return {
29
+ FeatureSetFormat.full: None,
30
+ FeatureSetFormat.minimal: FeatureSetFormat.filter_obj_method(
31
+ ["kind", "metadata", "spec", "status.state"]
32
+ ),
33
+ }[_format]
@@ -0,0 +1,46 @@
1
+ # Copyright 2024 Iguazio
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ #
15
+
16
+ import typing
17
+
18
+ import mlrun.common.types
19
+
20
+ from .base import ObjectFormat
21
+
22
+
23
+ class FunctionFormat(ObjectFormat, mlrun.common.types.StrEnum):
24
+ minimal = "minimal"
25
+
26
+ @staticmethod
27
+ def format_method(_format: str) -> typing.Optional[typing.Callable]:
28
+ return {
29
+ FunctionFormat.full: None,
30
+ FunctionFormat.minimal: FunctionFormat.filter_obj_method(
31
+ [
32
+ "kind",
33
+ "metadata",
34
+ "status",
35
+ "spec.description",
36
+ "spec.command",
37
+ "spec.image",
38
+ "spec.default_handler",
39
+ "spec.default_class",
40
+ "spec.graph",
41
+ "spec.preemption_mode",
42
+ "spec.node_selector",
43
+ "spec.priority_class_name",
44
+ ]
45
+ ),
46
+ }[_format]
@@ -0,0 +1,53 @@
1
+ # Copyright 2024 Iguazio
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ #
15
+
16
+ import typing
17
+
18
+ import mlrun_pipelines.common.ops
19
+ import mlrun_pipelines.models
20
+
21
+ import mlrun.common.types
22
+
23
+ from .base import ObjectFormat
24
+
25
+
26
+ class PipelineFormat(ObjectFormat, mlrun.common.types.StrEnum):
27
+ full = "full"
28
+ metadata_only = "metadata_only"
29
+ name_only = "name_only"
30
+ summary = "summary"
31
+
32
+ @staticmethod
33
+ def format_method(_format: str) -> typing.Optional[typing.Callable]:
34
+ def _full(run: mlrun_pipelines.models.PipelineRun) -> dict:
35
+ return run.to_dict()
36
+
37
+ def _metadata_only(run: mlrun_pipelines.models.PipelineRun) -> dict:
38
+ return mlrun.utils.helpers.format_run(run, with_project=True)
39
+
40
+ def _name_only(run: mlrun_pipelines.models.PipelineRun) -> str:
41
+ return run.get("name")
42
+
43
+ def _summary(run: mlrun_pipelines.models.PipelineRun) -> dict:
44
+ return mlrun_pipelines.common.ops.format_summary_from_kfp_run(
45
+ run, run["project"]
46
+ )
47
+
48
+ return {
49
+ PipelineFormat.full: _full,
50
+ PipelineFormat.metadata_only: _metadata_only,
51
+ PipelineFormat.name_only: _name_only,
52
+ PipelineFormat.summary: _summary,
53
+ }[_format]
@@ -0,0 +1,51 @@
1
+ # Copyright 2024 Iguazio
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ #
15
+
16
+ import typing
17
+
18
+ import mlrun.common.schemas
19
+ import mlrun.common.types
20
+
21
+ from .base import ObjectFormat
22
+
23
+
24
+ class ProjectFormat(ObjectFormat, mlrun.common.types.StrEnum):
25
+ full = "full"
26
+ name_only = "name_only"
27
+ # minimal format removes large fields from the response (e.g. functions, workflows, artifacts)
28
+ # and is used for faster response times (in the UI)
29
+ minimal = "minimal"
30
+ # internal - allowed only in follower mode, only for the leader for upgrade purposes
31
+ leader = "leader"
32
+
33
+ @staticmethod
34
+ def format_method(_format: str) -> typing.Optional[typing.Callable]:
35
+ def _name_only(project: mlrun.common.schemas.Project) -> str:
36
+ return project.metadata.name
37
+
38
+ def _minimal(
39
+ project: mlrun.common.schemas.Project,
40
+ ) -> mlrun.common.schemas.Project:
41
+ project.spec.functions = None
42
+ project.spec.workflows = None
43
+ project.spec.artifacts = None
44
+ return project
45
+
46
+ return {
47
+ ProjectFormat.full: None,
48
+ ProjectFormat.name_only: _name_only,
49
+ ProjectFormat.minimal: _minimal,
50
+ ProjectFormat.leader: None,
51
+ }[_format]
@@ -0,0 +1,29 @@
1
+ # Copyright 2024 Iguazio
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ #
15
+
16
+
17
+ import mlrun.common.types
18
+ from mlrun.common.formatters.base import ObjectFormat
19
+
20
+
21
+ class RunFormat(ObjectFormat, mlrun.common.types.StrEnum):
22
+ # No enrichment, data is pulled as-is from the database.
23
+ standard = "standard"
24
+
25
+ # Enrich run with full notifications since the notification params are subtracted from the run body.
26
+ notifications = "notifications"
27
+
28
+ # Performs run enrichment, including the run's artifacts. Only available for the `get` run API.
29
+ full = "full"
mlrun/common/helpers.py CHANGED
@@ -11,13 +11,11 @@
11
11
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
- #
15
- import typing
16
14
 
17
15
 
18
16
  def parse_versioned_object_uri(
19
17
  uri: str, default_project: str = ""
20
- ) -> typing.Tuple[str, str, str, str]:
18
+ ) -> tuple[str, str, str, str]:
21
19
  project = default_project
22
20
  tag = ""
23
21
  hash_key = ""
@@ -35,3 +33,14 @@ def parse_versioned_object_uri(
35
33
  uri = uri[:loc]
36
34
 
37
35
  return project, uri, tag, hash_key
36
+
37
+
38
+ def generate_api_gateway_name(project: str, name: str) -> str:
39
+ """
40
+ Generate a unique (within project) api gateway name
41
+ :param project: project name
42
+ :param name: api gateway name
43
+
44
+ :return: the resolved api gateway name
45
+ """
46
+ return f"{project}-{name}" if project else name
@@ -16,6 +16,7 @@ import sys
16
16
  import typing
17
17
 
18
18
  import mlrun.common
19
+ import mlrun.common.schemas.model_monitoring.constants as mm_constants
19
20
  from mlrun.common.schemas.model_monitoring import (
20
21
  EndpointUID,
21
22
  FunctionURI,
@@ -64,7 +65,7 @@ def parse_model_endpoint_store_prefix(store_prefix: str):
64
65
 
65
66
 
66
67
  def parse_monitoring_stream_path(
67
- stream_uri: str, project: str, application_name: str = None
68
+ stream_uri: str, project: str, function_name: str = None
68
69
  ):
69
70
  if stream_uri.startswith("kafka://"):
70
71
  if "?topic" in stream_uri:
@@ -72,14 +73,17 @@ def parse_monitoring_stream_path(
72
73
  "Custom kafka topic is not allowed"
73
74
  )
74
75
  # Add topic to stream kafka uri
75
- if application_name is None:
76
+ if (
77
+ function_name is None
78
+ or function_name == mm_constants.MonitoringFunctionNames.STREAM
79
+ ):
76
80
  stream_uri += f"?topic=monitoring_stream_{project}"
77
81
  else:
78
- stream_uri += f"?topic=monitoring_stream_{project}_{application_name}"
82
+ stream_uri += f"?topic=monitoring_stream_{project}_{function_name}"
79
83
 
80
84
  elif stream_uri.startswith("v3io://") and mlrun.mlconf.is_ce_mode():
81
85
  # V3IO is not supported in CE mode, generating a default http stream path
82
- if application_name is None:
86
+ if function_name is None:
83
87
  stream_uri = (
84
88
  mlrun.mlconf.model_endpoint_monitoring.default_http_sink.format(
85
89
  project=project, namespace=mlrun.mlconf.namespace
@@ -89,7 +93,7 @@ def parse_monitoring_stream_path(
89
93
  stream_uri = (
90
94
  mlrun.mlconf.model_endpoint_monitoring.default_http_sink_app.format(
91
95
  project=project,
92
- application_name=application_name,
96
+ application_name=function_name,
93
97
  namespace=mlrun.mlconf.namespace,
94
98
  )
95
99
  )
@@ -15,6 +15,10 @@
15
15
  import enum
16
16
  import typing
17
17
 
18
+ import mlrun_pipelines.common.models
19
+
20
+ import mlrun.common.constants as mlrun_constants
21
+
18
22
 
19
23
  class PodPhases:
20
24
  """
@@ -75,7 +79,7 @@ class ThresholdStates:
75
79
  ]
76
80
 
77
81
  @staticmethod
78
- def from_pod_phase(pod_phase: str, pod: typing.Dict) -> typing.Optional[str]:
82
+ def from_pod_phase(pod_phase: str, pod: dict) -> typing.Optional[str]:
79
83
  if pod_phase == PodPhases.pending:
80
84
  if ThresholdStates.is_pod_in_image_pull_backoff(pod):
81
85
  return ThresholdStates.image_pull_backoff
@@ -90,7 +94,7 @@ class ThresholdStates:
90
94
  return None
91
95
 
92
96
  @staticmethod
93
- def is_pod_scheduled(pod: typing.Dict):
97
+ def is_pod_scheduled(pod: dict):
94
98
  conditions = pod["status"].get("conditions", []) or []
95
99
  for condition in conditions:
96
100
  if condition["type"] == "PodScheduled" and condition["status"] == "True":
@@ -98,7 +102,7 @@ class ThresholdStates:
98
102
  return False
99
103
 
100
104
  @staticmethod
101
- def is_pod_in_image_pull_backoff(pod: typing.Dict):
105
+ def is_pod_in_image_pull_backoff(pod: dict):
102
106
  container_statuses = pod.get("status").get("container_statuses", []) or []
103
107
  for container_status in container_statuses:
104
108
  state_waiting = container_status.get("state", {}).get("waiting", {}) or {}
@@ -107,7 +111,7 @@ class ThresholdStates:
107
111
  return False
108
112
 
109
113
 
110
- class MPIJobCRDVersions(object):
114
+ class MPIJobCRDVersions:
111
115
  v1 = "v1"
112
116
  v1alpha1 = "v1alpha1"
113
117
 
@@ -122,12 +126,12 @@ class MPIJobCRDVersions(object):
122
126
  @staticmethod
123
127
  def role_label_by_version(version):
124
128
  return {
125
- MPIJobCRDVersions.v1alpha1: "mpi_role_type",
126
- MPIJobCRDVersions.v1: "mpi-job-role",
129
+ MPIJobCRDVersions.v1alpha1: mlrun_constants.MLRunInternalLabels.mpi_role_type,
130
+ MPIJobCRDVersions.v1: mlrun_constants.MLRunInternalLabels.mpi_job_role,
127
131
  }[version]
128
132
 
129
133
 
130
- class RunStates(object):
134
+ class RunStates:
131
135
  completed = "completed"
132
136
  error = "error"
133
137
  running = "running"
@@ -136,6 +140,7 @@ class RunStates(object):
136
140
  unknown = "unknown"
137
141
  aborted = "aborted"
138
142
  aborting = "aborting"
143
+ skipped = "skipped"
139
144
 
140
145
  @staticmethod
141
146
  def all():
@@ -148,6 +153,7 @@ class RunStates(object):
148
153
  RunStates.unknown,
149
154
  RunStates.aborted,
150
155
  RunStates.aborting,
156
+ RunStates.skipped,
151
157
  ]
152
158
 
153
159
  @staticmethod
@@ -156,6 +162,7 @@ class RunStates(object):
156
162
  RunStates.completed,
157
163
  RunStates.error,
158
164
  RunStates.aborted,
165
+ RunStates.skipped,
159
166
  ]
160
167
 
161
168
  @staticmethod
@@ -188,10 +195,31 @@ class RunStates(object):
188
195
  # TODO: add aborting state once we have it
189
196
  ]
190
197
 
198
+ @staticmethod
199
+ def run_state_to_pipeline_run_status(run_state: str):
200
+ if not run_state:
201
+ return mlrun_pipelines.common.models.RunStatuses.runtime_state_unspecified
191
202
 
203
+ if run_state not in RunStates.all():
204
+ raise ValueError(f"Invalid run state: {run_state}")
205
+
206
+ return {
207
+ RunStates.completed: mlrun_pipelines.common.models.RunStatuses.succeeded,
208
+ RunStates.error: mlrun_pipelines.common.models.RunStatuses.failed,
209
+ RunStates.running: mlrun_pipelines.common.models.RunStatuses.running,
210
+ RunStates.created: mlrun_pipelines.common.models.RunStatuses.pending,
211
+ RunStates.pending: mlrun_pipelines.common.models.RunStatuses.pending,
212
+ RunStates.unknown: mlrun_pipelines.common.models.RunStatuses.runtime_state_unspecified,
213
+ RunStates.aborted: mlrun_pipelines.common.models.RunStatuses.canceled,
214
+ RunStates.aborting: mlrun_pipelines.common.models.RunStatuses.canceling,
215
+ RunStates.skipped: mlrun_pipelines.common.models.RunStatuses.skipped,
216
+ }[run_state]
217
+
218
+
219
+ # TODO: remove this class in 1.9.0 - use only MlrunInternalLabels
192
220
  class RunLabels(enum.Enum):
193
- owner = "owner"
194
- v3io_user = "v3io_user"
221
+ owner = mlrun_constants.MLRunInternalLabels.owner
222
+ v3io_user = mlrun_constants.MLRunInternalLabels.v3io_user
195
223
 
196
224
  @staticmethod
197
225
  def all():
@@ -14,12 +14,29 @@
14
14
  #
15
15
  # flake8: noqa - this is until we take care of the F401 violations with respect to __all__ & sphinx
16
16
 
17
+ from .alert import (
18
+ AlertActiveState,
19
+ AlertConfig,
20
+ AlertNotification,
21
+ AlertTemplate,
22
+ Event,
23
+ )
24
+ from .api_gateway import (
25
+ APIGateway,
26
+ APIGatewayAuthenticationMode,
27
+ APIGatewayBasicAuth,
28
+ APIGatewayMetadata,
29
+ APIGatewaysOutput,
30
+ APIGatewaySpec,
31
+ APIGatewayState,
32
+ APIGatewayStatus,
33
+ APIGatewayUpstream,
34
+ )
17
35
  from .artifact import (
18
36
  Artifact,
19
37
  ArtifactCategories,
20
38
  ArtifactIdentifier,
21
39
  ArtifactMetadata,
22
- ArtifactsFormat,
23
40
  ArtifactSpec,
24
41
  )
25
42
  from .auth import (
@@ -65,6 +82,7 @@ from .events import (
65
82
  )
66
83
  from .feature_store import (
67
84
  EntitiesOutput,
85
+ EntitiesOutputV2,
68
86
  Entity,
69
87
  EntityListOutput,
70
88
  EntityRecord,
@@ -73,7 +91,9 @@ from .feature_store import (
73
91
  FeatureRecord,
74
92
  FeatureSet,
75
93
  FeatureSetDigestOutput,
94
+ FeatureSetDigestOutputV2,
76
95
  FeatureSetDigestSpec,
96
+ FeatureSetDigestSpecV2,
77
97
  FeatureSetIngestInput,
78
98
  FeatureSetIngestOutput,
79
99
  FeatureSetRecord,
@@ -81,12 +101,14 @@ from .feature_store import (
81
101
  FeatureSetSpec,
82
102
  FeatureSetsTagsOutput,
83
103
  FeaturesOutput,
104
+ FeaturesOutputV2,
84
105
  FeatureVector,
85
106
  FeatureVectorRecord,
86
107
  FeatureVectorsOutput,
87
108
  FeatureVectorsTagsOutput,
88
109
  )
89
110
  from .frontend_spec import (
111
+ ArtifactLimits,
90
112
  AuthenticationFeatureFlag,
91
113
  FeatureFlags,
92
114
  FrontendSpec,
@@ -130,7 +152,8 @@ from .model_monitoring import (
130
152
  ModelMonitoringMode,
131
153
  ModelMonitoringStoreKinds,
132
154
  MonitoringFunctionNames,
133
- TimeSeriesTarget,
155
+ TSDBTarget,
156
+ V3IOTSDBTables,
134
157
  )
135
158
  from .notification import (
136
159
  Notification,
@@ -140,23 +163,26 @@ from .notification import (
140
163
  SetNotificationRequest,
141
164
  )
142
165
  from .object import ObjectKind, ObjectMetadata, ObjectSpec, ObjectStatus
143
- from .pipeline import PipelinesFormat, PipelinesOutput, PipelinesPagination
166
+ from .pagination import PaginationInfo
167
+ from .pipeline import PipelinesOutput, PipelinesPagination
144
168
  from .project import (
145
169
  IguazioProject,
146
170
  Project,
147
171
  ProjectDesiredState,
148
172
  ProjectMetadata,
173
+ ProjectOut,
174
+ ProjectOutput,
149
175
  ProjectOwner,
150
- ProjectsFormat,
151
176
  ProjectsOutput,
152
177
  ProjectSpec,
178
+ ProjectSpecOut,
153
179
  ProjectState,
154
180
  ProjectStatus,
155
181
  ProjectSummariesOutput,
156
182
  ProjectSummary,
157
183
  )
158
184
  from .regex import RegexMatchModes
159
- from .runs import RunIdentifier, RunsFormat
185
+ from .runs import RunIdentifier
160
186
  from .runtime_resource import (
161
187
  GroupedByJobRuntimeResourcesOutput,
162
188
  GroupedByProjectRuntimeResourcesOutput,