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.
mlrun/runtimes/nuclio.py CHANGED
@@ -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.
mlrun/runtimes/pod.py CHANGED
@@ -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.
@@ -24,12 +24,12 @@ from deprecated import deprecated
24
24
 
25
25
  import mlrun.errors
26
26
  import mlrun.utils.regex
27
-
28
- from ..api.schemas import (
27
+ from mlrun.common.schemas import (
29
28
  NodeSelectorOperator,
30
29
  PreemptionModes,
31
30
  SecurityContextEnrichmentModes,
32
31
  )
32
+
33
33
  from ..config import config as mlconf
34
34
  from ..k8s_utils import (
35
35
  generate_preemptible_node_selector_requirements,
@@ -44,6 +44,7 @@ from .utils import (
44
44
  apply_kfp,
45
45
  get_gpu_from_resource_requirement,
46
46
  get_item_name,
47
+ get_k8s,
47
48
  get_resource_labels,
48
49
  set_named_item,
49
50
  verify_limits,
@@ -135,6 +136,7 @@ class KubeResourceSpec(FunctionSpec):
135
136
  tolerations=None,
136
137
  preemption_mode=None,
137
138
  security_context=None,
139
+ clone_target_dir=None,
138
140
  ):
139
141
  super().__init__(
140
142
  command=command,
@@ -148,6 +150,7 @@ class KubeResourceSpec(FunctionSpec):
148
150
  default_handler=default_handler,
149
151
  pythonpath=pythonpath,
150
152
  disable_auto_mount=disable_auto_mount,
153
+ clone_target_dir=clone_target_dir,
151
154
  )
152
155
  self._volumes = {}
153
156
  self._volume_mounts = {}
@@ -357,15 +360,25 @@ class KubeResourceSpec(FunctionSpec):
357
360
  patch: bool = False,
358
361
  ):
359
362
  """
360
- set pod cpu/memory/gpu limits
361
- by default it overrides the whole limits section, if you wish to patch specific resources use `patch=True`.
363
+ Set pod cpu/memory/gpu limits (max values)
364
+
365
+ :param mem: set limit for memory e.g. '500M', '2G', etc.
366
+ :param cpu: set limit for cpu e.g. '0.5', '2', etc.
367
+ :param gpus: set limit for gpu
368
+ :param gpu_type: set gpu type e.g. "nvidia.com/gpu"
369
+ :param patch: by default it overrides the whole limits section,
370
+ if you wish to patch specific resources use `patch=True`
362
371
  """
363
372
  self._verify_and_set_limits("resources", mem, cpu, gpus, gpu_type, patch=patch)
364
373
 
365
374
  def with_requests(self, mem: str = None, cpu: str = None, patch: bool = False):
366
375
  """
367
- set requested (desired) pod cpu/memory resources
368
- by default it overrides the whole requests section, if you wish to patch specific resources use `patch=True`.
376
+ Set requested (desired) pod cpu/memory resources
377
+
378
+ :param mem: set request for memory e.g. '200M', '1G', etc.
379
+ :param cpu: set request for cpu e.g. '0.1', '1', etc.
380
+ :param patch: by default it overrides the whole requests section,
381
+ if you wish to patch specific resources use `patch=True`
369
382
  """
370
383
  self._verify_and_set_requests("resources", mem, cpu, patch)
371
384
 
@@ -989,12 +1002,14 @@ class KubeResource(BaseRuntime):
989
1002
  "must specify env_vars OR file_path"
990
1003
  )
991
1004
  if file_path:
992
- env_vars = dotenv.dotenv_values(file_path)
993
- if None in env_vars.values():
994
- raise mlrun.errors.MLRunInvalidArgumentError(
995
- "env file lines must be in the form key=value"
996
- )
997
-
1005
+ if os.path.isfile(file_path):
1006
+ env_vars = dotenv.dotenv_values(file_path)
1007
+ if None in env_vars.values():
1008
+ raise mlrun.errors.MLRunInvalidArgumentError(
1009
+ "env file lines must be in the form key=value"
1010
+ )
1011
+ else:
1012
+ raise mlrun.errors.MLRunNotFoundError(f"{file_path} does not exist")
998
1013
  for name, value in env_vars.items():
999
1014
  self.set_env(name, value)
1000
1015
  return self
