mlrun 1.3.3rc1__py3-none-any.whl → 1.4.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 (444) hide show
  1. mlrun/__init__.py +3 -3
  2. mlrun/__main__.py +79 -37
  3. mlrun/api/__init__.py +1 -1
  4. mlrun/api/api/__init__.py +1 -1
  5. mlrun/api/api/api.py +4 -4
  6. mlrun/api/api/deps.py +10 -21
  7. mlrun/api/api/endpoints/__init__.py +1 -1
  8. mlrun/api/api/endpoints/artifacts.py +64 -36
  9. mlrun/api/api/endpoints/auth.py +4 -4
  10. mlrun/api/api/endpoints/background_tasks.py +11 -11
  11. mlrun/api/api/endpoints/client_spec.py +5 -5
  12. mlrun/api/api/endpoints/clusterization_spec.py +6 -4
  13. mlrun/api/api/endpoints/feature_store.py +124 -115
  14. mlrun/api/api/endpoints/files.py +22 -14
  15. mlrun/api/api/endpoints/frontend_spec.py +28 -21
  16. mlrun/api/api/endpoints/functions.py +142 -87
  17. mlrun/api/api/endpoints/grafana_proxy.py +89 -442
  18. mlrun/api/api/endpoints/healthz.py +20 -7
  19. mlrun/api/api/endpoints/hub.py +320 -0
  20. mlrun/api/api/endpoints/internal/__init__.py +1 -1
  21. mlrun/api/api/endpoints/internal/config.py +1 -1
  22. mlrun/api/api/endpoints/internal/memory_reports.py +9 -9
  23. mlrun/api/api/endpoints/logs.py +11 -11
  24. mlrun/api/api/endpoints/model_endpoints.py +74 -70
  25. mlrun/api/api/endpoints/operations.py +13 -9
  26. mlrun/api/api/endpoints/pipelines.py +93 -88
  27. mlrun/api/api/endpoints/projects.py +35 -35
  28. mlrun/api/api/endpoints/runs.py +69 -27
  29. mlrun/api/api/endpoints/runtime_resources.py +28 -28
  30. mlrun/api/api/endpoints/schedules.py +98 -41
  31. mlrun/api/api/endpoints/secrets.py +37 -32
  32. mlrun/api/api/endpoints/submit.py +12 -12
  33. mlrun/api/api/endpoints/tags.py +20 -22
  34. mlrun/api/api/utils.py +251 -42
  35. mlrun/api/constants.py +1 -1
  36. mlrun/api/crud/__init__.py +18 -15
  37. mlrun/api/crud/artifacts.py +10 -10
  38. mlrun/api/crud/client_spec.py +4 -4
  39. mlrun/api/crud/clusterization_spec.py +3 -3
  40. mlrun/api/crud/feature_store.py +54 -46
  41. mlrun/api/crud/functions.py +3 -3
  42. mlrun/api/crud/hub.py +312 -0
  43. mlrun/api/crud/logs.py +11 -9
  44. mlrun/api/crud/model_monitoring/__init__.py +3 -3
  45. mlrun/api/crud/model_monitoring/grafana.py +435 -0
  46. mlrun/api/crud/model_monitoring/model_endpoints.py +352 -129
  47. mlrun/api/crud/notifications.py +149 -0
  48. mlrun/api/crud/pipelines.py +67 -52
  49. mlrun/api/crud/projects.py +51 -23
  50. mlrun/api/crud/runs.py +7 -5
  51. mlrun/api/crud/runtime_resources.py +13 -13
  52. mlrun/api/{db/filedb → crud/runtimes}/__init__.py +1 -1
  53. mlrun/api/crud/runtimes/nuclio/__init__.py +14 -0
  54. mlrun/api/crud/runtimes/nuclio/function.py +505 -0
  55. mlrun/api/crud/runtimes/nuclio/helpers.py +310 -0
  56. mlrun/api/crud/secrets.py +88 -46
  57. mlrun/api/crud/tags.py +5 -5
  58. mlrun/api/db/__init__.py +1 -1
  59. mlrun/api/db/base.py +102 -54
  60. mlrun/api/db/init_db.py +2 -3
  61. mlrun/api/db/session.py +4 -12
  62. mlrun/api/db/sqldb/__init__.py +1 -1
  63. mlrun/api/db/sqldb/db.py +439 -196
  64. mlrun/api/db/sqldb/helpers.py +1 -1
  65. mlrun/api/db/sqldb/models/__init__.py +3 -3
  66. mlrun/api/db/sqldb/models/models_mysql.py +82 -64
  67. mlrun/api/db/sqldb/models/models_sqlite.py +76 -64
  68. mlrun/api/db/sqldb/session.py +27 -20
  69. mlrun/api/initial_data.py +82 -24
  70. mlrun/api/launcher.py +196 -0
  71. mlrun/api/main.py +91 -22
  72. mlrun/api/middlewares.py +6 -5
  73. mlrun/api/migrations_mysql/env.py +1 -1
  74. mlrun/api/migrations_mysql/versions/28383af526f3_market_place_to_hub.py +40 -0
  75. mlrun/api/migrations_mysql/versions/32bae1b0e29c_increase_timestamp_fields_precision.py +1 -1
  76. mlrun/api/migrations_mysql/versions/4903aef6a91d_tag_foreign_key_and_cascades.py +1 -1
  77. mlrun/api/migrations_mysql/versions/5f1351c88a19_adding_background_tasks_table.py +1 -1
  78. mlrun/api/migrations_mysql/versions/88e656800d6a_add_requested_logs_column_and_index_to_.py +1 -1
  79. mlrun/api/migrations_mysql/versions/9d16de5f03a7_adding_data_versions_table.py +1 -1
  80. mlrun/api/migrations_mysql/versions/b86f5b53f3d7_adding_name_and_updated_to_runs_table.py +1 -1
  81. mlrun/api/migrations_mysql/versions/c4af40b0bf61_init.py +1 -1
  82. mlrun/api/migrations_mysql/versions/c905d15bd91d_notifications.py +72 -0
  83. mlrun/api/migrations_mysql/versions/ee041e8fdaa0_adding_next_run_time_column_to_schedule_.py +1 -1
  84. mlrun/api/migrations_sqlite/env.py +1 -1
  85. mlrun/api/migrations_sqlite/versions/11f8dd2dc9fe_init.py +1 -1
  86. mlrun/api/migrations_sqlite/versions/1c954f8cb32d_schedule_last_run_uri.py +1 -1
  87. mlrun/api/migrations_sqlite/versions/2b6d23c715aa_adding_feature_sets.py +1 -1
  88. mlrun/api/migrations_sqlite/versions/4acd9430b093_market_place_to_hub.py +77 -0
  89. mlrun/api/migrations_sqlite/versions/6401142f2d7c_adding_next_run_time_column_to_schedule_.py +1 -1
  90. mlrun/api/migrations_sqlite/versions/64d90a1a69bc_adding_background_tasks_table.py +1 -1
  91. mlrun/api/migrations_sqlite/versions/803438ecd005_add_requested_logs_column_to_runs.py +1 -1
  92. mlrun/api/migrations_sqlite/versions/863114f0c659_refactoring_feature_set.py +1 -1
  93. mlrun/api/migrations_sqlite/versions/959ae00528ad_notifications.py +63 -0
  94. mlrun/api/migrations_sqlite/versions/accf9fc83d38_adding_data_versions_table.py +1 -1
  95. mlrun/api/migrations_sqlite/versions/b68e8e897a28_schedule_labels.py +1 -1
  96. mlrun/api/migrations_sqlite/versions/bcd0c1f9720c_adding_project_labels.py +1 -1
  97. mlrun/api/migrations_sqlite/versions/cf21882f938e_schedule_id.py +1 -1
  98. mlrun/api/migrations_sqlite/versions/d781f58f607f_tag_object_name_string.py +1 -1
  99. mlrun/api/migrations_sqlite/versions/deac06871ace_adding_marketplace_sources_table.py +1 -1
  100. mlrun/api/migrations_sqlite/versions/e1dd5983c06b_schedule_concurrency_limit.py +1 -1
  101. mlrun/api/migrations_sqlite/versions/e5594ed3ab53_adding_name_and_updated_to_runs_table.py +1 -1
  102. mlrun/api/migrations_sqlite/versions/f4249b4ba6fa_adding_feature_vectors.py +1 -1
  103. mlrun/api/migrations_sqlite/versions/f7b5a1a03629_adding_feature_labels.py +1 -1
  104. mlrun/api/schemas/__init__.py +216 -138
  105. mlrun/api/utils/__init__.py +1 -1
  106. mlrun/api/utils/asyncio.py +1 -1
  107. mlrun/api/utils/auth/__init__.py +1 -1
  108. mlrun/api/utils/auth/providers/__init__.py +1 -1
  109. mlrun/api/utils/auth/providers/base.py +7 -7
  110. mlrun/api/utils/auth/providers/nop.py +6 -7
  111. mlrun/api/utils/auth/providers/opa.py +17 -17
  112. mlrun/api/utils/auth/verifier.py +36 -34
  113. mlrun/api/utils/background_tasks.py +24 -24
  114. mlrun/{builder.py → api/utils/builder.py} +216 -123
  115. mlrun/api/utils/clients/__init__.py +1 -1
  116. mlrun/api/utils/clients/chief.py +19 -4
  117. mlrun/api/utils/clients/iguazio.py +106 -60
  118. mlrun/api/utils/clients/log_collector.py +1 -1
  119. mlrun/api/utils/clients/nuclio.py +23 -23
  120. mlrun/api/utils/clients/protocols/grpc.py +2 -2
  121. mlrun/api/utils/db/__init__.py +1 -1
  122. mlrun/api/utils/db/alembic.py +1 -1
  123. mlrun/api/utils/db/backup.py +1 -1
  124. mlrun/api/utils/db/mysql.py +24 -25
  125. mlrun/api/utils/db/sql_collation.py +1 -1
  126. mlrun/api/utils/db/sqlite_migration.py +2 -2
  127. mlrun/api/utils/events/__init__.py +14 -0
  128. mlrun/api/utils/events/base.py +57 -0
  129. mlrun/api/utils/events/events_factory.py +41 -0
  130. mlrun/api/utils/events/iguazio.py +217 -0
  131. mlrun/api/utils/events/nop.py +55 -0
  132. mlrun/api/utils/helpers.py +16 -13
  133. mlrun/api/utils/memory_reports.py +1 -1
  134. mlrun/api/utils/periodic.py +6 -3
  135. mlrun/api/utils/projects/__init__.py +1 -1
  136. mlrun/api/utils/projects/follower.py +33 -33
  137. mlrun/api/utils/projects/leader.py +36 -34
  138. mlrun/api/utils/projects/member.py +27 -27
  139. mlrun/api/utils/projects/remotes/__init__.py +1 -1
  140. mlrun/api/utils/projects/remotes/follower.py +13 -13
  141. mlrun/api/utils/projects/remotes/leader.py +10 -10
  142. mlrun/api/utils/projects/remotes/nop_follower.py +27 -21
  143. mlrun/api/utils/projects/remotes/nop_leader.py +17 -16
  144. mlrun/api/utils/scheduler.py +140 -51
  145. mlrun/api/utils/singletons/__init__.py +1 -1
  146. mlrun/api/utils/singletons/db.py +9 -15
  147. mlrun/api/utils/singletons/k8s.py +677 -5
  148. mlrun/api/utils/singletons/logs_dir.py +1 -1
  149. mlrun/api/utils/singletons/project_member.py +1 -1
  150. mlrun/api/utils/singletons/scheduler.py +1 -1
  151. mlrun/artifacts/__init__.py +2 -2
  152. mlrun/artifacts/base.py +8 -2
  153. mlrun/artifacts/dataset.py +5 -3
  154. mlrun/artifacts/manager.py +7 -1
  155. mlrun/artifacts/model.py +15 -4
  156. mlrun/artifacts/plots.py +1 -1
  157. mlrun/common/__init__.py +1 -1
  158. mlrun/common/constants.py +15 -0
  159. mlrun/common/model_monitoring.py +209 -0
  160. mlrun/common/schemas/__init__.py +167 -0
  161. mlrun/{api → common}/schemas/artifact.py +13 -14
  162. mlrun/{api → common}/schemas/auth.py +10 -8
  163. mlrun/{api → common}/schemas/background_task.py +3 -3
  164. mlrun/{api → common}/schemas/client_spec.py +1 -1
  165. mlrun/{api → common}/schemas/clusterization_spec.py +3 -3
  166. mlrun/{api → common}/schemas/constants.py +21 -8
  167. mlrun/common/schemas/events.py +36 -0
  168. mlrun/{api → common}/schemas/feature_store.py +2 -1
  169. mlrun/{api → common}/schemas/frontend_spec.py +7 -6
  170. mlrun/{api → common}/schemas/function.py +5 -5
  171. mlrun/{api → common}/schemas/http.py +3 -3
  172. mlrun/common/schemas/hub.py +134 -0
  173. mlrun/{api → common}/schemas/k8s.py +3 -3
  174. mlrun/{api → common}/schemas/memory_reports.py +1 -1
  175. mlrun/common/schemas/model_endpoints.py +342 -0
  176. mlrun/common/schemas/notification.py +57 -0
  177. mlrun/{api → common}/schemas/object.py +6 -6
  178. mlrun/{api → common}/schemas/pipeline.py +3 -3
  179. mlrun/{api → common}/schemas/project.py +6 -5
  180. mlrun/common/schemas/regex.py +24 -0
  181. mlrun/common/schemas/runs.py +30 -0
  182. mlrun/{api → common}/schemas/runtime_resource.py +3 -3
  183. mlrun/{api → common}/schemas/schedule.py +19 -7
  184. mlrun/{api → common}/schemas/secret.py +3 -3
  185. mlrun/{api → common}/schemas/tag.py +2 -2
  186. mlrun/common/types.py +25 -0
  187. mlrun/config.py +152 -20
  188. mlrun/data_types/__init__.py +7 -2
  189. mlrun/data_types/data_types.py +4 -2
  190. mlrun/data_types/infer.py +1 -1
  191. mlrun/data_types/spark.py +10 -3
  192. mlrun/datastore/__init__.py +10 -3
  193. mlrun/datastore/azure_blob.py +1 -1
  194. mlrun/datastore/base.py +185 -53
  195. mlrun/datastore/datastore.py +1 -1
  196. mlrun/datastore/filestore.py +1 -1
  197. mlrun/datastore/google_cloud_storage.py +1 -1
  198. mlrun/datastore/inmem.py +4 -1
  199. mlrun/datastore/redis.py +1 -1
  200. mlrun/datastore/s3.py +1 -1
  201. mlrun/datastore/sources.py +192 -70
  202. mlrun/datastore/spark_udf.py +44 -0
  203. mlrun/datastore/store_resources.py +4 -4
  204. mlrun/datastore/targets.py +115 -45
  205. mlrun/datastore/utils.py +127 -5
  206. mlrun/datastore/v3io.py +1 -1
  207. mlrun/datastore/wasbfs/__init__.py +1 -1
  208. mlrun/datastore/wasbfs/fs.py +1 -1
  209. mlrun/db/__init__.py +7 -5
  210. mlrun/db/base.py +112 -68
  211. mlrun/db/httpdb.py +445 -277
  212. mlrun/db/nopdb.py +491 -0
  213. mlrun/db/sqldb.py +112 -65
  214. mlrun/errors.py +6 -1
  215. mlrun/execution.py +44 -22
  216. mlrun/feature_store/__init__.py +1 -1
  217. mlrun/feature_store/api.py +143 -95
  218. mlrun/feature_store/common.py +16 -20
  219. mlrun/feature_store/feature_set.py +42 -12
  220. mlrun/feature_store/feature_vector.py +32 -21
  221. mlrun/feature_store/ingestion.py +9 -12
  222. mlrun/feature_store/retrieval/__init__.py +3 -2
  223. mlrun/feature_store/retrieval/base.py +388 -66
  224. mlrun/feature_store/retrieval/dask_merger.py +63 -151
  225. mlrun/feature_store/retrieval/job.py +30 -12
  226. mlrun/feature_store/retrieval/local_merger.py +40 -133
  227. mlrun/feature_store/retrieval/spark_merger.py +129 -127
  228. mlrun/feature_store/retrieval/storey_merger.py +173 -0
  229. mlrun/feature_store/steps.py +132 -15
  230. mlrun/features.py +8 -3
  231. mlrun/frameworks/__init__.py +1 -1
  232. mlrun/frameworks/_common/__init__.py +1 -1
  233. mlrun/frameworks/_common/artifacts_library.py +1 -1
  234. mlrun/frameworks/_common/mlrun_interface.py +1 -1
  235. mlrun/frameworks/_common/model_handler.py +1 -1
  236. mlrun/frameworks/_common/plan.py +1 -1
  237. mlrun/frameworks/_common/producer.py +1 -1
  238. mlrun/frameworks/_common/utils.py +1 -1
  239. mlrun/frameworks/_dl_common/__init__.py +1 -1
  240. mlrun/frameworks/_dl_common/loggers/__init__.py +1 -1
  241. mlrun/frameworks/_dl_common/loggers/logger.py +1 -1
  242. mlrun/frameworks/_dl_common/loggers/mlrun_logger.py +1 -1
  243. mlrun/frameworks/_dl_common/loggers/tensorboard_logger.py +1 -1
  244. mlrun/frameworks/_dl_common/model_handler.py +1 -1
  245. mlrun/frameworks/_dl_common/utils.py +1 -1
  246. mlrun/frameworks/_ml_common/__init__.py +1 -1
  247. mlrun/frameworks/_ml_common/artifacts_library.py +1 -1
  248. mlrun/frameworks/_ml_common/loggers/__init__.py +1 -1
  249. mlrun/frameworks/_ml_common/loggers/logger.py +1 -1
  250. mlrun/frameworks/_ml_common/loggers/mlrun_logger.py +1 -1
  251. mlrun/frameworks/_ml_common/model_handler.py +1 -1
  252. mlrun/frameworks/_ml_common/pkl_model_server.py +13 -1
  253. mlrun/frameworks/_ml_common/plan.py +1 -1
  254. mlrun/frameworks/_ml_common/plans/__init__.py +1 -1
  255. mlrun/frameworks/_ml_common/plans/calibration_curve_plan.py +1 -6
  256. mlrun/frameworks/_ml_common/plans/confusion_matrix_plan.py +1 -1
  257. mlrun/frameworks/_ml_common/plans/dataset_plan.py +1 -1
  258. mlrun/frameworks/_ml_common/plans/feature_importance_plan.py +1 -1
  259. mlrun/frameworks/_ml_common/plans/roc_curve_plan.py +1 -1
  260. mlrun/frameworks/_ml_common/producer.py +1 -1
  261. mlrun/frameworks/_ml_common/utils.py +1 -1
  262. mlrun/frameworks/auto_mlrun/__init__.py +1 -1
  263. mlrun/frameworks/auto_mlrun/auto_mlrun.py +1 -1
  264. mlrun/frameworks/huggingface/__init__.py +1 -1
  265. mlrun/frameworks/huggingface/model_server.py +1 -1
  266. mlrun/frameworks/lgbm/__init__.py +1 -1
  267. mlrun/frameworks/lgbm/callbacks/__init__.py +1 -1
  268. mlrun/frameworks/lgbm/callbacks/callback.py +1 -1
  269. mlrun/frameworks/lgbm/callbacks/logging_callback.py +1 -1
  270. mlrun/frameworks/lgbm/callbacks/mlrun_logging_callback.py +1 -1
  271. mlrun/frameworks/lgbm/mlrun_interfaces/__init__.py +1 -1
  272. mlrun/frameworks/lgbm/mlrun_interfaces/booster_mlrun_interface.py +1 -1
  273. mlrun/frameworks/lgbm/mlrun_interfaces/mlrun_interface.py +1 -1
  274. mlrun/frameworks/lgbm/mlrun_interfaces/model_mlrun_interface.py +1 -1
  275. mlrun/frameworks/lgbm/model_handler.py +1 -1
  276. mlrun/frameworks/lgbm/model_server.py +1 -1
  277. mlrun/frameworks/lgbm/utils.py +1 -1
  278. mlrun/frameworks/onnx/__init__.py +1 -1
  279. mlrun/frameworks/onnx/dataset.py +1 -1
  280. mlrun/frameworks/onnx/mlrun_interface.py +1 -1
  281. mlrun/frameworks/onnx/model_handler.py +1 -1
  282. mlrun/frameworks/onnx/model_server.py +1 -1
  283. mlrun/frameworks/parallel_coordinates.py +1 -1
  284. mlrun/frameworks/pytorch/__init__.py +1 -1
  285. mlrun/frameworks/pytorch/callbacks/__init__.py +1 -1
  286. mlrun/frameworks/pytorch/callbacks/callback.py +1 -1
  287. mlrun/frameworks/pytorch/callbacks/logging_callback.py +1 -1
  288. mlrun/frameworks/pytorch/callbacks/mlrun_logging_callback.py +1 -1
  289. mlrun/frameworks/pytorch/callbacks/tensorboard_logging_callback.py +1 -1
  290. mlrun/frameworks/pytorch/callbacks_handler.py +1 -1
  291. mlrun/frameworks/pytorch/mlrun_interface.py +1 -1
  292. mlrun/frameworks/pytorch/model_handler.py +1 -1
  293. mlrun/frameworks/pytorch/model_server.py +1 -1
  294. mlrun/frameworks/pytorch/utils.py +1 -1
  295. mlrun/frameworks/sklearn/__init__.py +1 -1
  296. mlrun/frameworks/sklearn/estimator.py +1 -1
  297. mlrun/frameworks/sklearn/metric.py +1 -1
  298. mlrun/frameworks/sklearn/metrics_library.py +1 -1
  299. mlrun/frameworks/sklearn/mlrun_interface.py +1 -1
  300. mlrun/frameworks/sklearn/model_handler.py +1 -1
  301. mlrun/frameworks/sklearn/utils.py +1 -1
  302. mlrun/frameworks/tf_keras/__init__.py +1 -1
  303. mlrun/frameworks/tf_keras/callbacks/__init__.py +1 -1
  304. mlrun/frameworks/tf_keras/callbacks/logging_callback.py +1 -1
  305. mlrun/frameworks/tf_keras/callbacks/mlrun_logging_callback.py +1 -1
  306. mlrun/frameworks/tf_keras/callbacks/tensorboard_logging_callback.py +1 -1
  307. mlrun/frameworks/tf_keras/mlrun_interface.py +1 -1
  308. mlrun/frameworks/tf_keras/model_handler.py +1 -1
  309. mlrun/frameworks/tf_keras/model_server.py +1 -1
  310. mlrun/frameworks/tf_keras/utils.py +1 -1
  311. mlrun/frameworks/xgboost/__init__.py +1 -1
  312. mlrun/frameworks/xgboost/mlrun_interface.py +1 -1
  313. mlrun/frameworks/xgboost/model_handler.py +1 -1
  314. mlrun/frameworks/xgboost/utils.py +1 -1
  315. mlrun/k8s_utils.py +14 -765
  316. mlrun/kfpops.py +14 -17
  317. mlrun/launcher/__init__.py +13 -0
  318. mlrun/launcher/base.py +406 -0
  319. mlrun/launcher/client.py +159 -0
  320. mlrun/launcher/factory.py +50 -0
  321. mlrun/launcher/local.py +276 -0
  322. mlrun/launcher/remote.py +178 -0
  323. mlrun/lists.py +10 -2
  324. mlrun/mlutils/__init__.py +1 -1
  325. mlrun/mlutils/data.py +1 -1
  326. mlrun/mlutils/models.py +1 -1
  327. mlrun/mlutils/plots.py +1 -1
  328. mlrun/model.py +252 -14
  329. mlrun/model_monitoring/__init__.py +41 -0
  330. mlrun/model_monitoring/features_drift_table.py +1 -1
  331. mlrun/model_monitoring/helpers.py +123 -38
  332. mlrun/model_monitoring/model_endpoint.py +144 -0
  333. mlrun/model_monitoring/model_monitoring_batch.py +310 -259
  334. mlrun/model_monitoring/stores/__init__.py +106 -0
  335. mlrun/model_monitoring/stores/kv_model_endpoint_store.py +448 -0
  336. mlrun/model_monitoring/stores/model_endpoint_store.py +147 -0
  337. mlrun/model_monitoring/stores/models/__init__.py +23 -0
  338. mlrun/model_monitoring/stores/models/base.py +18 -0
  339. mlrun/model_monitoring/stores/models/mysql.py +100 -0
  340. mlrun/model_monitoring/stores/models/sqlite.py +98 -0
  341. mlrun/model_monitoring/stores/sql_model_endpoint_store.py +370 -0
  342. mlrun/model_monitoring/stream_processing_fs.py +239 -271
  343. mlrun/package/__init__.py +163 -0
  344. mlrun/package/context_handler.py +325 -0
  345. mlrun/package/errors.py +47 -0
  346. mlrun/package/packager.py +298 -0
  347. mlrun/{runtimes/package → package/packagers}/__init__.py +3 -1
  348. mlrun/package/packagers/default_packager.py +422 -0
  349. mlrun/package/packagers/numpy_packagers.py +612 -0
  350. mlrun/package/packagers/pandas_packagers.py +968 -0
  351. mlrun/package/packagers/python_standard_library_packagers.py +616 -0
  352. mlrun/package/packagers_manager.py +786 -0
  353. mlrun/package/utils/__init__.py +53 -0
  354. mlrun/package/utils/_archiver.py +226 -0
  355. mlrun/package/utils/_formatter.py +211 -0
  356. mlrun/package/utils/_pickler.py +234 -0
  357. mlrun/package/utils/_supported_format.py +71 -0
  358. mlrun/package/utils/log_hint_utils.py +93 -0
  359. mlrun/package/utils/type_hint_utils.py +298 -0
  360. mlrun/platforms/__init__.py +1 -1
  361. mlrun/platforms/iguazio.py +34 -2
  362. mlrun/platforms/other.py +1 -1
  363. mlrun/projects/__init__.py +1 -1
  364. mlrun/projects/operations.py +14 -9
  365. mlrun/projects/pipelines.py +31 -13
  366. mlrun/projects/project.py +762 -238
  367. mlrun/render.py +49 -19
  368. mlrun/run.py +57 -326
  369. mlrun/runtimes/__init__.py +3 -9
  370. mlrun/runtimes/base.py +247 -784
  371. mlrun/runtimes/constants.py +1 -1
  372. mlrun/runtimes/daskjob.py +45 -41
  373. mlrun/runtimes/funcdoc.py +43 -7
  374. mlrun/runtimes/function.py +66 -656
  375. mlrun/runtimes/function_reference.py +1 -1
  376. mlrun/runtimes/generators.py +1 -1
  377. mlrun/runtimes/kubejob.py +99 -116
  378. mlrun/runtimes/local.py +59 -66
  379. mlrun/runtimes/mpijob/__init__.py +1 -1
  380. mlrun/runtimes/mpijob/abstract.py +13 -15
  381. mlrun/runtimes/mpijob/v1.py +3 -1
  382. mlrun/runtimes/mpijob/v1alpha1.py +1 -1
  383. mlrun/runtimes/nuclio.py +1 -1
  384. mlrun/runtimes/pod.py +51 -26
  385. mlrun/runtimes/remotesparkjob.py +3 -1
  386. mlrun/runtimes/serving.py +12 -4
  387. mlrun/runtimes/sparkjob/__init__.py +1 -2
  388. mlrun/runtimes/sparkjob/abstract.py +44 -31
  389. mlrun/runtimes/sparkjob/spark3job.py +11 -9
  390. mlrun/runtimes/utils.py +61 -42
  391. mlrun/secrets.py +16 -18
  392. mlrun/serving/__init__.py +3 -2
  393. mlrun/serving/merger.py +1 -1
  394. mlrun/serving/remote.py +1 -1
  395. mlrun/serving/routers.py +39 -42
  396. mlrun/serving/server.py +23 -13
  397. mlrun/serving/serving_wrapper.py +1 -1
  398. mlrun/serving/states.py +172 -39
  399. mlrun/serving/utils.py +1 -1
  400. mlrun/serving/v1_serving.py +1 -1
  401. mlrun/serving/v2_serving.py +29 -21
  402. mlrun/utils/__init__.py +1 -2
  403. mlrun/utils/async_http.py +8 -1
  404. mlrun/utils/azure_vault.py +1 -1
  405. mlrun/utils/clones.py +2 -2
  406. mlrun/utils/condition_evaluator.py +65 -0
  407. mlrun/utils/db.py +52 -0
  408. mlrun/utils/helpers.py +188 -13
  409. mlrun/utils/http.py +89 -54
  410. mlrun/utils/logger.py +48 -8
  411. mlrun/utils/model_monitoring.py +132 -100
  412. mlrun/utils/notifications/__init__.py +1 -1
  413. mlrun/utils/notifications/notification/__init__.py +8 -6
  414. mlrun/utils/notifications/notification/base.py +20 -14
  415. mlrun/utils/notifications/notification/console.py +7 -4
  416. mlrun/utils/notifications/notification/git.py +36 -19
  417. mlrun/utils/notifications/notification/ipython.py +10 -8
  418. mlrun/utils/notifications/notification/slack.py +18 -13
  419. mlrun/utils/notifications/notification_pusher.py +377 -56
  420. mlrun/utils/regex.py +6 -1
  421. mlrun/utils/singleton.py +1 -1
  422. mlrun/utils/v3io_clients.py +1 -1
  423. mlrun/utils/vault.py +270 -269
  424. mlrun/utils/version/__init__.py +1 -1
  425. mlrun/utils/version/version.json +2 -2
  426. mlrun/utils/version/version.py +1 -1
  427. {mlrun-1.3.3rc1.dist-info → mlrun-1.4.0.dist-info}/METADATA +16 -10
  428. mlrun-1.4.0.dist-info/RECORD +434 -0
  429. mlrun/api/api/endpoints/marketplace.py +0 -257
  430. mlrun/api/crud/marketplace.py +0 -221
  431. mlrun/api/crud/model_monitoring/model_endpoint_store.py +0 -847
  432. mlrun/api/db/filedb/db.py +0 -518
  433. mlrun/api/schemas/marketplace.py +0 -128
  434. mlrun/api/schemas/model_endpoints.py +0 -185
  435. mlrun/db/filedb.py +0 -891
  436. mlrun/feature_store/retrieval/online.py +0 -92
  437. mlrun/model_monitoring/constants.py +0 -67
  438. mlrun/runtimes/package/context_handler.py +0 -711
  439. mlrun/runtimes/sparkjob/spark2job.py +0 -59
  440. mlrun-1.3.3rc1.dist-info/RECORD +0 -381
  441. {mlrun-1.3.3rc1.dist-info → mlrun-1.4.0.dist-info}/LICENSE +0 -0
  442. {mlrun-1.3.3rc1.dist-info → mlrun-1.4.0.dist-info}/WHEEL +0 -0
  443. {mlrun-1.3.3rc1.dist-info → mlrun-1.4.0.dist-info}/entry_points.txt +0 -0
  444. {mlrun-1.3.3rc1.dist-info → mlrun-1.4.0.dist-info}/top_level.txt +0 -0
