mlrun 1.3.3__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.3.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.3.dist-info/RECORD +0 -381
  441. {mlrun-1.3.3.dist-info → mlrun-1.4.0.dist-info}/LICENSE +0 -0
  442. {mlrun-1.3.3.dist-info → mlrun-1.4.0.dist-info}/WHEEL +0 -0
  443. {mlrun-1.3.3.dist-info → mlrun-1.4.0.dist-info}/entry_points.txt +0 -0
  444. {mlrun-1.3.3.dist-info → mlrun-1.4.0.dist-info}/top_level.txt +0 -0
@@ -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.
@@ -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,10 +20,10 @@ if mysql_dsn_data:
20
20
  from .models_mysql import * # noqa
21
21
 
22
22
  # importing private variables as well
23
- from .models_mysql import _classes, _labeled, _table2cls, _tagged # noqa # isort:skip
23
+ from .models_mysql import _classes, _labeled, _table2cls, _tagged, _with_notifications # noqa # isort:skip
24
24
  else:
25
25
  from .models_sqlite import * # noqa
26
26
 
27
27
  # importing private variables as well
28
- from .models_sqlite import _classes, _labeled, _table2cls, _tagged # noqa # isort:skip
28
+ from .models_sqlite import _classes, _labeled, _table2cls, _tagged, _with_notifications # noqa # isort:skip
29
29
  # fmt: on
@@ -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.
@@ -30,9 +30,10 @@ from sqlalchemy import (
30
30
  UniqueConstraint,
31
31
  )
32
32
  from sqlalchemy.ext.declarative import declarative_base
33
- from sqlalchemy.orm import class_mapper, relationship
33
+ from sqlalchemy.orm import relationship
34
34
 
35
- from mlrun.api import schemas
35
+ import mlrun.common.schemas
36
+ import mlrun.utils.db
36
37
  from mlrun.api.utils.db.sql_collation import SQLCollationUtil
37
38
 
38
39
  Base = declarative_base()
@@ -40,42 +41,8 @@ NULL = None # Avoid flake8 issuing warnings when comparing in filter
40
41
  run_time_fmt = "%Y-%m-%dT%H:%M:%S.%fZ"
41
42
 
42
43
 
43
- class BaseModel:
44
- def to_dict(self, exclude=None):
45
- """
46
- NOTE - this function (currently) does not handle serializing relationships
47
- """
48
- exclude = exclude or []
49
- mapper = class_mapper(self.__class__)
50
- columns = [column.key for column in mapper.columns if column.key not in exclude]
51
- get_key_value = (
52
- lambda c: (c, getattr(self, c).isoformat())
53
- if isinstance(getattr(self, c), datetime)
54
- else (c, getattr(self, c))
55
- )
56
- return dict(map(get_key_value, columns))
57
-
58
-
59
- class HasStruct(BaseModel):
60
- @property
61
- def struct(self):
62
- return pickle.loads(self.body)
63
-
64
- @struct.setter
65
- def struct(self, value):
66
- self.body = pickle.dumps(value)
67
-
68
- def to_dict(self, exclude=None):
69
- """
70
- NOTE - this function (currently) does not handle serializing relationships
71
- """
72
- exclude = exclude or []
73
- exclude.append("body")
74
- return super().to_dict(exclude)
75
-
76
-
77
44
  def make_label(table):
78
- class Label(Base, BaseModel):
45
+ class Label(Base, mlrun.utils.db.BaseModel):
79
46
  __tablename__ = f"{table}_labels"