@@ -1036,15 +1051,25 @@ class KubeResource(BaseRuntime):
1036
1051
  patch: bool = False,
1037
1052
  ):
1038
1053
  """
1039
- set pod cpu/memory/gpu limits
1040
- by default it overrides the whole limits section, if you wish to patch specific resources use `patch=True`.
1054
+ Set pod cpu/memory/gpu limits (max values)
1055
+
1056
+ :param mem: set limit for memory e.g. '500M', '2G', etc.
1057
+ :param cpu: set limit for cpu e.g. '0.5', '2', etc.
1058
+ :param gpus: set limit for gpu
1059
+ :param gpu_type: set gpu type e.g. "nvidia.com/gpu"
1060
+ :param patch: by default it overrides the whole limits section,
1061
+ if you wish to patch specific resources use `patch=True`
1041
1062
  """
1042
1063
  self.spec.with_limits(mem, cpu, gpus, gpu_type, patch=patch)
1043
1064
 
1044
1065
  def with_requests(self, mem: str = None, cpu: str = None, patch: bool = False):
1045
1066
  """
1046
- set requested (desired) pod cpu/memory resources
1047
- by default it overrides the whole requests section, if you wish to patch specific resources use `patch=True`.
1067
+ Set requested (desired) pod cpu/memory resources
1068
+
1069
+ :param mem: set request for memory e.g. '200M', '1G', etc.
1070
+ :param cpu: set request for cpu e.g. '0.1', '1', etc.
1071
+ :param patch: by default it overrides the whole requests section,
1072
+ if you wish to patch specific resources use `patch=True`
1048
1073
  """
1049
1074
  self.spec.with_requests(mem, cpu, patch=patch)
1050
1075
 
@@ -1113,7 +1138,7 @@ class KubeResource(BaseRuntime):
1113
1138
  The default preemption mode is configurable in mlrun.mlconf.function_defaults.preemption_mode,
1114
1139
  by default it's set to **prevent**
1115
1140
 
1116
- :param mode: allow | constrain | prevent | none defined in :py:class:`~mlrun.api.schemas.PreemptionModes`
1141
+ :param mode: allow | constrain | prevent | none defined in :py:class:`~mlrun.common.schemas.PreemptionModes`
1117
1142
  """
1118
1143
  preemptible_mode = PreemptionModes(mode)
1119
1144
  self.spec.preemption_mode = preemptible_mode.value
@@ -1122,7 +1147,7 @@ class KubeResource(BaseRuntime):
1122
1147
  """
1123
1148
  Set security context for the pod.
1124
1149
  For Iguazio we handle security context internally -
1125
- see mlrun.api.schemas.function.SecurityContextEnrichmentModes
1150
+ see mlrun.common.schemas.function.SecurityContextEnrichmentModes
1126
1151
 
1127
1152
  Example:
1128
1153
 
@@ -1155,7 +1180,7 @@ class KubeResource(BaseRuntime):
1155
1180
  return mlconf.default_function_priority_class_name
1156
1181
 
1157
1182
  def _get_meta(self, runobj, unique=False):
1158
- namespace = self._get_k8s().resolve_namespace()
1183
+ namespace = get_k8s().resolve_namespace()
1159
1184
 
1160
1185
  labels = get_resource_labels(self, runobj, runobj.spec.scrape_metrics)
1161
1186
  new_meta = k8s_client.V1ObjectMeta(
@@ -1223,7 +1248,7 @@ class KubeResource(BaseRuntime):
1223
1248
  mlconf.secret_stores.kubernetes.global_function_env_secret_name
1224
1249
  )
1225
1250
  if mlrun.config.is_running_as_api() and global_secret_name:
1226
- global_secrets = self._get_k8s().get_secret_data(global_secret_name)
1251
+ global_secrets = get_k8s().get_secret_data(global_secret_name)
1227
1252
  for key, value in global_secrets.items():