mlrun/db/sqldb.py CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright 2019 Iguazio
1
+ # Copyright 2023 Iguazio
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -15,7 +15,8 @@
15
15
  import datetime
16
16
  from typing import List, Optional, Union
17
17
 
18
- import mlrun.api.schemas
18
+ import mlrun.common.schemas
19
+ import mlrun.model_monitoring.model_endpoint
19
20
  from mlrun.api.db.base import DBError
20
21
  from mlrun.api.db.sqldb.db import SQLDB as SQLAPIDB
21
22
  from mlrun.api.db.sqldb.session import create_session
@@ -28,8 +29,6 @@ from mlrun.api.db.sqldb.session import create_session
28
29
  # service, in order to prevent the api from calling itself several times for each submission request (since the runDB
29
30
  # will be httpdb to that same api service) we have this class which is kind of a proxy between the RunDB interface to
30
31
  # the api service's DB interface
31
- from ..api import schemas
32
- from ..api.schemas import ModelEndpoint
33
32
  from .base import RunDBError, RunDBInterface
34
33
 
35
34
 
@@ -95,7 +94,7 @@ class SQLDB(RunDBInterface):
95
94
  updates,
96
95
  )
97
96
 
98
- def abort_run(self, uid, project="", iter=0):
97
+ def abort_run(self, uid, project="", iter=0, timeout=45):
99
98
  raise NotImplementedError()
