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.
|
|
@@ -23,32 +23,30 @@ from fastapi.concurrency import run_in_threadpool
|
|
|
23
23
|
from sqlalchemy.orm import Session
|
|
24
24
|
|
|
25
25
|
import mlrun.api.crud
|
|
26
|
-
import mlrun.api.schemas
|
|
27
26
|
import mlrun.api.utils.auth.verifier
|
|
27
|
+
import mlrun.api.utils.singletons.k8s
|
|
28
|
+
import mlrun.common.schemas
|
|
28
29
|
import mlrun.errors
|
|
29
30
|
from mlrun.api.api import deps
|
|
30
31
|
from mlrun.api.api.utils import log_and_raise
|
|
31
32
|
from mlrun.config import config
|
|
32
|
-
from mlrun.k8s_utils import get_k8s_helper
|
|
33
33
|
from mlrun.utils import logger
|
|
34
34
|
|
|
35
|
-
router = APIRouter()
|
|
35
|
+
router = APIRouter(prefix="/projects/{project}/pipelines")
|
|
36
36
|
|
|
37
37
|
|
|
38
|
-
@router.get(
|
|
39
|
-
"/projects/{project}/pipelines", response_model=mlrun.api.schemas.PipelinesOutput
|
|
40
|
-
)
|
|
38
|
+
@router.get("", response_model=mlrun.common.schemas.PipelinesOutput)
|
|
41
39
|
async def list_pipelines(
|
|
42
40
|
project: str,
|
|
43
41
|
namespace: str = None,
|
|
44
42
|
sort_by: str = "",
|
|
45
43
|
page_token: str = "",
|
|
46
44
|
filter_: str = Query("", alias="filter"),
|
|
47
|
-
format_: mlrun.
|
|
48
|
-
mlrun.
|
|
45
|
+
format_: mlrun.common.schemas.PipelinesFormat = Query(
|
|
46
|
+
mlrun.common.schemas.PipelinesFormat.metadata_only, alias="format"
|
|
49
47
|
),
|
|
50
48
|
page_size: int = Query(None, gt=0, le=200),
|
|
51
|
-
auth_info: mlrun.
|
|
49
|
+
auth_info: mlrun.common.schemas.AuthInfo = Depends(
|
|
52
50
|
mlrun.api.api.deps.authenticate_request
|
|
53
51
|
),
|
|
54
52
|
db_session: Session = Depends(deps.get_db_session),
|
|
@@ -58,16 +56,18 @@ async def list_pipelines(
|
|
|
58
56
|
if project != "*":
|
|
59
57
|
await mlrun.api.utils.auth.verifier.AuthVerifier().query_project_permissions(
|
|
60
58
|
project,
|
|
61
|
-
mlrun.
|
|
59
|
+
mlrun.common.schemas.AuthorizationAction.read,
|
|
62
60
|
auth_info,
|
|
63
61
|
)
|
|
64
62
|
total_size, next_page_token, runs = None, None, []
|
|
65
|
-
if get_k8s_helper(
|
|
63
|
+
if mlrun.api.utils.singletons.k8s.get_k8s_helper(
|
|
64
|
+
silent=True
|
|
65
|
+
).is_running_inside_kubernetes_cluster():
|
|
66
66
|
# we need to resolve the project from the returned run for the opa enforcement (project query param might be
|
|
67
67
|
# "*"), so we can't really get back only the names here
|
|
68
68
|
computed_format = (
|
|
69
|
-
mlrun.
|
|
70
|
-
if format_ == mlrun.
|
|
69
|
+
mlrun.common.schemas.PipelinesFormat.metadata_only
|
|
70
|
+
if format_ == mlrun.common.schemas.PipelinesFormat.name_only
|
|
71
71
|
else format_
|
|
72
72
|
)
|
|
73
73
|
total_size, next_page_token, runs = await run_in_threadpool(
|
|
@@ -82,7 +82,7 @@ async def list_pipelines(
|
|
|
82
82
|
page_size,
|
|
83
83
|
)
|
|
84
84
|
allowed_runs = await mlrun.api.utils.auth.verifier.AuthVerifier().filter_project_resources_by_permissions(
|
|
85
|
-
mlrun.
|
|
85
|
+
mlrun.common.schemas.AuthorizationResourceTypes.pipeline,
|
|
86
86
|
runs,
|
|
87
87
|
lambda run: (
|
|
88
88
|
run["project"],
|
|
@@ -90,23 +90,23 @@ async def list_pipelines(
|
|
|
90
90
|
),
|
|
91
91
|
auth_info,
|
|
92
92
|
)
|
|
93
|
-
if format_ == mlrun.
|
|
93
|
+
if format_ == mlrun.common.schemas.PipelinesFormat.name_only:
|
|
94
94
|
allowed_runs = [run["name"] for run in allowed_runs]
|
|
95
|
-
return mlrun.
|
|
95
|
+
return mlrun.common.schemas.PipelinesOutput(
|
|
96
96
|
runs=allowed_runs,
|
|
97
97
|
total_size=total_size or 0,
|
|
98
98
|
next_page_token=next_page_token or None,
|
|
99
99
|
)
|
|
100
100
|
|
|
101
101
|
|
|
102
|
-
@router.post("
|
|
102
|
+
@router.post("")
|
|
103
103
|
async def create_pipeline(
|
|
104
104
|
project: str,
|
|
105
105
|
request: Request,
|
|
106
106
|
namespace: str = None,
|
|
107
107
|
experiment_name: str = Query("Default", alias="experiment"),
|
|
108
108
|
run_name: str = Query("", alias="run"),
|
|
109
|
-
auth_info: mlrun.
|
|
109
|
+
auth_info: mlrun.common.schemas.AuthInfo = Depends(
|
|
110
110
|
mlrun.api.api.deps.authenticate_request
|
|
111
111
|
),
|
|
112
112
|
):
|
|
@@ -118,8 +118,76 @@ async def create_pipeline(
|
|
|
118
118
|
return response
|
|
119
119
|
|
|
120
120
|
|
|
121
|
+
@router.get("/{run_id}")
|
|
122
|
+
async def get_pipeline(
|
|
123
|
+
run_id: str,
|
|
124
|
+
project: str,
|
|
125
|
+
namespace: str = Query(config.namespace),
|
|
126
|
+
format_: mlrun.common.schemas.PipelinesFormat = Query(
|
|
127
|
+
mlrun.common.schemas.PipelinesFormat.summary, alias="format"
|
|
128
|
+
),
|
|
129
|
+
auth_info: mlrun.common.schemas.AuthInfo = Depends(
|
|
130
|
+
mlrun.api.api.deps.authenticate_request
|
|
131
|
+
),
|
|
132
|
+
db_session: Session = Depends(deps.get_db_session),
|
|
133
|
+
):
|
|
134
|
+
pipeline = await run_in_threadpool(
|
|
135
|
+
mlrun.api.crud.Pipelines().get_pipeline,
|
|
136
|
+
db_session,
|
|
137
|
+
run_id,
|
|
138
|
+
project,
|
|
139
|
+
namespace,
|
|
140
|
+
format_,
|
|
141
|
+
)
|
|
142
|
+
if project == "*":
|
|
143
|
+
# In some flows the user may use SDK functions that won't require them to specify the pipeline's project (for
|
|
144
|
+
# backwards compatibility reasons), so the client will just send * in the project, in that case we use the
|
|
145
|
+
# legacy flow in which we first get the pipeline, resolve the project out of it, and only then query permissions
|
|
146
|
+
# we don't use the return value from this function since the user may have asked for a different format than
|
|
147
|
+
# summary which is the one used inside
|
|
148
|
+
await _get_pipeline_without_project(db_session, auth_info, run_id, namespace)
|
|
149
|
+
else:
|
|
150
|
+
await mlrun.api.utils.auth.verifier.AuthVerifier().query_project_resource_permissions(
|
|
151
|
+
mlrun.common.schemas.AuthorizationResourceTypes.pipeline,
|
|
152
|
+
project,
|
|
153
|
+
run_id,
|
|
154
|
+
mlrun.common.schemas.AuthorizationAction.read,
|
|
155
|
+
auth_info,
|
|
156
|
+
)
|
|
157
|
+
return pipeline
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
async def _get_pipeline_without_project(
|
|
161
|
+
db_session: Session,
|
|
162
|
+
auth_info: mlrun.common.schemas.AuthInfo,
|
|
163
|
+
run_id: str,
|
|
164
|
+
namespace: str,
|
|
165
|
+
):
|
|
166
|
+
"""
|
|
167
|
+
This function is for when we receive a get pipeline request without the client specifying the project
|
|
168
|
+
So we first get the pipeline, resolve the project out of it, and now that we know the project, we can verify
|
|
169
|
+
permissions
|
|
170
|
+
"""
|
|
171
|
+
run = await run_in_threadpool(
|
|
172
|
+
mlrun.api.crud.Pipelines().get_pipeline,
|
|
173
|
+
db_session,
|
|
174
|
+
run_id,
|
|
175
|
+
namespace=namespace,
|
|
176
|
+
# minimal format that includes the project
|
|
177
|
+
format_=mlrun.common.schemas.PipelinesFormat.summary,
|
|
178
|
+
)
|
|
179
|
+
await mlrun.api.utils.auth.verifier.AuthVerifier().query_project_resource_permissions(
|
|
180
|
+
mlrun.common.schemas.AuthorizationResourceTypes.pipeline,
|
|
181
|
+
run["run"]["project"],
|
|
182
|
+
run["run"]["id"],
|
|
183
|
+
mlrun.common.schemas.AuthorizationAction.read,
|
|
184
|
+
auth_info,
|
|
185
|
+
)
|
|
186
|
+
return run
|
|
187
|
+
|
|
188
|
+
|
|
121
189
|
async def _create_pipeline(
|
|
122
|
-
auth_info: mlrun.
|
|
190
|
+
auth_info: mlrun.common.schemas.AuthInfo,
|
|
123
191
|
request: Request,
|
|
124
192
|
namespace: str,
|
|
125
193
|
experiment_name: str,
|
|
@@ -129,10 +197,10 @@ async def _create_pipeline(
|
|
|
129
197
|
# If we have the project (new clients from 0.7.0 uses the new endpoint in which it's mandatory) - check auth now
|
|
130
198
|
if project:
|
|
131
199
|
await mlrun.api.utils.auth.verifier.AuthVerifier().query_project_resource_permissions(
|
|
132
|
-
mlrun.
|
|
200
|
+
mlrun.common.schemas.AuthorizationResourceTypes.pipeline,
|
|
133
201
|
project,
|
|
134
202
|
"",
|
|
135
|
-
mlrun.
|
|
203
|
+
mlrun.common.schemas.AuthorizationAction.create,
|
|
136
204
|
auth_info,
|
|
137
205
|
)
|
|
138
206
|
run_name = run_name or experiment_name + " " + datetime.now().strftime(
|
|
@@ -153,16 +221,16 @@ async def _create_pipeline(
|
|
|
153
221
|
)
|
|
154
222
|
else:
|
|
155
223
|
await mlrun.api.utils.auth.verifier.AuthVerifier().query_project_resource_permissions(
|
|
156
|
-
mlrun.
|
|
224
|
+
mlrun.common.schemas.AuthorizationResourceTypes.pipeline,
|
|
157
225
|
project,
|
|
158
226
|
"",
|
|
159
|
-
mlrun.
|
|
227
|
+
mlrun.common.schemas.AuthorizationAction.create,
|
|
160
228
|
auth_info,
|
|
161
229
|
)
|
|
162
230
|
|
|
163
231
|
arguments = {}
|
|
164
232
|
arguments_data = request.headers.get(
|
|
165
|
-
mlrun.
|
|
233
|
+
mlrun.common.schemas.HeaderNames.pipeline_arguments
|
|
166
234
|
)
|
|
167
235
|
if arguments_data:
|
|
168
236
|
arguments = ast.literal_eval(arguments_data)
|
|
@@ -196,66 +264,3 @@ def _try_resolve_project_from_body(
|
|
|
196
264
|
return mlrun.api.crud.Pipelines().resolve_project_from_workflow_manifest(
|
|
197
265
|
workflow_manifest
|
|
198
266
|
)
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
@router.get("/projects/{project}/pipelines/{run_id}")
|
|
202
|
-
async def get_pipeline(
|
|
203
|
-
run_id: str,
|
|
204
|
-
project: str,
|
|
205
|
-
namespace: str = Query(config.namespace),
|
|
206
|
-
format_: mlrun.api.schemas.PipelinesFormat = Query(
|
|
207
|
-
mlrun.api.schemas.PipelinesFormat.summary, alias="format"
|
|
208
|
-
),
|
|
209
|
-
auth_info: mlrun.api.schemas.AuthInfo = Depends(
|
|
210
|
-
mlrun.api.api.deps.authenticate_request
|
|
211
|
-
),
|
|
212
|
-
db_session: Session = Depends(deps.get_db_session),
|
|
213
|
-
):
|
|
214
|
-
pipeline = mlrun.api.crud.Pipelines().get_pipeline(
|
|
215
|
-
db_session, run_id, project, namespace, format_
|
|
216
|
-
)
|
|
217
|
-
if project == "*":
|
|
218
|
-
# In some flows the user may use SDK functions that won't require them to specify the pipeline's project (for
|
|
219
|
-
# backwards compatibility reasons), so the client will just send * in the project, in that case we use the
|
|
220
|
-
# legacy flow in which we first get the pipeline, resolve the project out of it, and only then query permissions
|
|
221
|
-
# we don't use the return value from this function since the user may have asked for a different format than
|
|
222
|
-
# summary which is the one used inside
|
|
223
|
-
await _get_pipeline_without_project(db_session, auth_info, run_id, namespace)
|
|
224
|
-
else:
|
|
225
|
-
await mlrun.api.utils.auth.verifier.AuthVerifier().query_project_resource_permissions(
|
|
226
|
-
mlrun.api.schemas.AuthorizationResourceTypes.pipeline,
|
|
227
|
-
project,
|
|
228
|
-
run_id,
|
|
229
|
-
mlrun.api.schemas.AuthorizationAction.read,
|
|
230
|
-
auth_info,
|
|
231
|
-
)
|
|
232
|
-
return pipeline
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
async def _get_pipeline_without_project(
|
|
236
|
-
db_session: Session,
|
|
237
|
-
auth_info: mlrun.api.schemas.AuthInfo,
|
|
238
|
-
run_id: str,
|
|
239
|
-
namespace: str,
|
|
240
|
-
):
|
|
241
|
-
"""
|
|
242
|
-
This function is for when we receive a get pipeline request without the client specifying the project
|
|
243
|
-
So we first get the pipeline, resolve the project out of it, and now that we know the project, we can verify
|
|
244
|
-
permissions
|
|
245
|
-
"""
|
|
246
|
-
run = await run_in_threadpool(
|
|
247
|
-
mlrun.api.crud.Pipelines().get_pipeline,
|
|
248
|
-
db_session,
|
|
249
|
-
run_id,
|
|
250
|
-
namespace=namespace,
|
|
251
|
-
# minimal format that includes the project
|
|
252
|
-
format_=mlrun.api.schemas.PipelinesFormat.summary,
|
|
253
|
-
)
|
|
254
|
-
await mlrun.api.utils.auth.verifier.AuthVerifier().query_project_resource_permissions(
|
|
255
|
-
mlrun.api.schemas.AuthorizationResourceTypes.pipeline,
|
|
256
|
-
run["run"]["project"],
|
|
257
|
-
run["run"]["id"],
|
|
258
|
-
mlrun.api.schemas.AuthorizationAction.read,
|
|
259
|
-
auth_info,
|
|
260
|
-
)
|
|
261
|
-
return run
|
|
@@ -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.
|
|
@@ -20,9 +20,9 @@ import sqlalchemy.orm
|
|
|
20
20
|
from fastapi.concurrency import run_in_threadpool
|
|
21
21
|
|
|
22
22
|
import mlrun.api.api.deps
|
|
23
|
-
import mlrun.api.schemas
|
|
24
23
|
import mlrun.api.utils.auth.verifier
|
|
25
24
|
import mlrun.api.utils.clients.chief
|
|
25
|
+
import mlrun.common.schemas
|
|
26
26
|
from mlrun.api.utils.singletons.project_member import get_project_member
|
|
27
27
|
from mlrun.utils import logger
|
|
28
28
|
|
|
@@ -32,17 +32,17 @@ router = fastapi.APIRouter()
|
|
|
32
32
|
@router.post(
|
|
33
33
|
"/projects",
|
|
34
34
|
responses={
|
|
35
|
-
http.HTTPStatus.CREATED.value: {"model": mlrun.
|
|
35
|
+
http.HTTPStatus.CREATED.value: {"model": mlrun.common.schemas.Project},
|
|
36
36
|
http.HTTPStatus.ACCEPTED.value: {},
|
|
37
37
|
},
|
|
38
38
|
)
|
|
39
39
|
def create_project(
|
|
40
|
-
project: mlrun.
|
|
40
|
+
project: mlrun.common.schemas.Project,
|
|
41
41
|
response: fastapi.Response,
|
|
42
42
|
# TODO: we're in a http request context here, therefore it doesn't make sense that by default it will hold the
|
|
43
43
|
# request until the process will be completed - after UI supports waiting - change default to False
|
|
44
44
|
wait_for_completion: bool = fastapi.Query(True, alias="wait-for-completion"),
|
|
45
|
-
auth_info: mlrun.
|
|
45
|
+
auth_info: mlrun.common.schemas.AuthInfo = fastapi.Depends(
|
|
46
46
|
mlrun.api.api.deps.authenticate_request
|
|
47
47
|
),
|
|
48
48
|
db_session: sqlalchemy.orm.Session = fastapi.Depends(
|
|
@@ -65,17 +65,17 @@ def create_project(
|
|
|
65
65
|
@router.put(
|
|
66
66
|
"/projects/{name}",
|
|
67
67
|
responses={
|
|
68
|
-
http.HTTPStatus.OK.value: {"model": mlrun.
|
|
68
|
+
http.HTTPStatus.OK.value: {"model": mlrun.common.schemas.Project},
|
|
69
69
|
http.HTTPStatus.ACCEPTED.value: {},
|
|
70
70
|
},
|
|
71
71
|
)
|
|
72
72
|
def store_project(
|
|
73
|
-
project: mlrun.
|
|
73
|
+
project: mlrun.common.schemas.Project,
|
|
74
74
|
name: str,
|
|
75
75
|
# TODO: we're in a http request context here, therefore it doesn't make sense that by default it will hold the
|
|
76
76
|
# request until the process will be completed - after UI supports waiting - change default to False
|
|
77
77
|
wait_for_completion: bool = fastapi.Query(True, alias="wait-for-completion"),
|
|
78
|
-
auth_info: mlrun.
|
|
78
|
+
auth_info: mlrun.common.schemas.AuthInfo = fastapi.Depends(
|
|
79
79
|
mlrun.api.api.deps.authenticate_request
|
|
80
80
|
),
|
|
81
81
|
db_session: sqlalchemy.orm.Session = fastapi.Depends(
|
|
@@ -98,21 +98,21 @@ def store_project(
|
|
|
98
98
|
@router.patch(
|
|
99
99
|
"/projects/{name}",
|
|
100
100
|
responses={
|
|
101
|
-
http.HTTPStatus.OK.value: {"model": mlrun.
|
|
101
|
+
http.HTTPStatus.OK.value: {"model": mlrun.common.schemas.Project},
|
|
102
102
|
http.HTTPStatus.ACCEPTED.value: {},
|
|
103
103
|
},
|
|
104
104
|
)
|
|
105
105
|
def patch_project(
|
|
106
106
|
project: dict,
|
|
107
107
|
name: str,
|
|
108
|
-
patch_mode: mlrun.
|
|
109
|
-
mlrun.
|
|
110
|
-
alias=mlrun.
|
|
108
|
+
patch_mode: mlrun.common.schemas.PatchMode = fastapi.Header(
|
|
109
|
+
mlrun.common.schemas.PatchMode.replace,
|
|
110
|
+
alias=mlrun.common.schemas.HeaderNames.patch_mode,
|
|
111
111
|
),
|
|
112
112
|
# TODO: we're in a http request context here, therefore it doesn't make sense that by default it will hold the
|
|
113
113
|
# request until the process will be completed - after UI supports waiting - change default to False
|
|
114
114
|
wait_for_completion: bool = fastapi.Query(True, alias="wait-for-completion"),
|
|
115
|
-
auth_info: mlrun.
|
|
115
|
+
auth_info: mlrun.common.schemas.AuthInfo = fastapi.Depends(
|
|
116
116
|
mlrun.api.api.deps.authenticate_request
|
|
117
117
|
),
|
|
118
118
|
db_session: sqlalchemy.orm.Session = fastapi.Depends(
|
|
@@ -133,13 +133,13 @@ def patch_project(
|
|
|
133
133
|
return project
|
|
134
134
|
|
|
135
135
|
|
|
136
|
-
@router.get("/projects/{name}", response_model=mlrun.
|
|
136
|
+
@router.get("/projects/{name}", response_model=mlrun.common.schemas.Project)
|
|
137
137
|
async def get_project(
|
|
138
138
|
name: str,
|
|
139
139
|
db_session: sqlalchemy.orm.Session = fastapi.Depends(
|
|
140
140
|
mlrun.api.api.deps.get_db_session
|
|
141
141
|
),
|
|
142
|
-
auth_info: mlrun.
|
|
142
|
+
auth_info: mlrun.common.schemas.AuthInfo = fastapi.Depends(
|
|
143
143
|
mlrun.api.api.deps.authenticate_request
|
|
144
144
|
),
|
|
145
145
|
):
|
|
@@ -150,7 +150,7 @@ async def get_project(
|
|
|
150
150
|
if not _is_request_from_leader(auth_info.projects_role):
|
|
151
151
|
await mlrun.api.utils.auth.verifier.AuthVerifier().query_project_permissions(
|
|
152
152
|
name,
|
|
153
|
-
mlrun.
|
|
153
|
+
mlrun.common.schemas.AuthorizationAction.read,
|
|
154
154
|
auth_info,
|
|
155
155
|
)
|
|
156
156
|
return project
|
|
@@ -166,14 +166,14 @@ async def get_project(
|
|
|
166
166
|
async def delete_project(
|
|
167
167
|
name: str,
|
|
168
168
|
request: fastapi.Request,
|
|
169
|
-
deletion_strategy: mlrun.
|
|
170
|
-
mlrun.
|
|
171
|
-
alias=mlrun.
|
|
169
|
+
deletion_strategy: mlrun.common.schemas.DeletionStrategy = fastapi.Header(
|
|
170
|
+
mlrun.common.schemas.DeletionStrategy.default(),
|
|
171
|
+
alias=mlrun.common.schemas.HeaderNames.deletion_strategy,
|
|
172
172
|
),
|
|
173
173
|
# TODO: we're in a http request context here, therefore it doesn't make sense that by default it will hold the
|
|
174
174
|
# request until the process will be completed - after UI supports waiting - change default to False
|
|
175
175
|
wait_for_completion: bool = fastapi.Query(True, alias="wait-for-completion"),
|
|
176
|
-
auth_info: mlrun.
|
|
176
|
+
auth_info: mlrun.common.schemas.AuthInfo = fastapi.Depends(
|
|
177
177
|
mlrun.api.api.deps.authenticate_request
|
|
178
178
|
),
|
|
179
179
|
db_session: sqlalchemy.orm.Session = fastapi.Depends(
|
|
@@ -184,7 +184,7 @@ async def delete_project(
|
|
|
184
184
|
# that is why we re-route requests to chief
|
|
185
185
|
if (
|
|
186
186
|
mlrun.mlconf.httpdb.clusterization.role
|
|
187
|
-
!= mlrun.
|
|
187
|
+
!= mlrun.common.schemas.ClusterizationRole.chief
|
|
188
188
|
):
|
|
189
189
|
logger.info(
|
|
190
190
|
"Requesting to delete project, re-routing to chief",
|
|
@@ -209,15 +209,15 @@ async def delete_project(
|
|
|
209
209
|
return fastapi.Response(status_code=http.HTTPStatus.NO_CONTENT.value)
|
|
210
210
|
|
|
211
211
|
|
|
212
|
-
@router.get("/projects", response_model=mlrun.
|
|
212
|
+
@router.get("/projects", response_model=mlrun.common.schemas.ProjectsOutput)
|
|
213
213
|
async def list_projects(
|
|
214
|
-
format_: mlrun.
|
|
215
|
-
mlrun.
|
|
214
|
+
format_: mlrun.common.schemas.ProjectsFormat = fastapi.Query(
|
|
215
|
+
mlrun.common.schemas.ProjectsFormat.full, alias="format"
|
|
216
216
|
),
|
|
217
217
|
owner: str = None,
|
|
218
218
|
labels: typing.List[str] = fastapi.Query(None, alias="label"),
|
|
219
|
-
state: mlrun.
|
|
220
|
-
auth_info: mlrun.
|
|
219
|
+
state: mlrun.common.schemas.ProjectState = None,
|
|
220
|
+
auth_info: mlrun.common.schemas.AuthInfo = fastapi.Depends(
|
|
221
221
|
mlrun.api.api.deps.authenticate_request
|
|
222
222
|
),
|
|
223
223
|
db_session: sqlalchemy.orm.Session = fastapi.Depends(
|
|
@@ -231,7 +231,7 @@ async def list_projects(
|
|
|
231
231
|
get_project_member().list_projects,
|
|
232
232
|
db_session,
|
|
233
233
|
owner,
|
|
234
|
-
mlrun.
|
|
234
|
+
mlrun.common.schemas.ProjectsFormat.name_only,
|
|
235
235
|
labels,
|
|
236
236
|
state,
|
|
237
237
|
auth_info.projects_role,
|
|
@@ -257,13 +257,13 @@ async def list_projects(
|
|
|
257
257
|
|
|
258
258
|
|
|
259
259
|
@router.get(
|
|
260
|
-
"/project-summaries", response_model=mlrun.
|
|
260
|
+
"/project-summaries", response_model=mlrun.common.schemas.ProjectSummariesOutput
|
|
261
261
|
)
|
|
262
262
|
async def list_project_summaries(
|
|
263
263
|
owner: str = None,
|
|
264
264
|
labels: typing.List[str] = fastapi.Query(None, alias="label"),
|
|
265
|
-
state: mlrun.
|
|
266
|
-
auth_info: mlrun.
|
|
265
|
+
state: mlrun.common.schemas.ProjectState = None,
|
|
266
|
+
auth_info: mlrun.common.schemas.AuthInfo = fastapi.Depends(
|
|
267
267
|
mlrun.api.api.deps.authenticate_request
|
|
268
268
|
),
|
|
269
269
|
db_session: sqlalchemy.orm.Session = fastapi.Depends(
|
|
@@ -274,7 +274,7 @@ async def list_project_summaries(
|
|
|
274
274
|
get_project_member().list_projects,
|
|
275
275
|
db_session,
|
|
276
276
|
owner,
|
|
277
|
-
mlrun.
|
|
277
|
+
mlrun.common.schemas.ProjectsFormat.name_only,
|
|
278
278
|
labels,
|
|
279
279
|
state,
|
|
280
280
|
auth_info.projects_role,
|
|
@@ -299,14 +299,14 @@ async def list_project_summaries(
|
|
|
299
299
|
|
|
300
300
|
|
|
301
301
|
@router.get(
|
|
302
|
-
"/project-summaries/{name}", response_model=mlrun.
|
|
302
|
+
"/project-summaries/{name}", response_model=mlrun.common.schemas.ProjectSummary
|
|
303
303
|
)
|
|
304
304
|
async def get_project_summary(
|
|
305
305
|
name: str,
|
|
306
306
|
db_session: sqlalchemy.orm.Session = fastapi.Depends(
|
|
307
307
|
mlrun.api.api.deps.get_db_session
|
|
308
308
|
),
|
|
309
|
-
auth_info: mlrun.
|
|
309
|
+
auth_info: mlrun.common.schemas.AuthInfo = fastapi.Depends(
|
|
310
310
|
mlrun.api.api.deps.authenticate_request
|
|
311
311
|
),
|
|
312
312
|
):
|
|
@@ -317,14 +317,14 @@ async def get_project_summary(
|
|
|
317
317
|
if not _is_request_from_leader(auth_info.projects_role):
|
|
318
318
|
await mlrun.api.utils.auth.verifier.AuthVerifier().query_project_permissions(
|
|
319
319
|
name,
|
|
320
|
-
mlrun.
|
|
320
|
+
mlrun.common.schemas.AuthorizationAction.read,
|
|
321
321
|
auth_info,
|
|
322
322
|
)
|
|
323
323
|
return project_summary
|
|
324
324
|
|
|
325
325
|
|
|
326
326
|
def _is_request_from_leader(
|
|
327
|
-
projects_role: typing.Optional[mlrun.
|
|
327
|
+
projects_role: typing.Optional[mlrun.common.schemas.ProjectsRole],
|
|
328
328
|
) -> bool:
|
|
329
329
|
if projects_role and projects_role.value == mlrun.mlconf.httpdb.projects.leader:
|
|
330
330
|
return True
|