1228
1253
  env_var_name = (
1229
1254
  SecretsStore.k8s_env_variable_name_for_secret(key)
@@ -1245,10 +1270,10 @@ class KubeResource(BaseRuntime):
1245
1270
  logger.warning("No project provided. Cannot add k8s secrets")
1246
1271
  return
1247
1272
 
1248
- secret_name = self._get_k8s().get_project_secret_name(project_name)
1273
+ secret_name = get_k8s().get_project_secret_name(project_name)
1249
1274
  # Not utilizing the same functionality from the Secrets crud object because this code also runs client-side
1250
1275
  # in the nuclio remote-dashboard flow, which causes dependency problems.
1251
- existing_secret_keys = self._get_k8s().get_project_secret_keys(
1276
+ existing_secret_keys = get_k8s().get_project_secret_keys(
1252
1277
  project_name, filter_internal=True
1253
1278
  )
1254
1279
 
@@ -1282,7 +1307,7 @@ class KubeResource(BaseRuntime):
1282
1307
  )
1283
1308
  )
1284
1309
 
1285
- project_vault_secret_name = self._get_k8s().get_project_vault_secret_name(
1310
+ project_vault_secret_name = get_k8s().get_project_vault_secret_name(
1286
1311
  project_name, service_account_name
1287
1312
  )
1288
1313
  if project_vault_secret_name is None:
@@ -1453,7 +1478,7 @@ def get_sanitized_attribute(spec, attribute_name: str):
1453
1478
  if isinstance(attribute, dict):
1454
1479
  if attribute_config["not_sanitized_class"] != dict:
1455
1480
  raise mlrun.errors.MLRunInvalidArgumentTypeError(
1456
- f"expected to to be of type {attribute_config.get('not_sanitized_class')} but got dict"
1481
+ f"expected to be of type {attribute_config.get('not_sanitized_class')} but got dict"
1457
1482
  )
1458
1483
  if _resolve_if_type_sanitized(attribute_name, attribute):
1459
1484
  return attribute
@@ -1463,7 +1488,7 @@ def get_sanitized_attribute(spec, attribute_name: str):
1463
1488
  ):
1464
1489
  if attribute_config["not_sanitized_class"] != list:
1465
1490
  raise mlrun.errors.MLRunInvalidArgumentTypeError(
1466
- f"expected to to be of type {attribute_config.get('not_sanitized_class')} but got list"
1491
+ f"expected to be of type {attribute_config.get('not_sanitized_class')} but got list"
1467
1492
  )
1468
1493
  if _resolve_if_type_sanitized(attribute_name, attribute[0]):
1469
1494
  return attribute
@@ -1,4 +1,4 @@
1
- # Copyright 2021 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.
@@ -58,6 +58,7 @@ class RemoteSparkSpec(KubeResourceSpec):
58
58
  tolerations=None,
59
59
  preemption_mode=None,
60
60
  security_context=None,
61
+ clone_target_dir=None,
61
62
  ):
62
63
  super().__init__(
63
64
  command=command,
@@ -86,6 +87,7 @@ class RemoteSparkSpec(KubeResourceSpec):
86
87
  tolerations=tolerations,
87
88
  preemption_mode=preemption_mode,
88
89
  security_context=security_context,
90
+ clone_target_dir=clone_target_dir,
89
91
  )
90
92
  self.provider = provider
91
93
 
mlrun/runtimes/serving.py CHANGED
@@ -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.
@@ -21,7 +21,7 @@ import nuclio
21
21
  from nuclio import KafkaTrigger
22
22
 
23
23
  import mlrun
24
- import mlrun.api.schemas
24
+ import mlrun.common.schemas
25
25
 
26
26
  from ..datastore import parse_kafka_url
27
27
  from ..model import ObjectList
@@ -116,6 +116,7 @@ class ServingSpec(NuclioSpec):
116
116
  function_kind=None,
117
117
  service_account=None,
118
118
  readiness_timeout=None,
119
+ readiness_timeout_before_failure=None,
119
120
  models=None,
120
121
  graph=None,
121
122
  parameters=None,
@@ -141,6 +142,9 @@ class ServingSpec(NuclioSpec):
141
142
  tolerations=None,
142
143
  preemption_mode=None,
143
144
  security_context=None,
145
+ service_type=None,
146
+ add_templated_ingress_host_mode=None,
147
+ clone_target_dir=None,
144
148
  ):
145
149
 
146
150
  super().__init__(
@@ -165,6 +169,7 @@ class ServingSpec(NuclioSpec):
165
169
  function_kind=serving_subkind,
166
170
  service_account=service_account,
167
171
  readiness_timeout=readiness_timeout,
172
+ readiness_timeout_before_failure=readiness_timeout_before_failure,
168
173
  build=build,
169
174
  node_name=node_name,
170
175
  node_selector=node_selector,
@@ -178,6 +183,9 @@ class ServingSpec(NuclioSpec):
178
183
  tolerations=tolerations,
179
184
  preemption_mode=preemption_mode,
180
185
  security_context=security_context,
186
+ service_type=service_type,
187
+ add_templated_ingress_host_mode=add_templated_ingress_host_mode,
188
+ clone_target_dir=clone_target_dir,
181
189
  )