100
99
 
101
100
  def read_run(self, uid, project=None, iter=None):
@@ -123,11 +122,14 @@ class SQLDB(RunDBInterface):
123
122
  start_time_to: datetime.datetime = None,
124
123
  last_update_time_from: datetime.datetime = None,
125
124
  last_update_time_to: datetime.datetime = None,
126
- partition_by: Union[schemas.RunPartitionByField, str] = None,
125
+ partition_by: Union[mlrun.common.schemas.RunPartitionByField, str] = None,
127
126
  rows_per_partition: int = 1,
128
- partition_sort_by: Union[schemas.SortField, str] = None,
129
- partition_order: Union[schemas.OrderType, str] = schemas.OrderType.desc,
127
+ partition_sort_by: Union[mlrun.common.schemas.SortField, str] = None,
128
+ partition_order: Union[
129
+ mlrun.common.schemas.OrderType, str
130
+ ] = mlrun.common.schemas.OrderType.desc,
130
131
  max_partitions: int = 0,
132
+ with_notifications: bool = False,
131
133
  ):
132
134
  import mlrun.api.crud
133
135
 
@@ -151,6 +153,7 @@ class SQLDB(RunDBInterface):
151
153
  partition_sort_by,
152
154
  partition_order,
153
155
  max_partitions,
