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/db/mysql.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.
|
|
@@ -32,29 +32,16 @@ class MySQLUtil(object):
|
|
|
32
32
|
"functions",
|
|
33
33
|
]
|
|
34
34
|
|
|
35
|
-
def __init__(self):
|
|
36
|
-
|
|
37
|
-
if not mysql_dsn_data:
|
|
38
|
-
raise RuntimeError(f"Invalid mysql dsn: {self.get_dsn()}")
|
|
39
|
-
|
|
40
|
-
@staticmethod
|
|
41
|
-
def wait_for_db_liveness(logger, retry_interval=3, timeout=2 * 60):
|
|
42
|
-
logger.debug("Waiting for database liveness")
|
|
43
|
-
mysql_dsn_data = MySQLUtil.get_mysql_dsn_data()
|
|
44
|
-
if not mysql_dsn_data:
|
|
45
|
-
dsn = MySQLUtil.get_dsn()
|
|
46
|
-
if "sqlite" in dsn:
|
|
47
|
-
logger.debug("SQLite DB is used, liveness check not needed")
|
|
48
|
-
else:
|
|
49
|
-
logger.warn(
|
|
50
|
-
f"Invalid mysql dsn: {MySQLUtil.get_dsn()}, assuming live and skipping liveness verification"
|
|
51
|
-
)
|
|
52
|
-
return
|
|
35
|
+
def __init__(self, logger: mlrun.utils.Logger):
|
|
36
|
+
self._logger = logger
|
|
53
37
|
|
|
38
|
+
def wait_for_db_liveness(self, retry_interval=3, timeout=2 * 60):
|
|
39
|
+
self._logger.debug("Waiting for database liveness")
|
|
40
|
+
mysql_dsn_data = self.get_mysql_dsn_data()
|
|
54
41
|
tmp_connection = mlrun.utils.retry_until_successful(
|
|
55
42
|
retry_interval,
|
|
56
43
|
timeout,
|
|
57
|
-
|
|
44
|
+
self._logger,
|
|
58
45
|
True,
|
|
59
46
|
pymysql.connect,
|
|
60
47
|
host=mysql_dsn_data["host"],
|
|
@@ -62,7 +49,7 @@ class MySQLUtil(object):
|
|
|
62
49
|
port=int(mysql_dsn_data["port"]),
|
|
63
50
|
database=mysql_dsn_data["database"],
|
|
64
51
|
)
|
|
65
|
-
|
|
52
|
+
self._logger.debug("Database ready for connection")
|
|
66
53
|
tmp_connection.close()
|
|
67
54
|
|
|
68
55
|
def check_db_has_tables(self):
|
|
@@ -78,6 +65,18 @@ class MySQLUtil(object):
|
|
|
78
65
|
finally:
|
|
79
66
|
connection.close()
|
|
80
67
|
|
|
68
|
+
def set_modes(self, modes):
|
|
69
|
+
if not modes or modes in ["nil", "none"]:
|
|
70
|
+
self._logger.debug("No sql modes were given, bailing", modes=modes)
|
|
71
|
+
return
|
|
72
|
+
connection = self._create_connection()
|
|
73
|
+
try:
|
|
74
|
+
self._logger.debug("Setting sql modes", modes=modes)
|
|
75
|
+
with connection.cursor() as cursor:
|
|
76
|
+
cursor.execute("SET GLOBAL sql_mode=%s;", (modes,))
|
|
77
|
+
finally:
|
|
78
|
+
connection.close()
|
|
79
|
+
|
|
81
80
|
def check_db_has_data(self):
|
|
82
81
|
connection = self._create_connection()
|
|
83
82
|
try:
|
|
@@ -101,10 +100,6 @@ class MySQLUtil(object):
|
|
|
101
100
|
database=mysql_dsn_data["database"],
|
|
102
101
|
)
|
|
103
102
|
|
|
104
|
-
@staticmethod
|
|
105
|
-
def get_dsn() -> str:
|
|
106
|
-
return os.environ.get(MySQLUtil.dsn_env_var, "")
|
|
107
|
-
|
|
108
103
|
@staticmethod
|
|
109
104
|
def get_mysql_dsn_data() -> typing.Optional[dict]:
|
|
110
105
|
match = re.match(MySQLUtil.dsn_regex, MySQLUtil.get_dsn())
|
|
@@ -112,3 +107,7 @@ class MySQLUtil(object):
|
|
|
112
107
|
return None
|
|
113
108
|
|
|
114
109
|
return match.groupdict()
|
|
110
|
+
|
|
111
|
+
@staticmethod
|
|
112
|
+
def get_dsn() -> str:
|
|
113
|
+
return os.environ.get(MySQLUtil.dsn_env_var, "")
|
|
@@ -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.
|
|
@@ -64,7 +64,7 @@ class SQLiteMigrationUtil(object):
|
|
|
64
64
|
self._migrator = self._create_migrator()
|
|
65
65
|
self._mysql_util = None
|
|
66
66
|
if self._mysql_dsn_data:
|
|
67
|
-
self._mysql_util = MySQLUtil()
|
|
67
|
+
self._mysql_util = MySQLUtil(logger)
|
|
68
68
|
|
|
69
69
|
def is_database_migration_needed(self) -> bool:
|
|
70
70
|
# if some data is missing, don't transfer the data
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Copyright 2023 Iguazio
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
#
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Copyright 2023 Iguazio
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
#
|
|
15
|
+
import abc
|
|
16
|
+
import typing
|
|
17
|
+
|
|
18
|
+
import mlrun.common.schemas
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class BaseEventClient:
|
|
22
|
+
@abc.abstractmethod
|
|
23
|
+
def emit(self, event):
|
|
24
|
+
pass
|
|
25
|
+
|
|
26
|
+
def generate_auth_secret_event(
|
|
27
|
+
self,
|
|
28
|
+
username: str,
|
|
29
|
+
secret_name: str,
|
|
30
|
+
action: mlrun.common.schemas.AuthSecretEventActions,
|
|
31
|
+
):
|
|
32
|
+
"""
|
|
33
|
+
Generate an auth secret event
|
|
34
|
+
:param username: username
|
|
35
|
+
:param secret_name: secret name
|
|
36
|
+
:param action: preformed action
|
|
37
|
+
:return: event object to emit
|
|
38
|
+
"""
|
|
39
|
+
pass
|
|
40
|
+
|
|
41
|
+
@abc.abstractmethod
|
|
42
|
+
def generate_project_secret_event(
|
|
43
|
+
self,
|
|
44
|
+
project: str,
|
|
45
|
+
secret_name: str,
|
|
46
|
+
secret_keys: typing.List[str] = None,
|
|
47
|
+
action: mlrun.common.schemas.SecretEventActions = mlrun.common.schemas.SecretEventActions.created,
|
|
48
|
+
):
|
|
49
|
+
"""
|
|
50
|
+
Generate a project secret event
|
|
51
|
+
:param project: project name
|
|
52
|
+
:param secret_name: secret name
|
|
53
|
+
:param secret_keys: secret keys, optional, only relevant for created/updated events
|
|
54
|
+
:param action: preformed action
|
|
55
|
+
:return: event object to emit
|
|
56
|
+
"""
|
|
57
|
+
pass
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Copyright 2023 Iguazio
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
#
|
|
15
|
+
import mlrun.api.utils.events.base
|
|
16
|
+
import mlrun.api.utils.events.iguazio
|
|
17
|
+
import mlrun.api.utils.events.nop
|
|
18
|
+
import mlrun.common.schemas
|
|
19
|
+
import mlrun.utils.singleton
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class EventsFactory(object):
|
|
23
|
+
@staticmethod
|
|
24
|
+
def get_events_client(
|
|
25
|
+
kind: mlrun.common.schemas.EventClientKinds = None, **kwargs
|
|
26
|
+
) -> mlrun.api.utils.events.base.BaseEventClient:
|
|
27
|
+
if mlrun.mlconf.events.mode == mlrun.common.schemas.EventsModes.disabled:
|
|
28
|
+
return mlrun.api.utils.events.nop.NopClient()
|
|
29
|
+
|
|
30
|
+
if not kind:
|
|
31
|
+
if mlrun.mlconf.get_parsed_igz_version():
|
|
32
|
+
kind = mlrun.common.schemas.EventClientKinds.iguazio
|
|
33
|
+
|
|
34
|
+
if kind == mlrun.common.schemas.EventClientKinds.iguazio:
|
|
35
|
+
if not mlrun.mlconf.get_parsed_igz_version():
|
|
36
|
+
raise mlrun.errors.MLRunInvalidArgumentError(
|
|
37
|
+
"Iguazio events client can only be used in Iguazio environment"
|
|
38
|
+
)
|
|
39
|
+
return mlrun.api.utils.events.iguazio.Client(**kwargs)
|
|
40
|
+
|
|
41
|
+
return mlrun.api.utils.events.nop.NopClient()
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
# Copyright 2023 Iguazio
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
#
|
|
15
|
+
import typing
|
|
16
|
+
|
|
17
|
+
import igz_mgmt.schemas.events
|
|
18
|
+
|
|
19
|
+
import mlrun.api.utils.clients.iguazio
|
|
20
|
+
import mlrun.api.utils.events.base as base_events
|
|
21
|
+
import mlrun.common.schemas
|
|
22
|
+
from mlrun.utils import logger
|
|
23
|
+
|
|
24
|
+
PROJECT_AUTH_SECRET_CREATED = "Security.Project.AuthSecret.Created"
|
|
25
|
+
PROJECT_AUTH_SECRET_UPDATED = "Security.Project.AuthSecret.Updated"
|
|
26
|
+
PROJECT_SECRET_CREATED = "Security.Project.Secret.Created"
|
|
27
|
+
PROJECT_SECRET_UPDATED = "Security.Project.Secret.Updated"
|
|
28
|
+
PROJECT_SECRET_DELETED = "Security.Project.Secret.Deleted"
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class Client(base_events.BaseEventClient):
|
|
32
|
+
def __init__(self, access_key: str = None, verbose: bool = None):
|
|
33
|
+
self.access_key = (
|
|
34
|
+
access_key
|
|
35
|
+
or mlrun.mlconf.events.access_key
|
|
36
|
+
or mlrun.mlconf.get_v3io_access_key()
|
|
37
|
+
)
|
|
38
|
+
self.verbose = verbose if verbose is not None else mlrun.mlconf.events.verbose
|
|
39
|
+
self.source = "mlrun-api"
|
|
40
|
+
|
|
41
|
+
def emit(self, event: igz_mgmt.Event):
|
|
42
|
+
try:
|
|
43
|
+
logger.debug("Emitting event", event=event)
|
|
44
|
+
mlrun.api.utils.clients.iguazio.Client().emit_manual_event(
|
|
45
|
+
self.access_key, event
|
|
46
|
+
)
|
|
47
|
+
except Exception as exc:
|
|
48
|
+
if self.verbose:
|
|
49
|
+
logger.warning(
|
|
50
|
+
"Failed to emit event",
|
|
51
|
+
event=event,
|
|
52
|
+
exc_info=exc,
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
def generate_auth_secret_event(
|
|
56
|
+
self,
|
|
57
|
+
username: str,
|
|
58
|
+
secret_name: str,
|
|
59
|
+
action: mlrun.common.schemas.AuthSecretEventActions,
|
|
60
|
+
) -> igz_mgmt.Event:
|
|
61
|
+
"""
|
|
62
|
+
Generate an auth secret event
|
|
63
|
+
:param username: username
|
|
64
|
+
:param secret_name: secret name
|
|
65
|
+
:param action: preformed action
|
|
66
|
+
:return: event object to emit
|
|
67
|
+
"""
|
|
68
|
+
if action == mlrun.common.schemas.SecretEventActions.created:
|
|
69
|
+
return self._generate_auth_secret_created_event(username, secret_name)
|
|
70
|
+
elif action == mlrun.common.schemas.SecretEventActions.updated:
|
|
71
|
+
return self._generate_auth_secret_updated_event(username, secret_name)
|
|
72
|
+
else:
|
|
73
|
+
raise mlrun.errors.MLRunInvalidArgumentError(f"Unsupported action {action}")
|
|
74
|
+
|
|
75
|
+
def generate_project_secret_event(
|
|
76
|
+
self,
|
|
77
|
+
project: str,
|
|
78
|
+
secret_name: str,
|
|
79
|
+
secret_keys: typing.List[str] = None,
|
|
80
|
+
action: mlrun.common.schemas.SecretEventActions = mlrun.common.schemas.SecretEventActions.created,
|
|
81
|
+
) -> igz_mgmt.Event:
|
|
82
|
+
"""
|
|
83
|
+
Generate a project secret event
|
|
84
|
+
:param project: project name
|
|
85
|
+
:param secret_name: secret name
|
|
86
|
+
:param secret_keys: secret keys, optional, only relevant for created/updated events
|
|
87
|
+
:param action: preformed action
|
|
88
|
+
:return: event object to emit
|
|
89
|
+
"""
|
|
90
|
+
if action == mlrun.common.schemas.SecretEventActions.created:
|
|
91
|
+
return self._generate_project_secret_created_event(
|
|
92
|
+
project, secret_name, secret_keys
|
|
93
|
+
)
|
|
94
|
+
elif action == mlrun.common.schemas.SecretEventActions.updated:
|
|
95
|
+
return self._generate_project_secret_updated_event(
|
|
96
|
+
project, secret_name, secret_keys
|
|
97
|
+
)
|
|
98
|
+
elif action == mlrun.common.schemas.SecretEventActions.deleted:
|
|
99
|
+
return self._generate_project_secret_deleted_event(project, secret_name)
|
|
100
|
+
else:
|
|
101
|
+
raise mlrun.errors.MLRunInvalidArgumentError(f"Unsupported action {action}")
|
|
102
|
+
|
|
103
|
+
def _generate_auth_secret_created_event(
|
|
104
|
+
self, username: str, secret_name: str
|
|
105
|
+
) -> igz_mgmt.Event:
|
|
106
|
+
return igz_mgmt.Event(
|
|
107
|
+
source=self.source,
|
|
108
|
+
kind=PROJECT_AUTH_SECRET_CREATED,
|
|
109
|
+
description=f"User {username} created secret {secret_name}",
|
|
110
|
+
parameters_text=[
|
|
111
|
+
igz_mgmt.schemas.events.ParametersText(name="username", value=username),
|
|
112
|
+
igz_mgmt.schemas.events.ParametersText(
|
|
113
|
+
name="secret_name", value=secret_name
|
|
114
|
+
),
|
|
115
|
+
],
|
|
116
|
+
severity=igz_mgmt.constants.EventSeverity.info,
|
|
117
|
+
classification=igz_mgmt.constants.EventClassification.security,
|
|
118
|
+
system_event=False,
|
|
119
|
+
visibility=igz_mgmt.constants.EventVisibility.external,
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
def _generate_auth_secret_updated_event(
|
|
123
|
+
self, username: str, secret_name: str
|
|
124
|
+
) -> igz_mgmt.Event:
|
|
125
|
+
return igz_mgmt.Event(
|
|
126
|
+
source=self.source,
|
|
127
|
+
kind=PROJECT_AUTH_SECRET_UPDATED,
|
|
128
|
+
description=f"User {username} updated secret {secret_name}",
|
|
129
|
+
parameters_text=[
|
|
130
|
+
igz_mgmt.schemas.events.ParametersText(name="username", value=username),
|
|
131
|
+
igz_mgmt.schemas.events.ParametersText(
|
|
132
|
+
name="secret_name", value=secret_name
|
|
133
|
+
),
|
|
134
|
+
],
|
|
135
|
+
severity=igz_mgmt.constants.EventSeverity.info,
|
|
136
|
+
classification=igz_mgmt.constants.EventClassification.security,
|
|
137
|
+
system_event=False,
|
|
138
|
+
visibility=igz_mgmt.constants.EventVisibility.external,
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
def _generate_project_secret_created_event(
|
|
142
|
+
self, project: str, secret_name: str, secret_keys: typing.List[str]
|
|
143
|
+
) -> igz_mgmt.Event:
|
|
144
|
+
normalized_secret_keys = self._list_to_string(secret_keys)
|
|
145
|
+
return igz_mgmt.Event(
|
|
146
|
+
source=self.source,
|
|
147
|
+
kind=PROJECT_SECRET_CREATED,
|
|
148
|
+
parameters_text=[
|
|
149
|
+
igz_mgmt.schemas.events.ParametersText(
|
|
150
|
+
name="project_name", value=project
|
|
151
|
+
),
|
|
152
|
+
igz_mgmt.schemas.events.ParametersText(
|
|
153
|
+
name="secret_name", value=secret_name
|
|
154
|
+
),
|
|
155
|
+
igz_mgmt.schemas.events.ParametersText(
|
|
156
|
+
name="secret_keys", value=normalized_secret_keys
|
|
157
|
+
),
|
|
158
|
+
],
|
|
159
|
+
description=f"Project {project} secret created",
|
|
160
|
+
severity=igz_mgmt.constants.EventSeverity.info,
|
|
161
|
+
classification=igz_mgmt.constants.EventClassification.security,
|
|
162
|
+
system_event=False,
|
|
163
|
+
visibility=igz_mgmt.constants.EventVisibility.external,
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
def _generate_project_secret_updated_event(
|
|
167
|
+
self,
|
|
168
|
+
project: str,
|
|
169
|
+
secret_name: str,
|
|
170
|
+
secret_keys: typing.List[str],
|
|
171
|
+
) -> igz_mgmt.Event:
|
|
172
|
+
normalized_secret_keys = self._list_to_string(secret_keys)
|
|
173
|
+
return igz_mgmt.Event(
|
|
174
|
+
source=self.source,
|
|
175
|
+
kind=PROJECT_SECRET_UPDATED,
|
|
176
|
+
description=f"Project {project} secret updated",
|
|
177
|
+
parameters_text=[
|
|
178
|
+
igz_mgmt.schemas.events.ParametersText(
|
|
179
|
+
name="project_name", value=project
|
|
180
|
+
),
|
|
181
|
+
igz_mgmt.schemas.events.ParametersText(
|
|
182
|
+
name="secret_name", value=secret_name
|
|
183
|
+
),
|
|
184
|
+
igz_mgmt.schemas.events.ParametersText(
|
|
185
|
+
name="secret_keys", value=normalized_secret_keys
|
|
186
|
+
),
|
|
187
|
+
],
|
|
188
|
+
severity=igz_mgmt.constants.EventSeverity.info,
|
|
189
|
+
classification=igz_mgmt.constants.EventClassification.security,
|
|
190
|
+
system_event=False,
|
|
191
|
+
visibility=igz_mgmt.constants.EventVisibility.external,
|
|
192
|
+
)
|
|
193
|
+
|
|
194
|
+
def _generate_project_secret_deleted_event(
|
|
195
|
+
self, project: str, secret_name: str
|
|
196
|
+
) -> igz_mgmt.Event:
|
|
197
|
+
return igz_mgmt.Event(
|
|
198
|
+
source=self.source,
|
|
199
|
+
kind=PROJECT_SECRET_DELETED,
|
|
200
|
+
description=f"Project {project} secret deleted",
|
|
201
|
+
parameters_text=[
|
|
202
|
+
igz_mgmt.schemas.events.ParametersText(
|
|
203
|
+
name="project_name", value=project
|
|
204
|
+
),
|
|
205
|
+
igz_mgmt.schemas.events.ParametersText(
|
|
206
|
+
name="secret_name", value=secret_name
|
|
207
|
+
),
|
|
208
|
+
],
|
|
209
|
+
severity=igz_mgmt.constants.EventSeverity.info,
|
|
210
|
+
classification=igz_mgmt.constants.EventClassification.security,
|
|
211
|
+
system_event=False,
|
|
212
|
+
visibility=igz_mgmt.constants.EventVisibility.external,
|
|
213
|
+
)
|
|
214
|
+
|
|
215
|
+
@staticmethod
|
|
216
|
+
def _list_to_string(list_to_convert: typing.List[str]) -> str:
|
|
217
|
+
return ", ".join(list_to_convert)
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# Copyright 2023 Iguazio
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
#
|
|
15
|
+
import typing
|
|
16
|
+
|
|
17
|
+
import mlrun.api.utils.events.base as base_events
|
|
18
|
+
import mlrun.common.schemas
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class NopClient(base_events.BaseEventClient):
|
|
22
|
+
def emit(self, event):
|
|
23
|
+
return
|
|
24
|
+
|
|
25
|
+
def generate_auth_secret_event(
|
|
26
|
+
self,
|
|
27
|
+
username: str,
|
|
28
|
+
secret_name: str,
|
|
29
|
+
action: mlrun.common.schemas.AuthSecretEventActions,
|
|
30
|
+
):
|
|
31
|
+
"""
|
|
32
|
+
Generate an auth secret event
|
|
33
|
+
:param username: username
|
|
34
|
+
:param secret_name: secret name
|
|
35
|
+
:param action: preformed action
|
|
36
|
+
:return: event object to emit
|
|
37
|
+
"""
|
|
38
|
+
return
|
|
39
|
+
|
|
40
|
+
def generate_project_secret_event(
|
|
41
|
+
self,
|
|
42
|
+
project: str,
|
|
43
|
+
secret_name: str,
|
|
44
|
+
secret_keys: typing.List[str] = None,
|
|
45
|
+
action: mlrun.common.schemas.SecretEventActions = mlrun.common.schemas.SecretEventActions.created,
|
|
46
|
+
):
|
|
47
|
+
"""
|
|
48
|
+
Generate a project secret event
|
|
49
|
+
:param project: project name
|
|
50
|
+
:param secret_name: secret name
|
|
51
|
+
:param secret_keys: secret keys, optional, only relevant for created/updated events
|
|
52
|
+
:param action: preformed action
|
|
53
|
+
:return: event object to emit
|
|
54
|
+
"""
|
|
55
|
+
pass
|
mlrun/api/utils/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.
|
|
@@ -13,22 +13,12 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
#
|
|
15
15
|
import asyncio
|
|
16
|
-
import enum
|
|
17
16
|
|
|
18
17
|
import mlrun
|
|
19
|
-
import mlrun.
|
|
18
|
+
import mlrun.common.schemas
|
|
20
19
|
from mlrun.utils import logger
|
|
21
20
|
|
|
22
21
|
|
|
23
|
-
# TODO: From python 3.11 StrEnum is built-in and this will not be needed
|
|
24
|
-
class StrEnum(str, enum.Enum):
|
|
25
|
-
def __str__(self):
|
|
26
|
-
return self.value
|
|
27
|
-
|
|
28
|
-
def __repr__(self):
|
|
29
|
-
return self.value
|
|
30
|
-
|
|
31
|
-
|
|
32
22
|
def ensure_running_on_chief(function):
|
|
33
23
|
"""
|
|
34
24
|
The motivation of this function is to catch development bugs in which we are accidentally using functions / flows
|
|
@@ -41,7 +31,7 @@ def ensure_running_on_chief(function):
|
|
|
41
31
|
def _ensure_running_on_chief():
|
|
42
32
|
if (
|
|
43
33
|
mlrun.mlconf.httpdb.clusterization.role
|
|
44
|
-
!= mlrun.
|
|
34
|
+
!= mlrun.common.schemas.ClusterizationRole.chief
|
|
45
35
|
):
|
|
46
36
|
if (
|
|
47
37
|
mlrun.mlconf.httpdb.clusterization.ensure_function_running_on_chief_mode
|
|
@@ -67,4 +57,17 @@ def ensure_running_on_chief(function):
|
|
|
67
57
|
|
|
68
58
|
if asyncio.iscoroutinefunction(function):
|
|
69
59
|
return async_wrapper
|
|
60
|
+
|
|
61
|
+
# ensure method name is preserved
|
|
62
|
+
wrapper.__name__ = function.__name__
|
|
63
|
+
|
|
70
64
|
return wrapper
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def minimize_project_schema(
|
|
68
|
+
project: mlrun.common.schemas.Project,
|
|
69
|
+
) -> mlrun.common.schemas.Project:
|
|
70
|
+
project.spec.functions = None
|
|
71
|
+
project.spec.workflows = None
|
|
72
|
+
project.spec.artifacts = None
|
|
73
|
+
return project
|
mlrun/api/utils/periodic.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.
|
|
@@ -34,9 +34,12 @@ async def _periodic_function_wrapper(interval: int, function, *args, **kwargs):
|
|
|
34
34
|
await function(*args, **kwargs)
|
|
35
35
|
else:
|
|
36
36
|
await run_in_threadpool(function, *args, **kwargs)
|
|
37
|
-
except Exception:
|
|
37
|
+
except Exception as exc:
|
|
38
38
|
logger.warning(
|
|
39
|
-
|
|
39
|
+
"Failed during periodic function execution",
|
|
40
|
+
func_name=function.__name__,
|
|
41
|
+
exc=mlrun.errors.err_to_str(exc),
|
|
42
|
+
tb=traceback.format_exc(),
|
|
40
43
|
)
|
|
41
44
|
await asyncio.sleep(interval)
|
|
42
45
|
|