182
190
 
183
191
  self.models = models or {}
@@ -313,7 +321,7 @@ class ServingRuntime(RemoteRuntime):
313
321
  example::
314
322
 
315
323
  # initialize a new serving function
316
- serving_fn = mlrun.import_function("hub://v2_model_server", new_name="serving")
324
+ serving_fn = mlrun.import_function("hub://v2-model-server", new_name="serving")
317
325
  # apply model monitoring and set monitoring batch job to run every 3 hours
318
326
  tracking_policy = {'default_batch_intervals':"0 */3 * * *"}
319
327
  serving_fn.set_tracking(tracking_policy=tracking_policy)
@@ -579,7 +587,7 @@ class ServingRuntime(RemoteRuntime):
579
587
  project="",
580
588
  tag="",
581
589
  verbose=False,
582
- auth_info: mlrun.api.schemas.AuthInfo = None,
590
+ auth_info: mlrun.common.schemas.AuthInfo = None,
583
591
  builder_env: dict = None,
584
592
  ):
585
593
  """deploy model serving function to a local/remote cluster
@@ -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.
@@ -15,5 +15,4 @@
15
15
  # flake8: noqa - this is until we take care of the F401 violations with respect to __all__ & sphinx
16
16
 
17
17
  from .abstract import SparkRuntimeHandler
18
- from .spark2job import Spark2Runtime
19
18
  from .spark3job import Spark3Runtime
@@ -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.
@@ -11,7 +11,7 @@
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
-
14
+ import os.path
15
15
  import typing
16
16
  from copy import deepcopy
17
17
  from datetime import datetime
@@ -31,7 +31,6 @@ from mlrun.runtimes.base import BaseRuntimeHandler
31
31
  from mlrun.runtimes.constants import RunStates, SparkApplicationStates
32
32
 
33
33
  from ...execution import MLClientCtx
34
- from ...k8s_utils import get_k8s_helper
35
34
  from ...model import RunObject
36
35
  from ...platforms.iguazio import mount_v3io, mount_v3iod
37
36
  from ...utils import (
@@ -45,7 +44,7 @@ from ...utils import (
45
44
  from ..base import RunError, RuntimeClassMode
46
45
  from ..kubejob import KubejobRuntime
47
46
  from ..pod import KubeResourceSpec
48
- from ..utils import get_item_name
47
+ from ..utils import get_item_name, get_k8s
49
48
 
50
49
  _service_account = "sparkapp"
51
50
  _sparkjob_template = {
@@ -143,6 +142,7 @@ class AbstractSparkJobSpec(KubeResourceSpec):
143
142
  tolerations=None,
144
143
  preemption_mode=None,
145
144
  security_context=None,
145
+ clone_target_dir=None,
146
146
  ):
147
147
 
148
148
  super().__init__(
@@ -172,6 +172,7 @@ class AbstractSparkJobSpec(KubeResourceSpec):
172
172
  tolerations=tolerations,
173
173
  preemption_mode=preemption_mode,
174
174
  security_context=security_context,
175
+ clone_target_dir=clone_target_dir,
175
176
  )
176
177
 
177
178
  self._driver_resources = self.enrich_resources_with_default_pod_resources(
@@ -363,6 +364,15 @@ class AbstractSparkRuntime(KubejobRuntime):
363
364
  def _get_igz_deps(self):
364
365
  raise NotImplementedError()
365
366
 
367
+ def _pre_run(self, runobj: RunObject, execution: MLClientCtx):
368
+ if self.spec.build.source and self.spec.build.load_source_on_run:
369
+ raise mlrun.errors.MLRunPreconditionFailedError(
370
+ "Sparkjob does not support loading source code on run, "
371
+ "use func.with_source_archive(pull_at_runtime=False)"
372
+ )
373
+
374
+ super()._pre_run(runobj, execution)
375
+
366
376
  def _run(self, runobj: RunObject, execution: MLClientCtx):
367
377
  self._validate(runobj)
368
378
 
@@ -559,7 +569,11 @@ with ctx:
559
569
 
560
570
  if self.spec.command:
561
571
  if "://" not in self.spec.command:
562
- self.spec.command = "local://" + self.spec.command
572
+ workdir = self._resolve_workdir()
573
+ self.spec.command = "local://" + os.path.join(
574
+ workdir or "",
575
+ self.spec.command,
576
+ )
563
577
  update_in(job, "spec.mainApplicationFile", self.spec.command)
564
578
 
565
579
  verify_list_and_update_in(job, "spec.arguments", self.spec.args or [], str)
@@ -577,7 +591,7 @@ with ctx:
577
591
  code=None,
578
592
  ):
579
593
  namespace = meta.namespace
580
- k8s = self._get_k8s()
594
+ k8s = get_k8s()
581
595
  namespace = k8s.resolve_namespace(namespace)
582
596
  if code:
583
597
  k8s_config_map = client.V1ConfigMap()
@@ -621,7 +635,7 @@ with ctx:
621
635
  raise RunError("Exception when creating SparkJob") from exc
622
636
 
623
637
  def get_job(self, name, namespace=None):
624
- k8s = self._get_k8s()
638
+ k8s = get_k8s()
625
639
  namespace = k8s.resolve_namespace(namespace)
626
640
  try:
627
641
  resp = k8s.crdapi.get_namespaced_custom_object(
@@ -789,25 +803,27 @@ with ctx:
789
803
  submission_retry_interval,
790
804
  )
791
805
 
792
- def get_pods(self, name=None, namespace=None, driver=False):
793
- k8s = self._get_k8s()
794
- namespace = k8s.resolve_namespace(namespace)
795
- selector = "mlrun/class=spark"
796
- if name:
797
- selector += f",sparkoperator.k8s.io/app-name={name}"
798
- if driver:
799
- selector += ",spark-role=driver"
800
- pods = k8s.list_pods(selector=selector, namespace=namespace)
801
- if pods:
802
- return {p.metadata.name: p.status.phase for p in pods}
803
-
804
- def _get_driver(self, name, namespace=None):
805
- pods = self.get_pods(name, namespace, driver=True)
806
- if not pods:
807
- logger.error("no pod matches that job name")
808
- return
809
- _ = self._get_k8s()
810
- return list(pods.items())[0]
806
+ def with_source_archive(
807
+ self, source, workdir=None, handler=None, pull_at_runtime=True, target_dir=None
808
+ ):
809
+ """load the code from git/tar/zip archive at runtime or build
810
+
811
+ :param source: valid path to git, zip, or tar file, e.g.
812
+ git://github.com/mlrun/something.git
813
+ http://some/url/file.zip
814
+ :param handler: default function handler
815
+ :param workdir: working dir relative to the archive root (e.g. './subdir') or absolute to the image root
816
+ :param pull_at_runtime: not supported for spark runtime, must be False
817
+ :param target_dir: target dir on runtime pod for repo clone / archive extraction
818
+ """
819
+ if pull_at_runtime:
820
+ raise mlrun.errors.MLRunInvalidArgumentError(
821
+ "pull_at_runtime is not supported for spark runtime, use pull_at_runtime=False"
822
+ )
823
+
824
+ super().with_source_archive(
825
+ source, workdir, handler, pull_at_runtime, target_dir
826
+ )
811
827
 
812
828
  def is_deployed(self):
813
829
  if (
@@ -926,22 +942,19 @@ class SparkRuntimeHandler(BaseRuntimeHandler):
926
942
  """