80
47
  __table_args__ = (
81
48
  UniqueConstraint("name", "parent", name=f"_{table}_labels_uc"),
@@ -90,7 +57,7 @@ def make_label(table):
90
57
 
91
58
 
92
59
  def make_tag(table):
93
- class Tag(Base, BaseModel):
60
+ class Tag(Base, mlrun.utils.db.BaseModel):
94
61
  __tablename__ = f"{table}_tags"
95
62
  __table_args__ = (
96
63
  UniqueConstraint("project", "name", "obj_id", name=f"_{table}_tags_uc"),
@@ -107,7 +74,7 @@ def make_tag(table):
107
74
  # TODO: don't want to refactor everything in one PR so splitting this function to 2 versions - eventually only this one
108
75
  # should be used
109
76
  def make_tag_v2(table):
110
- class Tag(Base, BaseModel):
77
+ class Tag(Base, mlrun.utils.db.BaseModel):
111
78
  __tablename__ = f"{table}_tags"
112
79
  __table_args__ = (
113
80
  UniqueConstraint("project", "name", "obj_name", name=f"_{table}_tags_uc"),
@@ -122,11 +89,57 @@ def make_tag_v2(table):
122
89
  return Tag
123
90
 
124
91
 
92
+ def make_notification(table):
93
+ class Notification(Base, mlrun.utils.db.BaseModel):
94
+ __tablename__ = f"{table}_notifications"
95
+ __table_args__ = (
96
+ UniqueConstraint("name", "parent_id", name=f"_{table}_notifications_uc"),
97
+ )
98
+
99
+ id = Column(Integer, primary_key=True)
100
+ project = Column(String(255, collation=SQLCollationUtil.collation()))
101
+ name = Column(
102
+ String(255, collation=SQLCollationUtil.collation()), nullable=False
103
+ )
104
+ kind = Column(
105
+ String(255, collation=SQLCollationUtil.collation()), nullable=False
106
+ )
107
+ message = Column(
108
+ String(255, collation=SQLCollationUtil.collation()), nullable=False
109
+ )
110
+ severity = Column(
111
+ String(255, collation=SQLCollationUtil.collation()), nullable=False
112
+ )
113
+ when = Column(
114
+ String(255, collation=SQLCollationUtil.collation()), nullable=False
115
+ )
116
+ condition = Column(
117
+ String(255, collation=SQLCollationUtil.collation()), nullable=False
118
+ )
119
+ params = Column("params", JSON)
120
+ parent_id = Column(Integer, ForeignKey(f"{table}.id"))
121
+
122
+ # TODO: Separate table for notification state.
123
+ # Currently, we are only supporting one notification being sent per DB row (either on completion or on error).
124
+ # In the future, we might want to support multiple notifications per DB row, and we might want to support on
125
+ # start, therefore we need to separate the state from the notification itself (e.g. this table can be table
126
+ # with notification_id, state, when, last_sent, etc.). This will require some refactoring in the code.
127
+ sent_time = Column(
128
+ sqlalchemy.dialects.mysql.TIMESTAMP(fsp=3),
129
+ nullable=True,
130
+ )
131
+ status = Column(
132
+ String(255, collation=SQLCollationUtil.collation()), nullable=False
133
+ )
134
+
135
+ return Notification
136
+
137
+
125
138
  # quell SQLAlchemy warnings on duplicate class name (Label)
126
139
  with warnings.catch_warnings():
127
140
  warnings.simplefilter("ignore")
128
141
 
129
- class Artifact(Base, HasStruct):
142
+ class Artifact(Base, mlrun.utils.db.HasStruct):
130
143
  __tablename__ = "artifacts"
131
144
  __table_args__ = (
132
145
  UniqueConstraint("uid", "project", "key", name="_artifacts_uc"),
@@ -140,7 +153,7 @@ with warnings.catch_warnings():
140
153
  project = Column(String(255, collation=SQLCollationUtil.collation()))
141
154
  uid = Column(String(255, collation=SQLCollationUtil.collation()))
142
155
  updated = Column(sqlalchemy.dialects.mysql.TIMESTAMP(fsp=3))
143
- # TODO: change to JSON, see mlrun/api/schemas/function.py::FunctionState for reasoning
156
+ # TODO: change to JSON, see mlrun/common/schemas/function.py::FunctionState for reasoning
144
157
  body = Column(sqlalchemy.dialects.mysql.MEDIUMBLOB)
145
158
 
146
159
  labels = relationship(Label, cascade="all, delete-orphan")
@@ -149,7 +162,7 @@ with warnings.catch_warnings():
149
162
  def get_identifier_string(self) -> str:
150
163
  return f"{self.project}/{self.key}/{self.uid}"
151
164
 
152
- class Function(Base, HasStruct):
165
+ class Function(Base, mlrun.utils.db.HasStruct):
153
166
  __tablename__ = "functions"
154
167
  __table_args__ = (
155
168
  UniqueConstraint("name", "project", "uid", name="_functions_uc"),
@@ -162,7 +175,7 @@ with warnings.catch_warnings():
162
175
  name = Column(String(255, collation=SQLCollationUtil.collation()))
163
176
  project = Column(String(255, collation=SQLCollationUtil.collation()))
164
177
  uid = Column(String(255, collation=SQLCollationUtil.collation()))
165
- # TODO: change to JSON, see mlrun/api/schemas/function.py::FunctionState for reasoning
178
+ # TODO: change to JSON, see mlrun/common/schemas/function.py::FunctionState for reasoning
166
179
  body = Column(sqlalchemy.dialects.mysql.MEDIUMBLOB)
167
180
  updated = Column(sqlalchemy.dialects.mysql.TIMESTAMP(fsp=3))
168
181
 
@@ -172,19 +185,19 @@ with warnings.catch_warnings():
172
185
  def get_identifier_string(self) -> str:
173
186
  return f"{self.project}/{self.name}/{self.uid}"
174
187
 
175
- class Log(Base, BaseModel):
188
+ class Log(Base, mlrun.utils.db.BaseModel):
176
189
  __tablename__ = "logs"
177
190
 
178
191
  id = Column(Integer, primary_key=True)
179
192
  uid = Column(String(255, collation=SQLCollationUtil.collation()))
180
193
  project = Column(String(255, collation=SQLCollationUtil.collation()))
181
- # TODO: change to JSON, see mlrun/api/schemas/function.py::FunctionState for reasoning
194
+ # TODO: change to JSON, see mlrun/common/schemas/function.py::FunctionState for reasoning
182
195
  body = Column(sqlalchemy.dialects.mysql.MEDIUMBLOB)
183
196
 
184
197
  def get_identifier_string(self) -> str:
185
198
  return f"{self.project}/{self.uid}"
186
199
 
187
- class Run(Base, HasStruct):
200
+ class Run(Base, mlrun.utils.db.HasStruct):
188
201
  __tablename__ = "runs"
189
202
  __table_args__ = (
190
203
  UniqueConstraint("uid", "project", "iteration", name="_runs_uc"),
@@ -192,6 +205,7 @@ with warnings.catch_warnings():
192
205
 
193
206
  Label = make_label(__tablename__)
194
207
  Tag = make_tag(__tablename__)
208
+ Notification = make_notification(__tablename__)
195
209
 
196
210
  id = Column(Integer, primary_key=True)
197
211
  uid = Column(String(255, collation=SQLCollationUtil.collation()))
@@ -201,7 +215,7 @@ with warnings.catch_warnings():
201
215
  )
202
216
  iteration = Column(Integer)
203
217
  state = Column(String(255, collation=SQLCollationUtil.collation()))
204
- # TODO: change to JSON, see mlrun/api/schemas/function.py::FunctionState for reasoning
218
+ # TODO: change to JSON, see mlrun/common/schemas/function.py::FunctionState for reasoning
205
219
  body = Column(sqlalchemy.dialects.mysql.MEDIUMBLOB)
206
220
  start_time = Column(sqlalchemy.dialects.mysql.TIMESTAMP(fsp=3))
207
221
  updated = Column(
@@ -215,11 +229,12 @@ with warnings.catch_warnings():
215
229
 
216
230
  labels = relationship(Label, cascade="all, delete-orphan")
217
231
  tags = relationship(Tag, cascade="all, delete-orphan")
232
+ notifications = relationship(Notification, cascade="all, delete-orphan")
218
233
 
219
234
  def get_identifier_string(self) -> str:
220
235
  return f"{self.project}/{self.uid}/{self.iteration}"
221
236
 
222
- class BackgroundTask(Base, BaseModel):
237
+ class BackgroundTask(Base, mlrun.utils.db.BaseModel):
223
238
  __tablename__ = "background_tasks"
224
239
  __table_args__ = (
225
240
  UniqueConstraint("name", "project", name="_background_tasks_uc"),
@@ -243,7 +258,7 @@ with warnings.catch_warnings():
243
258
  state = Column(String(255, collation=SQLCollationUtil.collation()))
244
259
  timeout = Column(Integer)
245
260
 
246
- class Schedule(Base, BaseModel):
261
+ class Schedule(Base, mlrun.utils.db.BaseModel):
247
262
  __tablename__ = "schedules_v2"
248
263
  __table_args__ = (UniqueConstraint("project", "name", name="_schedules_v2_uc"),)
249
264
 
@@ -262,7 +277,7 @@ with warnings.catch_warnings():
262
277
  creation_time = Column(sqlalchemy.dialects.mysql.TIMESTAMP(fsp=3))
263
278
  cron_trigger_str = Column(String(255, collation=SQLCollationUtil.collation()))
264
279
  last_run_uri = Column(String(255, collation=SQLCollationUtil.collation()))
265
- # TODO: change to JSON, see mlrun/api/schemas/function.py::FunctionState for reasoning
280
+ # TODO: change to JSON, see mlrun/common/schemas/function.py::FunctionState for reasoning
266
281
  struct = Column(sqlalchemy.dialects.mysql.MEDIUMBLOB)
267
282
  labels = relationship(Label, cascade="all, delete-orphan")
268
283
  concurrency_limit = Column(Integer, nullable=False)
@@ -280,11 +295,11 @@ with warnings.catch_warnings():
280
295
  self.struct = pickle.dumps(value)
281
296
 
282
297
  @property
283
- def cron_trigger(self) -> schemas.ScheduleCronTrigger:
298
+ def cron_trigger(self) -> mlrun.common.schemas.ScheduleCronTrigger:
284
299
  return orjson.loads(self.cron_trigger_str)
285
300
 
286
301
  @cron_trigger.setter
287
- def cron_trigger(self, trigger: schemas.ScheduleCronTrigger):
302
+ def cron_trigger(self, trigger: mlrun.common.schemas.ScheduleCronTrigger):
288
303
  self.cron_trigger_str = orjson.dumps(trigger.dict(exclude_unset=True))
289
304
 
290
305
  # Define "many to many" users/projects
@@ -295,14 +310,14 @@ with warnings.catch_warnings():
295
310
  Column("user_id", Integer, ForeignKey("users.id")),
296
311
  )
297
312
 
298
- class User(Base, BaseModel):
313
+ class User(Base, mlrun.utils.db.BaseModel):
299
314
  __tablename__ = "users"
300
315
  __table_args__ = (UniqueConstraint("name", name="_users_uc"),)
301
316
 
302
317
  id = Column(Integer, primary_key=True)
303
318
  name = Column(String(255, collation=SQLCollationUtil.collation()))
304
319
 
305
- class Project(Base, BaseModel):
320
+ class Project(Base, mlrun.utils.db.BaseModel):
306
321
  __tablename__ = "projects"
307
322
  # For now since we use project name a lot
308
323
  __table_args__ = (UniqueConstraint("name", name="_projects_uc"),)
@@ -314,7 +329,7 @@ with warnings.catch_warnings():
314
329
  source = Column(String(255, collation=SQLCollationUtil.collation()))
315
330
  # the attribute name used to be _spec which is just a wrong naming, the attribute was renamed to _full_object
316
331
  # leaving the column as is to prevent redundant migration
317
- # TODO: change to JSON, see mlrun/api/schemas/function.py::FunctionState for reasoning
332
+ # TODO: change to JSON, see mlrun/common/schemas/function.py::FunctionState for reasoning
318
333
  _full_object = Column("spec", sqlalchemy.dialects.mysql.MEDIUMBLOB)
319
334
  created = Column(
320
335
  sqlalchemy.dialects.mysql.TIMESTAMP(fsp=3), default=datetime.utcnow
@@ -338,7 +353,7 @@ with warnings.catch_warnings():
338
353
  def full_object(self, value):
339
354
  self._full_object = pickle.dumps(value)
340
355
 
341
- class Feature(Base, BaseModel):
356
+ class Feature(Base, mlrun.utils.db.BaseModel):
342
357
  __tablename__ = "features"
343
358
  id = Column(Integer, primary_key=True)
344
359
  feature_set_id = Column(Integer, ForeignKey("feature_sets.id"))
@@ -352,7 +367,7 @@ with warnings.catch_warnings():
352
367
  def get_identifier_string(self) -> str:
353
368
  return f"{self.project}/{self.name}"
354
369
 
355
- class Entity(Base, BaseModel):
370
+ class Entity(Base, mlrun.utils.db.BaseModel):
356
371
  __tablename__ = "entities"
357
372
  id = Column(Integer, primary_key=True)
358
373
  feature_set_id = Column(Integer, ForeignKey("feature_sets.id"))
@@ -366,7 +381,7 @@ with warnings.catch_warnings():
366
381
  def get_identifier_string(self) -> str:
367
382
  return f"{self.project}/{self.name}"
368
383
 
369
- class FeatureSet(Base, BaseModel):
384
+ class FeatureSet(Base, mlrun.utils.db.BaseModel):
370
385
  __tablename__ = "feature_sets"
371
386
  __table_args__ = (
372
387
  UniqueConstraint("name", "project", "uid", name="_feature_set_uc"),
@@ -410,7 +425,7 @@ with warnings.catch_warnings():
410
425
  # TODO - convert to pickle, to avoid issues with non-json serializable fields such as datetime
411
426
  self._full_object = json.dumps(value, default=str)
412
427
 
413
- class FeatureVector(Base, BaseModel):
428
+ class FeatureVector(Base, mlrun.utils.db.BaseModel):
414
429
  __tablename__ = "feature_vectors"
415
430
  __table_args__ = (
416
431
  UniqueConstraint("name", "project", "uid", name="_feature_vectors_uc"),
@@ -451,9 +466,9 @@ with warnings.catch_warnings():
451
466
  # TODO - convert to pickle, to avoid issues with non-json serializable fields such as datetime
452
467
  self._full_object = json.dumps(value, default=str)
453
468
 
454
- class MarketplaceSource(Base, BaseModel):
455
- __tablename__ = "marketplace_sources"
456
- __table_args__ = (UniqueConstraint("name", name="_marketplace_sources_uc"),)
469
+ class HubSource(Base, mlrun.utils.db.BaseModel):
470
+ __tablename__ = "hub_sources"
471
+ __table_args__ = (UniqueConstraint("name", name="_hub_sources_uc"),)
457
472
 
458
473
  id = Column(Integer, primary_key=True)
459
474
  name = Column(String(255, collation=SQLCollationUtil.collation()))
@@ -482,7 +497,7 @@ with warnings.catch_warnings():
482
497
  # TODO - convert to pickle, to avoid issues with non-json serializable fields such as datetime
483
498
  self._full_object = json.dumps(value, default=str)
484
499
 
485
- class DataVersion(Base, BaseModel):
500
+ class DataVersion(Base, mlrun.utils.db.BaseModel):
486
501
  __tablename__ = "data_versions"
487
502
  __table_args__ = (UniqueConstraint("version", name="_versions_uc"),)
488
503
 
@@ -497,5 +512,8 @@ with warnings.catch_warnings():
497
512
  # Must be after all table definitions
498
513
  _tagged = [cls for cls in Base.__subclasses__() if hasattr(cls, "Tag")]
499
514
  _labeled = [cls for cls in Base.__subclasses__() if hasattr(cls, "Label")]
515
+ _with_notifications = [
516
+ cls for cls in Base.__subclasses__() if hasattr(cls, "Notification")
517
+ ]
500
518
  _classes = [cls for cls in Base.__subclasses__()]
501
519
  _table2cls = {cls.__table__.name: cls for cls in Base.__subclasses__()}