156
+ with_notifications,
154
157
  )
155
158
 
156
159
  def del_run(self, uid, project=None, iter=None):
@@ -214,12 +217,12 @@ class SQLDB(RunDBInterface):
214
217
  iter: int = None,
215
218
  best_iteration: bool = False,
216
219
  kind: str = None,
217
- category: Union[str, schemas.ArtifactCategories] = None,
220
+ category: Union[str, mlrun.common.schemas.ArtifactCategories] = None,
218
221
  ):
219
222
  import mlrun.api.crud
220
223
 
221
224
  if category and isinstance(category, str):
222
- category = schemas.ArtifactCategories(category)
225
+ category = mlrun.common.schemas.ArtifactCategories(category)
223
226
 
224
227
  return self._transform_db_error(
225
228
  mlrun.api.crud.Artifacts().list_artifacts,
@@ -307,7 +310,9 @@ class SQLDB(RunDBInterface):
307
310
  )
308
311
 
309
312
  def list_artifact_tags(
310
- self, project=None, category: Union[str, schemas.ArtifactCategories] = None
313
+ self,
314
+ project=None,
315
+ category: Union[str, mlrun.common.schemas.ArtifactCategories] = None,
311
316
  ):
312
317
  return self._transform_db_error(
313
318
  self.db.list_artifact_tags, self.session, project
@@ -317,7 +322,7 @@ class SQLDB(RunDBInterface):
317
322
  self,
318
323
  project: str,
319
324
  tag_name: str,
320
- tag_objects: mlrun.api.schemas.TagObjects,
325
+ tag_objects: mlrun.common.schemas.TagObjects,
321
326
  replace: bool = False,
322
327
  ):
