mlrun 1.3.3__py3-none-any.whl → 1.4.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of mlrun might be problematic. Click here for more details.
- 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.3.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.3.dist-info/RECORD +0 -381
- {mlrun-1.3.3.dist-info → mlrun-1.4.0.dist-info}/LICENSE +0 -0
- {mlrun-1.3.3.dist-info → mlrun-1.4.0.dist-info}/WHEEL +0 -0
- {mlrun-1.3.3.dist-info → mlrun-1.4.0.dist-info}/entry_points.txt +0 -0
- {mlrun-1.3.3.dist-info → mlrun-1.4.0.dist-info}/top_level.txt +0 -0
mlrun/api/utils/scheduler.py
CHANGED
|
@@ -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.
|
|
@@ -27,11 +27,12 @@ from apscheduler.schedulers.asyncio import AsyncIOScheduler
|
|
|
27
27
|
from apscheduler.triggers.cron import CronTrigger as APSchedulerCronTrigger
|
|
28
28
|
from sqlalchemy.orm import Session
|
|
29
29
|
|
|
30
|
+
import mlrun.api.api.utils
|
|
30
31
|
import mlrun.api.utils.auth.verifier
|
|
31
32
|
import mlrun.api.utils.clients.iguazio
|
|
32
33
|
import mlrun.api.utils.helpers
|
|
34
|
+
import mlrun.common.schemas
|
|
33
35
|
import mlrun.errors
|
|
34
|
-
from mlrun.api import schemas
|
|
35
36
|
from mlrun.api.db.session import close_session, create_session
|
|
36
37
|
from mlrun.api.utils.singletons.db import get_db
|
|
37
38
|
from mlrun.config import config
|
|
@@ -60,7 +61,7 @@ class Scheduler:
|
|
|
60
61
|
# we don't allow to schedule a job to run more than one time per X
|
|
61
62
|
# NOTE this cannot be less than one minute - see _validate_cron_trigger
|
|
62
63
|
self._min_allowed_interval = config.httpdb.scheduling.min_allowed_interval
|
|
63
|
-
self._secrets_provider = schemas.SecretProviderName.kubernetes
|
|
64
|
+
self._secrets_provider = mlrun.common.schemas.SecretProviderName.kubernetes
|
|
64
65
|
|
|
65
66
|
async def start(self, db_session: Session):
|
|
66
67
|
logger.info("Starting scheduler")
|
|
@@ -73,7 +74,7 @@ class Scheduler:
|
|
|
73
74
|
try:
|
|
74
75
|
if (
|
|
75
76
|
mlrun.mlconf.httpdb.clusterization.role
|
|
76
|
-
== mlrun.
|
|
77
|
+
== mlrun.common.schemas.ClusterizationRole.chief
|
|
77
78
|
):
|
|
78
79
|
self._reload_schedules(db_session)
|
|
79
80
|
except Exception as exc:
|
|
@@ -93,7 +94,7 @@ class Scheduler:
|
|
|
93
94
|
return labels
|
|
94
95
|
|
|
95
96
|
def _get_access_key_secret_name_from_db_record(
|
|
96
|
-
self, db_schedule: schemas.ScheduleRecord
|
|
97
|
+
self, db_schedule: mlrun.common.schemas.ScheduleRecord
|
|
97
98
|
):
|
|
98
99
|
schedule_labels = db_schedule.dict()["labels"]
|
|
99
100
|
for label in schedule_labels:
|
|
@@ -104,19 +105,21 @@ class Scheduler:
|
|
|
104
105
|
def create_schedule(
|
|
105
106
|
self,
|
|
106
107
|
db_session: Session,
|
|
107
|
-
auth_info: mlrun.
|
|
108
|
+
auth_info: mlrun.common.schemas.AuthInfo,
|
|
108
109
|
project: str,
|
|
109
110
|
name: str,
|
|
110
|
-
kind: schemas.ScheduleKinds,
|
|
111
|
+
kind: mlrun.common.schemas.ScheduleKinds,
|
|
111
112
|
scheduled_object: Union[Dict, Callable],
|
|
112
|
-
cron_trigger: Union[str, schemas.ScheduleCronTrigger],
|
|
113
|
+
cron_trigger: Union[str, mlrun.common.schemas.ScheduleCronTrigger],
|
|
113
114
|
labels: Dict = None,
|
|
114
115
|
concurrency_limit: int = None,
|
|
115
116
|
):
|
|
116
117
|
if concurrency_limit is None:
|
|
117
118
|
concurrency_limit = config.httpdb.scheduling.default_concurrency_limit
|
|
118
119
|
if isinstance(cron_trigger, str):
|
|
119
|
-
cron_trigger = schemas.ScheduleCronTrigger.from_crontab(
|
|
120
|
+
cron_trigger = mlrun.common.schemas.ScheduleCronTrigger.from_crontab(
|
|
121
|
+
cron_trigger
|
|
122
|
+
)
|
|
120
123
|
|
|
121
124
|
self._validate_cron_trigger(cron_trigger)
|
|
122
125
|
|
|
@@ -135,6 +138,9 @@ class Scheduler:
|
|
|
135
138
|
# We use the schedule labels to keep track of the access-key to use. Note that this is the name of the secret,
|
|
136
139
|
# not the secret value itself. Therefore, it can be kept in a non-secure field.
|
|
137
140
|
labels = self._append_access_key_secret_to_labels(labels, secret_name)
|
|
141
|
+
|
|
142
|
+
self._enrich_schedule_notifications(project, name, scheduled_object)
|
|
143
|
+
|
|
138
144
|
get_db().create_schedule(
|
|
139
145
|
db_session,
|
|
140
146
|
project,
|
|
@@ -177,16 +183,18 @@ class Scheduler:
|
|
|
177
183
|
def update_schedule(
|
|
178
184
|
self,
|
|
179
185
|
db_session: Session,
|
|
180
|
-
auth_info: mlrun.
|
|
186
|
+
auth_info: mlrun.common.schemas.AuthInfo,
|
|
181
187
|
project: str,
|
|
182
188
|
name: str,
|
|
183
189
|
scheduled_object: Union[Dict, Callable] = None,
|
|
184
|
-
cron_trigger: Union[str, schemas.ScheduleCronTrigger] = None,
|
|
190
|
+
cron_trigger: Union[str, mlrun.common.schemas.ScheduleCronTrigger] = None,
|
|
185
191
|
labels: Dict = None,
|
|
186
192
|
concurrency_limit: int = None,
|
|
187
193
|
):
|
|
188
194
|
if isinstance(cron_trigger, str):
|
|
189
|
-
cron_trigger = schemas.ScheduleCronTrigger.from_crontab(
|
|
195
|
+
cron_trigger = mlrun.common.schemas.ScheduleCronTrigger.from_crontab(
|
|
196
|
+
cron_trigger
|
|
197
|
+
)
|
|
190
198
|
|
|
191
199
|
if cron_trigger is not None:
|
|
192
200
|
self._validate_cron_trigger(cron_trigger)
|
|
@@ -206,6 +214,8 @@ class Scheduler:
|
|
|
206
214
|
secret_name = self._store_schedule_secrets_using_auth_secret(auth_info)
|
|
207
215
|
labels = self._append_access_key_secret_to_labels(labels, secret_name)
|
|
208
216
|
|
|
217
|
+
self._enrich_schedule_notifications(project, name, scheduled_object)
|
|
218
|
+
|
|
209
219
|
get_db().update_schedule(
|
|
210
220
|
db_session,
|
|
211
221
|
project,
|
|
@@ -241,7 +251,7 @@ class Scheduler:
|
|
|
241
251
|
labels: str = None,
|
|
242
252
|
include_last_run: bool = False,
|
|
243
253
|
include_credentials: bool = False,
|
|
244
|
-
) -> schemas.SchedulesOutput:
|
|
254
|
+
) -> mlrun.common.schemas.SchedulesOutput:
|
|
245
255
|
db_schedules = get_db().list_schedules(db_session, project, name, labels, kind)
|
|
246
256
|
schedules = []
|
|
247
257
|
for db_schedule in db_schedules:
|
|
@@ -249,7 +259,7 @@ class Scheduler:
|
|
|
249
259
|
db_session, db_schedule, include_last_run, include_credentials
|
|
250
260
|
)
|
|
251
261
|
schedules.append(schedule)
|
|
252
|
-
return schemas.SchedulesOutput(schedules=schedules)
|
|
262
|
+
return mlrun.common.schemas.SchedulesOutput(schedules=schedules)
|
|
253
263
|
|
|
254
264
|
def get_schedule(
|
|
255
265
|
self,
|
|
@@ -258,7 +268,7 @@ class Scheduler:
|
|
|
258
268
|
name: str,
|
|
259
269
|
include_last_run: bool = False,
|
|
260
270
|
include_credentials: bool = False,
|
|
261
|
-
) -> schemas.ScheduleOutput:
|
|
271
|
+
) -> mlrun.common.schemas.ScheduleOutput:
|
|
262
272
|
logger.debug("Getting schedule", project=project, name=name)
|
|
263
273
|
db_schedule = get_db().get_schedule(db_session, project, name)
|
|
264
274
|
return self._transform_and_enrich_db_schedule(
|
|
@@ -273,7 +283,7 @@ class Scheduler:
|
|
|
273
283
|
name: str,
|
|
274
284
|
):
|
|
275
285
|
logger.debug("Deleting schedule", project=project, name=name)
|
|
276
|
-
self._remove_schedule_scheduler_resources(project, name)
|
|
286
|
+
self._remove_schedule_scheduler_resources(db_session, project, name)
|
|
277
287
|
get_db().delete_schedule(db_session, project, name)
|
|
278
288
|
|
|
279
289
|
@mlrun.api.utils.helpers.ensure_running_on_chief
|
|
@@ -288,15 +298,18 @@ class Scheduler:
|
|
|
288
298
|
)
|
|
289
299
|
logger.debug("Deleting schedules", project=project)
|
|
290
300
|
for schedule in schedules.schedules:
|
|
291
|
-
self._remove_schedule_scheduler_resources(
|
|
301
|
+
self._remove_schedule_scheduler_resources(
|
|
302
|
+
db_session, schedule.project, schedule.name
|
|
303
|
+
)
|
|
292
304
|
get_db().delete_schedules(db_session, project)
|
|
293
305
|
|
|
294
|
-
def _remove_schedule_scheduler_resources(self, project, name):
|
|
306
|
+
def _remove_schedule_scheduler_resources(self, db_session: Session, project, name):
|
|
295
307
|
self._remove_schedule_from_scheduler(project, name)
|
|
296
308
|
# This is kept for backwards compatibility - if schedule was using the "old" format of storing secrets, then
|
|
297
309
|
# this is a good opportunity to remove them. Using the new method we don't remove secrets since they are per
|
|
298
310
|
# access-key and there may be other entities (runtimes, for example) using the same secret.
|
|
299
311
|
self._remove_schedule_secrets(project, name)
|
|
312
|
+
self._remove_schedule_notification_secrets(db_session, project, name)
|
|
300
313
|
|
|
301
314
|
def _remove_schedule_from_scheduler(self, project, name):
|
|
302
315
|
job_id = self._resolve_job_id(project, name)
|
|
@@ -309,7 +322,7 @@ class Scheduler:
|
|
|
309
322
|
async def invoke_schedule(
|
|
310
323
|
self,
|
|
311
324
|
db_session: Session,
|
|
312
|
-
auth_info: mlrun.
|
|
325
|
+
auth_info: mlrun.common.schemas.AuthInfo,
|
|
313
326
|
project: str,
|
|
314
327
|
name: str,
|
|
315
328
|
):
|
|
@@ -333,15 +346,42 @@ class Scheduler:
|
|
|
333
346
|
)
|
|
334
347
|
return await function(*args, **kwargs)
|
|
335
348
|
|
|
349
|
+
@mlrun.api.utils.helpers.ensure_running_on_chief
|
|
350
|
+
def set_schedule_notifications(
|
|
351
|
+
self,
|
|
352
|
+
session: Session,
|
|
353
|
+
project: str,
|
|
354
|
+
identifier: mlrun.common.schemas.ScheduleIdentifier,
|
|
355
|
+
notifications: List[mlrun.model.Notification],
|
|
356
|
+
auth_info: mlrun.common.schemas.AuthInfo,
|
|
357
|
+
):
|
|
358
|
+
"""
|
|
359
|
+
Set notifications for a schedule. This will replace any existing notifications.
|
|
360
|
+
:param session: DB session
|
|
361
|
+
:param project: Project name
|
|
362
|
+
:param identifier: Schedule identifier
|
|
363
|
+
:param notifications: List of notifications to set
|
|
364
|
+
:param auth_info: Authorization info
|
|
365
|
+
"""
|
|
366
|
+
name = identifier.name
|
|
367
|
+
logger.debug("Setting schedule notifications", project=project, name=name)
|
|
368
|
+
db_schedule = get_db().get_schedule(session, project, name)
|
|
369
|
+
scheduled_object = db_schedule.scheduled_object
|
|
370
|
+
if scheduled_object:
|
|
371
|
+
scheduled_object.get("task", {}).get("spec", {})["notifications"] = [
|
|
372
|
+
notification.to_dict() for notification in notifications
|
|
373
|
+
]
|
|
374
|
+
self.update_schedule(session, auth_info, project, name, scheduled_object)
|
|
375
|
+
|
|
336
376
|
def _ensure_auth_info_has_access_key(
|
|
337
377
|
self,
|
|
338
|
-
auth_info: mlrun.
|
|
339
|
-
kind: schemas.ScheduleKinds,
|
|
378
|
+
auth_info: mlrun.common.schemas.AuthInfo,
|
|
379
|
+
kind: mlrun.common.schemas.ScheduleKinds,
|
|
340
380
|
):
|
|
341
381
|
import mlrun.api.crud
|
|
342
382
|
|
|
343
383
|
if (
|
|
344
|
-
kind not in schemas.ScheduleKinds.local_kinds()
|
|
384
|
+
kind not in mlrun.common.schemas.ScheduleKinds.local_kinds()
|
|
345
385
|
and mlrun.api.utils.auth.verifier.AuthVerifier().is_jobs_auth_required()
|
|
346
386
|
):
|
|
347
387
|
if (
|
|
@@ -371,7 +411,7 @@ class Scheduler:
|
|
|
371
411
|
|
|
372
412
|
def _store_schedule_secrets_using_auth_secret(
|
|
373
413
|
self,
|
|
374
|
-
auth_info: mlrun.
|
|
414
|
+
auth_info: mlrun.common.schemas.AuthInfo,
|
|
375
415
|
) -> str:
|
|
376
416
|
# import here to avoid circular imports
|
|
377
417
|
import mlrun.api.crud
|
|
@@ -388,8 +428,8 @@ class Scheduler:
|
|
|
388
428
|
auth_info.username = ""
|
|
389
429
|
|
|
390
430
|
secret_name = mlrun.api.crud.Secrets().store_auth_secret(
|
|
391
|
-
mlrun.
|
|
392
|
-
provider=mlrun.
|
|
431
|
+
mlrun.common.schemas.AuthSecretData(
|
|
432
|
+
provider=mlrun.common.schemas.SecretProviderName.kubernetes,
|
|
393
433
|
username=auth_info.username,
|
|
394
434
|
access_key=auth_info.access_key,
|
|
395
435
|
)
|
|
@@ -400,7 +440,7 @@ class Scheduler:
|
|
|
400
440
|
# are sure we are far enough that it's no longer going to be used (or keep, and use for other things).
|
|
401
441
|
def _store_schedule_secrets(
|
|
402
442
|
self,
|
|
403
|
-
auth_info: mlrun.
|
|
443
|
+
auth_info: mlrun.common.schemas.AuthInfo,
|
|
404
444
|
project: str,
|
|
405
445
|
name: str,
|
|
406
446
|
):
|
|
@@ -441,7 +481,7 @@ class Scheduler:
|
|
|
441
481
|
secrets[username_secret_key] = auth_info.username
|
|
442
482
|
mlrun.api.crud.Secrets().store_project_secrets(
|
|
443
483
|
project,
|
|
444
|
-
schemas.SecretsData(
|
|
484
|
+
mlrun.common.schemas.SecretsData(
|
|
445
485
|
provider=self._secrets_provider,
|
|
446
486
|
secrets=secrets,
|
|
447
487
|
),
|
|
@@ -545,7 +585,7 @@ class Scheduler:
|
|
|
545
585
|
|
|
546
586
|
def _validate_cron_trigger(
|
|
547
587
|
self,
|
|
548
|
-
cron_trigger: schemas.ScheduleCronTrigger,
|
|
588
|
+
cron_trigger: mlrun.common.schemas.ScheduleCronTrigger,
|
|
549
589
|
# accepting now from outside for testing purposes
|
|
550
590
|
now: datetime = None,
|
|
551
591
|
):
|
|
@@ -590,7 +630,7 @@ class Scheduler:
|
|
|
590
630
|
delta=second_next_run_time - next_run_time,
|
|
591
631
|
)
|
|
592
632
|
raise ValueError(
|
|
593
|
-
f"Cron trigger too frequent. no more
|
|
633
|
+
f"Cron trigger too frequent. no more than one job "
|
|
594
634
|
f"per {self._min_allowed_interval} is allowed"
|
|
595
635
|
)
|
|
596
636
|
|
|
@@ -598,11 +638,11 @@ class Scheduler:
|
|
|
598
638
|
self,
|
|
599
639
|
project: str,
|
|
600
640
|
name: str,
|
|
601
|
-
kind: schemas.ScheduleKinds,
|
|
641
|
+
kind: mlrun.common.schemas.ScheduleKinds,
|
|
602
642
|
scheduled_object: Any,
|
|
603
|
-
cron_trigger: schemas.ScheduleCronTrigger,
|
|
643
|
+
cron_trigger: mlrun.common.schemas.ScheduleCronTrigger,
|
|
604
644
|
concurrency_limit: int,
|
|
605
|
-
auth_info: mlrun.
|
|
645
|
+
auth_info: mlrun.common.schemas.AuthInfo,
|
|
606
646
|
):
|
|
607
647
|
job_id = self._resolve_job_id(project, name)
|
|
608
648
|
logger.debug("Adding schedule to scheduler", job_id=job_id)
|
|
@@ -628,11 +668,11 @@ class Scheduler:
|
|
|
628
668
|
self,
|
|
629
669
|
project: str,
|
|
630
670
|
name: str,
|
|
631
|
-
kind: schemas.ScheduleKinds,
|
|
671
|
+
kind: mlrun.common.schemas.ScheduleKinds,
|
|
632
672
|
scheduled_object: Any,
|
|
633
|
-
cron_trigger: schemas.ScheduleCronTrigger,
|
|
673
|
+
cron_trigger: mlrun.common.schemas.ScheduleCronTrigger,
|
|
634
674
|
concurrency_limit: int,
|
|
635
|
-
auth_info: mlrun.
|
|
675
|
+
auth_info: mlrun.common.schemas.AuthInfo,
|
|
636
676
|
):
|
|
637
677
|
job_id = self._resolve_job_id(project, name)
|
|
638
678
|
logger.debug("Updating schedule in scheduler", job_id=job_id)
|
|
@@ -706,7 +746,7 @@ class Scheduler:
|
|
|
706
746
|
if access_key:
|
|
707
747
|
need_to_update_credentials = True
|
|
708
748
|
|
|
709
|
-
auth_info = mlrun.
|
|
749
|
+
auth_info = mlrun.common.schemas.AuthInfo(
|
|
710
750
|
username=username,
|
|
711
751
|
access_key=access_key,
|
|
712
752
|
# enriching with control plane tag because scheduling a function requires control plane
|
|
@@ -753,21 +793,21 @@ class Scheduler:
|
|
|
753
793
|
def _transform_and_enrich_db_schedule(
|
|
754
794
|
self,
|
|
755
795
|
db_session: Session,
|
|
756
|
-
schedule_record: schemas.ScheduleRecord,
|
|
796
|
+
schedule_record: mlrun.common.schemas.ScheduleRecord,
|
|
757
797
|
include_last_run: bool = False,
|
|
758
798
|
include_credentials: bool = False,
|
|
759
|
-
) -> schemas.ScheduleOutput:
|
|
799
|
+
) -> mlrun.common.schemas.ScheduleOutput:
|
|
760
800
|
schedule_dict = schedule_record.dict()
|
|
761
801
|
schedule_dict["labels"] = {
|
|
762
802
|
label["name"]: label["value"] for label in schedule_dict["labels"]
|
|
763
803
|
}
|
|
764
|
-
schedule = schemas.ScheduleOutput(**schedule_dict)
|
|
804
|
+
schedule = mlrun.common.schemas.ScheduleOutput(**schedule_dict)
|
|
765
805
|
|
|
766
806
|
# Schedules are running only on chief. Therefore, we query next_run_time from the scheduler only when
|
|
767
807
|
# running on chief.
|
|
768
808
|
if (
|
|
769
809
|
mlrun.mlconf.httpdb.clusterization.role
|
|
770
|
-
== mlrun.
|
|
810
|
+
== mlrun.common.schemas.ClusterizationRole.chief
|
|
771
811
|
):
|
|
772
812
|
job_id = self._resolve_job_id(schedule_record.project, schedule_record.name)
|
|
773
813
|
job = self._scheduler.get_job(job_id)
|
|
@@ -788,7 +828,7 @@ class Scheduler:
|
|
|
788
828
|
|
|
789
829
|
@staticmethod
|
|
790
830
|
def _enrich_schedule_with_last_run(
|
|
791
|
-
db_session: Session, schedule_output: schemas.ScheduleOutput
|
|
831
|
+
db_session: Session, schedule_output: mlrun.common.schemas.ScheduleOutput
|
|
792
832
|
):
|
|
793
833
|
if schedule_output.last_run_uri:
|
|
794
834
|
run_project, run_uid, iteration, _ = RunObject.parse_uri(
|
|
@@ -798,7 +838,7 @@ class Scheduler:
|
|
|
798
838
|
schedule_output.last_run = run_data
|
|
799
839
|
|
|
800
840
|
def _enrich_schedule_with_credentials(
|
|
801
|
-
self, schedule_output: schemas.ScheduleOutput
|
|
841
|
+
self, schedule_output: mlrun.common.schemas.ScheduleOutput
|
|
802
842
|
):
|
|
803
843
|
secret_name = schedule_output.labels.get(self._db_record_auth_label)
|
|
804
844
|
if secret_name:
|
|
@@ -808,18 +848,18 @@ class Scheduler:
|
|
|
808
848
|
|
|
809
849
|
def _resolve_job_function(
|
|
810
850
|
self,
|
|
811
|
-
scheduled_kind: schemas.ScheduleKinds,
|
|
851
|
+
scheduled_kind: mlrun.common.schemas.ScheduleKinds,
|
|
812
852
|
scheduled_object: Any,
|
|
813
853
|
project_name: str,
|
|
814
854
|
schedule_name: str,
|
|
815
855
|
schedule_concurrency_limit: int,
|
|
816
|
-
auth_info: mlrun.
|
|
856
|
+
auth_info: mlrun.common.schemas.AuthInfo,
|
|
817
857
|
) -> Tuple[Callable, Optional[Union[List, Tuple]], Optional[Dict]]:
|
|
818
858
|
"""
|
|
819
859
|
:return: a tuple (function, args, kwargs) to be used with the APScheduler.add_job
|
|
820
860
|
"""
|
|
821
861
|
|
|
822
|
-
if scheduled_kind == schemas.ScheduleKinds.job:
|
|
862
|
+
if scheduled_kind == mlrun.common.schemas.ScheduleKinds.job:
|
|
823
863
|
scheduled_object_copy = copy.deepcopy(scheduled_object)
|
|
824
864
|
return (
|
|
825
865
|
Scheduler.submit_run_wrapper,
|
|
@@ -833,7 +873,7 @@ class Scheduler:
|
|
|
833
873
|
],
|
|
834
874
|
{},
|
|
835
875
|
)
|
|
836
|
-
if scheduled_kind == schemas.ScheduleKinds.local_function:
|
|
876
|
+
if scheduled_kind == mlrun.common.schemas.ScheduleKinds.local_function:
|
|
837
877
|
return scheduled_object, [], {}
|
|
838
878
|
|
|
839
879
|
# sanity
|
|
@@ -851,6 +891,55 @@ class Scheduler:
|
|
|
851
891
|
"""
|
|
852
892
|
return self._job_id_separator.join([project, name])
|
|
853
893
|
|
|
894
|
+
@staticmethod
|
|
895
|
+
def _enrich_schedule_notifications(
|
|
896
|
+
project: str, schedule_name: str, scheduled_object: Union[Dict, Callable]
|
|
897
|
+
):
|
|
898
|
+
if not isinstance(scheduled_object, dict):
|
|
899
|
+
return
|
|
900
|
+
|
|
901
|
+
schedule_notifications = (
|
|
902
|
+
scheduled_object.get("task", {}).get("spec", {}).get("notifications")
|
|
903
|
+
)
|
|
904
|
+
if schedule_notifications:
|
|
905
|
+
scheduled_object["task"]["spec"]["notifications"] = [
|
|
906
|
+
notification.to_dict()
|
|
907
|
+
for notification in mlrun.api.api.utils.validate_and_mask_notification_list(
|
|
908
|
+
schedule_notifications, schedule_name, project
|
|
909
|
+
)
|
|
910
|
+
]
|
|
911
|
+
|
|
912
|
+
@staticmethod
|
|
913
|
+
def _remove_schedule_notification_secrets(
|
|
914
|
+
db_session: Session, project: str, schedule_name: str
|
|
915
|
+
):
|
|
916
|
+
try:
|
|
917
|
+
db_schedule = get_db().get_schedule(
|
|
918
|
+
db_session,
|
|
919
|
+
project,
|
|
920
|
+
schedule_name,
|
|
921
|
+
)
|
|
922
|
+
except mlrun.errors.MLRunNotFoundError:
|
|
923
|
+
# we allow deleting a schedule even if it does not exist in the DB
|
|
924
|
+
logger.debug(
|
|
925
|
+
"Failed to find schedule. Continuing",
|
|
926
|
+
project=project,
|
|
927
|
+
schedule_name=schedule_name,
|
|
928
|
+
)
|
|
929
|
+
return
|
|
930
|
+
|
|
931
|
+
if db_schedule and isinstance(db_schedule.scheduled_object, dict):
|
|
932
|
+
notifications = (
|
|
933
|
+
db_schedule.scheduled_object.get("task", {})
|
|
934
|
+
.get("spec", {})
|
|
935
|
+
.get("notifications")
|
|
936
|
+
)
|
|
937
|
+
if notifications:
|
|
938
|
+
for notification in notifications:
|
|
939
|
+
mlrun.api.api.utils.delete_notification_params_secret(
|
|
940
|
+
project, mlrun.model.Notification.from_dict(notification)
|
|
941
|
+
)
|
|
942
|
+
|
|
854
943
|
@staticmethod
|
|
855
944
|
async def submit_run_wrapper(
|
|
856
945
|
scheduler,
|
|
@@ -858,7 +947,7 @@ class Scheduler:
|
|
|
858
947
|
project_name,
|
|
859
948
|
schedule_name,
|
|
860
949
|
schedule_concurrency_limit,
|
|
861
|
-
auth_info: mlrun.
|
|
950
|
+
auth_info: mlrun.common.schemas.AuthInfo,
|
|
862
951
|
):
|
|
863
952
|
|
|
864
953
|
# removing the schedule from the body otherwise when the scheduler will submit this task it will go to an
|
|
@@ -872,7 +961,7 @@ class Scheduler:
|
|
|
872
961
|
if "task" in scheduled_object and "metadata" in scheduled_object["task"]:
|
|
873
962
|
scheduled_object["task"]["metadata"].setdefault("labels", {})
|
|
874
963
|
scheduled_object["task"]["metadata"]["labels"][
|
|
875
|
-
schemas.constants.LabelNames.schedule_name
|
|
964
|
+
mlrun.common.schemas.constants.LabelNames.schedule_name
|
|
876
965
|
] = schedule_name
|
|
877
966
|
|
|
878
967
|
return await fastapi.concurrency.run_in_threadpool(
|
|
@@ -887,7 +976,7 @@ class Scheduler:
|
|
|
887
976
|
|
|
888
977
|
@staticmethod
|
|
889
978
|
def transform_schemas_cron_trigger_to_apscheduler_cron_trigger(
|
|
890
|
-
cron_trigger: schemas.ScheduleCronTrigger,
|
|
979
|
+
cron_trigger: mlrun.common.schemas.ScheduleCronTrigger,
|
|
891
980
|
):
|
|
892
981
|
return APSchedulerCronTrigger(
|
|
893
982
|
cron_trigger.year,
|
|
@@ -927,7 +1016,7 @@ class Scheduler:
|
|
|
927
1016
|
db_session,
|
|
928
1017
|
states=RunStates.non_terminal_states(),
|
|
929
1018
|
project=project_name,
|
|
930
|
-
labels=f"{schemas.constants.LabelNames.schedule_name}={schedule_name}",
|
|
1019
|
+
labels=f"{mlrun.common.schemas.constants.LabelNames.schedule_name}={schedule_name}",
|
|
931
1020
|
)
|
|
932
1021
|
if len(active_runs) >= schedule_concurrency_limit:
|
|
933
1022
|
logger.warn(
|
|
@@ -965,7 +1054,7 @@ class Scheduler:
|
|
|
965
1054
|
# Update the schedule with the new auth info so we won't need to do the above again in the next run
|
|
966
1055
|
scheduler.update_schedule(
|
|
967
1056
|
db_session,
|
|
968
|
-
mlrun.
|
|
1057
|
+
mlrun.common.schemas.AuthInfo(
|
|
969
1058
|
username=project_owner.username,
|
|
970
1059
|
access_key=project_owner.access_key,
|
|
971
1060
|
# enriching with control plane tag because scheduling a function requires control plane
|
mlrun/api/utils/singletons/db.py
CHANGED
|
@@ -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.
|
|
@@ -13,7 +13,6 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
#
|
|
15
15
|
from mlrun.api.db.base import DBInterface
|
|
16
|
-
from mlrun.api.db.filedb.db import FileDB
|
|
17
16
|
from mlrun.api.db.sqldb.db import SQLDB
|
|
18
17
|
from mlrun.api.db.sqldb.session import create_session
|
|
19
18
|
from mlrun.config import config
|
|
@@ -33,16 +32,11 @@ def initialize_db(override_db=None):
|
|
|
33
32
|
if override_db:
|
|
34
33
|
db = override_db
|
|
35
34
|
return
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
db_session
|
|
44
|
-
try:
|
|
45
|
-
db_session = create_session()
|
|
46
|
-
db.initialize(db_session)
|
|
47
|
-
finally:
|
|
48
|
-
db_session.close()
|
|
35
|
+
logger.info("Creating sql db")
|
|
36
|
+
db = SQLDB(config.httpdb.dsn)
|
|
37
|
+
db_session = None
|
|
38
|
+
try:
|
|
39
|
+
db_session = create_session()
|
|
40
|
+
db.initialize(db_session)
|
|
41
|
+
finally:
|
|
42
|
+
db_session.close()
|