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.
@@ -27,11 +27,12 @@ from apscheduler.schedulers.asyncio import AsyncIOScheduler
27
27
  from apscheduler.triggers.cron import CronTrigger as APSchedulerCronTrigger
28
28
  from sqlalchemy.orm import Session
29
29
 
30
+ import mlrun.api.api.utils
30
31
  import mlrun.api.utils.auth.verifier
31
32
  import mlrun.api.utils.clients.iguazio
32
33
  import mlrun.api.utils.helpers
34
+ import mlrun.common.schemas
33
35
  import mlrun.errors
34
- from mlrun.api import schemas
35
36
  from mlrun.api.db.session import close_session, create_session
36
37
  from mlrun.api.utils.singletons.db import get_db
37
38
  from mlrun.config import config
@@ -60,7 +61,7 @@ class Scheduler:
60
61
  # we don't allow to schedule a job to run more than one time per X
61
62
  # NOTE this cannot be less than one minute - see _validate_cron_trigger
62
63
  self._min_allowed_interval = config.httpdb.scheduling.min_allowed_interval
63
- self._secrets_provider = schemas.SecretProviderName.kubernetes
64
+ self._secrets_provider = mlrun.common.schemas.SecretProviderName.kubernetes
64
65
 
65
66
  async def start(self, db_session: Session):
66
67
  logger.info("Starting scheduler")
@@ -73,7 +74,7 @@ class Scheduler:
73
74
  try:
74
75
  if (
75
76
  mlrun.mlconf.httpdb.clusterization.role
76
- == mlrun.api.schemas.ClusterizationRole.chief
77
+ == mlrun.common.schemas.ClusterizationRole.chief
77
78
  ):
78
79
  self._reload_schedules(db_session)
79
80
  except Exception as exc:
@@ -93,7 +94,7 @@ class Scheduler:
93
94
  return labels
94
95
 
95
96
  def _get_access_key_secret_name_from_db_record(
96
- self, db_schedule: schemas.ScheduleRecord
97
+ self, db_schedule: mlrun.common.schemas.ScheduleRecord
97
98
  ):
98
99
  schedule_labels = db_schedule.dict()["labels"]
99
100
  for label in schedule_labels:
@@ -104,19 +105,21 @@ class Scheduler:
104
105
  def create_schedule(
105
106
  self,
106
107
  db_session: Session,
107
- auth_info: mlrun.api.schemas.AuthInfo,
108
+ auth_info: mlrun.common.schemas.AuthInfo,
108
109
  project: str,
109
110
  name: str,
110
- kind: schemas.ScheduleKinds,
111
+ kind: mlrun.common.schemas.ScheduleKinds,
111
112
  scheduled_object: Union[Dict, Callable],
112
- cron_trigger: Union[str, schemas.ScheduleCronTrigger],
113
+ cron_trigger: Union[str, mlrun.common.schemas.ScheduleCronTrigger],
113
114
  labels: Dict = None,
114
115
  concurrency_limit: int = None,
115
116
  ):
116
117
  if concurrency_limit is None:
117
118
  concurrency_limit = config.httpdb.scheduling.default_concurrency_limit
118
119
  if isinstance(cron_trigger, str):
119
- cron_trigger = schemas.ScheduleCronTrigger.from_crontab(cron_trigger)
120
+ cron_trigger = mlrun.common.schemas.ScheduleCronTrigger.from_crontab(
121
+ cron_trigger
122
+ )
120
123
 
121
124
  self._validate_cron_trigger(cron_trigger)
122
125
 
@@ -135,6 +138,9 @@ class Scheduler:
135
138
  # We use the schedule labels to keep track of the access-key to use. Note that this is the name of the secret,
136
139
  # not the secret value itself. Therefore, it can be kept in a non-secure field.
137
140
  labels = self._append_access_key_secret_to_labels(labels, secret_name)
