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.
@@ -18,9 +18,9 @@ import mergedeep
18
18
  import sqlalchemy.orm
19
19
 
20
20
  import mlrun.api.api.utils
21
- import mlrun.api.schemas
22
21
  import mlrun.api.utils.projects.remotes.follower
23
22
  import mlrun.api.utils.singletons.db
23
+ import mlrun.common.schemas
24
24
  import mlrun.config
25
25
  import mlrun.errors
26
26
  import mlrun.runtimes
@@ -37,12 +37,12 @@ class RuntimeResources(
37
37
  object_id: typing.Optional[str] = None,
38
38
  label_selector: typing.Optional[str] = None,
39
39
  group_by: typing.Optional[
40
- mlrun.api.schemas.ListRuntimeResourcesGroupByField
40
+ mlrun.common.schemas.ListRuntimeResourcesGroupByField
41
41
  ] = None,
42
42
  ) -> typing.Union[
43
- mlrun.api.schemas.RuntimeResourcesOutput,
44
- mlrun.api.schemas.GroupedByJobRuntimeResourcesOutput,
45
- mlrun.api.schemas.GroupedByProjectRuntimeResourcesOutput,
43
+ mlrun.common.schemas.RuntimeResourcesOutput,
44
+ mlrun.common.schemas.GroupedByJobRuntimeResourcesOutput,
45
+ mlrun.common.schemas.GroupedByProjectRuntimeResourcesOutput,
46
46
  ]:
47
47
  response = [] if group_by is None else {}
48
48
  kinds = mlrun.runtimes.RuntimeKinds.runtime_with_handlers()
@@ -56,7 +56,7 @@ class RuntimeResources(
56
56
  )
57
57
  if group_by is None:
58
58
  response.append(
59
- mlrun.api.schemas.KindRuntimeResources(
59
+ mlrun.common.schemas.KindRuntimeResources(
60
60
  kind=kind, resources=resources
61
61
  )
62
62
  )
@@ -66,15 +66,15 @@ class RuntimeResources(
66
66
 
67
67
  def filter_and_format_grouped_by_project_runtime_resources_output(
68
68
  self,
69
- grouped_by_project_runtime_resources_output: mlrun.api.schemas.GroupedByProjectRuntimeResourcesOutput,
69
+ grouped_by_project_runtime_resources_output: mlrun.common.schemas.GroupedByProjectRuntimeResourcesOutput,
70
70
  allowed_projects: typing.List[str],
71
71
  group_by: typing.Optional[
72
- mlrun.api.schemas.ListRuntimeResourcesGroupByField
72
+ mlrun.common.schemas.ListRuntimeResourcesGroupByField
73
73
  ] = None,
74
74
  ) -> typing.Union[
75
- mlrun.api.schemas.RuntimeResourcesOutput,
76
- mlrun.api.schemas.GroupedByJobRuntimeResourcesOutput,
77
- mlrun.api.schemas.GroupedByProjectRuntimeResourcesOutput,
75
+ mlrun.common.schemas.RuntimeResourcesOutput,
76
+ mlrun.common.schemas.GroupedByJobRuntimeResourcesOutput,
77
+ mlrun.common.schemas.GroupedByProjectRuntimeResourcesOutput,
78
78
  ]:
79
79
  runtime_resources_by_kind = {}
80
80
  for (
@@ -94,7 +94,7 @@ class RuntimeResources(
94
94
  )
95
95
  if group_by is None:
96
96
  runtimes_resources_output.append(
97
- mlrun.api.schemas.KindRuntimeResources(
97
+ mlrun.common.schemas.KindRuntimeResources(
98
98
  kind=kind, resources=resources
99
99
  )
100
100
  )
@@ -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.
@@ -0,0 +1,14 @@
1
+ # Copyright 2023 Iguazio
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ #
@@ -0,0 +1,505 @@
1
+ # Copyright 2023 Iguazio
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ #
15
+
16
+ import base64
17
+ import shlex
18
+
19
+ import nuclio
20
+ import nuclio.utils
21
+ import requests
22
+
23
+ import mlrun
24
+ import mlrun.api.crud.runtimes.nuclio.helpers
25
+ import mlrun.api.utils.builder
26
+ import mlrun.api.utils.singletons.k8s
27
+ import mlrun.common.schemas
28
+ import mlrun.datastore
29
+ import mlrun.errors
30
+ import mlrun.runtimes.function
31
+ import mlrun.runtimes.pod
32
+ import mlrun.utils
33
+ from mlrun.utils import logger
34
+
35
+
36
+ def deploy_nuclio_function(
37
+ function: mlrun.runtimes.function.RemoteRuntime,
38
+ auth_info: mlrun.common.schemas.AuthInfo = None,
39
+ client_version: str = None,
40
+ builder_env: dict = None,
41
+ client_python_version: str = None,
42
+ ):
43
+ """Deploys a nuclio function.
44
+
45
+ :param function: nuclio function object
46
+ :param auth_info: service AuthInfo
47
+ :param client_version: mlrun client version
48
+ :param builder_env: mlrun builder environment (for config/credentials)
49
+ :param client_python_version: mlrun client python version
50
+ """
51
+ function_name, project_name, function_config = _compile_function_config(
52
+ function,
53
+ client_version=client_version,
54
+ client_python_version=client_python_version,
55
+ builder_env=builder_env or {},
56
+ auth_info=auth_info,
57
+ )
58
+
59
+ # if mode allows it, enrich function http trigger with an ingress
60
+ mlrun.api.crud.runtimes.nuclio.helpers.enrich_function_with_ingress(
61
+ function_config,
62
+ function.spec.add_templated_ingress_host_mode
63
+ or mlrun.mlconf.httpdb.nuclio.add_templated_ingress_host_mode,
64
+ function.spec.service_type or mlrun.mlconf.httpdb.nuclio.default_service_type,
65
+ )
66
+
67
+ try:
68
+ logger.info(
69
+ "Starting Nuclio function deployment",
70
+ function_name=function_name,
71
+ project_name=project_name,
72
+ )
73
+ return nuclio.deploy.deploy_config(
74
+ function_config,
75
+ dashboard_url=mlrun.mlconf.nuclio_dashboard_url,
76
+ name=function_name,
77
+ project=project_name,
78
+ tag=function.metadata.tag,
79
+ verbose=function.verbose,
80
+ create_new=True,
81
+ watch=False,
82
+ return_address_mode=nuclio.deploy.ReturnAddressModes.all,
83
+ auth_info=auth_info.to_nuclio_auth_info() if auth_info else None,
84
+ )
85
+ except nuclio.utils.DeployError as exc:
86
+ if exc.err:
87
+ err_message = (
88
+ f"Failed to deploy nuclio function {project_name}/{function_name}"
89
+ )
90
+
91
+ try:
92
+
93
+ # the error might not be jsonable, so we'll try to parse it
94
+ # and extract the error message
95
+ json_err = exc.err.response.json()
96
+ if "error" in json_err:
97
+ err_message += f" {json_err['error']}"
98
+ if "errorStackTrace" in json_err:
99
+ logger.warning(
100
+ "Failed to deploy nuclio function",
101
+ nuclio_stacktrace=json_err["errorStackTrace"],
102
+ )
103
+ except Exception as parse_exc:
104
+ logger.warning(
105
+ "Failed to parse nuclio deploy error",
106
+ parse_exc=mlrun.errors.err_to_str(parse_exc),
107
+ )
108
+
109
+ mlrun.errors.raise_for_status(
110
+ exc.err.response,
111
+ err_message,
112
+ )
113
+ raise
114
+
115
+
116
+ def get_nuclio_deploy_status(
117
+ name,
118
+ project,
119
+ tag,
120
+ last_log_timestamp=0,
121
+ verbose=False,
122
+ resolve_address=True,
123
+ auth_info: mlrun.common.schemas.AuthInfo = None,
124
+ ):
125
+ """
126
+ Get nuclio function deploy status
127
+
128
+ :param name: function name
129
+ :param project: project name
130
+ :param tag: function tag
131
+ :param last_log_timestamp: last log timestamp
132
+ :param verbose: print logs
133
+ :param resolve_address: whether to resolve function address
134
+ :param auth_info: authentication information
135
+ """
136
+ api_address = nuclio.deploy.find_dashboard_url(mlrun.mlconf.nuclio_dashboard_url)
137
+ name = mlrun.runtimes.function.get_fullname(name, project, tag)
138
+ get_err_message = f"Failed to get function {name} deploy status"
139
+
140
+ try:
141
+ (
142
+ state,
143
+ address,
144
+ last_log_timestamp,
145
+ outputs,
146
+ function_status,
147
+ ) = nuclio.deploy.get_deploy_status(
148
+ api_address,
149
+ name,
150
+ last_log_timestamp,
151
+ verbose,
152
+ resolve_address,
153
+ return_function_status=True,
154
+ auth_info=auth_info.to_nuclio_auth_info() if auth_info else None,
155
+ )
156
+ except requests.exceptions.ConnectionError as exc:
157
+ mlrun.errors.raise_for_status(
158
+ exc.response,
159
+ get_err_message,
160
+ )
161
+
162
+ except nuclio.utils.DeployError as exc:
163
+ if exc.err:
164
+ mlrun.errors.raise_for_status(
165
+ exc.err.response,
166
+ get_err_message,
167
+ )
168
+ raise exc
169
+ else:
170
+ text = "\n".join(outputs) if outputs else ""
171
+ return state, address, name, last_log_timestamp, text, function_status
172
+
173
+
174
+ def _compile_function_config(
175
+ function: mlrun.runtimes.function.RemoteRuntime,
176
+ client_version: str = None,
177
+ client_python_version: str = None,
178
+ builder_env=None,
179
+ auth_info=None,
180
+ ):
181
+ _set_function_labels(function)
182
+
183
+ # resolve env vars before compiling the nuclio spec, as we need to set them in the spec
184
+ env_dict, external_source_env_dict = _resolve_env_vars(function)
185
+
186
+ nuclio_spec = nuclio.ConfigSpec(
187
+ env=env_dict,
188
+ external_source_env=external_source_env_dict,
189
+ config=function.spec.config,
190
+ )
191
+ nuclio_spec.cmd = function.spec.build.commands or []
192
+
193
+ _resolve_and_set_build_requirements(function, nuclio_spec)
194
+ _resolve_and_set_nuclio_runtime(
195
+ function, nuclio_spec, client_version, client_python_version
196
+ )
197
+
198
+ project = function.metadata.project or "default"
199
+ tag = function.metadata.tag
200
+ handler = function.spec.function_handler
201
+
202
+ _set_build_params(function, nuclio_spec, builder_env, project, auth_info)
203
+ _set_function_scheduling_params(function, nuclio_spec)
204
+ _set_function_replicas(function, nuclio_spec)
205
+ _set_misc_specs(function, nuclio_spec)
206
+
207
+ # if the user code is given explicitly or from a source, we need to set the handler and relevant attributes
208
+ if (
209
+ function.spec.base_spec
210
+ or function.spec.build.functionSourceCode
211
+ or function.spec.build.source
212
+ or function.kind == mlrun.runtimes.RuntimeKinds.serving # serving can be empty
213
+ ):
214
+ config = function.spec.base_spec
215
+ if not config:
216
+ # if base_spec was not set (when not using code_to_function) and we have base64 code
217
+ # we create the base spec with essential attributes
218
+ config = nuclio.config.new_config()
219
+ mlrun.utils.update_in(config, "spec.handler", handler or "main:handler")
220
+
221
+ config = nuclio.config.extend_config(
222
+ config, nuclio_spec, tag, function.spec.build.code_origin
223
+ )
224
+
225
+ if (
226
+ function.kind == mlrun.runtimes.RuntimeKinds.serving
227
+ and not mlrun.utils.get_in(config, "spec.build.functionSourceCode")
228
+ ):
229
+ _set_source_code_and_handler(function, config)
230
+ else:
231
+ # this may also be called in case of using single file code_to_function(embed_code=False)
232
+ # this option need to be removed or be limited to using remote files (this code runs in server)
233
+ function_name, config, code = nuclio.build_file(
234
+ function.spec.source,
235
+ name=function.metadata.name,
236
+ project=project,
237
+ handler=handler,
238
+ tag=tag,
239
+ spec=nuclio_spec,
240
+ kind=function.spec.function_kind,
241
+ verbose=function.verbose,
242
+ )
243
+
244
+ mlrun.utils.update_in(
245
+ config, "spec.volumes", function.spec.generate_nuclio_volumes()
246
+ )
247
+
248
+ _resolve_and_set_base_image(function, config, client_version, client_python_version)
249
+ function_name = _set_function_name(function, config, project, tag)
250
+
251
+ return function_name, project, config
252
+
253
+
254
+ def _set_function_labels(function):
255
+ labels = function.metadata.labels or {}
256
+ labels.update({"mlrun/class": function.kind})
257
+ for key, value in labels.items():
258
+ # Adding escaping to the key to prevent it from being split by dots if it contains any
259
+ function.set_config(f"metadata.labels.\\{key}\\", value)
260
+
261
+
262
+ def _resolve_env_vars(function):
263
+ # Add secret configurations to function's pod spec, if secret sources were added.
264
+ # Needs to be here, since it adds env params, which are handled in the next lines.
265
+ # This only needs to run if we're running within k8s context. If running in Docker, for example, skip.
266
+ if mlrun.api.utils.singletons.k8s.get_k8s_helper(
267
+ silent=True
268
+ ).is_running_inside_kubernetes_cluster():
269
+ function.add_secrets_config_to_spec()
270
+
271
+ env_dict, external_source_env_dict = function._get_nuclio_config_spec_env()
272
+
273
+ # In nuclio 1.6.0<=v<1.8.0, python runtimes default behavior was to not decode event strings
274
+ # Our code is counting on the strings to be decoded, so add the needed env var for those versions
275
+ if (
276
+ mlrun.api.crud.runtimes.nuclio.helpers.is_nuclio_version_in_range(
277
+ "1.6.0", "1.8.0"
278
+ )
279
+ and "NUCLIO_PYTHON_DECODE_EVENT_STRINGS" not in env_dict
280
+ ):
281
+ env_dict["NUCLIO_PYTHON_DECODE_EVENT_STRINGS"] = "true"
282
+
283
+ return env_dict, external_source_env_dict
284
+
285
+
286
+ def _resolve_and_set_nuclio_runtime(
287
+ function, nuclio_spec, client_version, client_python_version
288
+ ):
289
+ nuclio_runtime = (
290
+ function.spec.nuclio_runtime
291
+ or mlrun.api.crud.runtimes.nuclio.helpers.resolve_nuclio_runtime_python_image(
292
+ mlrun_client_version=client_version, python_version=client_python_version
293
+ )
294
+ )
295
+
296
+ # For backwards compatibility, we need to adjust the runtime for old Nuclio versions
297
+ if mlrun.api.crud.runtimes.nuclio.helpers.is_nuclio_version_in_range(
298
+ "0.0.0", "1.6.0"
299
+ ) and nuclio_runtime in [
300
+ "python:3.7",
301
+ "python:3.8",
302
+ ]:
303
+ nuclio_runtime_set_from_spec = nuclio_runtime == function.spec.nuclio_runtime
304
+ if nuclio_runtime_set_from_spec:
305
+ raise mlrun.errors.MLRunInvalidArgumentError(
306
+ f"Nuclio version does not support the configured runtime: {nuclio_runtime}"
307
+ )
308
+ else:
309
+ # our default is python:3.9, simply set it to python:3.6 to keep supporting envs with old Nuclio
310
+ nuclio_runtime = "python:3.6"
311
+
312
+ nuclio_spec.set_config("spec.runtime", nuclio_runtime)
313
+
314
+
315
+ def _resolve_and_set_build_requirements(function, nuclio_spec):
316
+ if function.spec.build.requirements:
317
+ resolved_requirements = []
318
+ # wrap in single quote to ensure that the requirement is treated as a single string
319
+ # quote the requirement to avoid issues with special characters, double quotes, etc.
320
+ for requirement in function.spec.build.requirements:
321
+ # -r / --requirement are flags and should not be escaped
322
+ # we allow such flags (could be passed within the requirements.txt file) and do not
323
+ # try to open the file and include its content since it might be a remote file
324
+ # given on the base image.
325
+ for req_flag in ["-r", "--requirement"]:
326
+ if requirement.startswith(req_flag):
327
+ requirement = requirement[len(req_flag) :].strip()
328
+ resolved_requirements.append(req_flag)
329
+ break
330
+
331
+ resolved_requirements.append(shlex.quote(requirement))
332
+
333
+ encoded_requirements = " ".join(resolved_requirements)
334
+ nuclio_spec.cmd.append(f"python -m pip install {encoded_requirements}")
335
+
336
+
337
+ def _set_build_params(function, nuclio_spec, builder_env, project, auth_info=None):
338
+ # handle archive build params
339
+ if function.spec.build.source:
340
+ mlrun.api.crud.runtimes.nuclio.helpers.compile_nuclio_archive_config(
341
+ nuclio_spec, function, builder_env, project, auth_info=auth_info
342
+ )
343
+
344
+ if function.spec.no_cache:
345
+ nuclio_spec.set_config("spec.build.noCache", True)
346
+ if function.spec.build.functionSourceCode:
347
+ nuclio_spec.set_config(
348
+ "spec.build.functionSourceCode", function.spec.build.functionSourceCode
349
+ )
350
+
351
+ image_pull_secret = (
352
+ mlrun.api.crud.runtimes.nuclio.helpers.resolve_function_image_pull_secret(
353
+ function
354
+ )
355
+ )
356
+ if image_pull_secret:
357
+ nuclio_spec.set_config("spec.imagePullSecrets", image_pull_secret)
358
+
359
+ if function.spec.base_image_pull:
360
+ nuclio_spec.set_config("spec.build.noBaseImagesPull", False)
361
+
362
+
363
+ def _set_function_scheduling_params(function, nuclio_spec):
364
+ # don't send node selections if nuclio is not compatible
365
+ if mlrun.runtimes.function.validate_nuclio_version_compatibility(
366
+ "1.5.20", "1.6.10"
367
+ ):
368
+ if function.spec.node_selector:
369
+ nuclio_spec.set_config("spec.nodeSelector", function.spec.node_selector)
370
+ if function.spec.node_name:
371
+ nuclio_spec.set_config("spec.nodeName", function.spec.node_name)
372
+ if function.spec.affinity:
373
+ nuclio_spec.set_config(
374
+ "spec.affinity",
375
+ mlrun.runtimes.pod.get_sanitized_attribute(function.spec, "affinity"),
376
+ )
377
+
378
+ # don't send tolerations if nuclio is not compatible
379
+ if mlrun.runtimes.function.validate_nuclio_version_compatibility("1.7.5"):
380
+ if function.spec.tolerations:
381
+ nuclio_spec.set_config(
382
+ "spec.tolerations",
383
+ mlrun.runtimes.pod.get_sanitized_attribute(
384
+ function.spec, "tolerations"
385
+ ),
386
+ )
387
+ # don't send preemption_mode if nuclio is not compatible
388
+ if mlrun.runtimes.function.validate_nuclio_version_compatibility("1.8.6"):
389
+ if function.spec.preemption_mode:
390
+ nuclio_spec.set_config(
391
+ "spec.PreemptionMode",
392
+ function.spec.preemption_mode,
393
+ )
394
+
395
+
396
+ def _set_function_replicas(function, nuclio_spec):
397
+ if function.spec.replicas:
398
+ nuclio_spec.set_config(
399
+ "spec.minReplicas",
400
+ mlrun.utils.as_number("spec.Replicas", function.spec.replicas),
401
+ )
402
+ nuclio_spec.set_config(
403
+ "spec.maxReplicas",
404
+ mlrun.utils.as_number("spec.Replicas", function.spec.replicas),
405
+ )
406
+ else:
407
+ nuclio_spec.set_config(
408
+ "spec.minReplicas",
409
+ mlrun.utils.as_number("spec.minReplicas", function.spec.min_replicas),
410
+ )
411
+ nuclio_spec.set_config(
412
+ "spec.maxReplicas",
413
+ mlrun.utils.as_number("spec.maxReplicas", function.spec.max_replicas),
414
+ )
415
+
416
+
417
+ def _set_misc_specs(function, nuclio_spec):
418
+ # in Nuclio >= 1.6.x default serviceType has changed to "ClusterIP".
419
+ nuclio_spec.set_config(
420
+ "spec.serviceType",
421
+ function.spec.service_type or mlrun.mlconf.httpdb.nuclio.default_service_type,
422
+ )
423
+ if function.spec.readiness_timeout:
424
+ nuclio_spec.set_config(
425
+ "spec.readinessTimeoutSeconds", function.spec.readiness_timeout
426
+ )
427
+ if function.spec.readiness_timeout_before_failure:
428
+ nuclio_spec.set_config(
429
+ "spec.waitReadinessTimeoutBeforeFailure",
430
+ function.spec.readiness_timeout_before_failure,
431
+ )
432
+ if function.spec.resources:
433
+ nuclio_spec.set_config("spec.resources", function.spec.resources)
434
+
435
+ # don't send default or any priority class name if nuclio is not compatible
436
+ if (
437
+ function.spec.priority_class_name
438
+ and mlrun.runtimes.function.validate_nuclio_version_compatibility("1.6.18")
439
+ and len(mlrun.mlconf.get_valid_function_priority_class_names())
440
+ ):
441
+ nuclio_spec.set_config(
442
+ "spec.priorityClassName", function.spec.priority_class_name
443
+ )
444
+
445
+ if function.spec.service_account:
446
+ nuclio_spec.set_config("spec.serviceAccount", function.spec.service_account)
447
+
448
+ if function.spec.security_context:
449
+ nuclio_spec.set_config(
450
+ "spec.securityContext",
451
+ mlrun.runtimes.pod.get_sanitized_attribute(
452
+ function.spec, "security_context"
453
+ ),
454
+ )
455
+
456
+
457
+ def _set_source_code_and_handler(function, config):
458
+ if not function.spec.build.source:
459
+ # set the source to the mlrun serving wrapper
460
+ body = nuclio.build.mlrun_footer.format(mlrun.runtimes.serving.serving_subkind)
461
+ mlrun.utils.update_in(
462
+ config,
463
+ "spec.build.functionSourceCode",
464
+ base64.b64encode(body.encode("utf-8")).decode("utf-8"),
465
+ )
466
+ elif not function.spec.function_handler:
467
+ # point the nuclio function handler to mlrun serving wrapper handlers
468
+ mlrun.utils.update_in(
469
+ config,
470
+ "spec.handler",
471
+ "mlrun.serving.serving_wrapper:handler",
472
+ )
473
+
474
+
475
+ def _resolve_and_set_base_image(
476
+ function, config, client_version, client_python_version
477
+ ):
478
+ base_image = (
479
+ mlrun.utils.get_in(config, "spec.build.baseImage")
480
+ or function.spec.image
481
+ or function.spec.build.base_image
482
+ )
483
+ if base_image:
484
+ # we ignore the returned registry secret as nuclio uses the image pull secret, which is resolved in the
485
+ # build params
486
+ (
487
+ base_image,
488
+ _,
489
+ ) = mlrun.api.utils.builder.resolve_image_target_and_registry_secret(
490
+ base_image, secret_name=function.spec.build.secret
491
+ )
492
+ mlrun.utils.update_in(
493
+ config,
494
+ "spec.build.baseImage",
495
+ mlrun.utils.enrich_image_url(
496
+ base_image, client_version, client_python_version
497
+ ),
498
+ )
499
+
500
+
501
+ def _set_function_name(function, config, project, tag):
502
+ name = mlrun.runtimes.function.get_fullname(function.metadata.name, project, tag)
503
+ function.status.nuclio_name = name
504
+ mlrun.utils.update_in(config, "metadata.name", name)
505
+ return name