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/db/sqldb/helpers.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.
|
|
@@ -20,10 +20,10 @@ if mysql_dsn_data:
|
|
|
20
20
|
from .models_mysql import * # noqa
|
|
21
21
|
|
|
22
22
|
# importing private variables as well
|
|
23
|
-
from .models_mysql import _classes, _labeled, _table2cls, _tagged # noqa # isort:skip
|
|
23
|
+
from .models_mysql import _classes, _labeled, _table2cls, _tagged, _with_notifications # noqa # isort:skip
|
|
24
24
|
else:
|
|
25
25
|
from .models_sqlite import * # noqa
|
|
26
26
|
|
|
27
27
|
# importing private variables as well
|
|
28
|
-
from .models_sqlite import _classes, _labeled, _table2cls, _tagged # noqa # isort:skip
|
|
28
|
+
from .models_sqlite import _classes, _labeled, _table2cls, _tagged, _with_notifications # noqa # isort:skip
|
|
29
29
|
# fmt: on
|
|
@@ -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.
|
|
@@ -30,9 +30,10 @@ from sqlalchemy import (
|
|
|
30
30
|
UniqueConstraint,
|
|
31
31
|
)
|
|
32
32
|
from sqlalchemy.ext.declarative import declarative_base
|
|
33
|
-
from sqlalchemy.orm import
|
|
33
|
+
from sqlalchemy.orm import relationship
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
import mlrun.common.schemas
|
|
36
|
+
import mlrun.utils.db
|
|
36
37
|
from mlrun.api.utils.db.sql_collation import SQLCollationUtil
|
|
37
38
|
|
|
38
39
|
Base = declarative_base()
|
|
@@ -40,42 +41,8 @@ NULL = None # Avoid flake8 issuing warnings when comparing in filter
|
|
|
40
41
|
run_time_fmt = "%Y-%m-%dT%H:%M:%S.%fZ"
|
|
41
42
|
|
|
42
43
|
|
|
43
|
-
class BaseModel:
|
|
44
|
-
def to_dict(self, exclude=None):
|
|
45
|
-
"""
|
|
46
|
-
NOTE - this function (currently) does not handle serializing relationships
|
|
47
|
-
"""
|
|
48
|
-
exclude = exclude or []
|
|
49
|
-
mapper = class_mapper(self.__class__)
|
|
50
|
-
columns = [column.key for column in mapper.columns if column.key not in exclude]
|
|
51
|
-
get_key_value = (
|
|
52
|
-
lambda c: (c, getattr(self, c).isoformat())
|
|
53
|
-
if isinstance(getattr(self, c), datetime)
|
|
54
|
-
else (c, getattr(self, c))
|
|
55
|
-
)
|
|
56
|
-
return dict(map(get_key_value, columns))
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
class HasStruct(BaseModel):
|
|
60
|
-
@property
|
|
61
|
-
def struct(self):
|
|
62
|
-
return pickle.loads(self.body)
|
|
63
|
-
|
|
64
|
-
@struct.setter
|
|
65
|
-
def struct(self, value):
|
|
66
|
-
self.body = pickle.dumps(value)
|
|
67
|
-
|
|
68
|
-
def to_dict(self, exclude=None):
|
|
69
|
-
"""
|
|
70
|
-
NOTE - this function (currently) does not handle serializing relationships
|
|
71
|
-
"""
|
|
72
|
-
exclude = exclude or []
|
|
73
|
-
exclude.append("body")
|
|
74
|
-
return super().to_dict(exclude)
|
|
75
|
-
|
|
76
|
-
|
|
77
44
|
def make_label(table):
|
|
78
|
-
class Label(Base, BaseModel):
|
|
45
|
+
class Label(Base, mlrun.utils.db.BaseModel):
|
|
79
46
|
__tablename__ = f"{table}_labels"
|
|
80
47
|
__table_args__ = (
|
|
81
48
|
UniqueConstraint("name", "parent", name=f"_{table}_labels_uc"),
|
|
@@ -90,7 +57,7 @@ def make_label(table):
|
|
|
90
57
|
|
|
91
58
|
|
|
92
59
|
def make_tag(table):
|
|
93
|
-
class Tag(Base, BaseModel):
|
|
60
|
+
class Tag(Base, mlrun.utils.db.BaseModel):
|
|
94
61
|
__tablename__ = f"{table}_tags"
|
|
95
62
|
__table_args__ = (
|
|
96
63
|
UniqueConstraint("project", "name", "obj_id", name=f"_{table}_tags_uc"),
|
|
@@ -107,7 +74,7 @@ def make_tag(table):
|
|
|
107
74
|
# TODO: don't want to refactor everything in one PR so splitting this function to 2 versions - eventually only this one
|
|
108
75
|
# should be used
|
|
109
76
|
def make_tag_v2(table):
|
|
110
|
-
class Tag(Base, BaseModel):
|
|
77
|
+
class Tag(Base, mlrun.utils.db.BaseModel):
|
|
111
78
|
__tablename__ = f"{table}_tags"
|
|
112
79
|
__table_args__ = (
|
|
113
80
|
UniqueConstraint("project", "name", "obj_name", name=f"_{table}_tags_uc"),
|
|
@@ -122,11 +89,57 @@ def make_tag_v2(table):
|
|
|
122
89
|
return Tag
|
|
123
90
|
|
|
124
91
|
|
|
92
|
+
def make_notification(table):
|
|
93
|
+
class Notification(Base, mlrun.utils.db.BaseModel):
|
|
94
|
+
__tablename__ = f"{table}_notifications"
|
|
95
|
+
__table_args__ = (
|
|
96
|
+
UniqueConstraint("name", "parent_id", name=f"_{table}_notifications_uc"),
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
id = Column(Integer, primary_key=True)
|
|
100
|
+
project = Column(String(255, collation=SQLCollationUtil.collation()))
|
|
101
|
+
name = Column(
|
|
102
|
+
String(255, collation=SQLCollationUtil.collation()), nullable=False
|
|
103
|
+
)
|
|
104
|
+
kind = Column(
|
|
105
|
+
String(255, collation=SQLCollationUtil.collation()), nullable=False
|
|
106
|
+
)
|
|
107
|
+
message = Column(
|
|
108
|
+
String(255, collation=SQLCollationUtil.collation()), nullable=False
|
|
109
|
+
)
|
|
110
|
+
severity = Column(
|
|
111
|
+
String(255, collation=SQLCollationUtil.collation()), nullable=False
|
|
112
|
+
)
|
|
113
|
+
when = Column(
|
|
114
|
+
String(255, collation=SQLCollationUtil.collation()), nullable=False
|
|
115
|
+
)
|
|
116
|
+
condition = Column(
|
|
117
|
+
String(255, collation=SQLCollationUtil.collation()), nullable=False
|
|
118
|
+
)
|
|
119
|
+
params = Column("params", JSON)
|
|
120
|
+
parent_id = Column(Integer, ForeignKey(f"{table}.id"))
|
|
121
|
+
|
|
122
|
+
# TODO: Separate table for notification state.
|
|
123
|
+
# Currently, we are only supporting one notification being sent per DB row (either on completion or on error).
|
|
124
|
+
# In the future, we might want to support multiple notifications per DB row, and we might want to support on
|
|
125
|
+
# start, therefore we need to separate the state from the notification itself (e.g. this table can be table
|
|
126
|
+
# with notification_id, state, when, last_sent, etc.). This will require some refactoring in the code.
|
|
127
|
+
sent_time = Column(
|
|
128
|
+
sqlalchemy.dialects.mysql.TIMESTAMP(fsp=3),
|
|
129
|
+
nullable=True,
|
|
130
|
+
)
|
|
131
|
+
status = Column(
|
|
132
|
+
String(255, collation=SQLCollationUtil.collation()), nullable=False
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
return Notification
|
|
136
|
+
|
|
137
|
+
|
|
125
138
|
# quell SQLAlchemy warnings on duplicate class name (Label)
|
|
126
139
|
with warnings.catch_warnings():
|
|
127
140
|
warnings.simplefilter("ignore")
|
|
128
141
|
|
|
129
|
-
class Artifact(Base, HasStruct):
|
|
142
|
+
class Artifact(Base, mlrun.utils.db.HasStruct):
|
|
130
143
|
__tablename__ = "artifacts"
|
|
131
144
|
__table_args__ = (
|
|
132
145
|
UniqueConstraint("uid", "project", "key", name="_artifacts_uc"),
|
|
@@ -140,7 +153,7 @@ with warnings.catch_warnings():
|
|
|
140
153
|
project = Column(String(255, collation=SQLCollationUtil.collation()))
|
|
141
154
|
uid = Column(String(255, collation=SQLCollationUtil.collation()))
|
|
142
155
|
updated = Column(sqlalchemy.dialects.mysql.TIMESTAMP(fsp=3))
|
|
143
|
-
# TODO: change to JSON, see mlrun/
|
|
156
|
+
# TODO: change to JSON, see mlrun/common/schemas/function.py::FunctionState for reasoning
|
|
144
157
|
body = Column(sqlalchemy.dialects.mysql.MEDIUMBLOB)
|
|
145
158
|
|
|
146
159
|
labels = relationship(Label, cascade="all, delete-orphan")
|
|
@@ -149,7 +162,7 @@ with warnings.catch_warnings():
|
|
|
149
162
|
def get_identifier_string(self) -> str:
|
|
150
163
|
return f"{self.project}/{self.key}/{self.uid}"
|
|
151
164
|
|
|
152
|
-
class Function(Base, HasStruct):
|
|
165
|
+
class Function(Base, mlrun.utils.db.HasStruct):
|
|
153
166
|
__tablename__ = "functions"
|
|
154
167
|
__table_args__ = (
|
|
155
168
|
UniqueConstraint("name", "project", "uid", name="_functions_uc"),
|
|
@@ -162,7 +175,7 @@ with warnings.catch_warnings():
|
|
|
162
175
|
name = Column(String(255, collation=SQLCollationUtil.collation()))
|
|
163
176
|
project = Column(String(255, collation=SQLCollationUtil.collation()))
|
|
164
177
|
uid = Column(String(255, collation=SQLCollationUtil.collation()))
|
|
165
|
-
# TODO: change to JSON, see mlrun/
|
|
178
|
+
# TODO: change to JSON, see mlrun/common/schemas/function.py::FunctionState for reasoning
|
|
166
179
|
body = Column(sqlalchemy.dialects.mysql.MEDIUMBLOB)
|
|
167
180
|
updated = Column(sqlalchemy.dialects.mysql.TIMESTAMP(fsp=3))
|
|
168
181
|
|
|
@@ -172,19 +185,19 @@ with warnings.catch_warnings():
|
|
|
172
185
|
def get_identifier_string(self) -> str:
|
|
173
186
|
return f"{self.project}/{self.name}/{self.uid}"
|
|
174
187
|
|
|
175
|
-
class Log(Base, BaseModel):
|
|
188
|
+
class Log(Base, mlrun.utils.db.BaseModel):
|
|
176
189
|
__tablename__ = "logs"
|
|
177
190
|
|
|
178
191
|
id = Column(Integer, primary_key=True)
|
|
179
192
|
uid = Column(String(255, collation=SQLCollationUtil.collation()))
|
|
180
193
|
project = Column(String(255, collation=SQLCollationUtil.collation()))
|
|
181
|
-
# TODO: change to JSON, see mlrun/
|
|
194
|
+
# TODO: change to JSON, see mlrun/common/schemas/function.py::FunctionState for reasoning
|
|
182
195
|
body = Column(sqlalchemy.dialects.mysql.MEDIUMBLOB)
|
|
183
196
|
|
|
184
197
|
def get_identifier_string(self) -> str:
|
|
185
198
|
return f"{self.project}/{self.uid}"
|
|
186
199
|
|
|
187
|
-
class Run(Base, HasStruct):
|
|
200
|
+
class Run(Base, mlrun.utils.db.HasStruct):
|
|
188
201
|
__tablename__ = "runs"
|
|
189
202
|
__table_args__ = (
|
|
190
203
|
UniqueConstraint("uid", "project", "iteration", name="_runs_uc"),
|
|
@@ -192,6 +205,7 @@ with warnings.catch_warnings():
|
|
|
192
205
|
|
|
193
206
|
Label = make_label(__tablename__)
|
|
194
207
|
Tag = make_tag(__tablename__)
|
|
208
|
+
Notification = make_notification(__tablename__)
|
|
195
209
|
|
|
196
210
|
id = Column(Integer, primary_key=True)
|
|
197
211
|
uid = Column(String(255, collation=SQLCollationUtil.collation()))
|
|
@@ -201,7 +215,7 @@ with warnings.catch_warnings():
|
|
|
201
215
|
)
|
|
202
216
|
iteration = Column(Integer)
|
|
203
217
|
state = Column(String(255, collation=SQLCollationUtil.collation()))
|
|
204
|
-
# TODO: change to JSON, see mlrun/
|
|
218
|
+
# TODO: change to JSON, see mlrun/common/schemas/function.py::FunctionState for reasoning
|
|
205
219
|
body = Column(sqlalchemy.dialects.mysql.MEDIUMBLOB)
|
|
206
220
|
start_time = Column(sqlalchemy.dialects.mysql.TIMESTAMP(fsp=3))
|
|
207
221
|
updated = Column(
|
|
@@ -215,11 +229,12 @@ with warnings.catch_warnings():
|
|
|
215
229
|
|
|
216
230
|
labels = relationship(Label, cascade="all, delete-orphan")
|
|
217
231
|
tags = relationship(Tag, cascade="all, delete-orphan")
|
|
232
|
+
notifications = relationship(Notification, cascade="all, delete-orphan")
|
|
218
233
|
|
|
219
234
|
def get_identifier_string(self) -> str:
|
|
220
235
|
return f"{self.project}/{self.uid}/{self.iteration}"
|
|
221
236
|
|
|
222
|
-
class BackgroundTask(Base, BaseModel):
|
|
237
|
+
class BackgroundTask(Base, mlrun.utils.db.BaseModel):
|
|
223
238
|
__tablename__ = "background_tasks"
|
|
224
239
|
__table_args__ = (
|
|
225
240
|
UniqueConstraint("name", "project", name="_background_tasks_uc"),
|
|
@@ -243,7 +258,7 @@ with warnings.catch_warnings():
|
|
|
243
258
|
state = Column(String(255, collation=SQLCollationUtil.collation()))
|
|
244
259
|
timeout = Column(Integer)
|
|
245
260
|
|
|
246
|
-
class Schedule(Base, BaseModel):
|
|
261
|
+
class Schedule(Base, mlrun.utils.db.BaseModel):
|
|
247
262
|
__tablename__ = "schedules_v2"
|
|
248
263
|
__table_args__ = (UniqueConstraint("project", "name", name="_schedules_v2_uc"),)
|
|
249
264
|
|
|
@@ -262,7 +277,7 @@ with warnings.catch_warnings():
|
|
|
262
277
|
creation_time = Column(sqlalchemy.dialects.mysql.TIMESTAMP(fsp=3))
|
|
263
278
|
cron_trigger_str = Column(String(255, collation=SQLCollationUtil.collation()))
|
|
264
279
|
last_run_uri = Column(String(255, collation=SQLCollationUtil.collation()))
|
|
265
|
-
# TODO: change to JSON, see mlrun/
|
|
280
|
+
# TODO: change to JSON, see mlrun/common/schemas/function.py::FunctionState for reasoning
|
|
266
281
|
struct = Column(sqlalchemy.dialects.mysql.MEDIUMBLOB)
|
|
267
282
|
labels = relationship(Label, cascade="all, delete-orphan")
|
|
268
283
|
concurrency_limit = Column(Integer, nullable=False)
|
|
@@ -280,11 +295,11 @@ with warnings.catch_warnings():
|
|
|
280
295
|
self.struct = pickle.dumps(value)
|
|
281
296
|
|
|
282
297
|
@property
|
|
283
|
-
def cron_trigger(self) -> schemas.ScheduleCronTrigger:
|
|
298
|
+
def cron_trigger(self) -> mlrun.common.schemas.ScheduleCronTrigger:
|
|
284
299
|
return orjson.loads(self.cron_trigger_str)
|
|
285
300
|
|
|
286
301
|
@cron_trigger.setter
|
|
287
|
-
def cron_trigger(self, trigger: schemas.ScheduleCronTrigger):
|
|
302
|
+
def cron_trigger(self, trigger: mlrun.common.schemas.ScheduleCronTrigger):
|
|
288
303
|
self.cron_trigger_str = orjson.dumps(trigger.dict(exclude_unset=True))
|
|
289
304
|
|
|
290
305
|
# Define "many to many" users/projects
|
|
@@ -295,14 +310,14 @@ with warnings.catch_warnings():
|
|
|
295
310
|
Column("user_id", Integer, ForeignKey("users.id")),
|
|
296
311
|
)
|
|
297
312
|
|
|
298
|
-
class User(Base, BaseModel):
|
|
313
|
+
class User(Base, mlrun.utils.db.BaseModel):
|
|
299
314
|
__tablename__ = "users"
|
|
300
315
|
__table_args__ = (UniqueConstraint("name", name="_users_uc"),)
|
|
301
316
|
|
|
302
317
|
id = Column(Integer, primary_key=True)
|
|
303
318
|
name = Column(String(255, collation=SQLCollationUtil.collation()))
|
|
304
319
|
|
|
305
|
-
class Project(Base, BaseModel):
|
|
320
|
+
class Project(Base, mlrun.utils.db.BaseModel):
|
|
306
321
|
__tablename__ = "projects"
|
|
307
322
|
# For now since we use project name a lot
|
|
308
323
|
__table_args__ = (UniqueConstraint("name", name="_projects_uc"),)
|
|
@@ -314,7 +329,7 @@ with warnings.catch_warnings():
|
|
|
314
329
|
source = Column(String(255, collation=SQLCollationUtil.collation()))
|
|
315
330
|
# the attribute name used to be _spec which is just a wrong naming, the attribute was renamed to _full_object
|
|
316
331
|
# leaving the column as is to prevent redundant migration
|
|
317
|
-
# TODO: change to JSON, see mlrun/
|
|
332
|
+
# TODO: change to JSON, see mlrun/common/schemas/function.py::FunctionState for reasoning
|
|
318
333
|
_full_object = Column("spec", sqlalchemy.dialects.mysql.MEDIUMBLOB)
|
|
319
334
|
created = Column(
|
|
320
335
|
sqlalchemy.dialects.mysql.TIMESTAMP(fsp=3), default=datetime.utcnow
|
|
@@ -338,7 +353,7 @@ with warnings.catch_warnings():
|
|
|
338
353
|
def full_object(self, value):
|
|
339
354
|
self._full_object = pickle.dumps(value)
|
|
340
355
|
|
|
341
|
-
class Feature(Base, BaseModel):
|
|
356
|
+
class Feature(Base, mlrun.utils.db.BaseModel):
|
|
342
357
|
__tablename__ = "features"
|
|
343
358
|
id = Column(Integer, primary_key=True)
|
|
344
359
|
feature_set_id = Column(Integer, ForeignKey("feature_sets.id"))
|
|
@@ -352,7 +367,7 @@ with warnings.catch_warnings():
|
|
|
352
367
|
def get_identifier_string(self) -> str:
|
|
353
368
|
return f"{self.project}/{self.name}"
|
|
354
369
|
|
|
355
|
-
class Entity(Base, BaseModel):
|
|
370
|
+
class Entity(Base, mlrun.utils.db.BaseModel):
|
|
356
371
|
__tablename__ = "entities"
|
|
357
372
|
id = Column(Integer, primary_key=True)
|
|
358
373
|
feature_set_id = Column(Integer, ForeignKey("feature_sets.id"))
|
|
@@ -366,7 +381,7 @@ with warnings.catch_warnings():
|
|
|
366
381
|
def get_identifier_string(self) -> str:
|
|
367
382
|
return f"{self.project}/{self.name}"
|
|
368
383
|
|
|
369
|
-
class FeatureSet(Base, BaseModel):
|
|
384
|
+
class FeatureSet(Base, mlrun.utils.db.BaseModel):
|
|
370
385
|
__tablename__ = "feature_sets"
|
|
371
386
|
__table_args__ = (
|
|
372
387
|
UniqueConstraint("name", "project", "uid", name="_feature_set_uc"),
|
|
@@ -410,7 +425,7 @@ with warnings.catch_warnings():
|
|
|
410
425
|
# TODO - convert to pickle, to avoid issues with non-json serializable fields such as datetime
|
|
411
426
|
self._full_object = json.dumps(value, default=str)
|
|
412
427
|
|
|
413
|
-
class FeatureVector(Base, BaseModel):
|
|
428
|
+
class FeatureVector(Base, mlrun.utils.db.BaseModel):
|
|
414
429
|
__tablename__ = "feature_vectors"
|
|
415
430
|
__table_args__ = (
|
|
416
431
|
UniqueConstraint("name", "project", "uid", name="_feature_vectors_uc"),
|
|
@@ -451,9 +466,9 @@ with warnings.catch_warnings():
|
|
|
451
466
|
# TODO - convert to pickle, to avoid issues with non-json serializable fields such as datetime
|
|
452
467
|
self._full_object = json.dumps(value, default=str)
|
|
453
468
|
|
|
454
|
-
class
|
|
455
|
-
__tablename__ = "
|
|
456
|
-
__table_args__ = (UniqueConstraint("name", name="
|
|
469
|
+
class HubSource(Base, mlrun.utils.db.BaseModel):
|
|
470
|
+
__tablename__ = "hub_sources"
|
|
471
|
+
__table_args__ = (UniqueConstraint("name", name="_hub_sources_uc"),)
|
|
457
472
|
|
|
458
473
|
id = Column(Integer, primary_key=True)
|
|
459
474
|
name = Column(String(255, collation=SQLCollationUtil.collation()))
|
|
@@ -482,7 +497,7 @@ with warnings.catch_warnings():
|
|
|
482
497
|
# TODO - convert to pickle, to avoid issues with non-json serializable fields such as datetime
|
|
483
498
|
self._full_object = json.dumps(value, default=str)
|
|
484
499
|
|
|
485
|
-
class DataVersion(Base, BaseModel):
|
|
500
|
+
class DataVersion(Base, mlrun.utils.db.BaseModel):
|
|
486
501
|
__tablename__ = "data_versions"
|
|
487
502
|
__table_args__ = (UniqueConstraint("version", name="_versions_uc"),)
|
|
488
503
|
|
|
@@ -497,5 +512,8 @@ with warnings.catch_warnings():
|
|
|
497
512
|
# Must be after all table definitions
|
|
498
513
|
_tagged = [cls for cls in Base.__subclasses__() if hasattr(cls, "Tag")]
|
|
499
514
|
_labeled = [cls for cls in Base.__subclasses__() if hasattr(cls, "Label")]
|
|
515
|
+
_with_notifications = [
|
|
516
|
+
cls for cls in Base.__subclasses__() if hasattr(cls, "Notification")
|
|
517
|
+
]
|
|
500
518
|
_classes = [cls for cls in Base.__subclasses__()]
|
|
501
519
|
_table2cls = {cls.__table__.name: cls for cls in Base.__subclasses__()}
|