141
+
142
+ self._enrich_schedule_notifications(project, name, scheduled_object)
143
+
138
144
  get_db().create_schedule(
139
145
  db_session,
140
146
  project,
@@ -177,16 +183,18 @@ class Scheduler:
177
183
  def update_schedule(
178
184
  self,
179
185
  db_session: Session,
180
- auth_info: mlrun.api.schemas.AuthInfo,
186
+ auth_info: mlrun.common.schemas.AuthInfo,
181
187
  project: str,
182
188
  name: str,
183
189
  scheduled_object: Union[Dict, Callable] = None,
184
- cron_trigger: Union[str, schemas.ScheduleCronTrigger] = None,
190
+ cron_trigger: Union[str, mlrun.common.schemas.ScheduleCronTrigger] = None,
185
191
  labels: Dict = None,
186
192
  concurrency_limit: int = None,
187
193
  ):
188
194
  if isinstance(cron_trigger, str):
189
- cron_trigger = schemas.ScheduleCronTrigger.from_crontab(cron_trigger)
195
+ cron_trigger = mlrun.common.schemas.ScheduleCronTrigger.from_crontab(
196
+ cron_trigger
197
+ )
190
198
 
191
199
  if cron_trigger is not None:
192
200
  self._validate_cron_trigger(cron_trigger)
@@ -206,6 +214,8 @@ class Scheduler:
206
214
  secret_name = self._store_schedule_secrets_using_auth_secret(auth_info)
207
215
  labels = self._append_access_key_secret_to_labels(labels, secret_name)
208
216
 
217
+ self._enrich_schedule_notifications(project, name, scheduled_object)
218
+
209
219
  get_db().update_schedule(
210
220
  db_session,
211
221
  project,
@@ -241,7 +251,7 @@ class Scheduler:
241
251
  labels: str = None,
242
252
  include_last_run: bool = False,
243
253
  include_credentials: bool = False,
244
- ) -> schemas.SchedulesOutput:
254
+ ) -> mlrun.common.schemas.SchedulesOutput:
245
255
  db_schedules = get_db().list_schedules(db_session, project, name, labels, kind)
246
256
  schedules = []
247
257
  for db_schedule in db_schedules:
@@ -249,7 +259,7 @@ class Scheduler:
249
259
  db_session, db_schedule, include_last_run, include_credentials
250
260
  )
251
261
  schedules.append(schedule)
252
- return schemas.SchedulesOutput(schedules=schedules)
262
+ return mlrun.common.schemas.SchedulesOutput(schedules=schedules)
253
263
 
254
264
  def get_schedule(
255
265
  self,
@@ -258,7 +268,7 @@ class Scheduler:
258
268
  name: str,
259
269
  include_last_run: bool = False,
260
270
  include_credentials: bool = False,
261
- ) -> schemas.ScheduleOutput:
271
+ ) -> mlrun.common.schemas.ScheduleOutput:
262
272
  logger.debug("Getting schedule", project=project, name=name)
263
273
  db_schedule = get_db().get_schedule(db_session, project, name)
264
274
  return self._transform_and_enrich_db_schedule(
@@ -273,7 +283,7 @@ class Scheduler:
273
283
  name: str,
274
284
  ):
275
285
  logger.debug("Deleting schedule", project=project, name=name)
276
- self._remove_schedule_scheduler_resources(project, name)
286
+ self._remove_schedule_scheduler_resources(db_session, project, name)
277
287
  get_db().delete_schedule(db_session, project, name)
278
288
 
279
289
  @mlrun.api.utils.helpers.ensure_running_on_chief
@@ -288,15 +298,18 @@ class Scheduler:
288
298
  )
289
299
  logger.debug("Deleting schedules", project=project)
290
300
  for schedule in schedules.schedules:
291
- self._remove_schedule_scheduler_resources(schedule.project, schedule.name)
301
+ self._remove_schedule_scheduler_resources(
302
+ db_session, schedule.project, schedule.name
303
+ )
292
304
  get_db().delete_schedules(db_session, project)
293
305
 
294
- def _remove_schedule_scheduler_resources(self, project, name):
306
+ def _remove_schedule_scheduler_resources(self, db_session: Session, project, name):
295
307
  self._remove_schedule_from_scheduler(project, name)
296
308
  # This is kept for backwards compatibility - if schedule was using the "old" format of storing secrets, then
297
309
  # this is a good opportunity to remove them. Using the new method we don't remove secrets since they are per
298
310
  # access-key and there may be other entities (runtimes, for example) using the same secret.
299
311
  self._remove_schedule_secrets(project, name)