927
943
  Handling config maps deletion
928
944
  """
929
- if grace_period is None:
930
- grace_period = config.runtime_resources_deletion_grace_period
931
945
  uids = []
932
946
  for crd_dict in deleted_resources:
933
947
  uid = crd_dict["metadata"].get("labels", {}).get("mlrun/uid", None)
934
948
  uids.append(uid)
935
949
 
936
- k8s_helper = get_k8s_helper()
937
- config_maps = k8s_helper.v1api.list_namespaced_config_map(
950
+ config_maps = get_k8s().v1api.list_namespaced_config_map(
938
951
  namespace, label_selector=label_selector
939
952
  )
940
953
  for config_map in config_maps.items:
941
954
  try:
942
955
  uid = config_map.metadata.labels.get("mlrun/uid", None)
943
956
  if force or uid in uids:
944
- k8s_helper.v1api.delete_namespaced_config_map(
957
+ get_k8s().v1api.delete_namespaced_config_map(
945
958
  config_map.metadata.name, namespace
946
959
  )
947
960
  logger.info(f"Deleted config map: {config_map.metadata.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.
@@ -16,7 +16,7 @@ import typing
16
16
 
17
17
  import kubernetes.client
18
18
 
19
- import mlrun.api.schemas.function
19
+ import mlrun.common.schemas.function
20
20
  import mlrun.errors
21
21
  import mlrun.runtimes.pod
22
22
 
@@ -100,6 +100,7 @@ class Spark3JobSpec(AbstractSparkJobSpec):
100
100
  driver_cores=None,
101
101
  executor_cores=None,
102
102
  security_context=None,
103
+ clone_target_dir=None,
103
104
  ):
104
105
 
105
106
  super().__init__(
@@ -129,6 +130,7 @@ class Spark3JobSpec(AbstractSparkJobSpec):
129
130
  tolerations=tolerations,
130
131
  preemption_mode=preemption_mode,
131
132
  security_context=security_context,
133
+ clone_target_dir=clone_target_dir,
132
134
  )
133
135
 
134
136
  self.driver_resources = driver_resources or {}
@@ -518,7 +520,7 @@ class Spark3Runtime(AbstractSparkRuntime):
518
520
  self.spec.executor_tolerations = tolerations
519
521
 
520
522
  def with_preemption_mode(
521
- self, mode: typing.Union[mlrun.api.schemas.function.PreemptionModes, str]
523
+ self, mode: typing.Union[mlrun.common.schemas.function.PreemptionModes, str]
522
524
  ):
523
525
  """