323
328
  import mlrun.api.crud
@@ -343,7 +348,7 @@ class SQLDB(RunDBInterface):
343
348
  self,
344
349
  project: str,
345
350
  tag_name: str,
346
- tag_objects: mlrun.api.schemas.TagObjects,
351
+ tag_objects: mlrun.common.schemas.TagObjects,
347
352
  ):
348
353
  import mlrun.api.crud
349
354
 
@@ -392,34 +397,65 @@ class SQLDB(RunDBInterface):
392
397
  def store_project(
393
398
  self,
394
399
  name: str,
395
- project: mlrun.api.schemas.Project,
396
- ) -> mlrun.api.schemas.Project:
397
- raise NotImplementedError()
400
+ project: mlrun.common.schemas.Project,
401
+ ) -> mlrun.common.schemas.Project:
402
+ import mlrun.api.crud
403
+
404
+ if isinstance(project, dict):
405
+ project = mlrun.common.schemas.Project(**project)
406
+
407
+ return self._transform_db_error(
408
+ mlrun.api.crud.Projects().store_project,
409
+ self.session,
410
+ name=name,
411
+ project=project,
412
+ )
398
413
 
399
414
  def patch_project(
400
415
  self,
401
416
  name: str,
402
417
  project: dict,
403
- patch_mode: mlrun.api.schemas.PatchMode = mlrun.api.schemas.PatchMode.replace,
404
- ) -> mlrun.api.schemas.Project:
405
- raise NotImplementedError()
418
+ patch_mode: mlrun.common.schemas.PatchMode = mlrun.common.schemas.PatchMode.replace,
419
+ ) -> mlrun.common.schemas.Project:
420
+ import mlrun.api.crud
421
+
422
+ return self._transform_db_error(
423
+ mlrun.api.crud.Projects().patch_project,
424
+ self.session,
425
+ name=name,
426
+ project=project,
427
+ patch_mode=patch_mode,
428
+ )
406
429
 