312
+ self._remove_schedule_notification_secrets(db_session, project, name)
300
313
 
301
314
  def _remove_schedule_from_scheduler(self, project, name):
302
315
  job_id = self._resolve_job_id(project, name)
@@ -309,7 +322,7 @@ class Scheduler:
309
322
  async def invoke_schedule(
310
323
  self,
311
324
  db_session: Session,
312
- auth_info: mlrun.api.schemas.AuthInfo,
325
+ auth_info: mlrun.common.schemas.AuthInfo,
313
326
  project: str,
314
327
  name: str,
315
328
  ):
@@ -333,15 +346,42 @@ class Scheduler:
333
346
  )
334
347
  return await function(*args, **kwargs)
335
348
 
349
+ @mlrun.api.utils.helpers.ensure_running_on_chief
350
+ def set_schedule_notifications(
351
+ self,
352
+ session: Session,
353
+ project: str,
354
+ identifier: mlrun.common.schemas.ScheduleIdentifier,
355
+ notifications: List[mlrun.model.Notification],
356
+ auth_info: mlrun.common.schemas.AuthInfo,
357
+ ):
358
+ """
359
+ Set notifications for a schedule. This will replace any existing notifications.
360
+ :param session: DB session
361
+ :param project: Project name
362
+ :param identifier: Schedule identifier
363
+ :param notifications: List of notifications to set
364
+ :param auth_info: Authorization info
365
+ """
366
+ name = identifier.name
367
+ logger.debug("Setting schedule notifications", project=project, name=name)
368
+ db_schedule = get_db().get_schedule(session, project, name)
369
+ scheduled_object = db_schedule.scheduled_object
370
+ if scheduled_object:
371
+ scheduled_object.get("task", {}).get("spec", {})["notifications"] = [
372
+ notification.to_dict() for notification in notifications
373
+ ]
374
+ self.update_schedule(session, auth_info, project, name, scheduled_object)
375
+
336
376
  def _ensure_auth_info_has_access_key(
337
377
  self,
338
- auth_info: mlrun.api.schemas.AuthInfo,
339
- kind: schemas.ScheduleKinds,
378
+ auth_info: mlrun.common.schemas.AuthInfo,
379
+ kind: mlrun.common.schemas.ScheduleKinds,
340
380
  ):
341
381
  import mlrun.api.crud
342
382
 
343
383
  if (
344
- kind not in schemas.ScheduleKinds.local_kinds()
384
+ kind not in mlrun.common.schemas.ScheduleKinds.local_kinds()
345
385
  and mlrun.api.utils.auth.verifier.AuthVerifier().is_jobs_auth_required()
346
386
  ):
