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.
|
|
@@ -35,23 +35,25 @@ from kubernetes.client.rest import ApiException
|
|
|
35
35
|
from sqlalchemy.orm import Session
|
|
36
36
|
|
|
37
37
|
import mlrun.api.crud
|
|
38
|
+
import mlrun.api.crud.runtimes.nuclio.function
|
|
38
39
|
import mlrun.api.db.session
|
|
39
|
-
import mlrun.api.
|
|
40
|
+
import mlrun.api.launcher
|
|
40
41
|
import mlrun.api.utils.auth.verifier
|
|
41
42
|
import mlrun.api.utils.background_tasks
|
|
42
43
|
import mlrun.api.utils.clients.chief
|
|
44
|
+
import mlrun.api.utils.singletons.k8s
|
|
43
45
|
import mlrun.api.utils.singletons.project_member
|
|
46
|
+
import mlrun.common.model_monitoring
|
|
47
|
+
import mlrun.common.schemas
|
|
44
48
|
from mlrun.api.api import deps
|
|
45
49
|
from mlrun.api.api.utils import get_run_db_instance, log_and_raise, log_path
|
|
46
50
|
from mlrun.api.crud.secrets import Secrets, SecretsClientType
|
|
47
|
-
from mlrun.api.
|
|
48
|
-
from mlrun.api.utils.singletons.
|
|
49
|
-
from mlrun.builder import build_runtime
|
|
51
|
+
from mlrun.api.utils.builder import build_runtime
|
|
52
|
+
from mlrun.api.utils.singletons.scheduler import get_scheduler
|
|
50
53
|
from mlrun.config import config
|
|
51
54
|
from mlrun.errors import MLRunRuntimeError, err_to_str
|
|
52
55
|
from mlrun.run import new_function
|
|
53
56
|
from mlrun.runtimes import RuntimeKinds, ServingRuntime, runtime_resources_map
|
|
54
|
-
from mlrun.runtimes.function import deploy_nuclio_function, get_nuclio_deploy_status
|
|
55
57
|
from mlrun.runtimes.utils import get_item_name
|
|
56
58
|
from mlrun.utils import get_in, logger, parse_versioned_object_uri, update_in
|
|
57
59
|
from mlrun.utils.model_monitoring import parse_model_endpoint_store_prefix
|
|
@@ -59,14 +61,20 @@ from mlrun.utils.model_monitoring import parse_model_endpoint_store_prefix
|
|
|
59
61
|
router = APIRouter()
|
|
60
62
|
|
|
61
63
|
|
|
62
|
-
@router.post(
|
|
64
|
+
@router.post(
|
|
65
|
+
"/func/{project}/{name}",
|
|
66
|
+
deprecated=True,
|
|
67
|
+
description="/func/{project}/{name} is deprecated in 1.4.0 and will be removed in 1.6.0, "
|
|
68
|
+
"use /projects/{project}/functions/{name} instead",
|
|
69
|
+
)
|
|
70
|
+
@router.post("/projects/{project}/functions/{name}")
|
|
63
71
|
async def store_function(
|
|
64
72
|
request: Request,
|
|
65
73
|
project: str,
|
|
66
74
|
name: str,
|
|
67
75
|
tag: str = "",
|
|
68
76
|
versioned: bool = False,
|
|
69
|
-
auth_info: mlrun.
|
|
77
|
+
auth_info: mlrun.common.schemas.AuthInfo = Depends(deps.authenticate_request),
|
|
70
78
|
db_session: Session = Depends(deps.get_db_session),
|
|
71
79
|
):
|
|
72
80
|
await run_in_threadpool(
|
|
@@ -76,10 +84,10 @@ async def store_function(
|
|
|
76
84
|
auth_info=auth_info,
|
|
77
85
|
)
|
|
78
86
|
await mlrun.api.utils.auth.verifier.AuthVerifier().query_project_resource_permissions(
|
|
79
|
-
mlrun.
|
|
87
|
+
mlrun.common.schemas.AuthorizationResourceTypes.function,
|
|
80
88
|
project,
|
|
81
89
|
name,
|
|
82
|
-
mlrun.
|
|
90
|
+
mlrun.common.schemas.AuthorizationAction.store,
|
|
83
91
|
auth_info,
|
|
84
92
|
)
|
|
85
93
|
data = None
|
|
@@ -104,13 +112,19 @@ async def store_function(
|
|
|
104
112
|
}
|
|
105
113
|
|
|
106
114
|
|
|
107
|
-
@router.get(
|
|
115
|
+
@router.get(
|
|
116
|
+
"/func/{project}/{name}",
|
|
117
|
+
deprecated=True,
|
|
118
|
+
description="/func/{project}/{name} is deprecated in 1.4.0 and will be removed in 1.6.0, "
|
|
119
|
+
"use /projects/{project}/functions/{name} instead",
|
|
120
|
+
)
|
|
121
|
+
@router.get("/projects/{project}/functions/{name}")
|
|
108
122
|
async def get_function(
|
|
109
123
|
project: str,
|
|
110
124
|
name: str,
|
|
111
125
|
tag: str = "",
|
|
112
126
|
hash_key="",
|
|
113
|
-
auth_info: mlrun.
|
|
127
|
+
auth_info: mlrun.common.schemas.AuthInfo = Depends(deps.authenticate_request),
|
|
114
128
|
db_session: Session = Depends(deps.get_db_session),
|
|
115
129
|
):
|
|
116
130
|
func = await run_in_threadpool(
|
|
@@ -122,10 +136,10 @@ async def get_function(
|
|
|
122
136
|
hash_key,
|
|
123
137
|
)
|
|
124
138
|
await mlrun.api.utils.auth.verifier.AuthVerifier().query_project_resource_permissions(
|
|
125
|
-
mlrun.
|
|
139
|
+
mlrun.common.schemas.AuthorizationResourceTypes.function,
|
|
126
140
|
project,
|
|
127
141
|
name,
|
|
128
|
-
mlrun.
|
|
142
|
+
mlrun.common.schemas.AuthorizationAction.read,
|
|
129
143
|
auth_info,
|
|
130
144
|
)
|
|
131
145
|
return {
|
|
@@ -139,37 +153,73 @@ async def get_function(
|
|
|
139
153
|
async def delete_function(
|
|
140
154
|
project: str,
|
|
141
155
|
name: str,
|
|
142
|
-
auth_info: mlrun.
|
|
156
|
+
auth_info: mlrun.common.schemas.AuthInfo = Depends(deps.authenticate_request),
|
|
143
157
|
db_session: Session = Depends(deps.get_db_session),
|
|
144
158
|
):
|
|
145
159
|
await mlrun.api.utils.auth.verifier.AuthVerifier().query_project_resource_permissions(
|
|
146
|
-
mlrun.
|
|
160
|
+
mlrun.common.schemas.AuthorizationResourceTypes.function,
|
|
147
161
|
project,
|
|
148
162
|
name,
|
|
149
|
-
mlrun.
|
|
163
|
+
mlrun.common.schemas.AuthorizationAction.delete,
|
|
150
164
|
auth_info,
|
|
151
165
|
)
|
|
166
|
+
# If the requested function has a schedule, we must delete it before deleting the function
|
|
167
|
+
try:
|
|
168
|
+
function_schedule = await run_in_threadpool(
|
|
169
|
+
get_scheduler().get_schedule,
|
|
170
|
+
db_session,
|
|
171
|
+
project,
|
|
172
|
+
name,
|
|
173
|
+
)
|
|
174
|
+
except mlrun.errors.MLRunNotFoundError:
|
|
175
|
+
function_schedule = None
|
|
176
|
+
|
|
177
|
+
if function_schedule:
|
|
178
|
+
# when deleting a function, we should also delete its schedules if exists
|
|
179
|
+
# schedules are only supposed to be run by the chief, therefore, if the function has a schedule,
|
|
180
|
+
# and we are running in worker, we send the request to the chief client
|
|
181
|
+
if (
|
|
182
|
+
mlrun.mlconf.httpdb.clusterization.role
|
|
183
|
+
!= mlrun.common.schemas.ClusterizationRole.chief
|
|
184
|
+
):
|
|
185
|
+
logger.info(
|
|
186
|
+
"Function has a schedule, deleting",
|
|
187
|
+
function=name,
|
|
188
|
+
project=project,
|
|
189
|
+
)
|
|
190
|
+
chief_client = mlrun.api.utils.clients.chief.Client()
|
|
191
|
+
await chief_client.delete_schedule(project=project, name=name)
|
|
192
|
+
else:
|
|
193
|
+
await run_in_threadpool(
|
|
194
|
+
get_scheduler().delete_schedule, db_session, project, name
|
|
195
|
+
)
|
|
152
196
|
await run_in_threadpool(
|
|
153
197
|
mlrun.api.crud.Functions().delete_function, db_session, project, name
|
|
154
198
|
)
|
|
155
199
|
return Response(status_code=HTTPStatus.NO_CONTENT.value)
|
|
156
200
|
|
|
157
201
|
|
|
158
|
-
@router.get(
|
|
202
|
+
@router.get(
|
|
203
|
+
"/funcs",
|
|
204
|
+
deprecated=True,
|
|
205
|
+
description="/funcs is deprecated in 1.4.0 and will be removed in 1.6.0, "
|
|
206
|
+
"use /projects/{project}/functions instead",
|
|
207
|
+
)
|
|
208
|
+
@router.get("/projects/{project}/functions")
|
|
159
209
|
async def list_functions(
|
|
160
210
|
project: str = None,
|
|
161
211
|
name: str = None,
|
|
162
212
|
tag: str = None,
|
|
163
213
|
labels: List[str] = Query([], alias="label"),
|
|
164
214
|
hash_key: str = None,
|
|
165
|
-
auth_info: mlrun.
|
|
215
|
+
auth_info: mlrun.common.schemas.AuthInfo = Depends(deps.authenticate_request),
|
|
166
216
|
db_session: Session = Depends(deps.get_db_session),
|
|
167
217
|
):
|
|
168
218
|
if project is None:
|
|
169
219
|
project = config.default_project
|
|
170
220
|
await mlrun.api.utils.auth.verifier.AuthVerifier().query_project_permissions(
|
|
171
221
|
project,
|
|
172
|
-
mlrun.
|
|
222
|
+
mlrun.common.schemas.AuthorizationAction.read,
|
|
173
223
|
auth_info,
|
|
174
224
|
)
|
|
175
225
|
functions = await run_in_threadpool(
|
|
@@ -182,7 +232,7 @@ async def list_functions(
|
|
|
182
232
|
hash_key=hash_key,
|
|
183
233
|
)
|
|
184
234
|
functions = await mlrun.api.utils.auth.verifier.AuthVerifier().filter_project_resources_by_permissions(
|
|
185
|
-
mlrun.
|
|
235
|
+
mlrun.common.schemas.AuthorizationResourceTypes.function,
|
|
186
236
|
functions,
|
|
187
237
|
lambda function: (
|
|
188
238
|
function.get("metadata", {}).get("project", mlrun.mlconf.default_project),
|
|
@@ -199,13 +249,13 @@ async def list_functions(
|
|
|
199
249
|
@router.post("/build/function/")
|
|
200
250
|
async def build_function(
|
|
201
251
|
request: Request,
|
|
202
|
-
auth_info: mlrun.
|
|
252
|
+
auth_info: mlrun.common.schemas.AuthInfo = Depends(deps.authenticate_request),
|
|
203
253
|
db_session: Session = Depends(deps.get_db_session),
|
|
204
254
|
client_version: Optional[str] = Header(
|
|
205
|
-
None, alias=mlrun.
|
|
255
|
+
None, alias=mlrun.common.schemas.HeaderNames.client_version
|
|
206
256
|
),
|
|
207
257
|
client_python_version: Optional[str] = Header(
|
|
208
|
-
None, alias=mlrun.
|
|
258
|
+
None, alias=mlrun.common.schemas.HeaderNames.python_version
|
|
209
259
|
),
|
|
210
260
|
):
|
|
211
261
|
data = None
|
|
@@ -225,10 +275,10 @@ async def build_function(
|
|
|
225
275
|
auth_info=auth_info,
|
|
226
276
|
)
|
|
227
277
|
await mlrun.api.utils.auth.verifier.AuthVerifier().query_project_resource_permissions(
|
|
228
|
-
mlrun.
|
|
278
|
+
mlrun.common.schemas.AuthorizationResourceTypes.function,
|
|
229
279
|
project,
|
|
230
280
|
function_name,
|
|
231
|
-
mlrun.
|
|
281
|
+
mlrun.common.schemas.AuthorizationAction.update,
|
|
232
282
|
auth_info,
|
|
233
283
|
)
|
|
234
284
|
|
|
@@ -240,7 +290,7 @@ async def build_function(
|
|
|
240
290
|
).get("track_models", False):
|
|
241
291
|
if (
|
|
242
292
|
mlrun.mlconf.httpdb.clusterization.role
|
|
243
|
-
!= mlrun.
|
|
293
|
+
!= mlrun.common.schemas.ClusterizationRole.chief
|
|
244
294
|
):
|
|
245
295
|
logger.info(
|
|
246
296
|
"Requesting to deploy serving function with track models, re-routing to chief",
|
|
@@ -275,18 +325,18 @@ async def build_function(
|
|
|
275
325
|
}
|
|
276
326
|
|
|
277
327
|
|
|
278
|
-
@router.post("/start/function", response_model=mlrun.
|
|
279
|
-
@router.post("/start/function/", response_model=mlrun.
|
|
328
|
+
@router.post("/start/function", response_model=mlrun.common.schemas.BackgroundTask)
|
|
329
|
+
@router.post("/start/function/", response_model=mlrun.common.schemas.BackgroundTask)
|
|
280
330
|
async def start_function(
|
|
281
331
|
request: Request,
|
|
282
332
|
background_tasks: BackgroundTasks,
|
|
283
|
-
auth_info: mlrun.
|
|
333
|
+
auth_info: mlrun.common.schemas.AuthInfo = Depends(deps.authenticate_request),
|
|
284
334
|
db_session: Session = Depends(deps.get_db_session),
|
|
285
335
|
client_version: Optional[str] = Header(
|
|
286
|
-
None, alias=mlrun.
|
|
336
|
+
None, alias=mlrun.common.schemas.HeaderNames.client_version
|
|
287
337
|
),
|
|
288
338
|
client_python_version: Optional[str] = Header(
|
|
289
|
-
None, alias=mlrun.
|
|
339
|
+
None, alias=mlrun.common.schemas.HeaderNames.python_version
|
|
290
340
|
),
|
|
291
341
|
):
|
|
292
342
|
# TODO: ensure project here !!! for background task
|
|
@@ -300,10 +350,10 @@ async def start_function(
|
|
|
300
350
|
|
|
301
351
|
function = await run_in_threadpool(_parse_start_function_body, db_session, data)
|
|
302
352
|
await mlrun.api.utils.auth.verifier.AuthVerifier().query_project_resource_permissions(
|
|
303
|
-
mlrun.
|
|
353
|
+
mlrun.common.schemas.AuthorizationResourceTypes.function,
|
|
304
354
|
function.metadata.project,
|
|
305
355
|
function.metadata.name,
|
|
306
|
-
mlrun.
|
|
356
|
+
mlrun.common.schemas.AuthorizationAction.update,
|
|
307
357
|
auth_info,
|
|
308
358
|
)
|
|
309
359
|
background_timeout = mlrun.mlconf.background_tasks.default_timeouts.runtimes.dask
|
|
@@ -329,7 +379,7 @@ async def start_function(
|
|
|
329
379
|
@router.post("/status/function/")
|
|
330
380
|
async def function_status(
|
|
331
381
|
request: Request,
|
|
332
|
-
auth_info: mlrun.
|
|
382
|
+
auth_info: mlrun.common.schemas.AuthInfo = Depends(deps.authenticate_request),
|
|
333
383
|
):
|
|
334
384
|
data = None
|
|
335
385
|
try:
|
|
@@ -353,16 +403,16 @@ async def build_status(
|
|
|
353
403
|
logs: bool = True,
|
|
354
404
|
last_log_timestamp: float = 0.0,
|
|
355
405
|
verbose: bool = False,
|
|
356
|
-
auth_info: mlrun.
|
|
406
|
+
auth_info: mlrun.common.schemas.AuthInfo = Depends(deps.authenticate_request),
|
|
357
407
|
db_session: Session = Depends(deps.get_db_session),
|
|
358
408
|
):
|
|
359
409
|
await mlrun.api.utils.auth.verifier.AuthVerifier().query_project_resource_permissions(
|
|
360
|
-
mlrun.
|
|
410
|
+
mlrun.common.schemas.AuthorizationResourceTypes.function,
|
|
361
411
|
project or mlrun.mlconf.default_project,
|
|
362
412
|
name,
|
|
363
413
|
# store since with the current mechanism we update the status (and store the function) in the DB when a client
|
|
364
414
|
# query for the status
|
|
365
|
-
mlrun.
|
|
415
|
+
mlrun.common.schemas.AuthorizationAction.store,
|
|
366
416
|
auth_info,
|
|
367
417
|
)
|
|
368
418
|
fn = await run_in_threadpool(
|
|
@@ -388,13 +438,10 @@ async def build_status(
|
|
|
388
438
|
return await run_in_threadpool(
|
|
389
439
|
_handle_job_deploy_status,
|
|
390
440
|
db_session,
|
|
391
|
-
auth_info,
|
|
392
441
|
fn,
|
|
393
442
|
name,
|
|
394
443
|
project,
|
|
395
444
|
tag,
|
|
396
|
-
last_log_timestamp,
|
|
397
|
-
verbose,
|
|
398
445
|
offset,
|
|
399
446
|
logs,
|
|
400
447
|
)
|
|
@@ -402,13 +449,10 @@ async def build_status(
|
|
|
402
449
|
|
|
403
450
|
def _handle_job_deploy_status(
|
|
404
451
|
db_session,
|
|
405
|
-
auth_info,
|
|
406
452
|
fn,
|
|
407
453
|
name,
|
|
408
454
|
project,
|
|
409
455
|
tag,
|
|
410
|
-
last_log_timestamp,
|
|
411
|
-
verbose,
|
|
412
456
|
offset,
|
|
413
457
|
logs,
|
|
414
458
|
):
|
|
@@ -418,7 +462,7 @@ def _handle_job_deploy_status(
|
|
|
418
462
|
image = get_in(fn, "spec.build.image", "")
|
|
419
463
|
out = b""
|
|
420
464
|
if not pod:
|
|
421
|
-
if state == mlrun.
|
|
465
|
+
if state == mlrun.common.schemas.FunctionState.ready:
|
|
422
466
|
# when the function has been built we set the created image into the `spec.image` for reference see at the
|
|
423
467
|
# end of the function where we resolve if the status is ready and then set the spec.build.image to
|
|
424
468
|
# spec.image
|
|
@@ -440,8 +484,7 @@ def _handle_job_deploy_status(
|
|
|
440
484
|
terminal_states = ["failed", "error", "ready"]
|
|
441
485
|
log_file = log_path(project, f"build_{name}__{tag or 'latest'}")
|
|
442
486
|
if state in terminal_states and log_file.exists():
|
|
443
|
-
|
|
444
|
-
if state == mlrun.api.schemas.FunctionState.ready:
|
|
487
|
+
if state == mlrun.common.schemas.FunctionState.ready:
|
|
445
488
|
# when the function has been built we set the created image into the `spec.image` for reference see at the
|
|
446
489
|
# end of the function where we resolve if the status is ready and then set the spec.build.image to
|
|
447
490
|
# spec.image
|
|
@@ -464,20 +507,22 @@ def _handle_job_deploy_status(
|
|
|
464
507
|
},
|
|
465
508
|
)
|
|
466
509
|
|
|
467
|
-
|
|
468
|
-
state =
|
|
469
|
-
|
|
510
|
+
# TODO: change state to pod_status
|
|
511
|
+
state = mlrun.api.utils.singletons.k8s.get_k8s_helper(silent=False).get_pod_status(
|
|
512
|
+
pod
|
|
513
|
+
)
|
|
514
|
+
logger.info("Resolved pod status", pod_status=state, pod_name=pod)
|
|
470
515
|
|
|
471
516
|
if state == "succeeded":
|
|
472
|
-
logger.info("
|
|
473
|
-
state = mlrun.
|
|
517
|
+
logger.info("Build completed successfully")
|
|
518
|
+
state = mlrun.common.schemas.FunctionState.ready
|
|
474
519
|
if state in ["failed", "error"]:
|
|
475
|
-
logger.error(
|
|
476
|
-
state = mlrun.
|
|
520
|
+
logger.error("Build failed", pod_name=pod, pod_status=state)
|
|
521
|
+
state = mlrun.common.schemas.FunctionState.error
|
|
477
522
|
|
|
478
523
|
if (logs and state != "pending") or state in terminal_states:
|
|
479
524
|
try:
|
|
480
|
-
resp =
|
|
525
|
+
resp = mlrun.api.utils.singletons.k8s.get_k8s_helper(silent=False).logs(pod)
|
|
481
526
|
except ApiException as exc:
|
|
482
527
|
logger.warning(
|
|
483
528
|
"Failed to get build logs",
|
|
@@ -489,6 +534,7 @@ def _handle_job_deploy_status(
|
|
|
489
534
|
resp = ""
|
|
490
535
|
|
|
491
536
|
if state in terminal_states:
|
|
537
|
+
# TODO: move to log collector
|
|
492
538
|
log_file.parent.mkdir(parents=True, exist_ok=True)
|
|
493
539
|
with log_file.open("wb") as fp:
|
|
494
540
|
fp.write(resp.encode())
|
|
@@ -498,11 +544,11 @@ def _handle_job_deploy_status(
|
|
|
498
544
|
out = resp[offset:].encode()
|
|
499
545
|
|
|
500
546
|
update_in(fn, "status.state", state)
|
|
501
|
-
if state == mlrun.
|
|
547
|
+
if state == mlrun.common.schemas.FunctionState.ready:
|
|
502
548
|
update_in(fn, "spec.image", image)
|
|
503
549
|
|
|
504
550
|
versioned = False
|
|
505
|
-
if state == mlrun.
|
|
551
|
+
if state == mlrun.common.schemas.FunctionState.ready:
|
|
506
552
|
versioned = True
|
|
507
553
|
mlrun.api.crud.Functions().store_function(
|
|
508
554
|
db_session,
|
|
@@ -535,7 +581,7 @@ def _handle_nuclio_deploy_status(
|
|
|
535
581
|
last_log_timestamp,
|
|
536
582
|
text,
|
|
537
583
|
status,
|
|
538
|
-
) = get_nuclio_deploy_status(
|
|
584
|
+
) = mlrun.api.crud.runtimes.nuclio.function.get_nuclio_deploy_status(
|
|
539
585
|
name,
|
|
540
586
|
project,
|
|
541
587
|
tag,
|
|
@@ -607,7 +653,7 @@ def _handle_nuclio_deploy_status(
|
|
|
607
653
|
|
|
608
654
|
def _build_function(
|
|
609
655
|
db_session,
|
|
610
|
-
auth_info: mlrun.
|
|
656
|
+
auth_info: mlrun.common.schemas.AuthInfo,
|
|
611
657
|
function,
|
|
612
658
|
with_mlrun=True,
|
|
613
659
|
skip_deployed=False,
|
|
@@ -629,9 +675,9 @@ def _build_function(
|
|
|
629
675
|
try:
|
|
630
676
|
run_db = get_run_db_instance(db_session)
|
|
631
677
|
fn.set_db_connection(run_db)
|
|
678
|
+
mlrun.api.launcher.ServerSideLauncher.enrich_runtime(runtime=fn)
|
|
632
679
|
fn.save(versioned=False)
|
|
633
680
|
if fn.kind in RuntimeKinds.nuclio_runtimes():
|
|
634
|
-
|
|
635
681
|
mlrun.api.api.utils.apply_enrichment_and_validation_on_function(
|
|
636
682
|
fn,
|
|
637
683
|
auth_info,
|
|
@@ -642,25 +688,37 @@ def _build_function(
|
|
|
642
688
|
try:
|
|
643
689
|
if fn.spec.track_models:
|
|
644
690
|
logger.info("Tracking enabled, initializing model monitoring")
|
|
645
|
-
|
|
646
|
-
#
|
|
647
|
-
model_monitoring_access_key =
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
691
|
+
|
|
692
|
+
# Generating model monitoring access key
|
|
693
|
+
model_monitoring_access_key = None
|
|
694
|
+
if not mlrun.mlconf.is_ce_mode():
|
|
695
|
+
model_monitoring_access_key = _process_model_monitoring_secret(
|
|
696
|
+
db_session,
|
|
697
|
+
fn.metadata.project,
|
|
698
|
+
mlrun.common.model_monitoring.ProjectSecretKeys.ACCESS_KEY,
|
|
699
|
+
)
|
|
700
|
+
|
|
701
|
+
stream_path = mlrun.utils.model_monitoring.get_stream_path(
|
|
702
|
+
project=fn.metadata.project
|
|
703
|
+
)
|
|
704
|
+
|
|
705
|
+
if stream_path.startswith("v3io://"):
|
|
706
|
+
# Initialize model monitoring V3IO stream
|
|
707
|
+
_create_model_monitoring_stream(
|
|
708
|
+
project=fn.metadata.project,
|
|
709
|
+
function=fn,
|
|
710
|
+
stream_path=stream_path,
|
|
711
|
+
)
|
|
654
712
|
|
|
655
713
|
if fn.spec.tracking_policy:
|
|
656
|
-
#
|
|
714
|
+
# Convert to `TrackingPolicy` object as `fn.spec.tracking_policy` is provided as a dict
|
|
657
715
|
fn.spec.tracking_policy = (
|
|
658
716
|
mlrun.utils.model_monitoring.TrackingPolicy.from_dict(
|
|
659
717
|
fn.spec.tracking_policy
|
|
660
718
|
)
|
|
661
719
|
)
|
|
662
720
|
else:
|
|
663
|
-
#
|
|
721
|
+
# Initialize tracking policy with default values
|
|
664
722
|
fn.spec.tracking_policy = (
|
|
665
723
|
mlrun.utils.model_monitoring.TrackingPolicy()
|
|
666
724
|
)
|
|
@@ -668,10 +726,10 @@ def _build_function(
|
|
|
668
726
|
# deploy both model monitoring stream and model monitoring batch job
|
|
669
727
|
mlrun.api.crud.ModelEndpoints().deploy_monitoring_functions(
|
|
670
728
|
project=fn.metadata.project,
|
|
671
|
-
model_monitoring_access_key=model_monitoring_access_key,
|
|
672
729
|
db_session=db_session,
|
|
673
730
|
auth_info=auth_info,
|
|
674
731
|
tracking_policy=fn.spec.tracking_policy,
|
|
732
|
+
model_monitoring_access_key=model_monitoring_access_key,
|
|
675
733
|
)
|
|
676
734
|
except Exception as exc:
|
|
677
735
|
logger.warning(
|
|
@@ -681,7 +739,7 @@ def _build_function(
|
|
|
681
739
|
traceback=traceback.format_exc(),
|
|
682
740
|
)
|
|
683
741
|
|
|
684
|
-
deploy_nuclio_function(
|
|
742
|
+
mlrun.api.crud.runtimes.nuclio.function.deploy_nuclio_function(
|
|
685
743
|
fn,
|
|
686
744
|
auth_info=auth_info,
|
|
687
745
|
client_version=client_version,
|
|
@@ -710,7 +768,7 @@ def _build_function(
|
|
|
710
768
|
client_python_version=client_python_version,
|
|
711
769
|
)
|
|
712
770
|
fn.save(versioned=True)
|
|
713
|
-
logger.info("
|
|
771
|
+
logger.info("Resolved function", fn=fn.to_yaml())
|
|
714
772
|
except Exception as err:
|
|
715
773
|
logger.error(traceback.format_exc())
|
|
716
774
|
log_and_raise(
|
|
@@ -743,7 +801,7 @@ def _parse_start_function_body(db_session, data):
|
|
|
743
801
|
|
|
744
802
|
def _start_function(
|
|
745
803
|
function,
|
|
746
|
-
auth_info: mlrun.
|
|
804
|
+
auth_info: mlrun.common.schemas.AuthInfo,
|
|
747
805
|
client_version: str = None,
|
|
748
806
|
client_python_version: str = None,
|
|
749
807
|
):
|
|
@@ -781,7 +839,7 @@ def _start_function(
|
|
|
781
839
|
mlrun.api.db.session.close_session(db_session)
|
|
782
840
|
|
|
783
841
|
|
|
784
|
-
async def _get_function_status(data, auth_info: mlrun.
|
|
842
|
+
async def _get_function_status(data, auth_info: mlrun.common.schemas.AuthInfo):
|
|
785
843
|
logger.info(f"function_status:\n{data}")
|
|
786
844
|
selector = data.get("selector")
|
|
787
845
|
kind = data.get("kind")
|
|
@@ -797,10 +855,10 @@ async def _get_function_status(data, auth_info: mlrun.api.schemas.AuthInfo):
|
|
|
797
855
|
project, name, _ = mlrun.runtimes.utils.parse_function_selector(selector)
|
|
798
856
|
|
|
799
857
|
await mlrun.api.utils.auth.verifier.AuthVerifier().query_project_resource_permissions(
|
|
800
|
-
mlrun.
|
|
858
|
+
mlrun.common.schemas.AuthorizationResourceTypes.function,
|
|
801
859
|
project,
|
|
802
860
|
name,
|
|
803
|
-
mlrun.
|
|
861
|
+
mlrun.common.schemas.AuthorizationAction.read,
|
|
804
862
|
auth_info,
|
|
805
863
|
)
|
|
806
864
|
|
|
@@ -822,10 +880,8 @@ async def _get_function_status(data, auth_info: mlrun.api.schemas.AuthInfo):
|
|
|
822
880
|
)
|
|
823
881
|
|
|
824
882
|
|
|
825
|
-
def _create_model_monitoring_stream(project: str):
|
|
826
|
-
|
|
827
|
-
project=project, kind="stream"
|
|
828
|
-
)
|
|
883
|
+
def _create_model_monitoring_stream(project: str, function, stream_path):
|
|
884
|
+
_init_serving_function_stream_args(fn=function)
|
|
829
885
|
|
|
830
886
|
_, container, stream_path = parse_model_endpoint_store_prefix(stream_path)
|
|
831
887
|
|
|
@@ -886,8 +942,7 @@ def _process_model_monitoring_secret(db_session, project_name: str, secret_key:
|
|
|
886
942
|
logger.info(
|
|
887
943
|
"Getting project secret", project_name=project_name, namespace=config.namespace
|
|
888
944
|
)
|
|
889
|
-
|
|
890
|
-
provider = SecretProviderName.kubernetes
|
|
945
|
+
provider = mlrun.common.schemas.SecretProviderName.kubernetes
|
|
891
946
|
secret_value = Secrets().get_project_secret(
|
|
892
947
|
project_name,
|
|
893
948
|
provider,
|
|
@@ -908,8 +963,6 @@ def _process_model_monitoring_secret(db_session, project_name: str, secret_key:
|
|
|
908
963
|
allow_internal_secrets=True,
|
|
909
964
|
)
|
|
910
965
|
if not secret_value:
|
|
911
|
-
import mlrun.api.utils.singletons.project_member
|
|
912
|
-
|
|
913
966
|
project_owner = mlrun.api.utils.singletons.project_member.get_project_member().get_project_owner(
|
|
914
967
|
db_session, project_name
|
|
915
968
|
)
|
|
@@ -926,7 +979,9 @@ def _process_model_monitoring_secret(db_session, project_name: str, secret_key:
|
|
|
926
979
|
project_owner=project_owner.username,
|
|
927
980
|
)
|
|
928
981
|
|
|
929
|
-
secrets = SecretsData(
|
|
982
|
+
secrets = mlrun.common.schemas.SecretsData(
|
|
983
|
+
provider=provider, secrets={internal_key_name: secret_value}
|
|
984
|
+
)
|
|
930
985
|
Secrets().store_project_secrets(project_name, secrets, allow_internal_secrets=True)
|
|
931
986
|
if user_provided_key:
|
|
932
987
|
logger.info(
|