407
430
  def create_project(
408
431
  self,
409
- project: mlrun.api.schemas.Project,
410
- ) -> mlrun.api.schemas.Project:
411
- raise NotImplementedError()
432
+ project: mlrun.common.schemas.Project,
433
+ ) -> mlrun.common.schemas.Project:
434
+ import mlrun.api.crud
435
+
436
+ return self._transform_db_error(
437
+ mlrun.api.crud.Projects().create_project,
438
+ self.session,
439
+ project=project,
440
+ )
412
441
 
413
442
  def delete_project(
414
443
  self,
415
444
  name: str,
416
- deletion_strategy: mlrun.api.schemas.DeletionStrategy = mlrun.api.schemas.DeletionStrategy.default(),
445
+ deletion_strategy: mlrun.common.schemas.DeletionStrategy = mlrun.common.schemas.DeletionStrategy.default(),
417
446
  ):
418
- raise NotImplementedError()
447
+ import mlrun.api.crud
448
+
449
+ return self._transform_db_error(
450
+ mlrun.api.crud.Projects().delete_project,
451
+ self.session,
452
+ name=name,
453
+ deletion_strategy=deletion_strategy,
454
+ )
419
455
 
420
456
  def get_project(
421
457
  self, name: str = None, project_id: int = None
422
- ) -> mlrun.api.schemas.Project:
458
+ ) -> mlrun.common.schemas.Project:
423
459
  import mlrun.api.crud
424
460
 
425
461
  return self._transform_db_error(
@@ -431,11 +467,20 @@ class SQLDB(RunDBInterface):
431
467
  def list_projects(
432
468
  self,
433
469
  owner: str = None,
434
- format_: mlrun.api.schemas.ProjectsFormat = mlrun.api.schemas.ProjectsFormat.full,
470
+ format_: mlrun.common.schemas.ProjectsFormat = mlrun.common.schemas.ProjectsFormat.full,
435
471
  labels: List[str] = None,
436
- state: mlrun.api.schemas.ProjectState = None,
437
- ) -> mlrun.api.schemas.ProjectsOutput:
438
- raise NotImplementedError()
472
+ state: mlrun.common.schemas.ProjectState = None,
473
+ ) -> mlrun.common.schemas.ProjectsOutput:
474
+ import mlrun.api.crud
475
+
476
+ return self._transform_db_error(
477
+ mlrun.api.crud.Projects().list_projects,
478
+ self.session,
479
+ owner=owner,
480
+ format_=format_,
481
+ labels=labels,
482
+ state=state,
483
+ )
439
484
 
440
485
  @staticmethod
441
486
  def _transform_db_error(func, *args, **kwargs):
@@ -517,10 +562,10 @@ class SQLDB(RunDBInterface):
517
562
  entities: List[str] = None,
518
563
  features: List[str] = None,
519
564
  labels: List[str] = None,
520
- partition_by: mlrun.api.schemas.FeatureStorePartitionByField = None,
565
+ partition_by: mlrun.common.schemas.FeatureStorePartitionByField = None,
521
566
  rows_per_partition: int = 1,
522
- partition_sort_by: mlrun.api.schemas.SortField = None,
523
- partition_order: mlrun.api.schemas.OrderType = mlrun.api.schemas.OrderType.desc,
567
+ partition_sort_by: mlrun.common.schemas.SortField = None,
568
+ partition_order: mlrun.common.schemas.OrderType = mlrun.common.schemas.OrderType.desc,
524
569
  ):
525
570
  import mlrun.api.crud
526
571
 
@@ -542,7 +587,7 @@ class SQLDB(RunDBInterface):
542
587
 
543
588
  def store_feature_set(
544
589
  self,
545
- feature_set: Union[dict, mlrun.api.schemas.FeatureSet],
590
+ feature_set: Union[dict, mlrun.common.schemas.FeatureSet],
546
591
  name=None,
547
592
  project="",
548
593
  tag=None,
@@ -552,7 +597,7 @@ class SQLDB(RunDBInterface):
552
597
  import mlrun.api.crud
553
598
 
554
599
  if isinstance(feature_set, dict):
555
- feature_set = mlrun.api.schemas.FeatureSet(**feature_set)
600
+ feature_set = mlrun.common.schemas.FeatureSet(**feature_set)
556
601
 
557
602
  name = name or feature_set.metadata.name
558
603
  project = project or feature_set.metadata.project
@@ -627,10 +672,10 @@ class SQLDB(RunDBInterface):
627
672
  tag: str = None,
628
673
  state: str = None,
629
674
  labels: List[str] = None,
630
- partition_by: mlrun.api.schemas.FeatureStorePartitionByField = None,
675
+ partition_by: mlrun.common.schemas.FeatureStorePartitionByField = None,
631
676
  rows_per_partition: int = 1,
632
- partition_sort_by: mlrun.api.schemas.SortField = None,
633
- partition_order: mlrun.api.schemas.OrderType = mlrun.api.schemas.OrderType.desc,
677
+ partition_sort_by: mlrun.common.schemas.SortField = None,
678
+ partition_order: mlrun.common.schemas.OrderType = mlrun.common.schemas.OrderType.desc,
634
679
  ):
