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.
@@ -32,29 +32,16 @@ class MySQLUtil(object):
32
32
  "functions",
33
33
  ]
34
34
 
35
- def __init__(self):
36
- mysql_dsn_data = self.get_mysql_dsn_data()
37
- if not mysql_dsn_data:
38
- raise RuntimeError(f"Invalid mysql dsn: {self.get_dsn()}")
39
-
40
- @staticmethod
41
- def wait_for_db_liveness(logger, retry_interval=3, timeout=2 * 60):
42
- logger.debug("Waiting for database liveness")
43
- mysql_dsn_data = MySQLUtil.get_mysql_dsn_data()
44
- if not mysql_dsn_data:
45
- dsn = MySQLUtil.get_dsn()
46
- if "sqlite" in dsn:
47
- logger.debug("SQLite DB is used, liveness check not needed")
48
- else:
49
- logger.warn(
50
- f"Invalid mysql dsn: {MySQLUtil.get_dsn()}, assuming live and skipping liveness verification"
51
- )
52
- return
35
+ def __init__(self, logger: mlrun.utils.Logger):
36
+ self._logger = logger
53
37
 
38
+ def wait_for_db_liveness(self, retry_interval=3, timeout=2 * 60):
39
+ self._logger.debug("Waiting for database liveness")
40
+ mysql_dsn_data = self.get_mysql_dsn_data()
54
41
  tmp_connection = mlrun.utils.retry_until_successful(
55
42
  retry_interval,
56
43
  timeout,
57
- logger,
44
+ self._logger,
58
45
  True,
59
46
  pymysql.connect,
60
47
  host=mysql_dsn_data["host"],
@@ -62,7 +49,7 @@ class MySQLUtil(object):
62
49
  port=int(mysql_dsn_data["port"]),
63
50
  database=mysql_dsn_data["database"],
64
51
  )
65
- logger.debug("Database ready for connection")
52
+ self._logger.debug("Database ready for connection")
66
53
  tmp_connection.close()
67
54
 
68
55
  def check_db_has_tables(self):
@@ -78,6 +65,18 @@ class MySQLUtil(object):
78
65
  finally:
79
66
  connection.close()
80
67
 
68
+ def set_modes(self, modes):
69
+ if not modes or modes in ["nil", "none"]:
70
+ self._logger.debug("No sql modes were given, bailing", modes=modes)
71
+ return
72
+ connection = self._create_connection()
73
+ try:
74
+ self._logger.debug("Setting sql modes", modes=modes)
75
+ with connection.cursor() as cursor:
76
+ cursor.execute("SET GLOBAL sql_mode=%s;", (modes,))
77
+ finally:
78
+ connection.close()
79
+
81
80
  def check_db_has_data(self):
82
81
  connection = self._create_connection()
83
82
  try:
@@ -101,10 +100,6 @@ class MySQLUtil(object):
101
100
  database=mysql_dsn_data["database"],
102
101
  )
103
102
 
104
- @staticmethod
105
- def get_dsn() -> str:
106
- return os.environ.get(MySQLUtil.dsn_env_var, "")
107
-
108
103
  @staticmethod
109
104
  def get_mysql_dsn_data() -> typing.Optional[dict]:
110
105
  match = re.match(MySQLUtil.dsn_regex, MySQLUtil.get_dsn())
@@ -112,3 +107,7 @@ class MySQLUtil(object):
112
107
  return None
113
108
 
114
109
  return match.groupdict()
110
+
111
+ @staticmethod
112
+ def get_dsn() -> str:
113
+ return os.environ.get(MySQLUtil.dsn_env_var, "")
@@ -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.
@@ -64,7 +64,7 @@ class SQLiteMigrationUtil(object):
64
64
  self._migrator = self._create_migrator()
65
65
  self._mysql_util = None
66
66
  if self._mysql_dsn_data:
67
- self._mysql_util = MySQLUtil()
67
+ self._mysql_util = MySQLUtil(logger)
68
68
 
69
69
  def is_database_migration_needed(self) -> bool:
