mlrun 1.3.3rc1__py3-none-any.whl → 1.4.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of mlrun might be problematic. Click here for more details.

Files changed (444) hide show
  1. mlrun/__init__.py +3 -3
  2. mlrun/__main__.py +79 -37
  3. mlrun/api/__init__.py +1 -1
  4. mlrun/api/api/__init__.py +1 -1
  5. mlrun/api/api/api.py +4 -4
  6. mlrun/api/api/deps.py +10 -21
  7. mlrun/api/api/endpoints/__init__.py +1 -1
  8. mlrun/api/api/endpoints/artifacts.py +64 -36
  9. mlrun/api/api/endpoints/auth.py +4 -4
  10. mlrun/api/api/endpoints/background_tasks.py +11 -11
  11. mlrun/api/api/endpoints/client_spec.py +5 -5
  12. mlrun/api/api/endpoints/clusterization_spec.py +6 -4
  13. mlrun/api/api/endpoints/feature_store.py +124 -115
  14. mlrun/api/api/endpoints/files.py +22 -14
  15. mlrun/api/api/endpoints/frontend_spec.py +28 -21
  16. mlrun/api/api/endpoints/functions.py +142 -87
  17. mlrun/api/api/endpoints/grafana_proxy.py +89 -442
  18. mlrun/api/api/endpoints/healthz.py +20 -7
  19. mlrun/api/api/endpoints/hub.py +320 -0
  20. mlrun/api/api/endpoints/internal/__init__.py +1 -1
  21. mlrun/api/api/endpoints/internal/config.py +1 -1
  22. mlrun/api/api/endpoints/internal/memory_reports.py +9 -9
  23. mlrun/api/api/endpoints/logs.py +11 -11
  24. mlrun/api/api/endpoints/model_endpoints.py +74 -70
  25. mlrun/api/api/endpoints/operations.py +13 -9
  26. mlrun/api/api/endpoints/pipelines.py +93 -88
  27. mlrun/api/api/endpoints/projects.py +35 -35
  28. mlrun/api/api/endpoints/runs.py +69 -27
  29. mlrun/api/api/endpoints/runtime_resources.py +28 -28
  30. mlrun/api/api/endpoints/schedules.py +98 -41
  31. mlrun/api/api/endpoints/secrets.py +37 -32
  32. mlrun/api/api/endpoints/submit.py +12 -12
  33. mlrun/api/api/endpoints/tags.py +20 -22
  34. mlrun/api/api/utils.py +251 -42
  35. mlrun/api/constants.py +1 -1
  36. mlrun/api/crud/__init__.py +18 -15
  37. mlrun/api/crud/artifacts.py +10 -10
  38. mlrun/api/crud/client_spec.py +4 -4
  39. mlrun/api/crud/clusterization_spec.py +3 -3
  40. mlrun/api/crud/feature_store.py +54 -46
  41. mlrun/api/crud/functions.py +3 -3
  42. mlrun/api/crud/hub.py +312 -0
  43. mlrun/api/crud/logs.py +11 -9
  44. mlrun/api/crud/model_monitoring/__init__.py +3 -3
  45. mlrun/api/crud/model_monitoring/grafana.py +435 -0
  46. mlrun/api/crud/model_monitoring/model_endpoints.py +352 -129
  47. mlrun/api/crud/notifications.py +149 -0
  48. mlrun/api/crud/pipelines.py +67 -52
  49. mlrun/api/crud/projects.py +51 -23
  50. mlrun/api/crud/runs.py +7 -5
  51. mlrun/api/crud/runtime_resources.py +13 -13
  52. mlrun/api/{db/filedb → crud/runtimes}/__init__.py +1 -1
  53. mlrun/api/crud/runtimes/nuclio/__init__.py +14 -0
  54. mlrun/api/crud/runtimes/nuclio/function.py +505 -0
  55. mlrun/api/crud/runtimes/nuclio/helpers.py +310 -0
  56. mlrun/api/crud/secrets.py +88 -46
  57. mlrun/api/crud/tags.py +5 -5
  58. mlrun/api/db/__init__.py +1 -1
  59. mlrun/api/db/base.py +102 -54
  60. mlrun/api/db/init_db.py +2 -3
  61. mlrun/api/db/session.py +4 -12
  62. mlrun/api/db/sqldb/__init__.py +1 -1
  63. mlrun/api/db/sqldb/db.py +439 -196
  64. mlrun/api/db/sqldb/helpers.py +1 -1
  65. mlrun/api/db/sqldb/models/__init__.py +3 -3
  66. mlrun/api/db/sqldb/models/models_mysql.py +82 -64
  67. mlrun/api/db/sqldb/models/models_sqlite.py +76 -64
  68. mlrun/api/db/sqldb/session.py +27 -20
  69. mlrun/api/initial_data.py +82 -24
  70. mlrun/api/launcher.py +196 -0
  71. mlrun/api/main.py +91 -22
  72. mlrun/api/middlewares.py +6 -5
  73. mlrun/api/migrations_mysql/env.py +1 -1
  74. mlrun/api/migrations_mysql/versions/28383af526f3_market_place_to_hub.py +40 -0
  75. mlrun/api/migrations_mysql/versions/32bae1b0e29c_increase_timestamp_fields_precision.py +1 -1
  76. mlrun/api/migrations_mysql/versions/4903aef6a91d_tag_foreign_key_and_cascades.py +1 -1
  77. mlrun/api/migrations_mysql/versions/5f1351c88a19_adding_background_tasks_table.py +1 -1
  78. mlrun/api/migrations_mysql/versions/88e656800d6a_add_requested_logs_column_and_index_to_.py +1 -1
  79. mlrun/api/migrations_mysql/versions/9d16de5f03a7_adding_data_versions_table.py +1 -1
  80. mlrun/api/migrations_mysql/versions/b86f5b53f3d7_adding_name_and_updated_to_runs_table.py +1 -1
  81. mlrun/api/migrations_mysql/versions/c4af40b0bf61_init.py +1 -1
  82. mlrun/api/migrations_mysql/versions/c905d15bd91d_notifications.py +72 -0
  83. mlrun/api/migrations_mysql/versions/ee041e8fdaa0_adding_next_run_time_column_to_schedule_.py +1 -1
  84. mlrun/api/migrations_sqlite/env.py +1 -1
  85. mlrun/api/migrations_sqlite/versions/11f8dd2dc9fe_init.py +1 -1
  86. mlrun/api/migrations_sqlite/versions/1c954f8cb32d_schedule_last_run_uri.py +1 -1
  87. mlrun/api/migrations_sqlite/versions/2b6d23c715aa_adding_feature_sets.py +1 -1
  88. mlrun/api/migrations_sqlite/versions/4acd9430b093_market_place_to_hub.py +77 -0
  89. mlrun/api/migrations_sqlite/versions/6401142f2d7c_adding_next_run_time_column_to_schedule_.py +1 -1
  90. mlrun/api/migrations_sqlite/versions/64d90a1a69bc_adding_background_tasks_table.py +1 -1
  91. mlrun/api/migrations_sqlite/versions/803438ecd005_add_requested_logs_column_to_runs.py +1 -1
  92. mlrun/api/migrations_sqlite/versions/863114f0c659_refactoring_feature_set.py +1 -1
  93. mlrun/api/migrations_sqlite/versions/959ae00528ad_notifications.py +63 -0
  94. mlrun/api/migrations_sqlite/versions/accf9fc83d38_adding_data_versions_table.py +1 -1
  95. mlrun/api/migrations_sqlite/versions/b68e8e897a28_schedule_labels.py +1 -1
  96. mlrun/api/migrations_sqlite/versions/bcd0c1f9720c_adding_project_labels.py +1 -1
  97. mlrun/api/migrations_sqlite/versions/cf21882f938e_schedule_id.py +1 -1
  98. mlrun/api/migrations_sqlite/versions/d781f58f607f_tag_object_name_string.py +1 -1
  99. mlrun/api/migrations_sqlite/versions/deac06871ace_adding_marketplace_sources_table.py +1 -1
  100. mlrun/api/migrations_sqlite/versions/e1dd5983c06b_schedule_concurrency_limit.py +1 -1
  101. mlrun/api/migrations_sqlite/versions/e5594ed3ab53_adding_name_and_updated_to_runs_table.py +1 -1
  102. mlrun/api/migrations_sqlite/versions/f4249b4ba6fa_adding_feature_vectors.py +1 -1
  103. mlrun/api/migrations_sqlite/versions/f7b5a1a03629_adding_feature_labels.py +1 -1
  104. mlrun/api/schemas/__init__.py +216 -138
  105. mlrun/api/utils/__init__.py +1 -1
  106. mlrun/api/utils/asyncio.py +1 -1
  107. mlrun/api/utils/auth/__init__.py +1 -1
  108. mlrun/api/utils/auth/providers/__init__.py +1 -1
  109. mlrun/api/utils/auth/providers/base.py +7 -7
  110. mlrun/api/utils/auth/providers/nop.py +6 -7
  111. mlrun/api/utils/auth/providers/opa.py +17 -17
  112. mlrun/api/utils/auth/verifier.py +36 -34
  113. mlrun/api/utils/background_tasks.py +24 -24
  114. mlrun/{builder.py → api/utils/builder.py} +216 -123
  115. mlrun/api/utils/clients/__init__.py +1 -1
  116. mlrun/api/utils/clients/chief.py +19 -4
  117. mlrun/api/utils/clients/iguazio.py +106 -60
  118. mlrun/api/utils/clients/log_collector.py +1 -1
  119. mlrun/api/utils/clients/nuclio.py +23 -23
  120. mlrun/api/utils/clients/protocols/grpc.py +2 -2
  121. mlrun/api/utils/db/__init__.py +1 -1
  122. mlrun/api/utils/db/alembic.py +1 -1
  123. mlrun/api/utils/db/backup.py +1 -1
  124. mlrun/api/utils/db/mysql.py +24 -25
  125. mlrun/api/utils/db/sql_collation.py +1 -1
  126. mlrun/api/utils/db/sqlite_migration.py +2 -2
  127. mlrun/api/utils/events/__init__.py +14 -0
  128. mlrun/api/utils/events/base.py +57 -0
  129. mlrun/api/utils/events/events_factory.py +41 -0
  130. mlrun/api/utils/events/iguazio.py +217 -0
  131. mlrun/api/utils/events/nop.py +55 -0
  132. mlrun/api/utils/helpers.py +16 -13
  133. mlrun/api/utils/memory_reports.py +1 -1
  134. mlrun/api/utils/periodic.py +6 -3
  135. mlrun/api/utils/projects/__init__.py +1 -1
  136. mlrun/api/utils/projects/follower.py +33 -33
  137. mlrun/api/utils/projects/leader.py +36 -34
  138. mlrun/api/utils/projects/member.py +27 -27
  139. mlrun/api/utils/projects/remotes/__init__.py +1 -1
  140. mlrun/api/utils/projects/remotes/follower.py +13 -13
  141. mlrun/api/utils/projects/remotes/leader.py +10 -10
  142. mlrun/api/utils/projects/remotes/nop_follower.py +27 -21
  143. mlrun/api/utils/projects/remotes/nop_leader.py +17 -16
  144. mlrun/api/utils/scheduler.py +140 -51
  145. mlrun/api/utils/singletons/__init__.py +1 -1
  146. mlrun/api/utils/singletons/db.py +9 -15
  147. mlrun/api/utils/singletons/k8s.py +677 -5
  148. mlrun/api/utils/singletons/logs_dir.py +1 -1
  149. mlrun/api/utils/singletons/project_member.py +1 -1
  150. mlrun/api/utils/singletons/scheduler.py +1 -1
  151. mlrun/artifacts/__init__.py +2 -2
  152. mlrun/artifacts/base.py +8 -2
  153. mlrun/artifacts/dataset.py +5 -3
  154. mlrun/artifacts/manager.py +7 -1
  155. mlrun/artifacts/model.py +15 -4
  156. mlrun/artifacts/plots.py +1 -1
  157. mlrun/common/__init__.py +1 -1
  158. mlrun/common/constants.py +15 -0
  159. mlrun/common/model_monitoring.py +209 -0
  160. mlrun/common/schemas/__init__.py +167 -0
  161. mlrun/{api → common}/schemas/artifact.py +13 -14
  162. mlrun/{api → common}/schemas/auth.py +10 -8
  163. mlrun/{api → common}/schemas/background_task.py +3 -3
  164. mlrun/{api → common}/schemas/client_spec.py +1 -1
  165. mlrun/{api → common}/schemas/clusterization_spec.py +3 -3
  166. mlrun/{api → common}/schemas/constants.py +21 -8
  167. mlrun/common/schemas/events.py +36 -0
  168. mlrun/{api → common}/schemas/feature_store.py +2 -1
  169. mlrun/{api → common}/schemas/frontend_spec.py +7 -6
  170. mlrun/{api → common}/schemas/function.py +5 -5
  171. mlrun/{api → common}/schemas/http.py +3 -3
  172. mlrun/common/schemas/hub.py +134 -0
  173. mlrun/{api → common}/schemas/k8s.py +3 -3
  174. mlrun/{api → common}/schemas/memory_reports.py +1 -1
  175. mlrun/common/schemas/model_endpoints.py +342 -0
  176. mlrun/common/schemas/notification.py +57 -0
  177. mlrun/{api → common}/schemas/object.py +6 -6
  178. mlrun/{api → common}/schemas/pipeline.py +3 -3
  179. mlrun/{api → common}/schemas/project.py +6 -5
  180. mlrun/common/schemas/regex.py +24 -0
  181. mlrun/common/schemas/runs.py +30 -0
  182. mlrun/{api → common}/schemas/runtime_resource.py +3 -3
  183. mlrun/{api → common}/schemas/schedule.py +19 -7
  184. mlrun/{api → common}/schemas/secret.py +3 -3
  185. mlrun/{api → common}/schemas/tag.py +2 -2
  186. mlrun/common/types.py +25 -0
  187. mlrun/config.py +152 -20
  188. mlrun/data_types/__init__.py +7 -2
  189. mlrun/data_types/data_types.py +4 -2
  190. mlrun/data_types/infer.py +1 -1
  191. mlrun/data_types/spark.py +10 -3
  192. mlrun/datastore/__init__.py +10 -3
  193. mlrun/datastore/azure_blob.py +1 -1
  194. mlrun/datastore/base.py +185 -53
  195. mlrun/datastore/datastore.py +1 -1
  196. mlrun/datastore/filestore.py +1 -1
  197. mlrun/datastore/google_cloud_storage.py +1 -1
  198. mlrun/datastore/inmem.py +4 -1
  199. mlrun/datastore/redis.py +1 -1
  200. mlrun/datastore/s3.py +1 -1
  201. mlrun/datastore/sources.py +192 -70
  202. mlrun/datastore/spark_udf.py +44 -0
  203. mlrun/datastore/store_resources.py +4 -4
  204. mlrun/datastore/targets.py +115 -45
  205. mlrun/datastore/utils.py +127 -5
  206. mlrun/datastore/v3io.py +1 -1
  207. mlrun/datastore/wasbfs/__init__.py +1 -1
  208. mlrun/datastore/wasbfs/fs.py +1 -1
  209. mlrun/db/__init__.py +7 -5
  210. mlrun/db/base.py +112 -68
  211. mlrun/db/httpdb.py +445 -277
  212. mlrun/db/nopdb.py +491 -0
  213. mlrun/db/sqldb.py +112 -65
  214. mlrun/errors.py +6 -1
  215. mlrun/execution.py +44 -22
  216. mlrun/feature_store/__init__.py +1 -1
  217. mlrun/feature_store/api.py +143 -95
  218. mlrun/feature_store/common.py +16 -20
  219. mlrun/feature_store/feature_set.py +42 -12
  220. mlrun/feature_store/feature_vector.py +32 -21
  221. mlrun/feature_store/ingestion.py +9 -12
  222. mlrun/feature_store/retrieval/__init__.py +3 -2
  223. mlrun/feature_store/retrieval/base.py +388 -66
  224. mlrun/feature_store/retrieval/dask_merger.py +63 -151
  225. mlrun/feature_store/retrieval/job.py +30 -12
  226. mlrun/feature_store/retrieval/local_merger.py +40 -133
  227. mlrun/feature_store/retrieval/spark_merger.py +129 -127
  228. mlrun/feature_store/retrieval/storey_merger.py +173 -0
  229. mlrun/feature_store/steps.py +132 -15
  230. mlrun/features.py +8 -3
  231. mlrun/frameworks/__init__.py +1 -1
  232. mlrun/frameworks/_common/__init__.py +1 -1
  233. mlrun/frameworks/_common/artifacts_library.py +1 -1
  234. mlrun/frameworks/_common/mlrun_interface.py +1 -1
  235. mlrun/frameworks/_common/model_handler.py +1 -1
  236. mlrun/frameworks/_common/plan.py +1 -1
  237. mlrun/frameworks/_common/producer.py +1 -1
  238. mlrun/frameworks/_common/utils.py +1 -1
  239. mlrun/frameworks/_dl_common/__init__.py +1 -1
  240. mlrun/frameworks/_dl_common/loggers/__init__.py +1 -1
  241. mlrun/frameworks/_dl_common/loggers/logger.py +1 -1
  242. mlrun/frameworks/_dl_common/loggers/mlrun_logger.py +1 -1
  243. mlrun/frameworks/_dl_common/loggers/tensorboard_logger.py +1 -1
  244. mlrun/frameworks/_dl_common/model_handler.py +1 -1
  245. mlrun/frameworks/_dl_common/utils.py +1 -1
  246. mlrun/frameworks/_ml_common/__init__.py +1 -1
  247. mlrun/frameworks/_ml_common/artifacts_library.py +1 -1
  248. mlrun/frameworks/_ml_common/loggers/__init__.py +1 -1
  249. mlrun/frameworks/_ml_common/loggers/logger.py +1 -1
  250. mlrun/frameworks/_ml_common/loggers/mlrun_logger.py +1 -1
  251. mlrun/frameworks/_ml_common/model_handler.py +1 -1
  252. mlrun/frameworks/_ml_common/pkl_model_server.py +13 -1
  253. mlrun/frameworks/_ml_common/plan.py +1 -1
  254. mlrun/frameworks/_ml_common/plans/__init__.py +1 -1
  255. mlrun/frameworks/_ml_common/plans/calibration_curve_plan.py +1 -6
  256. mlrun/frameworks/_ml_common/plans/confusion_matrix_plan.py +1 -1
  257. mlrun/frameworks/_ml_common/plans/dataset_plan.py +1 -1
  258. mlrun/frameworks/_ml_common/plans/feature_importance_plan.py +1 -1
  259. mlrun/frameworks/_ml_common/plans/roc_curve_plan.py +1 -1
  260. mlrun/frameworks/_ml_common/producer.py +1 -1
  261. mlrun/frameworks/_ml_common/utils.py +1 -1
  262. mlrun/frameworks/auto_mlrun/__init__.py +1 -1
  263. mlrun/frameworks/auto_mlrun/auto_mlrun.py +1 -1
  264. mlrun/frameworks/huggingface/__init__.py +1 -1
  265. mlrun/frameworks/huggingface/model_server.py +1 -1
  266. mlrun/frameworks/lgbm/__init__.py +1 -1
  267. mlrun/frameworks/lgbm/callbacks/__init__.py +1 -1
  268. mlrun/frameworks/lgbm/callbacks/callback.py +1 -1
  269. mlrun/frameworks/lgbm/callbacks/logging_callback.py +1 -1
  270. mlrun/frameworks/lgbm/callbacks/mlrun_logging_callback.py +1 -1
  271. mlrun/frameworks/lgbm/mlrun_interfaces/__init__.py +1 -1
  272. mlrun/frameworks/lgbm/mlrun_interfaces/booster_mlrun_interface.py +1 -1
  273. mlrun/frameworks/lgbm/mlrun_interfaces/mlrun_interface.py +1 -1
  274. mlrun/frameworks/lgbm/mlrun_interfaces/model_mlrun_interface.py +1 -1
  275. mlrun/frameworks/lgbm/model_handler.py +1 -1
  276. mlrun/frameworks/lgbm/model_server.py +1 -1
  277. mlrun/frameworks/lgbm/utils.py +1 -1
  278. mlrun/frameworks/onnx/__init__.py +1 -1
  279. mlrun/frameworks/onnx/dataset.py +1 -1
  280. mlrun/frameworks/onnx/mlrun_interface.py +1 -1
  281. mlrun/frameworks/onnx/model_handler.py +1 -1
  282. mlrun/frameworks/onnx/model_server.py +1 -1
  283. mlrun/frameworks/parallel_coordinates.py +1 -1
  284. mlrun/frameworks/pytorch/__init__.py +1 -1
  285. mlrun/frameworks/pytorch/callbacks/__init__.py +1 -1
  286. mlrun/frameworks/pytorch/callbacks/callback.py +1 -1
  287. mlrun/frameworks/pytorch/callbacks/logging_callback.py +1 -1
  288. mlrun/frameworks/pytorch/callbacks/mlrun_logging_callback.py +1 -1
  289. mlrun/frameworks/pytorch/callbacks/tensorboard_logging_callback.py +1 -1
  290. mlrun/frameworks/pytorch/callbacks_handler.py +1 -1
  291. mlrun/frameworks/pytorch/mlrun_interface.py +1 -1
  292. mlrun/frameworks/pytorch/model_handler.py +1 -1
  293. mlrun/frameworks/pytorch/model_server.py +1 -1
  294. mlrun/frameworks/pytorch/utils.py +1 -1
  295. mlrun/frameworks/sklearn/__init__.py +1 -1
  296. mlrun/frameworks/sklearn/estimator.py +1 -1
  297. mlrun/frameworks/sklearn/metric.py +1 -1
  298. mlrun/frameworks/sklearn/metrics_library.py +1 -1
  299. mlrun/frameworks/sklearn/mlrun_interface.py +1 -1
  300. mlrun/frameworks/sklearn/model_handler.py +1 -1
  301. mlrun/frameworks/sklearn/utils.py +1 -1
  302. mlrun/frameworks/tf_keras/__init__.py +1 -1
  303. mlrun/frameworks/tf_keras/callbacks/__init__.py +1 -1
  304. mlrun/frameworks/tf_keras/callbacks/logging_callback.py +1 -1
  305. mlrun/frameworks/tf_keras/callbacks/mlrun_logging_callback.py +1 -1
  306. mlrun/frameworks/tf_keras/callbacks/tensorboard_logging_callback.py +1 -1
  307. mlrun/frameworks/tf_keras/mlrun_interface.py +1 -1
  308. mlrun/frameworks/tf_keras/model_handler.py +1 -1
  309. mlrun/frameworks/tf_keras/model_server.py +1 -1
  310. mlrun/frameworks/tf_keras/utils.py +1 -1
  311. mlrun/frameworks/xgboost/__init__.py +1 -1
  312. mlrun/frameworks/xgboost/mlrun_interface.py +1 -1
  313. mlrun/frameworks/xgboost/model_handler.py +1 -1
  314. mlrun/frameworks/xgboost/utils.py +1 -1
  315. mlrun/k8s_utils.py +14 -765
  316. mlrun/kfpops.py +14 -17
  317. mlrun/launcher/__init__.py +13 -0
  318. mlrun/launcher/base.py +406 -0
  319. mlrun/launcher/client.py +159 -0
  320. mlrun/launcher/factory.py +50 -0
  321. mlrun/launcher/local.py +276 -0
  322. mlrun/launcher/remote.py +178 -0
  323. mlrun/lists.py +10 -2
  324. mlrun/mlutils/__init__.py +1 -1
  325. mlrun/mlutils/data.py +1 -1
  326. mlrun/mlutils/models.py +1 -1
  327. mlrun/mlutils/plots.py +1 -1
  328. mlrun/model.py +252 -14
  329. mlrun/model_monitoring/__init__.py +41 -0
  330. mlrun/model_monitoring/features_drift_table.py +1 -1
  331. mlrun/model_monitoring/helpers.py +123 -38
  332. mlrun/model_monitoring/model_endpoint.py +144 -0
  333. mlrun/model_monitoring/model_monitoring_batch.py +310 -259
  334. mlrun/model_monitoring/stores/__init__.py +106 -0
  335. mlrun/model_monitoring/stores/kv_model_endpoint_store.py +448 -0
  336. mlrun/model_monitoring/stores/model_endpoint_store.py +147 -0
  337. mlrun/model_monitoring/stores/models/__init__.py +23 -0
  338. mlrun/model_monitoring/stores/models/base.py +18 -0
  339. mlrun/model_monitoring/stores/models/mysql.py +100 -0
  340. mlrun/model_monitoring/stores/models/sqlite.py +98 -0
  341. mlrun/model_monitoring/stores/sql_model_endpoint_store.py +370 -0
  342. mlrun/model_monitoring/stream_processing_fs.py +239 -271
  343. mlrun/package/__init__.py +163 -0
  344. mlrun/package/context_handler.py +325 -0
  345. mlrun/package/errors.py +47 -0
  346. mlrun/package/packager.py +298 -0
  347. mlrun/{runtimes/package → package/packagers}/__init__.py +3 -1
  348. mlrun/package/packagers/default_packager.py +422 -0
  349. mlrun/package/packagers/numpy_packagers.py +612 -0
  350. mlrun/package/packagers/pandas_packagers.py +968 -0
  351. mlrun/package/packagers/python_standard_library_packagers.py +616 -0
  352. mlrun/package/packagers_manager.py +786 -0
  353. mlrun/package/utils/__init__.py +53 -0
  354. mlrun/package/utils/_archiver.py +226 -0
  355. mlrun/package/utils/_formatter.py +211 -0
  356. mlrun/package/utils/_pickler.py +234 -0
  357. mlrun/package/utils/_supported_format.py +71 -0
  358. mlrun/package/utils/log_hint_utils.py +93 -0
  359. mlrun/package/utils/type_hint_utils.py +298 -0
  360. mlrun/platforms/__init__.py +1 -1
  361. mlrun/platforms/iguazio.py +34 -2
  362. mlrun/platforms/other.py +1 -1
  363. mlrun/projects/__init__.py +1 -1
  364. mlrun/projects/operations.py +14 -9
  365. mlrun/projects/pipelines.py +31 -13
  366. mlrun/projects/project.py +762 -238
  367. mlrun/render.py +49 -19
  368. mlrun/run.py +57 -326
  369. mlrun/runtimes/__init__.py +3 -9
  370. mlrun/runtimes/base.py +247 -784
  371. mlrun/runtimes/constants.py +1 -1
  372. mlrun/runtimes/daskjob.py +45 -41
  373. mlrun/runtimes/funcdoc.py +43 -7
  374. mlrun/runtimes/function.py +66 -656
  375. mlrun/runtimes/function_reference.py +1 -1
  376. mlrun/runtimes/generators.py +1 -1
  377. mlrun/runtimes/kubejob.py +99 -116
  378. mlrun/runtimes/local.py +59 -66
  379. mlrun/runtimes/mpijob/__init__.py +1 -1
  380. mlrun/runtimes/mpijob/abstract.py +13 -15
  381. mlrun/runtimes/mpijob/v1.py +3 -1
  382. mlrun/runtimes/mpijob/v1alpha1.py +1 -1
  383. mlrun/runtimes/nuclio.py +1 -1
  384. mlrun/runtimes/pod.py +51 -26
  385. mlrun/runtimes/remotesparkjob.py +3 -1
  386. mlrun/runtimes/serving.py +12 -4
  387. mlrun/runtimes/sparkjob/__init__.py +1 -2
  388. mlrun/runtimes/sparkjob/abstract.py +44 -31
  389. mlrun/runtimes/sparkjob/spark3job.py +11 -9
  390. mlrun/runtimes/utils.py +61 -42
  391. mlrun/secrets.py +16 -18
  392. mlrun/serving/__init__.py +3 -2
  393. mlrun/serving/merger.py +1 -1
  394. mlrun/serving/remote.py +1 -1
  395. mlrun/serving/routers.py +39 -42
  396. mlrun/serving/server.py +23 -13
  397. mlrun/serving/serving_wrapper.py +1 -1
  398. mlrun/serving/states.py +172 -39
  399. mlrun/serving/utils.py +1 -1
  400. mlrun/serving/v1_serving.py +1 -1
  401. mlrun/serving/v2_serving.py +29 -21
  402. mlrun/utils/__init__.py +1 -2
  403. mlrun/utils/async_http.py +8 -1
  404. mlrun/utils/azure_vault.py +1 -1
  405. mlrun/utils/clones.py +2 -2
  406. mlrun/utils/condition_evaluator.py +65 -0
  407. mlrun/utils/db.py +52 -0
  408. mlrun/utils/helpers.py +188 -13
  409. mlrun/utils/http.py +89 -54
  410. mlrun/utils/logger.py +48 -8
  411. mlrun/utils/model_monitoring.py +132 -100
  412. mlrun/utils/notifications/__init__.py +1 -1
  413. mlrun/utils/notifications/notification/__init__.py +8 -6
  414. mlrun/utils/notifications/notification/base.py +20 -14
  415. mlrun/utils/notifications/notification/console.py +7 -4
  416. mlrun/utils/notifications/notification/git.py +36 -19
  417. mlrun/utils/notifications/notification/ipython.py +10 -8
  418. mlrun/utils/notifications/notification/slack.py +18 -13
  419. mlrun/utils/notifications/notification_pusher.py +377 -56
  420. mlrun/utils/regex.py +6 -1
  421. mlrun/utils/singleton.py +1 -1
  422. mlrun/utils/v3io_clients.py +1 -1
  423. mlrun/utils/vault.py +270 -269
  424. mlrun/utils/version/__init__.py +1 -1
  425. mlrun/utils/version/version.json +2 -2
  426. mlrun/utils/version/version.py +1 -1
  427. {mlrun-1.3.3rc1.dist-info → mlrun-1.4.0.dist-info}/METADATA +16 -10
  428. mlrun-1.4.0.dist-info/RECORD +434 -0
  429. mlrun/api/api/endpoints/marketplace.py +0 -257
  430. mlrun/api/crud/marketplace.py +0 -221
  431. mlrun/api/crud/model_monitoring/model_endpoint_store.py +0 -847
  432. mlrun/api/db/filedb/db.py +0 -518
  433. mlrun/api/schemas/marketplace.py +0 -128
  434. mlrun/api/schemas/model_endpoints.py +0 -185
  435. mlrun/db/filedb.py +0 -891
  436. mlrun/feature_store/retrieval/online.py +0 -92
  437. mlrun/model_monitoring/constants.py +0 -67
  438. mlrun/runtimes/package/context_handler.py +0 -711
  439. mlrun/runtimes/sparkjob/spark2job.py +0 -59
  440. mlrun-1.3.3rc1.dist-info/RECORD +0 -381
  441. {mlrun-1.3.3rc1.dist-info → mlrun-1.4.0.dist-info}/LICENSE +0 -0
  442. {mlrun-1.3.3rc1.dist-info → mlrun-1.4.0.dist-info}/WHEEL +0 -0
  443. {mlrun-1.3.3rc1.dist-info → mlrun-1.4.0.dist-info}/entry_points.txt +0 -0
  444. {mlrun-1.3.3rc1.dist-info → mlrun-1.4.0.dist-info}/top_level.txt +0 -0