524
526
  Use with_driver_preemption_mode / with_executor_preemption_mode to setup preemption_mode for spark operator
@@ -529,7 +531,7 @@ class Spark3Runtime(AbstractSparkRuntime):
529
531
  )
530
532
 
531
533
  def with_driver_preemption_mode(
532
- self, mode: typing.Union[mlrun.api.schemas.function.PreemptionModes, str]
534
+ self, mode: typing.Union[mlrun.common.schemas.function.PreemptionModes, str]
533
535
  ):
534
536
  """
535
537
  Preemption mode controls whether the spark driver can be scheduled on preemptible nodes.
@@ -545,13 +547,13 @@ class Spark3Runtime(AbstractSparkRuntime):
545
547
  The default preemption mode is configurable in mlrun.mlconf.function_defaults.preemption_mode,
546
548
  by default it's set to **prevent**
547
549
 
548
- :param mode: allow | constrain | prevent | none defined in :py:class:`~mlrun.api.schemas.PreemptionModes`
550
+ :param mode: allow | constrain | prevent | none defined in :py:class:`~mlrun.common.schemas.PreemptionModes`
549
551
  """
550
- preemption_mode = mlrun.api.schemas.function.PreemptionModes(mode)
552
+ preemption_mode = mlrun.common.schemas.function.PreemptionModes(mode)
551
553
  self.spec.driver_preemption_mode = preemption_mode.value
552
554
 
553
555
  def with_executor_preemption_mode(
554
- self, mode: typing.Union[mlrun.api.schemas.function.PreemptionModes, str]
556
+ self, mode: typing.Union[mlrun.common.schemas.function.PreemptionModes, str]
555
557
  ):
556
558
  """
557
559
  Preemption mode controls whether the spark executor can be scheduled on preemptible nodes.
@@ -567,9 +569,9 @@ class Spark3Runtime(AbstractSparkRuntime):
567
569
  The default preemption mode is configurable in mlrun.mlconf.function_defaults.preemption_mode,
568
570
  by default it's set to **prevent**
569
571
 
570
- :param mode: allow | constrain | prevent | none defined in :py:class:`~mlrun.api.schemas.PreemptionModes`
572
+ :param mode: allow | constrain | prevent | none defined in :py:class:`~mlrun.common.schemas.PreemptionModes`
571
573
  """
572
- preemption_mode = mlrun.api.schemas.function.PreemptionModes(mode)
574
+ preemption_mode = mlrun.common.schemas.function.PreemptionModes(mode)
573
575
  self.spec.executor_preemption_mode = preemption_mode.value
574
576
 
575
577
  def with_security_context(