635
680
  import mlrun.api.crud
636
681
 
@@ -712,18 +757,18 @@ class SQLDB(RunDBInterface):
712
757
  page_token: str = "",
713
758
  filter_: str = "",
714
759
  format_: Union[
715
- str, mlrun.api.schemas.PipelinesFormat
716
- ] = mlrun.api.schemas.PipelinesFormat.metadata_only,
760
+ str, mlrun.common.schemas.PipelinesFormat
761
+ ] = mlrun.common.schemas.PipelinesFormat.metadata_only,
717
762
  page_size: int = None,
718
- ) -> mlrun.api.schemas.PipelinesOutput:
763
+ ) -> mlrun.common.schemas.PipelinesOutput:
719
764
  raise NotImplementedError()
720
765
 
721
766
  def create_project_secrets(
722
767
  self,
723
768
  project: str,
724
769
  provider: Union[
725
- str, mlrun.api.schemas.SecretProviderName
726
- ] = mlrun.api.schemas.SecretProviderName.kubernetes,
770
+ str, mlrun.common.schemas.SecretProviderName
771
+ ] = mlrun.common.schemas.SecretProviderName.kubernetes,
727
772
  secrets: dict = None,
728
773
  ):
729
774
  raise NotImplementedError()
@@ -733,28 +778,28 @@ class SQLDB(RunDBInterface):
733
778
  project: str,
734
779
  token: str,
735
780
  provider: Union[
736
- str, mlrun.api.schemas.SecretProviderName
737
- ] = mlrun.api.schemas.SecretProviderName.kubernetes,
781
+ str, mlrun.common.schemas.SecretProviderName
782
+ ] = mlrun.common.schemas.SecretProviderName.kubernetes,
738
783
  secrets: List[str] = None,
739
- ) -> mlrun.api.schemas.SecretsData:
784
+ ) -> mlrun.common.schemas.SecretsData:
740
785
  raise NotImplementedError()
741
786
 
742
787
  def list_project_secret_keys(
743
788
  self,
744
789
  project: str,
745
790
  provider: Union[
746
- str, mlrun.api.schemas.SecretProviderName
747
- ] = mlrun.api.schemas.SecretProviderName.kubernetes,
791
+ str, mlrun.common.schemas.SecretProviderName
792
+ ] = mlrun.common.schemas.SecretProviderName.kubernetes,
748
793
  token: str = None,
749
- ) -> mlrun.api.schemas.SecretKeysData:
794
+ ) -> mlrun.common.schemas.SecretKeysData:
750
795
  raise NotImplementedError()
751
796
 
752
797
  def delete_project_secrets(
753
798
  self,
754
799
  project: str,
755
800
  provider: Union[
756
- str, mlrun.api.schemas.SecretProviderName
757
- ] = mlrun.api.schemas.SecretProviderName.kubernetes,
801
+ str, mlrun.common.schemas.SecretProviderName
802
+ ] = mlrun.common.schemas.SecretProviderName.kubernetes,
758
803
  secrets: List[str] = None,
759
804
  ):
760
805
  raise NotImplementedError()
@@ -763,8 +808,8 @@ class SQLDB(RunDBInterface):
763
808
  self,
764
809
  user: str,
765
810
  provider: Union[
766
- str, mlrun.api.schemas.SecretProviderName
767
- ] = mlrun.api.schemas.SecretProviderName.vault,
811
+ str, mlrun.common.schemas.SecretProviderName
812
+ ] = mlrun.common.schemas.SecretProviderName.vault,
768
813
  secrets: dict = None,
769
814
  ):
770
815
  raise NotImplementedError()
@@ -773,7 +818,9 @@ class SQLDB(RunDBInterface):
773
818
  self,
774
819
  project: str,
775
820
  endpoint_id: str,
776
- model_endpoint: ModelEndpoint,
821
+ model_endpoint: Union[
822
+ mlrun.model_monitoring.model_endpoint.ModelEndpoint, dict
823
+ ],
777
824
  ):
778
825
  raise NotImplementedError()
779
826
 
@@ -815,40 +862,40 @@ class SQLDB(RunDBInterface):
815
862
  ):
816
863
  raise NotImplementedError()
817
864
 