mlrun/api/db/filedb/db.py DELETED
@@ -1,518 +0,0 @@
1
- # Copyright 2018 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 datetime
16
- from typing import Any, Dict, List, Optional, Tuple, Union
17
-
18
- from mlrun.api import schemas
19
- from mlrun.api.db.base import DBError, DBInterface
20
- from mlrun.db.base import RunDBError
21
- from mlrun.db.filedb import FileRunDB
22
-
23
-
24
- class FileDB(DBInterface):
25
- def __init__(self, dirpath="", format=".yaml"):
26
- self.db = FileRunDB(dirpath, format)
27
-
28
- def initialize(self, session):
29
- self.db.connect()
30
-
31
- def store_log(
32
- self,
33
- session,
34
- uid,
35
- project="",
36
- body=None,
37
- append=False,
38
- ):
39
- return self._transform_run_db_error(
40
- self.db.store_log, uid, project, body, append
41
- )
42
-
43
- def get_log(self, session, uid, project="", offset=0, size=0):
44
- return self._transform_run_db_error(self.db.get_log, uid, project, offset, size)
45
-
46
- def store_run(
47
- self,
48
- session,
49
- struct,
50
- uid,
51
- project="",
52
- iter=0,
53
- ):
54
- return self._transform_run_db_error(
55
- self.db.store_run, struct, uid, project, iter
56
- )
57
-
58
- def update_run(self, session, updates: dict, uid, project="", iter=0):
59
- return self._transform_run_db_error(
60
- self.db.update_run, updates, uid, project, iter
61
- )
62
-
63
- def list_distinct_runs_uids(
64
- self,
65
- session,
66
- project: str = None,
67
- requested_logs_modes: List[bool] = None,
68
- only_uids: bool = False,
69
- last_update_time_from: datetime.datetime = None,
70
- states: List[str] = None,
71
- ):
72
- raise NotImplementedError()
73
-
74
- def update_runs_requested_logs(
75
- self, session, uids: List[str], requested_logs: bool = True
76
- ):
77
- raise NotImplementedError()
78
-
79
- def read_run(self, session, uid, project="", iter=0):
80
- return self._transform_run_db_error(self.db.read_run, uid, project, iter)
81
-
82
- def list_runs(
83
- self,
84
- session,
85
- name="",
86
- uid: Optional[Union[str, List[str]]] = None,
87
- project="",
88
- labels=None,
89
- states=None,
90
- sort=True,
91
- last=0,
92
- iter=False,
93
- start_time_from=None,
94
- start_time_to=None,
95
- last_update_time_from=None,
96
- last_update_time_to=None,
97
- partition_by: schemas.RunPartitionByField = None,
98
- rows_per_partition: int = 1,
99
- partition_sort_by: schemas.SortField = None,
100
- partition_order: schemas.OrderType = schemas.OrderType.desc,
101
- max_partitions: int = 0,
102
- requested_logs: bool = None,
103
- return_as_run_structs: bool = True,
104
- ):
105
- return self._transform_run_db_error(
106
- self.db.list_runs,
107
- name,
108
- uid,
109
- project,
110
- labels,
111
- states[0] if states else "",
112
- sort,
113
- last,
114
- iter,
115
- start_time_from,
116
- start_time_to,
117
- last_update_time_from,
118
- last_update_time_to,
119
- partition_by,
120
- rows_per_partition,
121
- partition_sort_by,
122
- partition_order,
123
- max_partitions,
124
- requested_logs,
125
- return_as_run_structs,
126
- )
127
-
128
- def del_run(self, session, uid, project="", iter=0):
129
- return self._transform_run_db_error(self.db.del_run, uid, project, iter)
130
-
131
- def del_runs(self, session, name="", project="", labels=None, state="", days_ago=0):
132
- return self._transform_run_db_error(
133
- self.db.del_runs, name, project, labels, state, days_ago
134
- )
135
-
136
- def overwrite_artifacts_with_tag(
137
- self,
138
- session,
139
- project: str,
140
- tag: str,
141
- identifiers: List[schemas.ArtifactIdentifier],
142
- ):
143
- raise NotImplementedError()
144
-
145
- def append_tag_to_artifacts(
146
- self,
147
- session,
148
- project: str,
149
- tag: str,
150
- identifiers: List[schemas.ArtifactIdentifier],
151
- ):
152
- raise NotImplementedError()
153
-
154
- def delete_tag_from_artifacts(
155
- self,
156
- session,
157
- project: str,
158
- tag: str,
159
- identifiers: List[schemas.ArtifactIdentifier],
160
- ):
161
- raise NotImplementedError()
162
-
163
- def store_artifact(
164
- self,
165
- session,
166
- key,
167
- artifact,
168
- uid,
169
- iter=None,
170
- tag="",
171
- project="",
172
- ):
173
- return self._transform_run_db_error(
174
- self.db.store_artifact, key, artifact, uid, iter, tag, project
175
- )
176
-
177
- def read_artifact(self, session, key, tag="", iter=None, project=""):
178
- return self._transform_run_db_error(
179
- self.db.read_artifact, key, tag, iter, project
180
- )
181
-
182
- def list_artifacts(
183
- self,
184
- session,
185
- name="",
186
- project="",
187
- tag="",
188
- labels=None,
189
- since=None,
190
- until=None,
191
- kind=None,
192
- category: schemas.ArtifactCategories = None,
193
- iter: int = None,
194
- best_iteration: bool = False,
195
- as_records: bool = False,
196
- use_tag_as_uid: bool = None,
197
- ):
198
- return self._transform_run_db_error(
199
- self.db.list_artifacts, name, project, tag, labels, since, until
200
- )
201
-
202
- def del_artifact(self, session, key, tag="", project=""):
203
- return self._transform_run_db_error(self.db.del_artifact, key, tag, project)
204
-
205
- def del_artifacts(self, session, name="", project="", tag="", labels=None):
206
- return self._transform_run_db_error(
207
- self.db.del_artifacts, name, project, tag, labels
208
- )
209
-
210
- def store_function(
211
- self,
212
- session,
213
- function,
214
- name,
215
- project="",
216
- tag="",
217
- versioned=False,
218
- ) -> str:
219
- return self._transform_run_db_error(
220
- self.db.store_function, function, name, project, tag, versioned
221
- )
222
-
223
- def get_function(self, session, name, project="", tag="", hash_key=""):
224
- return self._transform_run_db_error(
225
- self.db.get_function, name, project, tag, hash_key
226
- )
227
-
228
- def delete_function(self, session, project: str, name: str):
229
- raise NotImplementedError()
230
-
231
- def list_functions(
232
- self, session, name=None, project="", tag="", labels=None, hash_key=None
233
- ):
234
- return self._transform_run_db_error(
235
- self.db.list_functions, name, project, tag, labels
236
- )
237
-
238
- def store_schedule(self, session, data):
239
- return self._transform_run_db_error(self.db.store_schedule, data)
240
-
241
- def generate_projects_summaries(
242
- self, session, projects: List[str]
243
- ) -> List[schemas.ProjectSummary]:
244
- raise NotImplementedError()
245
-
246
- def delete_project_related_resources(self, session, name: str):
247
- raise NotImplementedError()
248
-
249
- def verify_project_has_no_related_resources(self, session, name: str):
250
- raise NotImplementedError()
251
-
252
- def is_project_exists(self, session, name: str):
253
- raise NotImplementedError()
254
-
255
- def list_projects(
256
- self,
257
- session,
258
- owner: str = None,
259
- format_: schemas.ProjectsFormat = schemas.ProjectsFormat.full,
260
- labels: List[str] = None,
261
- state: schemas.ProjectState = None,
262
- names: Optional[List[str]] = None,
263
- ) -> schemas.ProjectsOutput:
264
- return self._transform_run_db_error(
265
- self.db.list_projects, owner, format_, labels, state
266
- )
267
-
268
- async def get_project_resources_counters(
269
- self,
270
- ) -> Tuple[
271
- Dict[str, int],
272
- Dict[str, int],
273
- Dict[str, int],
274
- Dict[str, int],
275
- Dict[str, int],
276
- Dict[str, int],
277
- ]:
278
- raise NotImplementedError()
279
-
280
- def store_project(self, session, name: str, project: schemas.Project):
281
- raise NotImplementedError()
282
-
283
- def patch_project(
284
- self,
285
- session,
286
- name: str,
287
- project: dict,
288
- patch_mode: schemas.PatchMode = schemas.PatchMode.replace,
289
- ):
290
- raise NotImplementedError()
291
-
292
- def create_project(self, session, project: schemas.Project):
293
- raise NotImplementedError()
294
-
295
- def get_project(
296
- self, session, name: str = None, project_id: int = None
297
- ) -> schemas.Project:
298
- raise NotImplementedError()
299
-
300
- def delete_project(
301
- self,
302
- session,
303
- name: str,
304
- deletion_strategy: schemas.DeletionStrategy = schemas.DeletionStrategy.default(),
305
- ):
306
- raise NotImplementedError()
307
-
308
- def create_feature_set(
309
- self,
310
- session,
311
- project,
312
- feature_set: schemas.FeatureSet,
313
- versioned=True,
314
- ) -> str:
315
- raise NotImplementedError()
316
-
317
- def store_feature_set(
318
- self,
319
- session,
320
- project,
321
- name,
322
- feature_set: schemas.FeatureSet,
323
- tag=None,
324
- uid=None,
325
- versioned=True,
326
- always_overwrite=False,
327
- ) -> str:
328
- raise NotImplementedError()
329
-
330
- def get_feature_set(
331
- self, session, project: str, name: str, tag: str = None, uid: str = None
332
- ) -> schemas.FeatureSet:
333
- raise NotImplementedError()
334
-
335
- def list_features(
336
- self,
337
- session,
338
- project: str,
339
- name: str = None,
340
- tag: str = None,
341
- entities: List[str] = None,
342
- labels: List[str] = None,
343
- ) -> schemas.FeaturesOutput:
344
- raise NotImplementedError()
345
-
346
- def list_entities(
347
- self,
348
- session,
349
- project: str,
350
- name: str = None,
351
- tag: str = None,
352
- labels: List[str] = None,
353
- ) -> schemas.EntitiesOutput:
354
- pass
355
-
356
- def list_feature_sets(
357
- self,
358
- session,
359
- project: str,
360
- name: str = None,
361
- tag: str = None,
362
- state: str = None,
363
- entities: List[str] = None,
364
- features: List[str] = None,
365
- labels: List[str] = None,
366
- partition_by: schemas.FeatureStorePartitionByField = None,
367
- rows_per_partition: int = 1,
368
- partition_sort_by: schemas.SortField = None,
369
- partition_order: schemas.OrderType = schemas.OrderType.desc,
370
- ) -> schemas.FeatureSetsOutput:
371
- raise NotImplementedError()
372
-
373
- def list_feature_sets_tags(
374
- self,
375
- session,
376
- project: str,
377
- ):
378
- raise NotImplementedError()
379
-
380
- def patch_feature_set(
381
- self,
382
- session,
383
- project,
384
- name,
385
- feature_set_patch: dict,
386
- tag=None,
387
- uid=None,
388
- patch_mode: schemas.PatchMode = schemas.PatchMode.replace,
389
- ) -> str:
390
- raise NotImplementedError()
391
-
392
- def delete_feature_set(self, session, project, name, tag=None, uid=None):
393
- raise NotImplementedError()
394
-
395
- def create_feature_vector(
396
- self,
397
- session,
398
- project,
399
- feature_vector: schemas.FeatureVector,
400
- versioned=True,
401
- ) -> str:
402
- raise NotImplementedError()
403
-
404
- def get_feature_vector(
405
- self, session, project: str, name: str, tag: str = None, uid: str = None
406
- ) -> schemas.FeatureVector:
407
- raise NotImplementedError()
408
-
409
- def list_feature_vectors(
410
- self,
411
- session,
412
- project: str,
413
- name: str = None,
414
- tag: str = None,
415
- state: str = None,
416
- labels: List[str] = None,
417
- partition_by: schemas.FeatureStorePartitionByField = None,
418
- rows_per_partition: int = 1,
419
- partition_sort_by: schemas.SortField = None,
420
- partition_order: schemas.OrderType = schemas.OrderType.desc,
421
- ) -> schemas.FeatureVectorsOutput:
422
- raise NotImplementedError()
423
-
424
- def list_feature_vectors_tags(
425
- self,
426
- session,
427
- project: str,
428
- ):
429
- raise NotImplementedError()
430
-
431
- def store_feature_vector(
432
- self,
433
- session,
434
- project,
435
- name,
436
- feature_vector: schemas.FeatureVector,
437
- tag=None,
438
- uid=None,
439
- versioned=True,
440
- always_overwrite=False,
441
- ) -> str:
442
- raise NotImplementedError()
443
-
444
- def patch_feature_vector(
445
- self,
446
- session,
447
- project,
448
- name,
449
- feature_vector_update: dict,
450
- tag=None,
451
- uid=None,
452
- patch_mode: schemas.PatchMode = schemas.PatchMode.replace,
453
- ) -> str:
454
- raise NotImplementedError()
455
-
456
- def delete_feature_vector(self, session, project, name, tag=None, uid=None):
457
- raise NotImplementedError()
458
-
459
- def list_artifact_tags(
460
- self, session, project, category: Union[str, schemas.ArtifactCategories] = None
461
- ):
462
- return self._transform_run_db_error(
463
- self.db.list_artifact_tags, project, category
464
- )
465
-
466
- def create_schedule(
467
- self,
468
- session,
469
- project: str,
470
- name: str,
471
- kind: schemas.ScheduleKinds,
472
- scheduled_object: Any,
473
- cron_trigger: schemas.ScheduleCronTrigger,
474
- concurrency_limit: int,
475
- labels: Dict = None,
476
- next_run_time: datetime.datetime = None,
477
- ):
478
- raise NotImplementedError()
479
-
480
- def update_schedule(
481
- self,
482
- session,
483
- project: str,
484
- name: str,
485
- scheduled_object: Any = None,
486
- cron_trigger: schemas.ScheduleCronTrigger = None,
487
- labels: Dict = None,
488
- last_run_uri: str = None,
489
- concurrency_limit: int = None,
490
- next_run_time: datetime.datetime = None,
491
- ):
492
- raise NotImplementedError()
493
-
494
- def list_schedules(
495
- self,
496
- session,
497
- project: str = None,
498
- name: str = None,
499
- labels: str = None,
500
- kind: schemas.ScheduleKinds = None,
501
- ) -> List[schemas.ScheduleRecord]:
502
- raise NotImplementedError()
503
-
504
- def get_schedule(self, session, project: str, name: str) -> schemas.ScheduleRecord:
505
- raise NotImplementedError()
506
-
507
- def delete_schedule(self, session, project: str, name: str):
508
- raise NotImplementedError()
509
-
510
- def delete_schedules(self, session, project: str):
511
- raise NotImplementedError()
512
-
513
- @staticmethod
514
- def _transform_run_db_error(func, *args, **kwargs):
515
- try:
516
- return func(*args, **kwargs)
517
- except RunDBError as exc:
518
- raise DBError(exc.args)
@@ -1,128 +0,0 @@
1
- # Copyright 2018 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
- from datetime import datetime, timezone
16
- from typing import List, Optional
17
-
18
- from pydantic import BaseModel, Extra, Field
19
-
20
- import mlrun.api.utils.helpers
21
- import mlrun.errors
22
- from mlrun.api.schemas.object import ObjectKind, ObjectSpec, ObjectStatus
23
- from mlrun.config import config
24
-
25
-
26
- # Defining a different base class (not ObjectMetadata), as there's no project and it differs enough to
27
- # justify a new class
28
- class MarketplaceObjectMetadata(BaseModel):
29
- name: str
30
- description: str = ""
31
- labels: Optional[dict] = {}
32
- updated: Optional[datetime]
33
- created: Optional[datetime]
34
-
35
- class Config:
36
- extra = Extra.allow
37
-
38
-
39
- # Currently only functions are supported. Will add more in the future.
40
- class MarketplaceSourceType(mlrun.api.utils.helpers.StrEnum):
41
- functions = "functions"
42
-
43
-
44
- # Sources-related objects
45
- class MarketplaceSourceSpec(ObjectSpec):
46
- path: str # URL to base directory, should include schema (s3://, etc...)
47
- channel: str
48
- credentials: Optional[dict] = {}
49
-
50
-
51
- class MarketplaceSource(BaseModel):
52
- kind: ObjectKind = Field(ObjectKind.marketplace_source, const=True)
53
- metadata: MarketplaceObjectMetadata
54
- spec: MarketplaceSourceSpec
55
- status: Optional[ObjectStatus] = ObjectStatus(state="created")
56
-
57
- def get_full_uri(self, relative_path):
58
- return "{base}/{channel}/{relative_path}".format(
59
- base=self.spec.path, channel=self.spec.channel, relative_path=relative_path
60
- )
61
-
62
- def get_catalog_uri(self):
63
- return self.get_full_uri(config.marketplace.catalog_filename)
64
-
65
- @classmethod
66
- def generate_default_source(cls):
67
- if not config.marketplace.default_source.create:
68
- return None
69
-
70
- now = datetime.now(timezone.utc)
71
- hub_metadata = MarketplaceObjectMetadata(
72
- name=config.marketplace.default_source.name,
73
- description=config.marketplace.default_source.description,
74
- created=now,
75
- updated=now,
76
- )
77
- return cls(
78
- metadata=hub_metadata,
79
- spec=MarketplaceSourceSpec(
80
- path=config.marketplace.default_source.url,
81
- channel=config.marketplace.default_source.channel,
82
- ),
83
- status=ObjectStatus(state="created"),
84
- )
85
-
86
-
87
- last_source_index = -1
88
-
89
-
90
- class IndexedMarketplaceSource(BaseModel):
91
- index: int = last_source_index # Default last. Otherwise must be > 0
92
- source: MarketplaceSource
93
-
94
-
95
- # Item-related objects
96
- class MarketplaceItemMetadata(MarketplaceObjectMetadata):
97
- source: MarketplaceSourceType = Field(MarketplaceSourceType.functions, const=True)
98
- channel: str
99
- version: str
100
- tag: Optional[str]
101
-
102
- def get_relative_path(self) -> str:
103
- if self.source == MarketplaceSourceType.functions:
104
- # This is needed since the marketplace deployment script modifies the paths to use _ instead of -.
105
- modified_name = self.name.replace("-", "_")
106
- # Prefer using the tag if exists. Otherwise use version.
107
- version = self.tag or self.version
108
- return f"{self.source.value}/{self.channel}/{modified_name}/{version}/"
109
- else:
110
- raise mlrun.errors.MLRunInvalidArgumentError(
111
- f"Bad source for marketplace item - {self.source}"
112
- )
113
-
114
-
115
- class MarketplaceItemSpec(ObjectSpec):
116
- item_uri: str
117
-
118
-
119
- class MarketplaceItem(BaseModel):
120
- kind: ObjectKind = Field(ObjectKind.marketplace_item, const=True)
121
- metadata: MarketplaceItemMetadata
122
- spec: MarketplaceItemSpec
123
- status: ObjectStatus
124
-
125
-
126
- class MarketplaceCatalog(BaseModel):
127
- kind: ObjectKind = Field(ObjectKind.marketplace_catalog, const=True)
128
- catalog: List[MarketplaceItem]