70
70
  # if some data is missing, don't transfer the data
@@ -0,0 +1,14 @@
1
+ # Copyright 2023 Iguazio
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ #
@@ -0,0 +1,57 @@
1
+ # Copyright 2023 Iguazio
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ #
15
+ import abc
16
+ import typing
17
+
18
+ import mlrun.common.schemas
19
+
20
+
21
+ class BaseEventClient:
22
+ @abc.abstractmethod
23
+ def emit(self, event):
24
+ pass
25
+
26
+ def generate_auth_secret_event(
27
+ self,
28
+ username: str,
29
+ secret_name: str,
30
+ action: mlrun.common.schemas.AuthSecretEventActions,
31
+ ):
32
+ """
33
+ Generate an auth secret event
34
+ :param username: username
35
+ :param secret_name: secret name
36
+ :param action: preformed action
37
+ :return: event object to emit
38
+ """
39
+ pass
40
+
41
+ @abc.abstractmethod
42
+ def generate_project_secret_event(
43
+ self,
44
+ project: str,
45
+ secret_name: str,
46
+ secret_keys: typing.List[str] = None,
47
+ action: mlrun.common.schemas.SecretEventActions = mlrun.common.schemas.SecretEventActions.created,
48
+ ):
49
+ """
50
+ Generate a project secret event
51
+ :param project: project name
52
+ :param secret_name: secret name
53
+ :param secret_keys: secret keys, optional, only relevant for created/updated events
54
+ :param action: preformed action
55
+ :return: event object to emit
56
+ """
57
+ pass
@@ -0,0 +1,41 @@
1
+ # Copyright 2023 Iguazio
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ #
15
+ import mlrun.api.utils.events.base
16
+ import mlrun.api.utils.events.iguazio
17
+ import mlrun.api.utils.events.nop
18
+ import mlrun.common.schemas
19
+ import mlrun.utils.singleton
20
+
21
+
22
+ class EventsFactory(object):
23
+ @staticmethod
24
+ def get_events_client(
25
+ kind: mlrun.common.schemas.EventClientKinds = None, **kwargs
26
+ ) -> mlrun.api.utils.events.base.BaseEventClient:
27
+ if mlrun.mlconf.events.mode == mlrun.common.schemas.EventsModes.disabled:
28
+ return mlrun.api.utils.events.nop.NopClient()
29
+
30
+ if not kind:
31
+ if mlrun.mlconf.get_parsed_igz_version():
32
+ kind = mlrun.common.schemas.EventClientKinds.iguazio
33
+
34
+ if kind == mlrun.common.schemas.EventClientKinds.iguazio:
35
+ if not mlrun.mlconf.get_parsed_igz_version():
36
+ raise mlrun.errors.MLRunInvalidArgumentError(
37
+ "Iguazio events client can only be used in Iguazio environment"
38
+ )
39
+ return mlrun.api.utils.events.iguazio.Client(**kwargs)
40
+
41
+ return mlrun.api.utils.events.nop.NopClient()
@@ -0,0 +1,217 @@
1
+ # Copyright 2023 Iguazio
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ #
15
+ import typing
16
+
17
+ import igz_mgmt.schemas.events
18
+
19
+ import mlrun.api.utils.clients.iguazio
20
+ import mlrun.api.utils.events.base as base_events
21
+ import mlrun.common.schemas
22
+ from mlrun.utils import logger
23
+
24
+ PROJECT_AUTH_SECRET_CREATED = "Security.Project.AuthSecret.Created"
25
+ PROJECT_AUTH_SECRET_UPDATED = "Security.Project.AuthSecret.Updated"
26
+ PROJECT_SECRET_CREATED = "Security.Project.Secret.Created"
27
+ PROJECT_SECRET_UPDATED = "Security.Project.Secret.Updated"
28
+ PROJECT_SECRET_DELETED = "Security.Project.Secret.Deleted"
29
+
30
+
31
+ class Client(base_events.BaseEventClient):
32
+ def __init__(self, access_key: str = None, verbose: bool = None):
33
+ self.access_key = (
34
+ access_key
35
+ or mlrun.mlconf.events.access_key
36
+ or mlrun.mlconf.get_v3io_access_key()
37
+ )
38
+ self.verbose = verbose if verbose is not None else mlrun.mlconf.events.verbose
39
+ self.source = "mlrun-api"
40
+
41
+ def emit(self, event: igz_mgmt.Event):
42
+ try:
43
+ logger.debug("Emitting event", event=event)
44
+ mlrun.api.utils.clients.iguazio.Client().emit_manual_event(
45
+ self.access_key, event
46
+ )
47
+ except Exception as exc:
48
+ if self.verbose:
49
+ logger.warning(
50
+ "Failed to emit event",
51
+ event=event,
52
+ exc_info=exc,
53
+ )
54
+
55
+ def generate_auth_secret_event(
56
+ self,
57
+ username: str,
58
+ secret_name: str,
59
+ action: mlrun.common.schemas.AuthSecretEventActions,
60
+ ) -> igz_mgmt.Event:
61
+ """
62
+ Generate an auth secret event
63
+ :param username: username
64
+ :param secret_name: secret name
65
+ :param action: preformed action
66
+ :return: event object to emit
67
+ """
68
+ if action == mlrun.common.schemas.SecretEventActions.created:
69
+ return self._generate_auth_secret_created_event(username, secret_name)
70
+ elif action == mlrun.common.schemas.SecretEventActions.updated:
71
+ return self._generate_auth_secret_updated_event(username, secret_name)
72
+ else:
73
+ raise mlrun.errors.MLRunInvalidArgumentError(f"Unsupported action {action}")
74
+
75
+ def generate_project_secret_event(
76
+ self,
77
+ project: str,
78
+ secret_name: str,
79
+ secret_keys: typing.List[str] = None,
80
+ action: mlrun.common.schemas.SecretEventActions = mlrun.common.schemas.SecretEventActions.created,
81
+ ) -> igz_mgmt.Event:
82
+ """
83
+ Generate a project secret event
84
+ :param project: project name
85
+ :param secret_name: secret name
86
+ :param secret_keys: secret keys, optional, only relevant for created/updated events
87
+ :param action: preformed action
88
+ :return: event object to emit
89
+ """
90
+ if action == mlrun.common.schemas.SecretEventActions.created:
91
+ return self._generate_project_secret_created_event(
92
+ project, secret_name, secret_keys
93
+ )
94
+ elif action == mlrun.common.schemas.SecretEventActions.updated:
95
+ return self._generate_project_secret_updated_event(
96
+ project, secret_name, secret_keys
97
+ )
98
+ elif action == mlrun.common.schemas.SecretEventActions.deleted:
99
+ return self._generate_project_secret_deleted_event(project, secret_name)
100
+ else:
101
+ raise mlrun.errors.MLRunInvalidArgumentError(f"Unsupported action {action}")
102
+
103
+ def _generate_auth_secret_created_event(
104
+ self, username: str, secret_name: str
105
+ ) -> igz_mgmt.Event:
106
+ return igz_mgmt.Event(
107
+ source=self.source,
108
+ kind=PROJECT_AUTH_SECRET_CREATED,
109
+ description=f"User {username} created secret {secret_name}",
110
+ parameters_text=[
111
+ igz_mgmt.schemas.events.ParametersText(name="username", value=username),
112
+ igz_mgmt.schemas.events.ParametersText(
113
+ name="secret_name", value=secret_name
114
+ ),
115
+ ],
116
+ severity=igz_mgmt.constants.EventSeverity.info,
117
+ classification=igz_mgmt.constants.EventClassification.security,
118
+ system_event=False,
119
+ visibility=igz_mgmt.constants.EventVisibility.external,
120
+ )
121
+
122
+ def _generate_auth_secret_updated_event(
123
+ self, username: str, secret_name: str
124
+ ) -> igz_mgmt.Event:
125
+ return igz_mgmt.Event(
126
+ source=self.source,
127
+ kind=PROJECT_AUTH_SECRET_UPDATED,
128
+ description=f"User {username} updated secret {secret_name}",
129
+ parameters_text=[
130
+ igz_mgmt.schemas.events.ParametersText(name="username", value=username),
131
+ igz_mgmt.schemas.events.ParametersText(
132
+ name="secret_name", value=secret_name
133
+ ),
134
+ ],
135
+ severity=igz_mgmt.constants.EventSeverity.info,
136
+ classification=igz_mgmt.constants.EventClassification.security,
137
+ system_event=False,
138
+ visibility=igz_mgmt.constants.EventVisibility.external,
139
+ )
140
+
141
+ def _generate_project_secret_created_event(
142
+ self, project: str, secret_name: str, secret_keys: typing.List[str]
143
+ ) -> igz_mgmt.Event:
144
+ normalized_secret_keys = self._list_to_string(secret_keys)
145
+ return igz_mgmt.Event(
146
+ source=self.source,
147
+ kind=PROJECT_SECRET_CREATED,
148
+ parameters_text=[
149
+ igz_mgmt.schemas.events.ParametersText(
150
+ name="project_name", value=project
151
+ ),
152
+ igz_mgmt.schemas.events.ParametersText(
153
+ name="secret_name", value=secret_name
154
+ ),
155
+ igz_mgmt.schemas.events.ParametersText(
156
+ name="secret_keys", value=normalized_secret_keys
157
+ ),
158
+ ],
159
+ description=f"Project {project} secret created",
160
+ severity=igz_mgmt.constants.EventSeverity.info,
161
+ classification=igz_mgmt.constants.EventClassification.security,
162
+ system_event=False,
163
+ visibility=igz_mgmt.constants.EventVisibility.external,
164
+ )
165
+
166
+ def _generate_project_secret_updated_event(
167
+ self,
168
+ project: str,
169
+ secret_name: str,
170
+ secret_keys: typing.List[str],
171
+ ) -> igz_mgmt.Event:
172
+ normalized_secret_keys = self._list_to_string(secret_keys)
173
+ return igz_mgmt.Event(
174
+ source=self.source,
175
+ kind=PROJECT_SECRET_UPDATED,
176
+ description=f"Project {project} secret updated",
177
+ parameters_text=[
178
+ igz_mgmt.schemas.events.ParametersText(
179
+ name="project_name", value=project
180
+ ),
181
+ igz_mgmt.schemas.events.ParametersText(
182
+ name="secret_name", value=secret_name
183
+ ),
184
+ igz_mgmt.schemas.events.ParametersText(
185
+ name="secret_keys", value=normalized_secret_keys
186
+ ),
187
+ ],
188
+ severity=igz_mgmt.constants.EventSeverity.info,
189
+ classification=igz_mgmt.constants.EventClassification.security,
190
+ system_event=False,
191
+ visibility=igz_mgmt.constants.EventVisibility.external,
192
+ )
193
+
194
+ def _generate_project_secret_deleted_event(
195
+ self, project: str, secret_name: str
196
+ ) -> igz_mgmt.Event:
197
+ return igz_mgmt.Event(
198
+ source=self.source,
199
+ kind=PROJECT_SECRET_DELETED,
200
+ description=f"Project {project} secret deleted",
201
+ parameters_text=[
202
+ igz_mgmt.schemas.events.ParametersText(
203
+ name="project_name", value=project
204
+ ),
205
+ igz_mgmt.schemas.events.ParametersText(
206
+ name="secret_name", value=secret_name
207
+ ),
208
+ ],
209
+ severity=igz_mgmt.constants.EventSeverity.info,
210
+ classification=igz_mgmt.constants.EventClassification.security,
211
+ system_event=False,
212
+ visibility=igz_mgmt.constants.EventVisibility.external,
213
+ )
214
+
215
+ @staticmethod
216
+ def _list_to_string(list_to_convert: typing.List[str]) -> str:
217
+ return ", ".join(list_to_convert)
@@ -0,0 +1,55 @@
1
+ # Copyright 2023 Iguazio
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ #
15
+ import typing
16
+
17
+ import mlrun.api.utils.events.base as base_events
18
+ import mlrun.common.schemas
19
+
20
+
21
+ class NopClient(base_events.BaseEventClient):
22
+ def emit(self, event):
23
+ return
24
+
25
+ def generate_auth_secret_event(
26
+ self,
27
+ username: str,
28
+ secret_name: str,
29
+ action: mlrun.common.schemas.AuthSecretEventActions,
30
+ ):
31
+ """
32
+ Generate an auth secret event
33
+ :param username: username
34
+ :param secret_name: secret name
35
+ :param action: preformed action
36
+ :return: event object to emit
37
+ """
38
+ return
39
+
40
+ def generate_project_secret_event(
41
+ self,
42
+ project: str,
43
+ secret_name: str,
44
+ secret_keys: typing.List[str] = None,
45
+ action: mlrun.common.schemas.SecretEventActions = mlrun.common.schemas.SecretEventActions.created,
46
+ ):
47
+ """
48
+ Generate a project secret event
49
+ :param project: project name
50
+ :param secret_name: secret name
51
+ :param secret_keys: secret keys, optional, only relevant for created/updated events
52
+ :param action: preformed action
53
+ :return: event object to emit
54
+ """
55
+ pass
@@ -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,22 +13,12 @@
13
13
  # limitations under the License.