818
- def create_marketplace_source(
819
- self, source: Union[dict, schemas.IndexedMarketplaceSource]
865
+ def create_hub_source(
866
+ self, source: Union[dict, mlrun.common.schemas.IndexedHubSource]
820
867
  ):
821
868
  raise NotImplementedError()
822
869
 
823
- def store_marketplace_source(
824
- self, source_name: str, source: Union[dict, schemas.IndexedMarketplaceSource]
870
+ def store_hub_source(
871
+ self,
872
+ source_name: str,
873
+ source: Union[dict, mlrun.common.schemas.IndexedHubSource],
825
874
  ):
826
875
  raise NotImplementedError()
827
876
 
828
- def list_marketplace_sources(self):
877
+ def list_hub_sources(self):
829
878
  raise NotImplementedError()
830
879
 
831
- def get_marketplace_source(self, source_name: str):
880
+ def get_hub_source(self, source_name: str):
832
881
  raise NotImplementedError()
833
882
 
834
- def delete_marketplace_source(self, source_name: str):
883
+ def delete_hub_source(self, source_name: str):
835
884
  raise NotImplementedError()
836
885
 
837
- def get_marketplace_catalog(
886
+ def get_hub_catalog(
838
887
  self,
839
888
  source_name: str,
840
- channel: str = None,
841
889
  version: str = None,
842
890
  tag: str = None,
843
891
  force_refresh: bool = False,
844
892
  ):
845
893
  raise NotImplementedError()
846
894
 
847
- def get_marketplace_item(
895
+ def get_hub_item(
848
896
  self,
849
897
  source_name: str,
850
898
  item_name: str,
851
- channel: str = "development",
852
899
  version: str = None,
853
900
  tag: str = "latest",
854
901
  force_refresh: bool = False,
@@ -857,7 +904,7 @@ class SQLDB(RunDBInterface):
857
904
 
858
905
  def verify_authorization(
859
906
  self,
860
- authorization_verification_input: mlrun.api.schemas.AuthorizationVerificationInput,
907
+ authorization_verification_input: mlrun.common.schemas.AuthorizationVerificationInput,
861
908
  ):
862
909
  # on server side authorization is done in endpoint anyway, so for server side we can "pass" on check
863
910
  # done from ingest()
mlrun/errors.py CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright 2018 Iguazio
1
+ # Copyright 2023 Iguazio
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -179,6 +179,10 @@ class MLRunInternalServerError(MLRunHTTPStatusError):
179
179
  error_status_code = HTTPStatus.INTERNAL_SERVER_ERROR.value
180
180
 
181
181
 
182
+ class MLRunServiceUnavailableError(MLRunHTTPStatusError):
183
+ error_status_code = HTTPStatus.SERVICE_UNAVAILABLE.value
184
+
185
+
182
186
  class MLRunRuntimeError(MLRunHTTPStatusError, RuntimeError):
183
187
  error_status_code = HTTPStatus.INTERNAL_SERVER_ERROR.value
184
188
 
@@ -213,4 +217,5 @@ STATUS_ERRORS = {
213
217
  HTTPStatus.CONFLICT.value: MLRunConflictError,
214
218
  HTTPStatus.PRECONDITION_FAILED.value: MLRunPreconditionFailedError,
215
219
  HTTPStatus.INTERNAL_SERVER_ERROR.value: MLRunInternalServerError,
220
+ HTTPStatus.SERVICE_UNAVAILABLE.value: MLRunServiceUnavailableError,
216
221
  }
mlrun/execution.py CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright 2018 Iguazio
1
+ # Copyright 2023 Iguazio
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -20,6 +20,7 @@ from typing import List, Union
20
20
 
21
21
  import numpy as np
22
22
  import yaml
23
+ from dateutil import parser
23
24
 
24
25
  import mlrun
25
26
  from mlrun.artifacts import ModelArtifact
@@ -79,6 +80,7 @@ class MLClientCtx(object):
79
80
  self._log_level = "info"
80
81
  self._matrics_db = None
81
82
  self._autocommit = autocommit
83
+ self._notifications = []
82
84
 
83
85
  self._labels = {}
84
86
  self._annotations = {}
@@ -298,11 +300,12 @@ class MLClientCtx(object):
298
300
  self.artifact_path = spec.get(run_keys.output_path, self.artifact_path)
299
301
  self._in_path = spec.get(run_keys.input_path, self._in_path)
300
302
  inputs = spec.get(run_keys.inputs)
303
+ self._notifications = spec.get("notifications", self._notifications)
301
304
 
302
305
  self._init_dbs(rundb)
303
306
 
304
- if spec and not is_api:
305
- # init data related objects (require DB & Secrets to be set first), skip when running in the api service
307
+ if spec:
308
+ # init data related objects (require DB & Secrets to be set first)
306
309
  self._data_stores.from_dict(spec)
307
310
  if inputs and isinstance(inputs, dict):
308
311
  for k, v in inputs.items():
@@ -314,6 +317,7 @@ class MLClientCtx(object):
314
317
 
315
318
  start = get_in(attrs, "status.start_time")
316
319
  if start:
320
+ start = parser.parse(start) if isinstance(start, str) else start
317
321
  self._start_time = start
318
322
  self._state = "running"
319
323
  if store_run:
@@ -376,7 +380,7 @@ class MLClientCtx(object):
376
380
 
377
381
  @property
378
382
  def inputs(self):
379
- """dictionary of input data items (read-only)"""
383
+ """dictionary of input data item urls (read-only)"""
380
384
  return self._inputs
381
385
 
382
386
  @property
@@ -459,16 +463,26 @@ class MLClientCtx(object):
459
463
  def _load_project_object(self):
460
464
  if not self._project_object:
461
465
  if not self._project:
462
- self.logger.warning("get_project_param called without a project name")
466
+ self.logger.warning(
467
+ "Project cannot be loaded without a project name set in the context"
468
+ )
463
469
  return None
464
470
  if not self._rundb:
465
471
  self.logger.warning(
466
- "cannot retrieve project parameters - MLRun DB is not accessible"
472
+ "Cannot retrieve project data - MLRun DB is not accessible"
467
473
  )
468
474
  return None
469
475
  self._project_object = self._rundb.get_project(self._project)
470
476
  return self._project_object
471
477
 
478
+ def get_project_object(self):
479
+ """
480
+ Get the MLRun project object by the project name set in the context.
481
+
482
+ :return: The project object or None if it couldn't be retrieved.
483
+ """
484
+ return self._load_project_object()
485
+
472
486
  def get_project_param(self, key: str, default=None):
473
487
  """get a parameter from the run's project's parameters"""
474
488
  if not self._load_project_object():
@@ -493,27 +507,34 @@ class MLClientCtx(object):
493
507
  url = key
494
508
  if self.in_path and is_relative_path(url):
495
509
  url = os.path.join(self._in_path, url)
496
- obj = self._data_stores.object(
497
- url,
498
- key,
499
- project=self._project,
500
- allow_empty_resources=self._allow_empty_resources,
501
- )
502
- self._inputs[key] = obj
503
- return obj
510
+ self._inputs[key] = url
504
511
 
505
512
  def get_input(self, key: str, url: str = ""):
506
- """get an input :py:class:`~mlrun.DataItem` object, data objects have methods such as
507
- .get(), .download(), .url, .. to access the actual data
513
+ """
514
+ Get an input :py:class:`~mlrun.DataItem` object,
515
+ data objects have methods such as .get(), .download(), .url, .. to access the actual data.
516
+ Requires access to the data store secrets if configured.
508
517
 
509
- example::
518
+ Example::
510
519
 
511
520
  data = context.get_input("my_data").get()
521
+
522
+ :param key: The key name for the input url entry.
523
+ :param url: The url of the input data (file, stream, ..) - optional, saved in the inputs dictionary
524
+ if the key is not already present.
525
+
526
+ :return: :py:class:`~mlrun.datastore.base.DataItem` object
512
527
  """
513
528
  if key not in self._inputs:
514
- return self._set_input(key, url)
515
- else:
516
- return self._inputs[key]
529
+ self._set_input(key, url)
530
+
531
+ url = self._inputs[key]
532
+ return self._data_stores.object(
533
+ url,
534
+ key,
535
+ project=self._project,
536
+ allow_empty_resources=self._allow_empty_resources,
537
+ )
517
538
 
518
539
  def log_result(self, key: str, value, commit=False):
519
540
  """log a scalar result value
@@ -941,7 +962,8 @@ class MLClientCtx(object):
941
962
  "handler": self._handler,
942
963
  "outputs": self._outputs,
943
964
  run_keys.output_path: self.artifact_path,
944
- run_keys.inputs: {k: v.artifact_url for k, v in self._inputs.items()},
965
+ run_keys.inputs: self._inputs,
966
+ "notifications": self._notifications,
945
967
  },
946
968
  "status": {
947
969
  "results": self._results,
@@ -977,7 +999,7 @@ class MLClientCtx(object):
977
999
  "metadata.annotations": self._annotations,
978
1000
  "spec.parameters": self._parameters,
979
1001
  "spec.outputs": self._outputs,
980
- "spec.inputs": {k: v.artifact_url for k, v in self._inputs.items()},
1002
+ "spec.inputs": self._inputs,
981
1003
  "status.results": self._results,
982
1004
  "status.start_time": to_date_str(self._start_time),
983
1005
  "status.last_update": to_date_str(self._last_update),
@@ -1,4 +1,4 @@
1
- # Copyright 2018 Iguazio
1
+ # Copyright 2023 Iguazio
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.