347
387
  if (
@@ -371,7 +411,7 @@ class Scheduler:
371
411
 
372
412
  def _store_schedule_secrets_using_auth_secret(
373
413
  self,
374
- auth_info: mlrun.api.schemas.AuthInfo,
414
+ auth_info: mlrun.common.schemas.AuthInfo,
375
415
  ) -> str:
376
416
  # import here to avoid circular imports
377
417
  import mlrun.api.crud
@@ -388,8 +428,8 @@ class Scheduler:
388
428
  auth_info.username = ""
389
429
 
390
430
  secret_name = mlrun.api.crud.Secrets().store_auth_secret(
391
- mlrun.api.schemas.AuthSecretData(
392
- provider=mlrun.api.schemas.SecretProviderName.kubernetes,
431
+ mlrun.common.schemas.AuthSecretData(
432
+ provider=mlrun.common.schemas.SecretProviderName.kubernetes,
393
433
  username=auth_info.username,
394
434
  access_key=auth_info.access_key,
395
435
  )
@@ -400,7 +440,7 @@ class Scheduler:
400
440
  # are sure we are far enough that it's no longer going to be used (or keep, and use for other things).
401
441
  def _store_schedule_secrets(
402
442
  self,
403
- auth_info: mlrun.api.schemas.AuthInfo,
443
+ auth_info: mlrun.common.schemas.AuthInfo,
404
444
  project: str,
405
445
  name: str,
406
446
  ):
@@ -441,7 +481,7 @@ class Scheduler:
441
481
  secrets[username_secret_key] = auth_info.username
442
482
  mlrun.api.crud.Secrets().store_project_secrets(
443
483
  project,
444
- schemas.SecretsData(
484
+ mlrun.common.schemas.SecretsData(
445
485
  provider=self._secrets_provider,
446
486
  secrets=secrets,
447
487
  ),
@@ -545,7 +585,7 @@ class Scheduler:
545
585
 
546
586
  def _validate_cron_trigger(
547
587
  self,
548
- cron_trigger: schemas.ScheduleCronTrigger,
588
+ cron_trigger: mlrun.common.schemas.ScheduleCronTrigger,
549
589
  # accepting now from outside for testing purposes
550
590
  now: datetime = None,
551
591
  ):
@@ -590,7 +630,7 @@ class Scheduler:
590
630
  delta=second_next_run_time - next_run_time,
591
631
  )
592
632
  raise ValueError(
593
- f"Cron trigger too frequent. no more then one job "
633
+ f"Cron trigger too frequent. no more than one job "
594
634
  f"per {self._min_allowed_interval} is allowed"
595
635
  )
596
636
 
@@ -598,11 +638,11 @@ class Scheduler:
598
638
  self,
599
639
  project: str,
600
640
  name: str,
601
- kind: schemas.ScheduleKinds,
641
+ kind: mlrun.common.schemas.ScheduleKinds,
602
642
  scheduled_object: Any,
603
- cron_trigger: schemas.ScheduleCronTrigger,
643
+ cron_trigger: mlrun.common.schemas.ScheduleCronTrigger,
604
644
  concurrency_limit: int,
605
- auth_info: mlrun.api.schemas.AuthInfo,
645
+ auth_info: mlrun.common.schemas.AuthInfo,
606
646
  ):
607
647
  job_id = self._resolve_job_id(project, name)
608
648
  logger.debug("Adding schedule to scheduler", job_id=job_id)
@@ -628,11 +668,11 @@ class Scheduler:
628
668
  self,
629
669
  project: str,
630
670
  name: str,
631
- kind: schemas.ScheduleKinds,
671
+ kind: mlrun.common.schemas.ScheduleKinds,
632
672
  scheduled_object: Any,
633
- cron_trigger: schemas.ScheduleCronTrigger,
673
+ cron_trigger: mlrun.common.schemas.ScheduleCronTrigger,
634
674
  concurrency_limit: int,
635
- auth_info: mlrun.api.schemas.AuthInfo,
675
+ auth_info: mlrun.common.schemas.AuthInfo,
636
676
  ):
637
677
  job_id = self._resolve_job_id(project, name)
638
678
  logger.debug("Updating schedule in scheduler", job_id=job_id)
@@ -706,7 +746,7 @@ class Scheduler:
706
746
  if access_key:
707
747
  need_to_update_credentials = True
708
748
 
709
- auth_info = mlrun.api.schemas.AuthInfo(
749
+ auth_info = mlrun.common.schemas.AuthInfo(
710
750
  username=username,
711
751
  access_key=access_key,
712
752
  # enriching with control plane tag because scheduling a function requires control plane
@@ -753,21 +793,21 @@ class Scheduler:
753
793
  def _transform_and_enrich_db_schedule(
754
794
  self,
755
795
  db_session: Session,
756
- schedule_record: schemas.ScheduleRecord,
796
+ schedule_record: mlrun.common.schemas.ScheduleRecord,
757
797
  include_last_run: bool = False,
758
798
  include_credentials: bool = False,
759
- ) -> schemas.ScheduleOutput:
799
+ ) -> mlrun.common.schemas.ScheduleOutput:
760
800
  schedule_dict = schedule_record.dict()
761
801
  schedule_dict["labels"] = {
762
802
  label["name"]: label["value"] for label in schedule_dict["labels"]
763
803
  }
764
- schedule = schemas.ScheduleOutput(**schedule_dict)
804
+ schedule = mlrun.common.schemas.ScheduleOutput(**schedule_dict)
765
805
 
766
806
  # Schedules are running only on chief. Therefore, we query next_run_time from the scheduler only when
767
807
  # running on chief.
768
808
  if (
769
809
  mlrun.mlconf.httpdb.clusterization.role
770
- == mlrun.api.schemas.ClusterizationRole.chief
810
+ == mlrun.common.schemas.ClusterizationRole.chief
771
811
  ):
772
812
  job_id = self._resolve_job_id(schedule_record.project, schedule_record.name)
773
813
  job = self._scheduler.get_job(job_id)
@@ -788,7 +828,7 @@ class Scheduler:
788
828
 
789
829
  @staticmethod
790
830
  def _enrich_schedule_with_last_run(
791
- db_session: Session, schedule_output: schemas.ScheduleOutput
831
+ db_session: Session, schedule_output: mlrun.common.schemas.ScheduleOutput
792
832
  ):
793
833
  if schedule_output.last_run_uri:
794
834
  run_project, run_uid, iteration, _ = RunObject.parse_uri(
@@ -798,7 +838,7 @@ class Scheduler:
798
838
  schedule_output.last_run = run_data
799
839
 
800
840
  def _enrich_schedule_with_credentials(
801
- self, schedule_output: schemas.ScheduleOutput
841
+ self, schedule_output: mlrun.common.schemas.ScheduleOutput
802
842
  ):
803
843
  secret_name = schedule_output.labels.get(self._db_record_auth_label)
804
844
  if secret_name:
@@ -808,18 +848,18 @@ class Scheduler:
808
848
 
809
849
  def _resolve_job_function(
810
850
  self,
811
- scheduled_kind: schemas.ScheduleKinds,
851
+ scheduled_kind: mlrun.common.schemas.ScheduleKinds,
812
852
  scheduled_object: Any,
813
853
  project_name: str,
814
854
  schedule_name: str,
815
855
  schedule_concurrency_limit: int,
816
- auth_info: mlrun.api.schemas.AuthInfo,
856
+ auth_info: mlrun.common.schemas.AuthInfo,
817
857
  ) -> Tuple[Callable, Optional[Union[List, Tuple]], Optional[Dict]]:
818
858
  """
819
859
  :return: a tuple (function, args, kwargs) to be used with the APScheduler.add_job
820
860
  """
821
861
 
822
- if scheduled_kind == schemas.ScheduleKinds.job:
862
+ if scheduled_kind == mlrun.common.schemas.ScheduleKinds.job:
823
863
  scheduled_object_copy = copy.deepcopy(scheduled_object)
824
864
  return (
825
865
  Scheduler.submit_run_wrapper,
@@ -833,7 +873,7 @@ class Scheduler:
833
873
  ],
834
874
  {},
835
875
  )
836
- if scheduled_kind == schemas.ScheduleKinds.local_function:
876
+ if scheduled_kind == mlrun.common.schemas.ScheduleKinds.local_function:
837
877
  return scheduled_object, [], {}
838
878
 
839
879
  # sanity
@@ -851,6 +891,55 @@ class Scheduler:
851
891
  """
852
892
  return self._job_id_separator.join([project, name])
853
893
 
894
+ @staticmethod
895
+ def _enrich_schedule_notifications(
896
+ project: str, schedule_name: str, scheduled_object: Union[Dict, Callable]
897
+ ):
898
+ if not isinstance(scheduled_object, dict):
899
+ return
900
+
901
+ schedule_notifications = (
902
+ scheduled_object.get("task", {}).get("spec", {}).get("notifications")
903
+ )
904
+ if schedule_notifications:
905
+ scheduled_object["task"]["spec"]["notifications"] = [
906
+ notification.to_dict()
907
+ for notification in mlrun.api.api.utils.validate_and_mask_notification_list(
908
+ schedule_notifications, schedule_name, project
909
+ )
910
+ ]
911
+
912
+ @staticmethod
913
+ def _remove_schedule_notification_secrets(
914
+ db_session: Session, project: str, schedule_name: str
915
+ ):
916
+ try:
917
+ db_schedule = get_db().get_schedule(
918
+ db_session,
919
+ project,
920
+ schedule_name,
921
+ )
922
+ except mlrun.errors.MLRunNotFoundError:
923
+ # we allow deleting a schedule even if it does not exist in the DB
924
+ logger.debug(
925
+ "Failed to find schedule. Continuing",
926
+ project=project,
927
+ schedule_name=schedule_name,
928
+ )
929
+ return
930
+
931
+ if db_schedule and isinstance(db_schedule.scheduled_object, dict):
932
+ notifications = (
933
+ db_schedule.scheduled_object.get("task", {})
934
+ .get("spec", {})
935
+ .get("notifications")
936
+ )
937
+ if notifications:
938
+ for notification in notifications:
939
+ mlrun.api.api.utils.delete_notification_params_secret(
940
+ project, mlrun.model.Notification.from_dict(notification)
941
+ )
942
+
854
943
  @staticmethod
855
944
  async def submit_run_wrapper(
856
945
  scheduler,
@@ -858,7 +947,7 @@ class Scheduler:
858
947
  project_name,
859
948
  schedule_name,
860
949
  schedule_concurrency_limit,
861
- auth_info: mlrun.api.schemas.AuthInfo,
950
+ auth_info: mlrun.common.schemas.AuthInfo,
862
951
  ):
863
952
 
864
953
  # removing the schedule from the body otherwise when the scheduler will submit this task it will go to an
@@ -872,7 +961,7 @@ class Scheduler:
872
961
  if "task" in scheduled_object and "metadata" in scheduled_object["task"]:
873
962
  scheduled_object["task"]["metadata"].setdefault("labels", {})
874
963
  scheduled_object["task"]["metadata"]["labels"][
875
- schemas.constants.LabelNames.schedule_name
964
+ mlrun.common.schemas.constants.LabelNames.schedule_name
876
965
  ] = schedule_name
877
966
 
878
967
  return await fastapi.concurrency.run_in_threadpool(
@@ -887,7 +976,7 @@ class Scheduler:
887
976
 
888
977
  @staticmethod
889
978
  def transform_schemas_cron_trigger_to_apscheduler_cron_trigger(
890
- cron_trigger: schemas.ScheduleCronTrigger,
979
+ cron_trigger: mlrun.common.schemas.ScheduleCronTrigger,
891
980
  ):
892
981
  return APSchedulerCronTrigger(
893
982
  cron_trigger.year,
@@ -927,7 +1016,7 @@ class Scheduler:
927
1016
  db_session,
928
1017
  states=RunStates.non_terminal_states(),
929
1018
  project=project_name,
930
- labels=f"{schemas.constants.LabelNames.schedule_name}={schedule_name}",
1019
+ labels=f"{mlrun.common.schemas.constants.LabelNames.schedule_name}={schedule_name}",
931
1020
  )
932
1021
  if len(active_runs) >= schedule_concurrency_limit:
933
1022
  logger.warn(
@@ -965,7 +1054,7 @@ class Scheduler:
965
1054
  # Update the schedule with the new auth info so we won't need to do the above again in the next run
966
1055
  scheduler.update_schedule(
967
1056
  db_session,
968
- mlrun.api.schemas.AuthInfo(
1057
+ mlrun.common.schemas.AuthInfo(
969
1058
  username=project_owner.username,
970
1059
  access_key=project_owner.access_key,
971
1060
  # enriching with control plane tag because scheduling a function requires control plane
@@ -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.
@@ -13,7 +13,6 @@
13
13
  # limitations under the License.
14
14
  #
15
15
  from mlrun.api.db.base import DBInterface
16
- from mlrun.api.db.filedb.db import FileDB
17
16
  from mlrun.api.db.sqldb.db import SQLDB
18
17
  from mlrun.api.db.sqldb.session import create_session
19
18
  from mlrun.config import config
@@ -33,16 +32,11 @@ def initialize_db(override_db=None):
33
32
  if override_db:
34
33
  db = override_db
35
34
  return
36
- if config.httpdb.db_type == "filedb":
37
- logger.info("Creating file db")
38
- db = FileDB(config.httpdb.dirpath)
39
- db.initialize(None)
40
- else:
41
- logger.info("Creating sql db")
42
- db = SQLDB(config.httpdb.dsn)
43
- db_session = None
44
- try:
45
- db_session = create_session()
46
- db.initialize(db_session)
47
- finally:
48
- db_session.close()
35
+ logger.info("Creating sql db")
36
+ db = SQLDB(config.httpdb.dsn)
37
+ db_session = None
38
+ try:
39
+ db_session = create_session()
40
+ db.initialize(db_session)
41
+ finally:
42
+ db_session.close()