14
14
  #
15
15
  import asyncio
16
- import enum
17
16
 
18
17
  import mlrun
19
- import mlrun.api.schemas
18
+ import mlrun.common.schemas
20
19
  from mlrun.utils import logger
21
20
 
22
21
 
23
- # TODO: From python 3.11 StrEnum is built-in and this will not be needed
24
- class StrEnum(str, enum.Enum):
25
- def __str__(self):
26
- return self.value
27
-
28
- def __repr__(self):
29
- return self.value
30
-
31
-
32
22
  def ensure_running_on_chief(function):
33
23
  """
34
24
  The motivation of this function is to catch development bugs in which we are accidentally using functions / flows
@@ -41,7 +31,7 @@ def ensure_running_on_chief(function):
41
31
  def _ensure_running_on_chief():
42
32
  if (
43
33
  mlrun.mlconf.httpdb.clusterization.role
44
- != mlrun.api.schemas.ClusterizationRole.chief
34
+ != mlrun.common.schemas.ClusterizationRole.chief
45
35
  ):
46
36
  if (
47
37
  mlrun.mlconf.httpdb.clusterization.ensure_function_running_on_chief_mode
@@ -67,4 +57,17 @@ def ensure_running_on_chief(function):
67
57
 
68
58
  if asyncio.iscoroutinefunction(function):
69
59
  return async_wrapper
60
+
61
+ # ensure method name is preserved
62
+ wrapper.__name__ = function.__name__
63
+
70
64
  return wrapper
65
+
66
+
67
+ def minimize_project_schema(
68
+ project: mlrun.common.schemas.Project,
69
+ ) -> mlrun.common.schemas.Project:
70
+ project.spec.functions = None
71
+ project.spec.workflows = None
72
+ project.spec.artifacts = None
73
+ return project
@@ -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.
@@ -34,9 +34,12 @@ async def _periodic_function_wrapper(interval: int, function, *args, **kwargs):
34
34
  await function(*args, **kwargs)
35
35
  else:
36
36
  await run_in_threadpool(function, *args, **kwargs)
37
- except Exception:
37
+ except Exception as exc:
38
38
  logger.warning(
39
- f"Failed during periodic function execution: {function.__name__}, exc: {traceback.format_exc()}"
39
+ "Failed during periodic function execution",
40
+ func_name=function.__name__,
41
+ exc=mlrun.errors.err_to_str(exc),
42
+ tb=traceback.format_exc(),
40
43
  )
41
44
  await asyncio.sleep(interval)
42
45
 
@@ -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.