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
mlrun/utils/vault.py CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright 2020 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.
@@ -11,271 +11,272 @@
11
11
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
-
15
- import json
16
- import os
17
- from os.path import expanduser
18
-
19
- import requests
20
-
21
- from mlrun.errors import MLRunInvalidArgumentError
22
-
23
- from ..config import config as mlconf
24
- from ..k8s_utils import get_k8s_helper
25
- from .helpers import logger
26
-
27
- vault_default_prefix = "v1/secret/data"
28
-
29
-
30
- class VaultStore:
31
- def __init__(self, token=None):
32
- self._token = token
33
- self.url = mlconf.secret_stores.vault.url
34
-
35
- @property
36
- def token(self):
37
- if not self._token:
38
- self._login()
39
-
40
- return self._token
41
-
42
- def _login(self):
43
- if self._token:
44
- return
45
-
46
- if mlconf.secret_stores.vault.user_token != "":
47
- logger.warning(
48
- "Using a user-token from configuration. This should only be done in test/debug!"
49
- )
50
- self._token = mlconf.secret_stores.vault.user_token
51
- return
52
-
53
- config_role = mlconf.secret_stores.vault.role
54
- if config_role != "":
55
- role_type, role_val = config_role.split(":", 1)
56
- vault_role = f"mlrun-role-{role_type}-{role_val}"
57
- self._safe_login_with_jwt_token(vault_role)
58
-
59
- if self._token is None:
60
- logger.warning(
61
- "Vault login: no vault token is available. No secrets will be accessible"
62
- )
63
-
64
- @staticmethod
65
- def _generate_path(
66
- prefix=vault_default_prefix,
67
- user=None,
68
- project=None,
69
- user_prefix="users",
70
- project_prefix="projects",
71
- ):
72
- if user and project:
73
- raise MLRunInvalidArgumentError(
74
- "Both user and project were provided for Vault operations"
75
- )
76
-
77
- if user:
78
- return prefix + f"/mlrun/{user_prefix}/{user}"
79
- elif project:
80
- return prefix + f"/mlrun/{project_prefix}/{project}"
81
- else:
82
- raise MLRunInvalidArgumentError(
83
- "To generate a vault secret path, either user or project must be specified"
84
- )
85
-
86
- @staticmethod
87
- def _read_jwt_token():
88
- # if for some reason the path to the token is not in conf, then attempt to get the SA token (works on k8s pods)
89
- token_path = "/var/run/secrets/kubernetes.io/serviceaccount/token"
90
- if mlconf.secret_stores.vault.token_path:
91
- # Override the default SA token in case a specific token is installed in the mlconf-specified path
92
- secret_token_path = expanduser(
93
- mlconf.secret_stores.vault.token_path + "/token"
94
- )
95
- if os.path.isfile(secret_token_path):
96
- token_path = secret_token_path
97
-
98
- with open(token_path, "r") as token_file:
99
- jwt_token = token_file.read()
100
-
101
- return jwt_token
102
-
103
- def _api_call(self, method, url, data=None):
104
- self._login()
105
-
106
- headers = {"X-Vault-Token": self._token}
107
- full_url = self.url + "/" + url
108
-
109
- response = requests.request(method, full_url, headers=headers, json=data)
110
-
111
- if not response:
112
- logger.error(
113
- "Vault failed the API call",
114
- status_code=response.status_code,
115
- reason=response.reason,
116
- url=url,
117
- )
118
- return response
119
-
120
- # This method logins to the vault, assuming the container has a JWT token mounted as part of its assigned service
121
- # account.
122
- def _safe_login_with_jwt_token(self, role):
123
-
124
- if role is None:
125
- logger.warning(
126
- "login_with_token: Role passed is None. Will not attempt login"
127
- )
128
- return
129
-
130
- jwt_token = self._read_jwt_token()
131
-
132
- login_url = f"{self.url}/v1/auth/kubernetes/login"
133
- data = {"jwt": jwt_token, "role": role}
134
-
135
- response = requests.post(login_url, data=json.dumps(data))
136
- if not response:
137
- logger.error(
138
- "login_with_token: Vault failed the login request",
139
- role=role,
140
- status_code=response.status_code,
141
- reason=response.reason,
142
- )
143
- return
144
- self._token = response.json()["auth"]["client_token"]
145
-
146
- def get_secrets(self, keys, user=None, project=None):
147
- secret_path = VaultStore._generate_path(user=user, project=project)
148
- secrets = {}
149
-
150
- # Since this method is called both on the client side (when constructing VaultStore before persisting to
151
- # pod configuration) and on server side and in execution pods, we let this method fail gracefully in this case.
152
- # Should replace with something that will explode on server-side, once we have a way to do that.
153
- if not self.url:
154
- return secrets
155
-
156
- response = self._api_call("GET", secret_path)
157
-
158
- if not response:
159
- return secrets
160
-
161
- values = response.json()["data"]["data"]
162
-
163
- # if no specific keys were asked for, return all the values available
164
- if not keys:
165
- return values
166
-
167
- for key in keys:
168
- if key in values:
169
- secrets[key] = values[key]
170
- return secrets
171
-
172
- def add_vault_secrets(self, items, project=None, user=None):
173
- data_object = {"data": items}
174
- url = VaultStore._generate_path(project=project, user=user)
175
-
176
- response = self._api_call("POST", url, data_object)
177
- if not response:
178
- raise MLRunInvalidArgumentError(
179
- f"Vault failed the API call to create secrets. project={project}/user={user}"
180
- )
181
-
182
- def delete_vault_secrets(self, project=None, user=None):
183
- self._login()
184
- # Using the API to delete all versions + metadata of the given secret.
185
- url = "v1/secret/metadata" + VaultStore._generate_path(
186
- prefix="", project=project, user=user
187
- )
188
-
189
- response = self._api_call("DELETE", url)
190
- if not response:
191
- raise MLRunInvalidArgumentError(
192
- f"Vault failed the API call to delete secrets. project={project}/user={user}"
193
- )
194
-
195
- def create_project_policy(self, project):
196
- policy_name = f"mlrun-project-{project}"
197
- # TODO - need to make sure name is escaped properly and invalid chars are stripped
198
- url = "v1/sys/policies/acl/" + policy_name
199
-
200
- policy_str = (
201
- f'path "secret/data/mlrun/projects/{project}" {{\n'
202
- + ' capabilities = ["read", "list", "create", "delete", "update"]\n'
203
- + "}\n"
204
- + f'path "secret/data/mlrun/projects/{project}/*" {{\n'
205
- + ' capabilities = ["read", "list", "create", "delete", "update"]\n'
206
- + "}"
207
- )
208
-
209
- data_object = {"policy": policy_str}
210
-
211
- response = self._api_call("PUT", url, data_object)
212
- if not response:
213
- raise MLRunInvalidArgumentError(
214
- f"Vault failed the API call to create a policy. "
215
- f"Response code: ({response.status_code}) - {response.reason}"
216
- )
217
- return policy_name
218
-
219
- def create_project_role(self, project, sa, policy, namespace="default-tenant"):
220
- role_name = f"mlrun-role-project-{project}"
221
- # TODO - need to make sure name is escaped properly and invalid chars are stripped
222
- url = "v1/auth/kubernetes/role/" + role_name
223
-
224
- role_object = {
225
- "bound_service_account_names": sa,
226
- "bound_service_account_namespaces": namespace,
227
- "policies": [policy],
228
- "token_ttl": mlconf.secret_stores.vault.token_ttl,
229
- }
230
-
231
- response = self._api_call("POST", url, role_object)
232
- if not response:
233
- raise MLRunInvalidArgumentError(
234
- f"Vault failed the API call to create a secret. "
235
- f"Response code: ({response.status_code}) - {response.reason}"
236
- )
237
- return role_name
238
-
239
-
240
- def store_vault_project_secrets(project, items):
241
- return VaultStore().add_vault_secrets(items, project=project)
242
-
243
-
244
- def add_vault_user_secrets(user, items):
245
- return VaultStore().add_vault_secrets(items, user=user)
246
-
247
-
248
- def init_project_vault_configuration(project):
249
- """Create needed configurations for this new project:
250
- - Create a k8s service account with the name sa_vault_{proj name}
251
- - Create a Vault policy with the name proj_{proj name}
252
- - Create a Vault k8s auth role with the name role_proj_{proj name}
253
- These constructs will enable any pod created as part of this project to access the project's secrets
254
- in Vault, assuming that the secret which is part of the SA created is mounted to the pod.
255
-
256
- :param project: Project name
257
- """
258
- logger.info("Initializing project vault configuration", project=project)
259
-
260
- namespace = mlconf.namespace
261
- k8s = get_k8s_helper(silent=True)
262
- service_account_name = (
263
- mlconf.secret_stores.vault.project_service_account_name.format(project=project)
264
- )
265
-
266
- secret_name = k8s.get_project_vault_secret_name(
267
- project, service_account_name, namespace=namespace
268
- )
269
-
270
- if not secret_name:
271
- k8s.create_project_service_account(
272
- project, service_account_name, namespace=namespace
273
- )
274
-
275
- vault = VaultStore()
276
- policy_name = vault.create_project_policy(project)
277
- role_name = vault.create_project_role(
278
- project, namespace=namespace, sa=service_account_name, policy=policy_name
279
- )
280
-
281
- logger.info("Created Vault policy. ", policy=policy_name, role=role_name)
14
+ #
15
+ # import json
16
+ # import os
17
+ # from os.path import expanduser
18
+ #
19
+ # import requests
20
+ #
21
+ # from mlrun.errors import MLRunInvalidArgumentError
22
+ #
23
+ # from ..config import config as mlconf
24
+ # from ..k8s_utils import get_k8s_helper
25
+ # from .helpers import logger
26
+ #
27
+ # vault_default_prefix = "v1/secret/data"
28
+ #
29
+ #
30
+ # class VaultStore:
31
+ # def __init__(self, token=None):
32
+ # self._token = token
33
+ # self.url = mlconf.secret_stores.vault.url
34
+ #
35
+ # @property
36
+ # def token(self):
37
+ # if not self._token:
38
+ # self._login()
39
+ #
40
+ # return self._token
41
+ #
42
+ # def _login(self):
43
+ # if self._token:
44
+ # return
45
+ #
46
+ # if mlconf.secret_stores.vault.user_token != "":
47
+ # logger.warning(
48
+ # "Using a user-token from configuration. This should only be done in test/debug!"
49
+ # )
50
+ # self._token = mlconf.secret_stores.vault.user_token
51
+ # return
52
+ #
53
+ # config_role = mlconf.secret_stores.vault.role
54
+ # if config_role != "":
55
+ # role_type, role_val = config_role.split(":", 1)
56
+ # vault_role = f"mlrun-role-{role_type}-{role_val}"
57
+ # self._safe_login_with_jwt_token(vault_role)
58
+ #
59
+ # if self._token is None:
60
+ # logger.warning(
61
+ # "Vault login: no vault token is available. No secrets will be accessible"
62
+ # )
63
+ #
64
+ # @staticmethod
65
+ # def _generate_path(
66
+ # prefix=vault_default_prefix,
67
+ # user=None,
68
+ # project=None,
69
+ # user_prefix="users",
70
+ # project_prefix="projects",
71
+ # ):
72
+ # if user and project:
73
+ # raise MLRunInvalidArgumentError(
74
+ # "Both user and project were provided for Vault operations"
75
+ # )
76
+ #
77
+ # if user:
78
+ # return prefix + f"/mlrun/{user_prefix}/{user}"
79
+ # elif project:
80
+ # return prefix + f"/mlrun/{project_prefix}/{project}"
81
+ # else:
82
+ # raise MLRunInvalidArgumentError(
83
+ # "To generate a vault secret path, either user or project must be specified"
84
+ # )
85
+ #
86
+ # @staticmethod
87
+ # def _read_jwt_token():
88
+ # # if for some reason the path to the token is not in conf, then attempt to get the SA token
89
+ # # (works on k8s pods)
90
+ # token_path = "/var/run/secrets/kubernetes.io/serviceaccount/token"
91
+ # if mlconf.secret_stores.vault.token_path:
92
+ # # Override the default SA token in case a specific token is installed in the mlconf-specified path
93
+ # secret_token_path = expanduser(
94
+ # mlconf.secret_stores.vault.token_path + "/token"
95
+ # )
96
+ # if os.path.isfile(secret_token_path):
97
+ # token_path = secret_token_path
98
+ #
99
+ # with open(token_path, "r") as token_file:
100
+ # jwt_token = token_file.read()
101
+ #
102
+ # return jwt_token
103
+ #
104
+ # def _api_call(self, method, url, data=None):
105
+ # self._login()
106
+ #
107
+ # headers = {"X-Vault-Token": self._token}
108
+ # full_url = self.url + "/" + url
109
+ #
110
+ # response = requests.request(method, full_url, headers=headers, json=data)
111
+ #
112
+ # if not response:
113
+ # logger.error(
114
+ # "Vault failed the API call",
115
+ # status_code=response.status_code,
116
+ # reason=response.reason,
117
+ # url=url,
118
+ # )
119
+ # return response
120
+ #
121
+ # # This method logins to the vault, assuming the container has a JWT token mounted as part of its assigned service
122
+ # # account.
123
+ # def _safe_login_with_jwt_token(self, role):
124
+ #
125
+ # if role is None:
126
+ # logger.warning(
127
+ # "login_with_token: Role passed is None. Will not attempt login"
128
+ # )
129
+ # return
130
+ #
131
+ # jwt_token = self._read_jwt_token()
132
+ #
133
+ # login_url = f"{self.url}/v1/auth/kubernetes/login"
134
+ # data = {"jwt": jwt_token, "role": role}
135
+ #
136
+ # response = requests.post(login_url, data=json.dumps(data))
137
+ # if not response:
138
+ # logger.error(
139
+ # "login_with_token: Vault failed the login request",
140
+ # role=role,
141
+ # status_code=response.status_code,
142
+ # reason=response.reason,
143
+ # )
144
+ # return
145
+ # self._token = response.json()["auth"]["client_token"]
146
+ #
147
+ # def get_secrets(self, keys, user=None, project=None):
148
+ # secret_path = VaultStore._generate_path(user=user, project=project)
149
+ # secrets = {}
150
+ #
151
+ # # Since this method is called both on the client side (when constructing VaultStore before persisting to
152
+ # # pod configuration) and on server side and in execution pods, we let this method fail gracefully in this case
153
+ # # Should replace with something that will explode on server-side, once we have a way to do that.
154
+ # if not self.url:
155
+ # return secrets
156
+ #
157
+ # response = self._api_call("GET", secret_path)
158
+ #
159
+ # if not response:
160
+ # return secrets
161
+ #
162
+ # values = response.json()["data"]["data"]
163
+ #
164
+ # # if no specific keys were asked for, return all the values available
165
+ # if not keys:
166
+ # return values
167
+ #
168
+ # for key in keys:
169
+ # if key in values:
170
+ # secrets[key] = values[key]
171
+ # return secrets
172
+ #
173
+ # def add_vault_secrets(self, items, project=None, user=None):
174
+ # data_object = {"data": items}
175
+ # url = VaultStore._generate_path(project=project, user=user)
176
+ #
177
+ # response = self._api_call("POST", url, data_object)
178
+ # if not response:
179
+ # raise MLRunInvalidArgumentError(
180
+ # f"Vault failed the API call to create secrets. project={project}/user={user}"
181
+ # )
182
+ #
183
+ # def delete_vault_secrets(self, project=None, user=None):
184
+ # self._login()
185
+ # # Using the API to delete all versions + metadata of the given secret.
186
+ # url = "v1/secret/metadata" + VaultStore._generate_path(
187
+ # prefix="", project=project, user=user
188
+ # )
189
+ #
190
+ # response = self._api_call("DELETE", url)
191
+ # if not response:
192
+ # raise MLRunInvalidArgumentError(
193
+ # f"Vault failed the API call to delete secrets. project={project}/user={user}"
194
+ # )
195
+ #
196
+ # def create_project_policy(self, project):
197
+ # policy_name = f"mlrun-project-{project}"
198
+ # # TODO - need to make sure name is escaped properly and invalid chars are stripped
199
+ # url = "v1/sys/policies/acl/" + policy_name
200
+ #
201
+ # policy_str = (
202
+ # f'path "secret/data/mlrun/projects/{project}" {{\n'
203
+ # + ' capabilities = ["read", "list", "create", "delete", "update"]\n'
204
+ # + "}\n"
205
+ # + f'path "secret/data/mlrun/projects/{project}/*" {{\n'
206
+ # + ' capabilities = ["read", "list", "create", "delete", "update"]\n'
207
+ # + "}"
208
+ # )
209
+ #
210
+ # data_object = {"policy": policy_str}
211
+ #
212
+ # response = self._api_call("PUT", url, data_object)
213
+ # if not response:
214
+ # raise MLRunInvalidArgumentError(
215
+ # f"Vault failed the API call to create a policy. "
216
+ # f"Response code: ({response.status_code}) - {response.reason}"
217
+ # )
218
+ # return policy_name
219
+ #
220
+ # def create_project_role(self, project, sa, policy, namespace="default-tenant"):
221
+ # role_name = f"mlrun-role-project-{project}"
222
+ # # TODO - need to make sure name is escaped properly and invalid chars are stripped
223
+ # url = "v1/auth/kubernetes/role/" + role_name
224
+ #
225
+ # role_object = {
226
+ # "bound_service_account_names": sa,
227
+ # "bound_service_account_namespaces": namespace,
228
+ # "policies": [policy],
229
+ # "token_ttl": mlconf.secret_stores.vault.token_ttl,
230
+ # }
231
+ #
232
+ # response = self._api_call("POST", url, role_object)
233
+ # if not response:
234
+ # raise MLRunInvalidArgumentError(
235
+ # f"Vault failed the API call to create a secret. "
236
+ # f"Response code: ({response.status_code}) - {response.reason}"
237
+ # )
238
+ # return role_name
239
+ #
240
+ #
241
+ # def store_vault_project_secrets(project, items):
242
+ # return VaultStore().add_vault_secrets(items, project=project)
243
+ #
244
+ #
245
+ # def add_vault_user_secrets(user, items):
246
+ # return VaultStore().add_vault_secrets(items, user=user)
247
+ #
248
+ #
249
+ # def init_project_vault_configuration(project):
250
+ # """Create needed configurations for this new project:
251
+ # - Create a k8s service account with the name sa_vault_{proj name}
252
+ # - Create a Vault policy with the name proj_{proj name}
253
+ # - Create a Vault k8s auth role with the name role_proj_{proj name}
254
+ # These constructs will enable any pod created as part of this project to access the project's secrets
255
+ # in Vault, assuming that the secret which is part of the SA created is mounted to the pod.
256
+ #
257
+ # :param project: Project name
258
+ # """
259
+ # logger.info("Initializing project vault configuration", project=project)
260
+ #
261
+ # namespace = mlconf.namespace
262
+ # k8s = get_k8s_helper(silent=True)
263
+ # service_account_name = (
264
+ # mlconf.secret_stores.vault.project_service_account_name.format(project=project)
265
+ # )
266
+ #
267
+ # secret_name = k8s.get_project_vault_secret_name(
268
+ # project, service_account_name, namespace=namespace
269
+ # )
270
+ #
271
+ # if not secret_name:
272
+ # k8s.create_project_service_account(
273
+ # project, service_account_name, namespace=namespace
274
+ # )
275
+ #
276
+ # vault = VaultStore()
277
+ # policy_name = vault.create_project_policy(project)
278
+ # role_name = vault.create_project_role(
279
+ # project, namespace=namespace, sa=service_account_name, policy=policy_name
280
+ # )
281
+ #
282
+ # logger.info("Created Vault policy. ", policy=policy_name, role=role_name)
@@ -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
1
  {
2
- "git_commit": "4d664a57bb739cc1064f4f64e304ffaf3b623f3e",
3
- "version": "1.3.3"
2
+ "git_commit": "b7786a3b8683c20c239f89292d1e671d9f466f25",
3
+ "version": "1.4.0"
4
4
  }
@@ -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.