mlrun 1.3.3rc1__py3-none-any.whl → 1.4.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of mlrun might be problematic. Click here for more details.
- mlrun/__init__.py +3 -3
- mlrun/__main__.py +79 -37
- mlrun/api/__init__.py +1 -1
- mlrun/api/api/__init__.py +1 -1
- mlrun/api/api/api.py +4 -4
- mlrun/api/api/deps.py +10 -21
- mlrun/api/api/endpoints/__init__.py +1 -1
- mlrun/api/api/endpoints/artifacts.py +64 -36
- mlrun/api/api/endpoints/auth.py +4 -4
- mlrun/api/api/endpoints/background_tasks.py +11 -11
- mlrun/api/api/endpoints/client_spec.py +5 -5
- mlrun/api/api/endpoints/clusterization_spec.py +6 -4
- mlrun/api/api/endpoints/feature_store.py +124 -115
- mlrun/api/api/endpoints/files.py +22 -14
- mlrun/api/api/endpoints/frontend_spec.py +28 -21
- mlrun/api/api/endpoints/functions.py +142 -87
- mlrun/api/api/endpoints/grafana_proxy.py +89 -442
- mlrun/api/api/endpoints/healthz.py +20 -7
- mlrun/api/api/endpoints/hub.py +320 -0
- mlrun/api/api/endpoints/internal/__init__.py +1 -1
- mlrun/api/api/endpoints/internal/config.py +1 -1
- mlrun/api/api/endpoints/internal/memory_reports.py +9 -9
- mlrun/api/api/endpoints/logs.py +11 -11
- mlrun/api/api/endpoints/model_endpoints.py +74 -70
- mlrun/api/api/endpoints/operations.py +13 -9
- mlrun/api/api/endpoints/pipelines.py +93 -88
- mlrun/api/api/endpoints/projects.py +35 -35
- mlrun/api/api/endpoints/runs.py +69 -27
- mlrun/api/api/endpoints/runtime_resources.py +28 -28
- mlrun/api/api/endpoints/schedules.py +98 -41
- mlrun/api/api/endpoints/secrets.py +37 -32
- mlrun/api/api/endpoints/submit.py +12 -12
- mlrun/api/api/endpoints/tags.py +20 -22
- mlrun/api/api/utils.py +251 -42
- mlrun/api/constants.py +1 -1
- mlrun/api/crud/__init__.py +18 -15
- mlrun/api/crud/artifacts.py +10 -10
- mlrun/api/crud/client_spec.py +4 -4
- mlrun/api/crud/clusterization_spec.py +3 -3
- mlrun/api/crud/feature_store.py +54 -46
- mlrun/api/crud/functions.py +3 -3
- mlrun/api/crud/hub.py +312 -0
- mlrun/api/crud/logs.py +11 -9
- mlrun/api/crud/model_monitoring/__init__.py +3 -3
- mlrun/api/crud/model_monitoring/grafana.py +435 -0
- mlrun/api/crud/model_monitoring/model_endpoints.py +352 -129
- mlrun/api/crud/notifications.py +149 -0
- mlrun/api/crud/pipelines.py +67 -52
- mlrun/api/crud/projects.py +51 -23
- mlrun/api/crud/runs.py +7 -5
- mlrun/api/crud/runtime_resources.py +13 -13
- mlrun/api/{db/filedb → crud/runtimes}/__init__.py +1 -1
- mlrun/api/crud/runtimes/nuclio/__init__.py +14 -0
- mlrun/api/crud/runtimes/nuclio/function.py +505 -0
- mlrun/api/crud/runtimes/nuclio/helpers.py +310 -0
- mlrun/api/crud/secrets.py +88 -46
- mlrun/api/crud/tags.py +5 -5
- mlrun/api/db/__init__.py +1 -1
- mlrun/api/db/base.py +102 -54
- mlrun/api/db/init_db.py +2 -3
- mlrun/api/db/session.py +4 -12
- mlrun/api/db/sqldb/__init__.py +1 -1
- mlrun/api/db/sqldb/db.py +439 -196
- mlrun/api/db/sqldb/helpers.py +1 -1
- mlrun/api/db/sqldb/models/__init__.py +3 -3
- mlrun/api/db/sqldb/models/models_mysql.py +82 -64
- mlrun/api/db/sqldb/models/models_sqlite.py +76 -64
- mlrun/api/db/sqldb/session.py +27 -20
- mlrun/api/initial_data.py +82 -24
- mlrun/api/launcher.py +196 -0
- mlrun/api/main.py +91 -22
- mlrun/api/middlewares.py +6 -5
- mlrun/api/migrations_mysql/env.py +1 -1
- mlrun/api/migrations_mysql/versions/28383af526f3_market_place_to_hub.py +40 -0
- mlrun/api/migrations_mysql/versions/32bae1b0e29c_increase_timestamp_fields_precision.py +1 -1
- mlrun/api/migrations_mysql/versions/4903aef6a91d_tag_foreign_key_and_cascades.py +1 -1
- mlrun/api/migrations_mysql/versions/5f1351c88a19_adding_background_tasks_table.py +1 -1
- mlrun/api/migrations_mysql/versions/88e656800d6a_add_requested_logs_column_and_index_to_.py +1 -1
- mlrun/api/migrations_mysql/versions/9d16de5f03a7_adding_data_versions_table.py +1 -1
- mlrun/api/migrations_mysql/versions/b86f5b53f3d7_adding_name_and_updated_to_runs_table.py +1 -1
- mlrun/api/migrations_mysql/versions/c4af40b0bf61_init.py +1 -1
- mlrun/api/migrations_mysql/versions/c905d15bd91d_notifications.py +72 -0
- mlrun/api/migrations_mysql/versions/ee041e8fdaa0_adding_next_run_time_column_to_schedule_.py +1 -1
- mlrun/api/migrations_sqlite/env.py +1 -1
- mlrun/api/migrations_sqlite/versions/11f8dd2dc9fe_init.py +1 -1
- mlrun/api/migrations_sqlite/versions/1c954f8cb32d_schedule_last_run_uri.py +1 -1
- mlrun/api/migrations_sqlite/versions/2b6d23c715aa_adding_feature_sets.py +1 -1
- mlrun/api/migrations_sqlite/versions/4acd9430b093_market_place_to_hub.py +77 -0
- mlrun/api/migrations_sqlite/versions/6401142f2d7c_adding_next_run_time_column_to_schedule_.py +1 -1
- mlrun/api/migrations_sqlite/versions/64d90a1a69bc_adding_background_tasks_table.py +1 -1
- mlrun/api/migrations_sqlite/versions/803438ecd005_add_requested_logs_column_to_runs.py +1 -1
- mlrun/api/migrations_sqlite/versions/863114f0c659_refactoring_feature_set.py +1 -1
- mlrun/api/migrations_sqlite/versions/959ae00528ad_notifications.py +63 -0
- mlrun/api/migrations_sqlite/versions/accf9fc83d38_adding_data_versions_table.py +1 -1
- mlrun/api/migrations_sqlite/versions/b68e8e897a28_schedule_labels.py +1 -1
- mlrun/api/migrations_sqlite/versions/bcd0c1f9720c_adding_project_labels.py +1 -1
- mlrun/api/migrations_sqlite/versions/cf21882f938e_schedule_id.py +1 -1
- mlrun/api/migrations_sqlite/versions/d781f58f607f_tag_object_name_string.py +1 -1
- mlrun/api/migrations_sqlite/versions/deac06871ace_adding_marketplace_sources_table.py +1 -1
- mlrun/api/migrations_sqlite/versions/e1dd5983c06b_schedule_concurrency_limit.py +1 -1
- mlrun/api/migrations_sqlite/versions/e5594ed3ab53_adding_name_and_updated_to_runs_table.py +1 -1
- mlrun/api/migrations_sqlite/versions/f4249b4ba6fa_adding_feature_vectors.py +1 -1
- mlrun/api/migrations_sqlite/versions/f7b5a1a03629_adding_feature_labels.py +1 -1
- mlrun/api/schemas/__init__.py +216 -138
- mlrun/api/utils/__init__.py +1 -1
- mlrun/api/utils/asyncio.py +1 -1
- mlrun/api/utils/auth/__init__.py +1 -1
- mlrun/api/utils/auth/providers/__init__.py +1 -1
- mlrun/api/utils/auth/providers/base.py +7 -7
- mlrun/api/utils/auth/providers/nop.py +6 -7
- mlrun/api/utils/auth/providers/opa.py +17 -17
- mlrun/api/utils/auth/verifier.py +36 -34
- mlrun/api/utils/background_tasks.py +24 -24
- mlrun/{builder.py → api/utils/builder.py} +216 -123
- mlrun/api/utils/clients/__init__.py +1 -1
- mlrun/api/utils/clients/chief.py +19 -4
- mlrun/api/utils/clients/iguazio.py +106 -60
- mlrun/api/utils/clients/log_collector.py +1 -1
- mlrun/api/utils/clients/nuclio.py +23 -23
- mlrun/api/utils/clients/protocols/grpc.py +2 -2
- mlrun/api/utils/db/__init__.py +1 -1
- mlrun/api/utils/db/alembic.py +1 -1
- mlrun/api/utils/db/backup.py +1 -1
- mlrun/api/utils/db/mysql.py +24 -25
- mlrun/api/utils/db/sql_collation.py +1 -1
- mlrun/api/utils/db/sqlite_migration.py +2 -2
- mlrun/api/utils/events/__init__.py +14 -0
- mlrun/api/utils/events/base.py +57 -0
- mlrun/api/utils/events/events_factory.py +41 -0
- mlrun/api/utils/events/iguazio.py +217 -0
- mlrun/api/utils/events/nop.py +55 -0
- mlrun/api/utils/helpers.py +16 -13
- mlrun/api/utils/memory_reports.py +1 -1
- mlrun/api/utils/periodic.py +6 -3
- mlrun/api/utils/projects/__init__.py +1 -1
- mlrun/api/utils/projects/follower.py +33 -33
- mlrun/api/utils/projects/leader.py +36 -34
- mlrun/api/utils/projects/member.py +27 -27
- mlrun/api/utils/projects/remotes/__init__.py +1 -1
- mlrun/api/utils/projects/remotes/follower.py +13 -13
- mlrun/api/utils/projects/remotes/leader.py +10 -10
- mlrun/api/utils/projects/remotes/nop_follower.py +27 -21
- mlrun/api/utils/projects/remotes/nop_leader.py +17 -16
- mlrun/api/utils/scheduler.py +140 -51
- mlrun/api/utils/singletons/__init__.py +1 -1
- mlrun/api/utils/singletons/db.py +9 -15
- mlrun/api/utils/singletons/k8s.py +677 -5
- mlrun/api/utils/singletons/logs_dir.py +1 -1
- mlrun/api/utils/singletons/project_member.py +1 -1
- mlrun/api/utils/singletons/scheduler.py +1 -1
- mlrun/artifacts/__init__.py +2 -2
- mlrun/artifacts/base.py +8 -2
- mlrun/artifacts/dataset.py +5 -3
- mlrun/artifacts/manager.py +7 -1
- mlrun/artifacts/model.py +15 -4
- mlrun/artifacts/plots.py +1 -1
- mlrun/common/__init__.py +1 -1
- mlrun/common/constants.py +15 -0
- mlrun/common/model_monitoring.py +209 -0
- mlrun/common/schemas/__init__.py +167 -0
- mlrun/{api → common}/schemas/artifact.py +13 -14
- mlrun/{api → common}/schemas/auth.py +10 -8
- mlrun/{api → common}/schemas/background_task.py +3 -3
- mlrun/{api → common}/schemas/client_spec.py +1 -1
- mlrun/{api → common}/schemas/clusterization_spec.py +3 -3
- mlrun/{api → common}/schemas/constants.py +21 -8
- mlrun/common/schemas/events.py +36 -0
- mlrun/{api → common}/schemas/feature_store.py +2 -1
- mlrun/{api → common}/schemas/frontend_spec.py +7 -6
- mlrun/{api → common}/schemas/function.py +5 -5
- mlrun/{api → common}/schemas/http.py +3 -3
- mlrun/common/schemas/hub.py +134 -0
- mlrun/{api → common}/schemas/k8s.py +3 -3
- mlrun/{api → common}/schemas/memory_reports.py +1 -1
- mlrun/common/schemas/model_endpoints.py +342 -0
- mlrun/common/schemas/notification.py +57 -0
- mlrun/{api → common}/schemas/object.py +6 -6
- mlrun/{api → common}/schemas/pipeline.py +3 -3
- mlrun/{api → common}/schemas/project.py +6 -5
- mlrun/common/schemas/regex.py +24 -0
- mlrun/common/schemas/runs.py +30 -0
- mlrun/{api → common}/schemas/runtime_resource.py +3 -3
- mlrun/{api → common}/schemas/schedule.py +19 -7
- mlrun/{api → common}/schemas/secret.py +3 -3
- mlrun/{api → common}/schemas/tag.py +2 -2
- mlrun/common/types.py +25 -0
- mlrun/config.py +152 -20
- mlrun/data_types/__init__.py +7 -2
- mlrun/data_types/data_types.py +4 -2
- mlrun/data_types/infer.py +1 -1
- mlrun/data_types/spark.py +10 -3
- mlrun/datastore/__init__.py +10 -3
- mlrun/datastore/azure_blob.py +1 -1
- mlrun/datastore/base.py +185 -53
- mlrun/datastore/datastore.py +1 -1
- mlrun/datastore/filestore.py +1 -1
- mlrun/datastore/google_cloud_storage.py +1 -1
- mlrun/datastore/inmem.py +4 -1
- mlrun/datastore/redis.py +1 -1
- mlrun/datastore/s3.py +1 -1
- mlrun/datastore/sources.py +192 -70
- mlrun/datastore/spark_udf.py +44 -0
- mlrun/datastore/store_resources.py +4 -4
- mlrun/datastore/targets.py +115 -45
- mlrun/datastore/utils.py +127 -5
- mlrun/datastore/v3io.py +1 -1
- mlrun/datastore/wasbfs/__init__.py +1 -1
- mlrun/datastore/wasbfs/fs.py +1 -1
- mlrun/db/__init__.py +7 -5
- mlrun/db/base.py +112 -68
- mlrun/db/httpdb.py +445 -277
- mlrun/db/nopdb.py +491 -0
- mlrun/db/sqldb.py +112 -65
- mlrun/errors.py +6 -1
- mlrun/execution.py +44 -22
- mlrun/feature_store/__init__.py +1 -1
- mlrun/feature_store/api.py +143 -95
- mlrun/feature_store/common.py +16 -20
- mlrun/feature_store/feature_set.py +42 -12
- mlrun/feature_store/feature_vector.py +32 -21
- mlrun/feature_store/ingestion.py +9 -12
- mlrun/feature_store/retrieval/__init__.py +3 -2
- mlrun/feature_store/retrieval/base.py +388 -66
- mlrun/feature_store/retrieval/dask_merger.py +63 -151
- mlrun/feature_store/retrieval/job.py +30 -12
- mlrun/feature_store/retrieval/local_merger.py +40 -133
- mlrun/feature_store/retrieval/spark_merger.py +129 -127
- mlrun/feature_store/retrieval/storey_merger.py +173 -0
- mlrun/feature_store/steps.py +132 -15
- mlrun/features.py +8 -3
- mlrun/frameworks/__init__.py +1 -1
- mlrun/frameworks/_common/__init__.py +1 -1
- mlrun/frameworks/_common/artifacts_library.py +1 -1
- mlrun/frameworks/_common/mlrun_interface.py +1 -1
- mlrun/frameworks/_common/model_handler.py +1 -1
- mlrun/frameworks/_common/plan.py +1 -1
- mlrun/frameworks/_common/producer.py +1 -1
- mlrun/frameworks/_common/utils.py +1 -1
- mlrun/frameworks/_dl_common/__init__.py +1 -1
- mlrun/frameworks/_dl_common/loggers/__init__.py +1 -1
- mlrun/frameworks/_dl_common/loggers/logger.py +1 -1
- mlrun/frameworks/_dl_common/loggers/mlrun_logger.py +1 -1
- mlrun/frameworks/_dl_common/loggers/tensorboard_logger.py +1 -1
- mlrun/frameworks/_dl_common/model_handler.py +1 -1
- mlrun/frameworks/_dl_common/utils.py +1 -1
- mlrun/frameworks/_ml_common/__init__.py +1 -1
- mlrun/frameworks/_ml_common/artifacts_library.py +1 -1
- mlrun/frameworks/_ml_common/loggers/__init__.py +1 -1
- mlrun/frameworks/_ml_common/loggers/logger.py +1 -1
- mlrun/frameworks/_ml_common/loggers/mlrun_logger.py +1 -1
- mlrun/frameworks/_ml_common/model_handler.py +1 -1
- mlrun/frameworks/_ml_common/pkl_model_server.py +13 -1
- mlrun/frameworks/_ml_common/plan.py +1 -1
- mlrun/frameworks/_ml_common/plans/__init__.py +1 -1
- mlrun/frameworks/_ml_common/plans/calibration_curve_plan.py +1 -6
- mlrun/frameworks/_ml_common/plans/confusion_matrix_plan.py +1 -1
- mlrun/frameworks/_ml_common/plans/dataset_plan.py +1 -1
- mlrun/frameworks/_ml_common/plans/feature_importance_plan.py +1 -1
- mlrun/frameworks/_ml_common/plans/roc_curve_plan.py +1 -1
- mlrun/frameworks/_ml_common/producer.py +1 -1
- mlrun/frameworks/_ml_common/utils.py +1 -1
- mlrun/frameworks/auto_mlrun/__init__.py +1 -1
- mlrun/frameworks/auto_mlrun/auto_mlrun.py +1 -1
- mlrun/frameworks/huggingface/__init__.py +1 -1
- mlrun/frameworks/huggingface/model_server.py +1 -1
- mlrun/frameworks/lgbm/__init__.py +1 -1
- mlrun/frameworks/lgbm/callbacks/__init__.py +1 -1
- mlrun/frameworks/lgbm/callbacks/callback.py +1 -1
- mlrun/frameworks/lgbm/callbacks/logging_callback.py +1 -1
- mlrun/frameworks/lgbm/callbacks/mlrun_logging_callback.py +1 -1
- mlrun/frameworks/lgbm/mlrun_interfaces/__init__.py +1 -1
- mlrun/frameworks/lgbm/mlrun_interfaces/booster_mlrun_interface.py +1 -1
- mlrun/frameworks/lgbm/mlrun_interfaces/mlrun_interface.py +1 -1
- mlrun/frameworks/lgbm/mlrun_interfaces/model_mlrun_interface.py +1 -1
- mlrun/frameworks/lgbm/model_handler.py +1 -1
- mlrun/frameworks/lgbm/model_server.py +1 -1
- mlrun/frameworks/lgbm/utils.py +1 -1
- mlrun/frameworks/onnx/__init__.py +1 -1
- mlrun/frameworks/onnx/dataset.py +1 -1
- mlrun/frameworks/onnx/mlrun_interface.py +1 -1
- mlrun/frameworks/onnx/model_handler.py +1 -1
- mlrun/frameworks/onnx/model_server.py +1 -1
- mlrun/frameworks/parallel_coordinates.py +1 -1
- mlrun/frameworks/pytorch/__init__.py +1 -1
- mlrun/frameworks/pytorch/callbacks/__init__.py +1 -1
- mlrun/frameworks/pytorch/callbacks/callback.py +1 -1
- mlrun/frameworks/pytorch/callbacks/logging_callback.py +1 -1
- mlrun/frameworks/pytorch/callbacks/mlrun_logging_callback.py +1 -1
- mlrun/frameworks/pytorch/callbacks/tensorboard_logging_callback.py +1 -1
- mlrun/frameworks/pytorch/callbacks_handler.py +1 -1
- mlrun/frameworks/pytorch/mlrun_interface.py +1 -1
- mlrun/frameworks/pytorch/model_handler.py +1 -1
- mlrun/frameworks/pytorch/model_server.py +1 -1
- mlrun/frameworks/pytorch/utils.py +1 -1
- mlrun/frameworks/sklearn/__init__.py +1 -1
- mlrun/frameworks/sklearn/estimator.py +1 -1
- mlrun/frameworks/sklearn/metric.py +1 -1
- mlrun/frameworks/sklearn/metrics_library.py +1 -1
- mlrun/frameworks/sklearn/mlrun_interface.py +1 -1
- mlrun/frameworks/sklearn/model_handler.py +1 -1
- mlrun/frameworks/sklearn/utils.py +1 -1
- mlrun/frameworks/tf_keras/__init__.py +1 -1
- mlrun/frameworks/tf_keras/callbacks/__init__.py +1 -1
- mlrun/frameworks/tf_keras/callbacks/logging_callback.py +1 -1
- mlrun/frameworks/tf_keras/callbacks/mlrun_logging_callback.py +1 -1
- mlrun/frameworks/tf_keras/callbacks/tensorboard_logging_callback.py +1 -1
- mlrun/frameworks/tf_keras/mlrun_interface.py +1 -1
- mlrun/frameworks/tf_keras/model_handler.py +1 -1
- mlrun/frameworks/tf_keras/model_server.py +1 -1
- mlrun/frameworks/tf_keras/utils.py +1 -1
- mlrun/frameworks/xgboost/__init__.py +1 -1
- mlrun/frameworks/xgboost/mlrun_interface.py +1 -1
- mlrun/frameworks/xgboost/model_handler.py +1 -1
- mlrun/frameworks/xgboost/utils.py +1 -1
- mlrun/k8s_utils.py +14 -765
- mlrun/kfpops.py +14 -17
- mlrun/launcher/__init__.py +13 -0
- mlrun/launcher/base.py +406 -0
- mlrun/launcher/client.py +159 -0
- mlrun/launcher/factory.py +50 -0
- mlrun/launcher/local.py +276 -0
- mlrun/launcher/remote.py +178 -0
- mlrun/lists.py +10 -2
- mlrun/mlutils/__init__.py +1 -1
- mlrun/mlutils/data.py +1 -1
- mlrun/mlutils/models.py +1 -1
- mlrun/mlutils/plots.py +1 -1
- mlrun/model.py +252 -14
- mlrun/model_monitoring/__init__.py +41 -0
- mlrun/model_monitoring/features_drift_table.py +1 -1
- mlrun/model_monitoring/helpers.py +123 -38
- mlrun/model_monitoring/model_endpoint.py +144 -0
- mlrun/model_monitoring/model_monitoring_batch.py +310 -259
- mlrun/model_monitoring/stores/__init__.py +106 -0
- mlrun/model_monitoring/stores/kv_model_endpoint_store.py +448 -0
- mlrun/model_monitoring/stores/model_endpoint_store.py +147 -0
- mlrun/model_monitoring/stores/models/__init__.py +23 -0
- mlrun/model_monitoring/stores/models/base.py +18 -0
- mlrun/model_monitoring/stores/models/mysql.py +100 -0
- mlrun/model_monitoring/stores/models/sqlite.py +98 -0
- mlrun/model_monitoring/stores/sql_model_endpoint_store.py +370 -0
- mlrun/model_monitoring/stream_processing_fs.py +239 -271
- mlrun/package/__init__.py +163 -0
- mlrun/package/context_handler.py +325 -0
- mlrun/package/errors.py +47 -0
- mlrun/package/packager.py +298 -0
- mlrun/{runtimes/package → package/packagers}/__init__.py +3 -1
- mlrun/package/packagers/default_packager.py +422 -0
- mlrun/package/packagers/numpy_packagers.py +612 -0
- mlrun/package/packagers/pandas_packagers.py +968 -0
- mlrun/package/packagers/python_standard_library_packagers.py +616 -0
- mlrun/package/packagers_manager.py +786 -0
- mlrun/package/utils/__init__.py +53 -0
- mlrun/package/utils/_archiver.py +226 -0
- mlrun/package/utils/_formatter.py +211 -0
- mlrun/package/utils/_pickler.py +234 -0
- mlrun/package/utils/_supported_format.py +71 -0
- mlrun/package/utils/log_hint_utils.py +93 -0
- mlrun/package/utils/type_hint_utils.py +298 -0
- mlrun/platforms/__init__.py +1 -1
- mlrun/platforms/iguazio.py +34 -2
- mlrun/platforms/other.py +1 -1
- mlrun/projects/__init__.py +1 -1
- mlrun/projects/operations.py +14 -9
- mlrun/projects/pipelines.py +31 -13
- mlrun/projects/project.py +762 -238
- mlrun/render.py +49 -19
- mlrun/run.py +57 -326
- mlrun/runtimes/__init__.py +3 -9
- mlrun/runtimes/base.py +247 -784
- mlrun/runtimes/constants.py +1 -1
- mlrun/runtimes/daskjob.py +45 -41
- mlrun/runtimes/funcdoc.py +43 -7
- mlrun/runtimes/function.py +66 -656
- mlrun/runtimes/function_reference.py +1 -1
- mlrun/runtimes/generators.py +1 -1
- mlrun/runtimes/kubejob.py +99 -116
- mlrun/runtimes/local.py +59 -66
- mlrun/runtimes/mpijob/__init__.py +1 -1
- mlrun/runtimes/mpijob/abstract.py +13 -15
- mlrun/runtimes/mpijob/v1.py +3 -1
- mlrun/runtimes/mpijob/v1alpha1.py +1 -1
- mlrun/runtimes/nuclio.py +1 -1
- mlrun/runtimes/pod.py +51 -26
- mlrun/runtimes/remotesparkjob.py +3 -1
- mlrun/runtimes/serving.py +12 -4
- mlrun/runtimes/sparkjob/__init__.py +1 -2
- mlrun/runtimes/sparkjob/abstract.py +44 -31
- mlrun/runtimes/sparkjob/spark3job.py +11 -9
- mlrun/runtimes/utils.py +61 -42
- mlrun/secrets.py +16 -18
- mlrun/serving/__init__.py +3 -2
- mlrun/serving/merger.py +1 -1
- mlrun/serving/remote.py +1 -1
- mlrun/serving/routers.py +39 -42
- mlrun/serving/server.py +23 -13
- mlrun/serving/serving_wrapper.py +1 -1
- mlrun/serving/states.py +172 -39
- mlrun/serving/utils.py +1 -1
- mlrun/serving/v1_serving.py +1 -1
- mlrun/serving/v2_serving.py +29 -21
- mlrun/utils/__init__.py +1 -2
- mlrun/utils/async_http.py +8 -1
- mlrun/utils/azure_vault.py +1 -1
- mlrun/utils/clones.py +2 -2
- mlrun/utils/condition_evaluator.py +65 -0
- mlrun/utils/db.py +52 -0
- mlrun/utils/helpers.py +188 -13
- mlrun/utils/http.py +89 -54
- mlrun/utils/logger.py +48 -8
- mlrun/utils/model_monitoring.py +132 -100
- mlrun/utils/notifications/__init__.py +1 -1
- mlrun/utils/notifications/notification/__init__.py +8 -6
- mlrun/utils/notifications/notification/base.py +20 -14
- mlrun/utils/notifications/notification/console.py +7 -4
- mlrun/utils/notifications/notification/git.py +36 -19
- mlrun/utils/notifications/notification/ipython.py +10 -8
- mlrun/utils/notifications/notification/slack.py +18 -13
- mlrun/utils/notifications/notification_pusher.py +377 -56
- mlrun/utils/regex.py +6 -1
- mlrun/utils/singleton.py +1 -1
- mlrun/utils/v3io_clients.py +1 -1
- mlrun/utils/vault.py +270 -269
- mlrun/utils/version/__init__.py +1 -1
- mlrun/utils/version/version.json +2 -2
- mlrun/utils/version/version.py +1 -1
- {mlrun-1.3.3rc1.dist-info → mlrun-1.4.0.dist-info}/METADATA +16 -10
- mlrun-1.4.0.dist-info/RECORD +434 -0
- mlrun/api/api/endpoints/marketplace.py +0 -257
- mlrun/api/crud/marketplace.py +0 -221
- mlrun/api/crud/model_monitoring/model_endpoint_store.py +0 -847
- mlrun/api/db/filedb/db.py +0 -518
- mlrun/api/schemas/marketplace.py +0 -128
- mlrun/api/schemas/model_endpoints.py +0 -185
- mlrun/db/filedb.py +0 -891
- mlrun/feature_store/retrieval/online.py +0 -92
- mlrun/model_monitoring/constants.py +0 -67
- mlrun/runtimes/package/context_handler.py +0 -711
- mlrun/runtimes/sparkjob/spark2job.py +0 -59
- mlrun-1.3.3rc1.dist-info/RECORD +0 -381
- {mlrun-1.3.3rc1.dist-info → mlrun-1.4.0.dist-info}/LICENSE +0 -0
- {mlrun-1.3.3rc1.dist-info → mlrun-1.4.0.dist-info}/WHEEL +0 -0
- {mlrun-1.3.3rc1.dist-info → mlrun-1.4.0.dist-info}/entry_points.txt +0 -0
- {mlrun-1.3.3rc1.dist-info → mlrun-1.4.0.dist-info}/top_level.txt +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Copyright
|
|
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.
|
|
40
|
+
mlrun.common.schemas.ListRuntimeResourcesGroupByField
|
|
41
41
|
] = None,
|
|
42
42
|
) -> typing.Union[
|
|
43
|
-
mlrun.
|
|
44
|
-
mlrun.
|
|
45
|
-
mlrun.
|
|
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.
|
|
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.
|
|
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.
|
|
72
|
+
mlrun.common.schemas.ListRuntimeResourcesGroupByField
|
|
73
73
|
] = None,
|
|
74
74
|
) -> typing.Union[
|
|
75
|
-
mlrun.
|
|
76
|
-
mlrun.
|
|
77
|
-
mlrun.
|
|
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.
|
|
97
|
+
mlrun.common.schemas.KindRuntimeResources(
|
|
98
98
|
kind=kind, resources=resources
|
|
99
99
|
)
|
|
100
100
|
)
|
|
@@ -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
|