oracle-ads 2.13.9rc0__py3-none-any.whl → 2.13.10rc0__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.
- ads/aqua/__init__.py +40 -0
- ads/aqua/app.py +507 -0
- ads/aqua/cli.py +96 -0
- ads/aqua/client/__init__.py +3 -0
- ads/aqua/client/client.py +836 -0
- ads/aqua/client/openai_client.py +305 -0
- ads/aqua/common/__init__.py +5 -0
- ads/aqua/common/decorator.py +125 -0
- ads/aqua/common/entities.py +274 -0
- ads/aqua/common/enums.py +134 -0
- ads/aqua/common/errors.py +109 -0
- ads/aqua/common/utils.py +1295 -0
- ads/aqua/config/__init__.py +4 -0
- ads/aqua/config/container_config.py +247 -0
- ads/aqua/config/evaluation/__init__.py +4 -0
- ads/aqua/config/evaluation/evaluation_service_config.py +147 -0
- ads/aqua/config/utils/__init__.py +4 -0
- ads/aqua/config/utils/serializer.py +339 -0
- ads/aqua/constants.py +116 -0
- ads/aqua/data.py +14 -0
- ads/aqua/dummy_data/icon.txt +1 -0
- ads/aqua/dummy_data/oci_model_deployments.json +56 -0
- ads/aqua/dummy_data/oci_models.json +1 -0
- ads/aqua/dummy_data/readme.md +26 -0
- ads/aqua/evaluation/__init__.py +8 -0
- ads/aqua/evaluation/constants.py +53 -0
- ads/aqua/evaluation/entities.py +186 -0
- ads/aqua/evaluation/errors.py +70 -0
- ads/aqua/evaluation/evaluation.py +1814 -0
- ads/aqua/extension/__init__.py +42 -0
- ads/aqua/extension/aqua_ws_msg_handler.py +76 -0
- ads/aqua/extension/base_handler.py +90 -0
- ads/aqua/extension/common_handler.py +121 -0
- ads/aqua/extension/common_ws_msg_handler.py +36 -0
- ads/aqua/extension/deployment_handler.py +381 -0
- ads/aqua/extension/deployment_ws_msg_handler.py +54 -0
- ads/aqua/extension/errors.py +30 -0
- ads/aqua/extension/evaluation_handler.py +129 -0
- ads/aqua/extension/evaluation_ws_msg_handler.py +61 -0
- ads/aqua/extension/finetune_handler.py +96 -0
- ads/aqua/extension/model_handler.py +390 -0
- ads/aqua/extension/models/__init__.py +0 -0
- ads/aqua/extension/models/ws_models.py +145 -0
- ads/aqua/extension/models_ws_msg_handler.py +50 -0
- ads/aqua/extension/ui_handler.py +300 -0
- ads/aqua/extension/ui_websocket_handler.py +130 -0
- ads/aqua/extension/utils.py +133 -0
- ads/aqua/finetuning/__init__.py +7 -0
- ads/aqua/finetuning/constants.py +23 -0
- ads/aqua/finetuning/entities.py +181 -0
- ads/aqua/finetuning/finetuning.py +749 -0
- ads/aqua/model/__init__.py +8 -0
- ads/aqua/model/constants.py +60 -0
- ads/aqua/model/entities.py +385 -0
- ads/aqua/model/enums.py +32 -0
- ads/aqua/model/model.py +2134 -0
- ads/aqua/model/utils.py +52 -0
- ads/aqua/modeldeployment/__init__.py +6 -0
- ads/aqua/modeldeployment/constants.py +10 -0
- ads/aqua/modeldeployment/deployment.py +1315 -0
- ads/aqua/modeldeployment/entities.py +653 -0
- ads/aqua/modeldeployment/utils.py +543 -0
- ads/aqua/resources/gpu_shapes_index.json +94 -0
- ads/aqua/server/__init__.py +4 -0
- ads/aqua/server/__main__.py +24 -0
- ads/aqua/server/app.py +47 -0
- ads/aqua/server/aqua_spec.yml +1291 -0
- ads/aqua/training/__init__.py +4 -0
- ads/aqua/training/exceptions.py +476 -0
- ads/aqua/ui.py +519 -0
- ads/automl/__init__.py +9 -0
- ads/automl/driver.py +330 -0
- ads/automl/provider.py +975 -0
- ads/bds/__init__.py +5 -0
- ads/bds/auth.py +127 -0
- ads/bds/big_data_service.py +255 -0
- ads/catalog/__init__.py +19 -0
- ads/catalog/model.py +1576 -0
- ads/catalog/notebook.py +461 -0
- ads/catalog/project.py +468 -0
- ads/catalog/summary.py +178 -0
- ads/common/__init__.py +11 -0
- ads/common/analyzer.py +65 -0
- ads/common/artifact/.model-ignore +63 -0
- ads/common/artifact/__init__.py +10 -0
- ads/common/auth.py +1122 -0
- ads/common/card_identifier.py +83 -0
- ads/common/config.py +647 -0
- ads/common/data.py +165 -0
- ads/common/decorator/__init__.py +9 -0
- ads/common/decorator/argument_to_case.py +88 -0
- ads/common/decorator/deprecate.py +69 -0
- ads/common/decorator/require_nonempty_arg.py +65 -0
- ads/common/decorator/runtime_dependency.py +178 -0
- ads/common/decorator/threaded.py +97 -0
- ads/common/decorator/utils.py +35 -0
- ads/common/dsc_file_system.py +303 -0
- ads/common/error.py +14 -0
- ads/common/extended_enum.py +81 -0
- ads/common/function/__init__.py +5 -0
- ads/common/function/fn_util.py +142 -0
- ads/common/function/func_conf.yaml +25 -0
- ads/common/ipython.py +76 -0
- ads/common/model.py +679 -0
- ads/common/model_artifact.py +1759 -0
- ads/common/model_artifact_schema.json +107 -0
- ads/common/model_export_util.py +664 -0
- ads/common/model_metadata.py +24 -0
- ads/common/object_storage_details.py +296 -0
- ads/common/oci_client.py +179 -0
- ads/common/oci_datascience.py +46 -0
- ads/common/oci_logging.py +1144 -0
- ads/common/oci_mixin.py +957 -0
- ads/common/oci_resource.py +136 -0
- ads/common/serializer.py +559 -0
- ads/common/utils.py +1852 -0
- ads/common/word_lists.py +1491 -0
- ads/common/work_request.py +189 -0
- ads/config.py +1 -0
- ads/data_labeling/__init__.py +13 -0
- ads/data_labeling/boundingbox.py +253 -0
- ads/data_labeling/constants.py +47 -0
- ads/data_labeling/data_labeling_service.py +244 -0
- ads/data_labeling/interface/__init__.py +5 -0
- ads/data_labeling/interface/loader.py +16 -0
- ads/data_labeling/interface/parser.py +16 -0
- ads/data_labeling/interface/reader.py +23 -0
- ads/data_labeling/loader/__init__.py +5 -0
- ads/data_labeling/loader/file_loader.py +241 -0
- ads/data_labeling/metadata.py +110 -0
- ads/data_labeling/mixin/__init__.py +5 -0
- ads/data_labeling/mixin/data_labeling.py +232 -0
- ads/data_labeling/ner.py +129 -0
- ads/data_labeling/parser/__init__.py +5 -0
- ads/data_labeling/parser/dls_record_parser.py +388 -0
- ads/data_labeling/parser/export_metadata_parser.py +94 -0
- ads/data_labeling/parser/export_record_parser.py +473 -0
- ads/data_labeling/reader/__init__.py +5 -0
- ads/data_labeling/reader/dataset_reader.py +574 -0
- ads/data_labeling/reader/dls_record_reader.py +121 -0
- ads/data_labeling/reader/export_record_reader.py +62 -0
- ads/data_labeling/reader/jsonl_reader.py +75 -0
- ads/data_labeling/reader/metadata_reader.py +203 -0
- ads/data_labeling/reader/record_reader.py +263 -0
- ads/data_labeling/record.py +52 -0
- ads/data_labeling/visualizer/__init__.py +5 -0
- ads/data_labeling/visualizer/image_visualizer.py +525 -0
- ads/data_labeling/visualizer/text_visualizer.py +357 -0
- ads/database/__init__.py +5 -0
- ads/database/connection.py +338 -0
- ads/dataset/__init__.py +10 -0
- ads/dataset/capabilities.md +51 -0
- ads/dataset/classification_dataset.py +339 -0
- ads/dataset/correlation.py +226 -0
- ads/dataset/correlation_plot.py +563 -0
- ads/dataset/dask_series.py +173 -0
- ads/dataset/dataframe_transformer.py +110 -0
- ads/dataset/dataset.py +1979 -0
- ads/dataset/dataset_browser.py +360 -0
- ads/dataset/dataset_with_target.py +995 -0
- ads/dataset/exception.py +25 -0
- ads/dataset/factory.py +987 -0
- ads/dataset/feature_engineering_transformer.py +35 -0
- ads/dataset/feature_selection.py +107 -0
- ads/dataset/forecasting_dataset.py +26 -0
- ads/dataset/helper.py +1450 -0
- ads/dataset/label_encoder.py +99 -0
- ads/dataset/mixin/__init__.py +5 -0
- ads/dataset/mixin/dataset_accessor.py +134 -0
- ads/dataset/pipeline.py +58 -0
- ads/dataset/plot.py +710 -0
- ads/dataset/progress.py +86 -0
- ads/dataset/recommendation.py +297 -0
- ads/dataset/recommendation_transformer.py +502 -0
- ads/dataset/regression_dataset.py +14 -0
- ads/dataset/sampled_dataset.py +1050 -0
- ads/dataset/target.py +98 -0
- ads/dataset/timeseries.py +18 -0
- ads/dbmixin/__init__.py +5 -0
- ads/dbmixin/db_pandas_accessor.py +153 -0
- ads/environment/__init__.py +9 -0
- ads/environment/ml_runtime.py +66 -0
- ads/evaluations/README.md +14 -0
- ads/evaluations/__init__.py +109 -0
- ads/evaluations/evaluation_plot.py +983 -0
- ads/evaluations/evaluator.py +1334 -0
- ads/evaluations/statistical_metrics.py +543 -0
- ads/experiments/__init__.py +9 -0
- ads/experiments/capabilities.md +0 -0
- ads/explanations/__init__.py +21 -0
- ads/explanations/base_explainer.py +142 -0
- ads/explanations/capabilities.md +83 -0
- ads/explanations/explainer.py +190 -0
- ads/explanations/mlx_global_explainer.py +1050 -0
- ads/explanations/mlx_interface.py +386 -0
- ads/explanations/mlx_local_explainer.py +287 -0
- ads/explanations/mlx_whatif_explainer.py +201 -0
- ads/feature_engineering/__init__.py +20 -0
- ads/feature_engineering/accessor/__init__.py +5 -0
- ads/feature_engineering/accessor/dataframe_accessor.py +535 -0
- ads/feature_engineering/accessor/mixin/__init__.py +5 -0
- ads/feature_engineering/accessor/mixin/correlation.py +166 -0
- ads/feature_engineering/accessor/mixin/eda_mixin.py +266 -0
- ads/feature_engineering/accessor/mixin/eda_mixin_series.py +85 -0
- ads/feature_engineering/accessor/mixin/feature_types_mixin.py +211 -0
- ads/feature_engineering/accessor/mixin/utils.py +65 -0
- ads/feature_engineering/accessor/series_accessor.py +431 -0
- ads/feature_engineering/adsimage/__init__.py +5 -0
- ads/feature_engineering/adsimage/image.py +192 -0
- ads/feature_engineering/adsimage/image_reader.py +170 -0
- ads/feature_engineering/adsimage/interface/__init__.py +5 -0
- ads/feature_engineering/adsimage/interface/reader.py +19 -0
- ads/feature_engineering/adsstring/__init__.py +7 -0
- ads/feature_engineering/adsstring/oci_language/__init__.py +8 -0
- ads/feature_engineering/adsstring/string/__init__.py +8 -0
- ads/feature_engineering/data_schema.json +57 -0
- ads/feature_engineering/dataset/__init__.py +5 -0
- ads/feature_engineering/dataset/zip_code_data.py +42062 -0
- ads/feature_engineering/exceptions.py +40 -0
- ads/feature_engineering/feature_type/__init__.py +133 -0
- ads/feature_engineering/feature_type/address.py +184 -0
- ads/feature_engineering/feature_type/adsstring/__init__.py +5 -0
- ads/feature_engineering/feature_type/adsstring/common_regex_mixin.py +164 -0
- ads/feature_engineering/feature_type/adsstring/oci_language.py +93 -0
- ads/feature_engineering/feature_type/adsstring/parsers/__init__.py +5 -0
- ads/feature_engineering/feature_type/adsstring/parsers/base.py +47 -0
- ads/feature_engineering/feature_type/adsstring/parsers/nltk_parser.py +96 -0
- ads/feature_engineering/feature_type/adsstring/parsers/spacy_parser.py +221 -0
- ads/feature_engineering/feature_type/adsstring/string.py +258 -0
- ads/feature_engineering/feature_type/base.py +58 -0
- ads/feature_engineering/feature_type/boolean.py +183 -0
- ads/feature_engineering/feature_type/category.py +146 -0
- ads/feature_engineering/feature_type/constant.py +137 -0
- ads/feature_engineering/feature_type/continuous.py +151 -0
- ads/feature_engineering/feature_type/creditcard.py +314 -0
- ads/feature_engineering/feature_type/datetime.py +190 -0
- ads/feature_engineering/feature_type/discrete.py +134 -0
- ads/feature_engineering/feature_type/document.py +43 -0
- ads/feature_engineering/feature_type/gis.py +251 -0
- ads/feature_engineering/feature_type/handler/__init__.py +5 -0
- ads/feature_engineering/feature_type/handler/feature_validator.py +524 -0
- ads/feature_engineering/feature_type/handler/feature_warning.py +319 -0
- ads/feature_engineering/feature_type/handler/warnings.py +128 -0
- ads/feature_engineering/feature_type/integer.py +142 -0
- ads/feature_engineering/feature_type/ip_address.py +144 -0
- ads/feature_engineering/feature_type/ip_address_v4.py +138 -0
- ads/feature_engineering/feature_type/ip_address_v6.py +138 -0
- ads/feature_engineering/feature_type/lat_long.py +256 -0
- ads/feature_engineering/feature_type/object.py +43 -0
- ads/feature_engineering/feature_type/ordinal.py +132 -0
- ads/feature_engineering/feature_type/phone_number.py +135 -0
- ads/feature_engineering/feature_type/string.py +171 -0
- ads/feature_engineering/feature_type/text.py +93 -0
- ads/feature_engineering/feature_type/unknown.py +43 -0
- ads/feature_engineering/feature_type/zip_code.py +164 -0
- ads/feature_engineering/feature_type_manager.py +406 -0
- ads/feature_engineering/schema.py +795 -0
- ads/feature_engineering/utils.py +245 -0
- ads/feature_store/.readthedocs.yaml +19 -0
- ads/feature_store/README.md +65 -0
- ads/feature_store/__init__.py +9 -0
- ads/feature_store/common/__init__.py +0 -0
- ads/feature_store/common/enums.py +339 -0
- ads/feature_store/common/exceptions.py +18 -0
- ads/feature_store/common/spark_session_singleton.py +125 -0
- ads/feature_store/common/utils/__init__.py +0 -0
- ads/feature_store/common/utils/base64_encoder_decoder.py +72 -0
- ads/feature_store/common/utils/feature_schema_mapper.py +283 -0
- ads/feature_store/common/utils/transformation_utils.py +82 -0
- ads/feature_store/common/utils/utility.py +403 -0
- ads/feature_store/data_validation/__init__.py +0 -0
- ads/feature_store/data_validation/great_expectation.py +129 -0
- ads/feature_store/dataset.py +1230 -0
- ads/feature_store/dataset_job.py +530 -0
- ads/feature_store/docs/Dockerfile +7 -0
- ads/feature_store/docs/Makefile +44 -0
- ads/feature_store/docs/conf.py +28 -0
- ads/feature_store/docs/requirements.txt +14 -0
- ads/feature_store/docs/source/ads.feature_store.query.rst +20 -0
- ads/feature_store/docs/source/cicd.rst +137 -0
- ads/feature_store/docs/source/conf.py +86 -0
- ads/feature_store/docs/source/data_versioning.rst +33 -0
- ads/feature_store/docs/source/dataset.rst +388 -0
- ads/feature_store/docs/source/dataset_job.rst +27 -0
- ads/feature_store/docs/source/demo.rst +70 -0
- ads/feature_store/docs/source/entity.rst +78 -0
- ads/feature_store/docs/source/feature_group.rst +624 -0
- ads/feature_store/docs/source/feature_group_job.rst +29 -0
- ads/feature_store/docs/source/feature_store.rst +122 -0
- ads/feature_store/docs/source/feature_store_class.rst +123 -0
- ads/feature_store/docs/source/feature_validation.rst +66 -0
- ads/feature_store/docs/source/figures/cicd.png +0 -0
- ads/feature_store/docs/source/figures/data_validation.png +0 -0
- ads/feature_store/docs/source/figures/data_versioning.png +0 -0
- ads/feature_store/docs/source/figures/dataset.gif +0 -0
- ads/feature_store/docs/source/figures/dataset.png +0 -0
- ads/feature_store/docs/source/figures/dataset_lineage.png +0 -0
- ads/feature_store/docs/source/figures/dataset_statistics.png +0 -0
- ads/feature_store/docs/source/figures/dataset_statistics_viz.png +0 -0
- ads/feature_store/docs/source/figures/dataset_validation_results.png +0 -0
- ads/feature_store/docs/source/figures/dataset_validation_summary.png +0 -0
- ads/feature_store/docs/source/figures/drift_monitoring.png +0 -0
- ads/feature_store/docs/source/figures/entity.png +0 -0
- ads/feature_store/docs/source/figures/feature_group.png +0 -0
- ads/feature_store/docs/source/figures/feature_group_lineage.png +0 -0
- ads/feature_store/docs/source/figures/feature_group_statistics_viz.png +0 -0
- ads/feature_store/docs/source/figures/feature_store_deployment.png +0 -0
- ads/feature_store/docs/source/figures/feature_store_overview.png +0 -0
- ads/feature_store/docs/source/figures/featuregroup.gif +0 -0
- ads/feature_store/docs/source/figures/lineage_d1.png +0 -0
- ads/feature_store/docs/source/figures/lineage_d2.png +0 -0
- ads/feature_store/docs/source/figures/lineage_fg.png +0 -0
- ads/feature_store/docs/source/figures/logo-dark-mode.png +0 -0
- ads/feature_store/docs/source/figures/logo-light-mode.png +0 -0
- ads/feature_store/docs/source/figures/overview.png +0 -0
- ads/feature_store/docs/source/figures/resource_manager.png +0 -0
- ads/feature_store/docs/source/figures/resource_manager_feature_store_stack.png +0 -0
- ads/feature_store/docs/source/figures/resource_manager_home.png +0 -0
- ads/feature_store/docs/source/figures/stats_1.png +0 -0
- ads/feature_store/docs/source/figures/stats_2.png +0 -0
- ads/feature_store/docs/source/figures/stats_d.png +0 -0
- ads/feature_store/docs/source/figures/stats_fg.png +0 -0
- ads/feature_store/docs/source/figures/transformation.png +0 -0
- ads/feature_store/docs/source/figures/transformations.gif +0 -0
- ads/feature_store/docs/source/figures/validation.png +0 -0
- ads/feature_store/docs/source/figures/validation_fg.png +0 -0
- ads/feature_store/docs/source/figures/validation_results.png +0 -0
- ads/feature_store/docs/source/figures/validation_summary.png +0 -0
- ads/feature_store/docs/source/index.rst +81 -0
- ads/feature_store/docs/source/module.rst +8 -0
- ads/feature_store/docs/source/notebook.rst +94 -0
- ads/feature_store/docs/source/overview.rst +47 -0
- ads/feature_store/docs/source/quickstart.rst +176 -0
- ads/feature_store/docs/source/release_notes.rst +194 -0
- ads/feature_store/docs/source/setup_feature_store.rst +81 -0
- ads/feature_store/docs/source/statistics.rst +58 -0
- ads/feature_store/docs/source/transformation.rst +199 -0
- ads/feature_store/docs/source/ui.rst +65 -0
- ads/feature_store/docs/source/user_guides.setup.feature_store_operator.rst +66 -0
- ads/feature_store/docs/source/user_guides.setup.helm_chart.rst +192 -0
- ads/feature_store/docs/source/user_guides.setup.terraform.rst +338 -0
- ads/feature_store/entity.py +718 -0
- ads/feature_store/execution_strategy/__init__.py +0 -0
- ads/feature_store/execution_strategy/delta_lake/__init__.py +0 -0
- ads/feature_store/execution_strategy/delta_lake/delta_lake_service.py +375 -0
- ads/feature_store/execution_strategy/engine/__init__.py +0 -0
- ads/feature_store/execution_strategy/engine/spark_engine.py +316 -0
- ads/feature_store/execution_strategy/execution_strategy.py +113 -0
- ads/feature_store/execution_strategy/execution_strategy_provider.py +47 -0
- ads/feature_store/execution_strategy/spark/__init__.py +0 -0
- ads/feature_store/execution_strategy/spark/spark_execution.py +618 -0
- ads/feature_store/feature.py +192 -0
- ads/feature_store/feature_group.py +1494 -0
- ads/feature_store/feature_group_expectation.py +346 -0
- ads/feature_store/feature_group_job.py +602 -0
- ads/feature_store/feature_lineage/__init__.py +0 -0
- ads/feature_store/feature_lineage/graphviz_service.py +180 -0
- ads/feature_store/feature_option_details.py +50 -0
- ads/feature_store/feature_statistics/__init__.py +0 -0
- ads/feature_store/feature_statistics/statistics_service.py +99 -0
- ads/feature_store/feature_store.py +699 -0
- ads/feature_store/feature_store_registrar.py +518 -0
- ads/feature_store/input_feature_detail.py +149 -0
- ads/feature_store/mixin/__init__.py +4 -0
- ads/feature_store/mixin/oci_feature_store.py +145 -0
- ads/feature_store/model_details.py +73 -0
- ads/feature_store/query/__init__.py +0 -0
- ads/feature_store/query/filter.py +266 -0
- ads/feature_store/query/generator/__init__.py +0 -0
- ads/feature_store/query/generator/query_generator.py +298 -0
- ads/feature_store/query/join.py +161 -0
- ads/feature_store/query/query.py +403 -0
- ads/feature_store/query/validator/__init__.py +0 -0
- ads/feature_store/query/validator/query_validator.py +57 -0
- ads/feature_store/response/__init__.py +0 -0
- ads/feature_store/response/response_builder.py +68 -0
- ads/feature_store/service/__init__.py +0 -0
- ads/feature_store/service/oci_dataset.py +139 -0
- ads/feature_store/service/oci_dataset_job.py +199 -0
- ads/feature_store/service/oci_entity.py +125 -0
- ads/feature_store/service/oci_feature_group.py +164 -0
- ads/feature_store/service/oci_feature_group_job.py +214 -0
- ads/feature_store/service/oci_feature_store.py +182 -0
- ads/feature_store/service/oci_lineage.py +87 -0
- ads/feature_store/service/oci_transformation.py +104 -0
- ads/feature_store/statistics/__init__.py +0 -0
- ads/feature_store/statistics/abs_feature_value.py +49 -0
- ads/feature_store/statistics/charts/__init__.py +0 -0
- ads/feature_store/statistics/charts/abstract_feature_plot.py +37 -0
- ads/feature_store/statistics/charts/box_plot.py +148 -0
- ads/feature_store/statistics/charts/frequency_distribution.py +65 -0
- ads/feature_store/statistics/charts/probability_distribution.py +68 -0
- ads/feature_store/statistics/charts/top_k_frequent_elements.py +98 -0
- ads/feature_store/statistics/feature_stat.py +126 -0
- ads/feature_store/statistics/generic_feature_value.py +33 -0
- ads/feature_store/statistics/statistics.py +41 -0
- ads/feature_store/statistics_config.py +101 -0
- ads/feature_store/templates/feature_store_template.yaml +45 -0
- ads/feature_store/transformation.py +499 -0
- ads/feature_store/validation_output.py +57 -0
- ads/hpo/__init__.py +9 -0
- ads/hpo/_imports.py +91 -0
- ads/hpo/ads_search_space.py +439 -0
- ads/hpo/distributions.py +325 -0
- ads/hpo/objective.py +280 -0
- ads/hpo/search_cv.py +1657 -0
- ads/hpo/stopping_criterion.py +75 -0
- ads/hpo/tuner_artifact.py +413 -0
- ads/hpo/utils.py +91 -0
- ads/hpo/validation.py +140 -0
- ads/hpo/visualization/__init__.py +5 -0
- ads/hpo/visualization/_contour.py +23 -0
- ads/hpo/visualization/_edf.py +20 -0
- ads/hpo/visualization/_intermediate_values.py +21 -0
- ads/hpo/visualization/_optimization_history.py +25 -0
- ads/hpo/visualization/_parallel_coordinate.py +169 -0
- ads/hpo/visualization/_param_importances.py +26 -0
- ads/jobs/__init__.py +53 -0
- ads/jobs/ads_job.py +663 -0
- ads/jobs/builders/__init__.py +5 -0
- ads/jobs/builders/base.py +156 -0
- ads/jobs/builders/infrastructure/__init__.py +6 -0
- ads/jobs/builders/infrastructure/base.py +165 -0
- ads/jobs/builders/infrastructure/dataflow.py +1252 -0
- ads/jobs/builders/infrastructure/dsc_job.py +1894 -0
- ads/jobs/builders/infrastructure/dsc_job_runtime.py +1233 -0
- ads/jobs/builders/infrastructure/utils.py +65 -0
- ads/jobs/builders/runtimes/__init__.py +5 -0
- ads/jobs/builders/runtimes/artifact.py +338 -0
- ads/jobs/builders/runtimes/base.py +325 -0
- ads/jobs/builders/runtimes/container_runtime.py +242 -0
- ads/jobs/builders/runtimes/python_runtime.py +1016 -0
- ads/jobs/builders/runtimes/pytorch_runtime.py +204 -0
- ads/jobs/cli.py +104 -0
- ads/jobs/env_var_parser.py +131 -0
- ads/jobs/extension.py +160 -0
- ads/jobs/schema/__init__.py +5 -0
- ads/jobs/schema/infrastructure_schema.json +116 -0
- ads/jobs/schema/job_schema.json +42 -0
- ads/jobs/schema/runtime_schema.json +183 -0
- ads/jobs/schema/validator.py +141 -0
- ads/jobs/serializer.py +296 -0
- ads/jobs/templates/__init__.py +5 -0
- ads/jobs/templates/container.py +6 -0
- ads/jobs/templates/driver_notebook.py +177 -0
- ads/jobs/templates/driver_oci.py +500 -0
- ads/jobs/templates/driver_python.py +48 -0
- ads/jobs/templates/driver_pytorch.py +852 -0
- ads/jobs/templates/driver_utils.py +615 -0
- ads/jobs/templates/hostname_from_env.c +55 -0
- ads/jobs/templates/oci_metrics.py +181 -0
- ads/jobs/utils.py +104 -0
- ads/llm/__init__.py +28 -0
- ads/llm/autogen/__init__.py +2 -0
- ads/llm/autogen/constants.py +15 -0
- ads/llm/autogen/reports/__init__.py +2 -0
- ads/llm/autogen/reports/base.py +67 -0
- ads/llm/autogen/reports/data.py +103 -0
- ads/llm/autogen/reports/session.py +526 -0
- ads/llm/autogen/reports/templates/chat_box.html +13 -0
- ads/llm/autogen/reports/templates/chat_box_lt.html +5 -0
- ads/llm/autogen/reports/templates/chat_box_rt.html +6 -0
- ads/llm/autogen/reports/utils.py +56 -0
- ads/llm/autogen/v02/__init__.py +4 -0
- ads/llm/autogen/v02/client.py +295 -0
- ads/llm/autogen/v02/log_handlers/__init__.py +2 -0
- ads/llm/autogen/v02/log_handlers/oci_file_handler.py +83 -0
- ads/llm/autogen/v02/loggers/__init__.py +6 -0
- ads/llm/autogen/v02/loggers/metric_logger.py +320 -0
- ads/llm/autogen/v02/loggers/session_logger.py +580 -0
- ads/llm/autogen/v02/loggers/utils.py +86 -0
- ads/llm/autogen/v02/runtime_logging.py +163 -0
- ads/llm/chain.py +268 -0
- ads/llm/chat_template.py +31 -0
- ads/llm/deploy.py +63 -0
- ads/llm/guardrails/__init__.py +5 -0
- ads/llm/guardrails/base.py +442 -0
- ads/llm/guardrails/huggingface.py +44 -0
- ads/llm/langchain/__init__.py +5 -0
- ads/llm/langchain/plugins/__init__.py +5 -0
- ads/llm/langchain/plugins/chat_models/__init__.py +5 -0
- ads/llm/langchain/plugins/chat_models/oci_data_science.py +1027 -0
- ads/llm/langchain/plugins/embeddings/__init__.py +4 -0
- ads/llm/langchain/plugins/embeddings/oci_data_science_model_deployment_endpoint.py +184 -0
- ads/llm/langchain/plugins/llms/__init__.py +5 -0
- ads/llm/langchain/plugins/llms/oci_data_science_model_deployment_endpoint.py +979 -0
- ads/llm/requirements.txt +3 -0
- ads/llm/serialize.py +219 -0
- ads/llm/serializers/__init__.py +0 -0
- ads/llm/serializers/retrieval_qa.py +153 -0
- ads/llm/serializers/runnable_parallel.py +27 -0
- ads/llm/templates/score_chain.jinja2 +155 -0
- ads/llm/templates/tool_chat_template_hermes.jinja +130 -0
- ads/llm/templates/tool_chat_template_mistral_parallel.jinja +94 -0
- ads/model/__init__.py +52 -0
- ads/model/artifact.py +573 -0
- ads/model/artifact_downloader.py +254 -0
- ads/model/artifact_uploader.py +267 -0
- ads/model/base_properties.py +238 -0
- ads/model/common/.model-ignore +66 -0
- ads/model/common/__init__.py +5 -0
- ads/model/common/utils.py +142 -0
- ads/model/datascience_model.py +2635 -0
- ads/model/deployment/__init__.py +20 -0
- ads/model/deployment/common/__init__.py +5 -0
- ads/model/deployment/common/utils.py +308 -0
- ads/model/deployment/model_deployer.py +466 -0
- ads/model/deployment/model_deployment.py +1846 -0
- ads/model/deployment/model_deployment_infrastructure.py +671 -0
- ads/model/deployment/model_deployment_properties.py +493 -0
- ads/model/deployment/model_deployment_runtime.py +838 -0
- ads/model/extractor/__init__.py +5 -0
- ads/model/extractor/automl_extractor.py +74 -0
- ads/model/extractor/embedding_onnx_extractor.py +80 -0
- ads/model/extractor/huggingface_extractor.py +88 -0
- ads/model/extractor/keras_extractor.py +84 -0
- ads/model/extractor/lightgbm_extractor.py +93 -0
- ads/model/extractor/model_info_extractor.py +114 -0
- ads/model/extractor/model_info_extractor_factory.py +105 -0
- ads/model/extractor/pytorch_extractor.py +87 -0
- ads/model/extractor/sklearn_extractor.py +112 -0
- ads/model/extractor/spark_extractor.py +89 -0
- ads/model/extractor/tensorflow_extractor.py +85 -0
- ads/model/extractor/xgboost_extractor.py +94 -0
- ads/model/framework/__init__.py +5 -0
- ads/model/framework/automl_model.py +178 -0
- ads/model/framework/embedding_onnx_model.py +438 -0
- ads/model/framework/huggingface_model.py +399 -0
- ads/model/framework/lightgbm_model.py +266 -0
- ads/model/framework/pytorch_model.py +266 -0
- ads/model/framework/sklearn_model.py +250 -0
- ads/model/framework/spark_model.py +326 -0
- ads/model/framework/tensorflow_model.py +254 -0
- ads/model/framework/xgboost_model.py +258 -0
- ads/model/generic_model.py +3518 -0
- ads/model/model_artifact_boilerplate/README.md +381 -0
- ads/model/model_artifact_boilerplate/__init__.py +5 -0
- ads/model/model_artifact_boilerplate/artifact_introspection_test/__init__.py +5 -0
- ads/model/model_artifact_boilerplate/artifact_introspection_test/model_artifact_validate.py +427 -0
- ads/model/model_artifact_boilerplate/artifact_introspection_test/requirements.txt +2 -0
- ads/model/model_artifact_boilerplate/runtime.yaml +7 -0
- ads/model/model_artifact_boilerplate/score.py +61 -0
- ads/model/model_file_description_schema.json +68 -0
- ads/model/model_introspect.py +331 -0
- ads/model/model_metadata.py +1810 -0
- ads/model/model_metadata_mixin.py +460 -0
- ads/model/model_properties.py +63 -0
- ads/model/model_version_set.py +739 -0
- ads/model/runtime/__init__.py +5 -0
- ads/model/runtime/env_info.py +306 -0
- ads/model/runtime/model_deployment_details.py +37 -0
- ads/model/runtime/model_provenance_details.py +58 -0
- ads/model/runtime/runtime_info.py +81 -0
- ads/model/runtime/schemas/inference_env_info_schema.yaml +16 -0
- ads/model/runtime/schemas/model_provenance_schema.yaml +36 -0
- ads/model/runtime/schemas/training_env_info_schema.yaml +16 -0
- ads/model/runtime/utils.py +201 -0
- ads/model/serde/__init__.py +5 -0
- ads/model/serde/common.py +40 -0
- ads/model/serde/model_input.py +547 -0
- ads/model/serde/model_serializer.py +1184 -0
- ads/model/service/__init__.py +5 -0
- ads/model/service/oci_datascience_model.py +1076 -0
- ads/model/service/oci_datascience_model_deployment.py +500 -0
- ads/model/service/oci_datascience_model_version_set.py +176 -0
- ads/model/transformer/__init__.py +5 -0
- ads/model/transformer/onnx_transformer.py +324 -0
- ads/mysqldb/__init__.py +5 -0
- ads/mysqldb/mysql_db.py +227 -0
- ads/opctl/__init__.py +18 -0
- ads/opctl/anomaly_detection.py +11 -0
- ads/opctl/backend/__init__.py +5 -0
- ads/opctl/backend/ads_dataflow.py +353 -0
- ads/opctl/backend/ads_ml_job.py +710 -0
- ads/opctl/backend/ads_ml_pipeline.py +164 -0
- ads/opctl/backend/ads_model_deployment.py +209 -0
- ads/opctl/backend/base.py +146 -0
- ads/opctl/backend/local.py +1053 -0
- ads/opctl/backend/marketplace/__init__.py +9 -0
- ads/opctl/backend/marketplace/helm_helper.py +173 -0
- ads/opctl/backend/marketplace/local_marketplace.py +271 -0
- ads/opctl/backend/marketplace/marketplace_backend_runner.py +71 -0
- ads/opctl/backend/marketplace/marketplace_operator_interface.py +44 -0
- ads/opctl/backend/marketplace/marketplace_operator_runner.py +24 -0
- ads/opctl/backend/marketplace/marketplace_utils.py +212 -0
- ads/opctl/backend/marketplace/models/__init__.py +5 -0
- ads/opctl/backend/marketplace/models/bearer_token.py +94 -0
- ads/opctl/backend/marketplace/models/marketplace_type.py +70 -0
- ads/opctl/backend/marketplace/models/ocir_details.py +56 -0
- ads/opctl/backend/marketplace/prerequisite_checker.py +238 -0
- ads/opctl/cli.py +707 -0
- ads/opctl/cmds.py +869 -0
- ads/opctl/conda/__init__.py +5 -0
- ads/opctl/conda/cli.py +193 -0
- ads/opctl/conda/cmds.py +749 -0
- ads/opctl/conda/config.yaml +34 -0
- ads/opctl/conda/manifest_template.yaml +13 -0
- ads/opctl/conda/multipart_uploader.py +188 -0
- ads/opctl/conda/pack.py +89 -0
- ads/opctl/config/__init__.py +5 -0
- ads/opctl/config/base.py +57 -0
- ads/opctl/config/diagnostics/__init__.py +5 -0
- ads/opctl/config/diagnostics/distributed/default_requirements_config.yaml +62 -0
- ads/opctl/config/merger.py +255 -0
- ads/opctl/config/resolver.py +297 -0
- ads/opctl/config/utils.py +79 -0
- ads/opctl/config/validator.py +17 -0
- ads/opctl/config/versioner.py +68 -0
- ads/opctl/config/yaml_parsers/__init__.py +7 -0
- ads/opctl/config/yaml_parsers/base.py +58 -0
- ads/opctl/config/yaml_parsers/distributed/__init__.py +7 -0
- ads/opctl/config/yaml_parsers/distributed/yaml_parser.py +201 -0
- ads/opctl/constants.py +66 -0
- ads/opctl/decorator/__init__.py +5 -0
- ads/opctl/decorator/common.py +129 -0
- ads/opctl/diagnostics/__init__.py +5 -0
- ads/opctl/diagnostics/__main__.py +25 -0
- ads/opctl/diagnostics/check_distributed_job_requirements.py +212 -0
- ads/opctl/diagnostics/check_requirements.py +144 -0
- ads/opctl/diagnostics/requirement_exception.py +9 -0
- ads/opctl/distributed/README.md +109 -0
- ads/opctl/distributed/__init__.py +5 -0
- ads/opctl/distributed/certificates.py +32 -0
- ads/opctl/distributed/cli.py +207 -0
- ads/opctl/distributed/cmds.py +731 -0
- ads/opctl/distributed/common/__init__.py +5 -0
- ads/opctl/distributed/common/abstract_cluster_provider.py +449 -0
- ads/opctl/distributed/common/abstract_framework_spec_builder.py +88 -0
- ads/opctl/distributed/common/cluster_config_helper.py +103 -0
- ads/opctl/distributed/common/cluster_provider_factory.py +21 -0
- ads/opctl/distributed/common/cluster_runner.py +54 -0
- ads/opctl/distributed/common/framework_factory.py +29 -0
- ads/opctl/docker/Dockerfile.job +103 -0
- ads/opctl/docker/Dockerfile.job.arm +107 -0
- ads/opctl/docker/Dockerfile.job.gpu +175 -0
- ads/opctl/docker/base-env.yaml +13 -0
- ads/opctl/docker/cuda.repo +6 -0
- ads/opctl/docker/operator/.dockerignore +0 -0
- ads/opctl/docker/operator/Dockerfile +41 -0
- ads/opctl/docker/operator/Dockerfile.gpu +85 -0
- ads/opctl/docker/operator/cuda.repo +6 -0
- ads/opctl/docker/operator/environment.yaml +8 -0
- ads/opctl/forecast.py +11 -0
- ads/opctl/index.yaml +3 -0
- ads/opctl/model/__init__.py +5 -0
- ads/opctl/model/cli.py +65 -0
- ads/opctl/model/cmds.py +73 -0
- ads/opctl/operator/README.md +4 -0
- ads/opctl/operator/__init__.py +31 -0
- ads/opctl/operator/cli.py +344 -0
- ads/opctl/operator/cmd.py +596 -0
- ads/opctl/operator/common/__init__.py +5 -0
- ads/opctl/operator/common/backend_factory.py +460 -0
- ads/opctl/operator/common/const.py +27 -0
- ads/opctl/operator/common/data/synthetic.csv +16001 -0
- ads/opctl/operator/common/dictionary_merger.py +148 -0
- ads/opctl/operator/common/errors.py +42 -0
- ads/opctl/operator/common/operator_config.py +99 -0
- ads/opctl/operator/common/operator_loader.py +811 -0
- ads/opctl/operator/common/operator_schema.yaml +130 -0
- ads/opctl/operator/common/operator_yaml_generator.py +152 -0
- ads/opctl/operator/common/utils.py +208 -0
- ads/opctl/operator/lowcode/__init__.py +5 -0
- ads/opctl/operator/lowcode/anomaly/MLoperator +16 -0
- ads/opctl/operator/lowcode/anomaly/README.md +207 -0
- ads/opctl/operator/lowcode/anomaly/__init__.py +5 -0
- ads/opctl/operator/lowcode/anomaly/__main__.py +103 -0
- ads/opctl/operator/lowcode/anomaly/cmd.py +35 -0
- ads/opctl/operator/lowcode/anomaly/const.py +167 -0
- ads/opctl/operator/lowcode/anomaly/environment.yaml +10 -0
- ads/opctl/operator/lowcode/anomaly/model/__init__.py +5 -0
- ads/opctl/operator/lowcode/anomaly/model/anomaly_dataset.py +146 -0
- ads/opctl/operator/lowcode/anomaly/model/anomaly_merlion.py +162 -0
- ads/opctl/operator/lowcode/anomaly/model/automlx.py +99 -0
- ads/opctl/operator/lowcode/anomaly/model/autots.py +115 -0
- ads/opctl/operator/lowcode/anomaly/model/base_model.py +404 -0
- ads/opctl/operator/lowcode/anomaly/model/factory.py +110 -0
- ads/opctl/operator/lowcode/anomaly/model/isolationforest.py +78 -0
- ads/opctl/operator/lowcode/anomaly/model/oneclasssvm.py +78 -0
- ads/opctl/operator/lowcode/anomaly/model/randomcutforest.py +120 -0
- ads/opctl/operator/lowcode/anomaly/model/tods.py +119 -0
- ads/opctl/operator/lowcode/anomaly/operator_config.py +127 -0
- ads/opctl/operator/lowcode/anomaly/schema.yaml +401 -0
- ads/opctl/operator/lowcode/anomaly/utils.py +88 -0
- ads/opctl/operator/lowcode/common/__init__.py +5 -0
- ads/opctl/operator/lowcode/common/const.py +10 -0
- ads/opctl/operator/lowcode/common/data.py +116 -0
- ads/opctl/operator/lowcode/common/errors.py +47 -0
- ads/opctl/operator/lowcode/common/transformations.py +296 -0
- ads/opctl/operator/lowcode/common/utils.py +384 -0
- ads/opctl/operator/lowcode/feature_store_marketplace/MLoperator +13 -0
- ads/opctl/operator/lowcode/feature_store_marketplace/README.md +30 -0
- ads/opctl/operator/lowcode/feature_store_marketplace/__init__.py +5 -0
- ads/opctl/operator/lowcode/feature_store_marketplace/__main__.py +116 -0
- ads/opctl/operator/lowcode/feature_store_marketplace/cmd.py +85 -0
- ads/opctl/operator/lowcode/feature_store_marketplace/const.py +15 -0
- ads/opctl/operator/lowcode/feature_store_marketplace/environment.yaml +0 -0
- ads/opctl/operator/lowcode/feature_store_marketplace/models/__init__.py +4 -0
- ads/opctl/operator/lowcode/feature_store_marketplace/models/apigw_config.py +32 -0
- ads/opctl/operator/lowcode/feature_store_marketplace/models/db_config.py +43 -0
- ads/opctl/operator/lowcode/feature_store_marketplace/models/mysql_config.py +120 -0
- ads/opctl/operator/lowcode/feature_store_marketplace/models/serializable_yaml_model.py +34 -0
- ads/opctl/operator/lowcode/feature_store_marketplace/operator_utils.py +386 -0
- ads/opctl/operator/lowcode/feature_store_marketplace/schema.yaml +160 -0
- ads/opctl/operator/lowcode/forecast/MLoperator +25 -0
- ads/opctl/operator/lowcode/forecast/README.md +209 -0
- ads/opctl/operator/lowcode/forecast/__init__.py +5 -0
- ads/opctl/operator/lowcode/forecast/__main__.py +89 -0
- ads/opctl/operator/lowcode/forecast/cmd.py +40 -0
- ads/opctl/operator/lowcode/forecast/const.py +92 -0
- ads/opctl/operator/lowcode/forecast/environment.yaml +20 -0
- ads/opctl/operator/lowcode/forecast/errors.py +26 -0
- ads/opctl/operator/lowcode/forecast/model/__init__.py +5 -0
- ads/opctl/operator/lowcode/forecast/model/arima.py +279 -0
- ads/opctl/operator/lowcode/forecast/model/automlx.py +553 -0
- ads/opctl/operator/lowcode/forecast/model/autots.py +312 -0
- ads/opctl/operator/lowcode/forecast/model/base_model.py +875 -0
- ads/opctl/operator/lowcode/forecast/model/factory.py +106 -0
- ads/opctl/operator/lowcode/forecast/model/forecast_datasets.py +492 -0
- ads/opctl/operator/lowcode/forecast/model/ml_forecast.py +243 -0
- ads/opctl/operator/lowcode/forecast/model/neuralprophet.py +482 -0
- ads/opctl/operator/lowcode/forecast/model/prophet.py +450 -0
- ads/opctl/operator/lowcode/forecast/model_evaluator.py +244 -0
- ads/opctl/operator/lowcode/forecast/operator_config.py +234 -0
- ads/opctl/operator/lowcode/forecast/schema.yaml +506 -0
- ads/opctl/operator/lowcode/forecast/utils.py +397 -0
- ads/opctl/operator/lowcode/forecast/whatifserve/__init__.py +7 -0
- ads/opctl/operator/lowcode/forecast/whatifserve/deployment_manager.py +285 -0
- ads/opctl/operator/lowcode/forecast/whatifserve/score.py +246 -0
- ads/opctl/operator/lowcode/pii/MLoperator +17 -0
- ads/opctl/operator/lowcode/pii/README.md +208 -0
- ads/opctl/operator/lowcode/pii/__init__.py +5 -0
- ads/opctl/operator/lowcode/pii/__main__.py +78 -0
- ads/opctl/operator/lowcode/pii/cmd.py +39 -0
- ads/opctl/operator/lowcode/pii/constant.py +84 -0
- ads/opctl/operator/lowcode/pii/environment.yaml +17 -0
- ads/opctl/operator/lowcode/pii/errors.py +27 -0
- ads/opctl/operator/lowcode/pii/model/__init__.py +5 -0
- ads/opctl/operator/lowcode/pii/model/factory.py +82 -0
- ads/opctl/operator/lowcode/pii/model/guardrails.py +167 -0
- ads/opctl/operator/lowcode/pii/model/pii.py +145 -0
- ads/opctl/operator/lowcode/pii/model/processor/__init__.py +34 -0
- ads/opctl/operator/lowcode/pii/model/processor/email_replacer.py +34 -0
- ads/opctl/operator/lowcode/pii/model/processor/mbi_replacer.py +35 -0
- ads/opctl/operator/lowcode/pii/model/processor/name_replacer.py +225 -0
- ads/opctl/operator/lowcode/pii/model/processor/number_replacer.py +73 -0
- ads/opctl/operator/lowcode/pii/model/processor/remover.py +26 -0
- ads/opctl/operator/lowcode/pii/model/report.py +487 -0
- ads/opctl/operator/lowcode/pii/operator_config.py +95 -0
- ads/opctl/operator/lowcode/pii/schema.yaml +108 -0
- ads/opctl/operator/lowcode/pii/utils.py +43 -0
- ads/opctl/operator/lowcode/recommender/MLoperator +16 -0
- ads/opctl/operator/lowcode/recommender/README.md +206 -0
- ads/opctl/operator/lowcode/recommender/__init__.py +5 -0
- ads/opctl/operator/lowcode/recommender/__main__.py +82 -0
- ads/opctl/operator/lowcode/recommender/cmd.py +33 -0
- ads/opctl/operator/lowcode/recommender/constant.py +30 -0
- ads/opctl/operator/lowcode/recommender/environment.yaml +11 -0
- ads/opctl/operator/lowcode/recommender/model/base_model.py +212 -0
- ads/opctl/operator/lowcode/recommender/model/factory.py +56 -0
- ads/opctl/operator/lowcode/recommender/model/recommender_dataset.py +25 -0
- ads/opctl/operator/lowcode/recommender/model/svd.py +106 -0
- ads/opctl/operator/lowcode/recommender/operator_config.py +81 -0
- ads/opctl/operator/lowcode/recommender/schema.yaml +265 -0
- ads/opctl/operator/lowcode/recommender/utils.py +13 -0
- ads/opctl/operator/runtime/__init__.py +5 -0
- ads/opctl/operator/runtime/const.py +17 -0
- ads/opctl/operator/runtime/container_runtime_schema.yaml +50 -0
- ads/opctl/operator/runtime/marketplace_runtime.py +50 -0
- ads/opctl/operator/runtime/python_marketplace_runtime_schema.yaml +21 -0
- ads/opctl/operator/runtime/python_runtime_schema.yaml +21 -0
- ads/opctl/operator/runtime/runtime.py +115 -0
- ads/opctl/schema.yaml.yml +36 -0
- ads/opctl/script.py +40 -0
- ads/opctl/spark/__init__.py +5 -0
- ads/opctl/spark/cli.py +43 -0
- ads/opctl/spark/cmds.py +147 -0
- ads/opctl/templates/diagnostic_report_template.jinja2 +102 -0
- ads/opctl/utils.py +344 -0
- ads/oracledb/__init__.py +5 -0
- ads/oracledb/oracle_db.py +346 -0
- ads/pipeline/__init__.py +39 -0
- ads/pipeline/ads_pipeline.py +2279 -0
- ads/pipeline/ads_pipeline_run.py +772 -0
- ads/pipeline/ads_pipeline_step.py +605 -0
- ads/pipeline/builders/__init__.py +5 -0
- ads/pipeline/builders/infrastructure/__init__.py +5 -0
- ads/pipeline/builders/infrastructure/custom_script.py +32 -0
- ads/pipeline/cli.py +119 -0
- ads/pipeline/extension.py +291 -0
- ads/pipeline/schema/__init__.py +5 -0
- ads/pipeline/schema/cs_step_schema.json +35 -0
- ads/pipeline/schema/ml_step_schema.json +31 -0
- ads/pipeline/schema/pipeline_schema.json +71 -0
- ads/pipeline/visualizer/__init__.py +5 -0
- ads/pipeline/visualizer/base.py +570 -0
- ads/pipeline/visualizer/graph_renderer.py +272 -0
- ads/pipeline/visualizer/text_renderer.py +84 -0
- ads/secrets/__init__.py +11 -0
- ads/secrets/adb.py +386 -0
- ads/secrets/auth_token.py +86 -0
- ads/secrets/big_data_service.py +365 -0
- ads/secrets/mysqldb.py +149 -0
- ads/secrets/oracledb.py +160 -0
- ads/secrets/secrets.py +407 -0
- ads/telemetry/__init__.py +7 -0
- ads/telemetry/base.py +69 -0
- ads/telemetry/client.py +122 -0
- ads/telemetry/telemetry.py +257 -0
- ads/templates/dataflow_pyspark.jinja2 +13 -0
- ads/templates/dataflow_sparksql.jinja2 +22 -0
- ads/templates/func.jinja2 +20 -0
- ads/templates/schemas/openapi.json +1740 -0
- ads/templates/score-pkl.jinja2 +173 -0
- ads/templates/score.jinja2 +322 -0
- ads/templates/score_embedding_onnx.jinja2 +202 -0
- ads/templates/score_generic.jinja2 +165 -0
- ads/templates/score_huggingface_pipeline.jinja2 +217 -0
- ads/templates/score_lightgbm.jinja2 +185 -0
- ads/templates/score_onnx.jinja2 +407 -0
- ads/templates/score_onnx_new.jinja2 +473 -0
- ads/templates/score_oracle_automl.jinja2 +185 -0
- ads/templates/score_pyspark.jinja2 +154 -0
- ads/templates/score_pytorch.jinja2 +219 -0
- ads/templates/score_scikit-learn.jinja2 +184 -0
- ads/templates/score_tensorflow.jinja2 +184 -0
- ads/templates/score_xgboost.jinja2 +178 -0
- ads/text_dataset/__init__.py +5 -0
- ads/text_dataset/backends.py +211 -0
- ads/text_dataset/dataset.py +445 -0
- ads/text_dataset/extractor.py +207 -0
- ads/text_dataset/options.py +53 -0
- ads/text_dataset/udfs.py +22 -0
- ads/text_dataset/utils.py +49 -0
- ads/type_discovery/__init__.py +9 -0
- ads/type_discovery/abstract_detector.py +21 -0
- ads/type_discovery/constant_detector.py +41 -0
- ads/type_discovery/continuous_detector.py +54 -0
- ads/type_discovery/credit_card_detector.py +99 -0
- ads/type_discovery/datetime_detector.py +92 -0
- ads/type_discovery/discrete_detector.py +118 -0
- ads/type_discovery/document_detector.py +146 -0
- ads/type_discovery/ip_detector.py +68 -0
- ads/type_discovery/latlon_detector.py +90 -0
- ads/type_discovery/phone_number_detector.py +63 -0
- ads/type_discovery/type_discovery_driver.py +87 -0
- ads/type_discovery/typed_feature.py +594 -0
- ads/type_discovery/unknown_detector.py +41 -0
- ads/type_discovery/zipcode_detector.py +48 -0
- ads/vault/__init__.py +7 -0
- ads/vault/vault.py +237 -0
- {oracle_ads-2.13.9rc0.dist-info → oracle_ads-2.13.10rc0.dist-info}/METADATA +150 -149
- oracle_ads-2.13.10rc0.dist-info/RECORD +858 -0
- {oracle_ads-2.13.9rc0.dist-info → oracle_ads-2.13.10rc0.dist-info}/WHEEL +1 -2
- {oracle_ads-2.13.9rc0.dist-info → oracle_ads-2.13.10rc0.dist-info}/entry_points.txt +2 -1
- oracle_ads-2.13.9rc0.dist-info/RECORD +0 -9
- oracle_ads-2.13.9rc0.dist-info/top_level.txt +0 -1
- {oracle_ads-2.13.9rc0.dist-info → oracle_ads-2.13.10rc0.dist-info}/licenses/LICENSE.txt +0 -0
@@ -0,0 +1,365 @@
|
|
1
|
+
#!/usr/bin/env python
|
2
|
+
# -*- coding: utf-8 -*--
|
3
|
+
|
4
|
+
# Copyright (c) 2022 Oracle and/or its affiliates.
|
5
|
+
# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/
|
6
|
+
|
7
|
+
import ads
|
8
|
+
from ads.secrets import SecretKeeper, Secret
|
9
|
+
from ads.bds.auth import DEFAULT_KRB5_CONFIG_PATH
|
10
|
+
import json
|
11
|
+
import os
|
12
|
+
import base64
|
13
|
+
from tqdm.auto import tqdm
|
14
|
+
from dataclasses import dataclass, field
|
15
|
+
|
16
|
+
logger = ads.getLogger("ads.secrets")
|
17
|
+
|
18
|
+
|
19
|
+
@dataclass
|
20
|
+
class BDSSecret(Secret):
|
21
|
+
"""
|
22
|
+
Dataclass representing the attributes managed and serialized by BDSSecretKeeper.
|
23
|
+
|
24
|
+
Attributes
|
25
|
+
----------
|
26
|
+
principal: str
|
27
|
+
The unique identity to which Kerberos can assign tickets.
|
28
|
+
hdfs_host: str
|
29
|
+
hdfs host name from the bds cluster.
|
30
|
+
hive_host: str
|
31
|
+
hive host name from the bds cluster.
|
32
|
+
hdfs_port: str
|
33
|
+
hdfs port from the bds cluster.
|
34
|
+
hive_port: str
|
35
|
+
hive port from the bds cluster.
|
36
|
+
kerb5_path: str
|
37
|
+
krb5.conf file path.
|
38
|
+
kerb5_content: dict
|
39
|
+
Content of the krb5.conf.
|
40
|
+
keytab_path: str
|
41
|
+
Path to the keytab file.
|
42
|
+
keytab_content: dict
|
43
|
+
Content of the keytab file.
|
44
|
+
secret_id: str
|
45
|
+
secret id where the BDSSecret is stored.
|
46
|
+
"""
|
47
|
+
|
48
|
+
principal: str
|
49
|
+
hdfs_host: str
|
50
|
+
hive_host: str
|
51
|
+
hdfs_port: str
|
52
|
+
hive_port: str
|
53
|
+
|
54
|
+
kerb5_path: str = field(
|
55
|
+
default=None,
|
56
|
+
)
|
57
|
+
kerb5_content: dict = field(
|
58
|
+
default=None,
|
59
|
+
repr=False,
|
60
|
+
metadata={"serializable": False},
|
61
|
+
)
|
62
|
+
keytab_path: str = field(
|
63
|
+
default=None,
|
64
|
+
)
|
65
|
+
keytab_content: dict = field(
|
66
|
+
default=None,
|
67
|
+
repr=False,
|
68
|
+
metadata={"serializable": False},
|
69
|
+
)
|
70
|
+
secret_id: str = field(repr=False, default_factory=str)
|
71
|
+
|
72
|
+
|
73
|
+
class BDSSecretKeeper(SecretKeeper):
|
74
|
+
"""
|
75
|
+
`BDSSecretKeeper` provides an interface to save BDS hdfs and hive credentials.
|
76
|
+
This interface does not store the wallet file by default.
|
77
|
+
For saving keytab and krb5.cofig file, set `save_files=True` while calling `BDSSecretKeeper.save` method.
|
78
|
+
|
79
|
+
Attributes
|
80
|
+
----------
|
81
|
+
principal: str
|
82
|
+
The unique identity to which Kerberos can assign tickets.
|
83
|
+
hdfs_host: str
|
84
|
+
hdfs host name from the bds cluster.
|
85
|
+
hive_host: str
|
86
|
+
hive host name from the bds cluster.
|
87
|
+
hdfs_port: str
|
88
|
+
hdfs port from the bds cluster.
|
89
|
+
hive_port: str
|
90
|
+
hive port from the bds cluster.
|
91
|
+
kerb5_path: str
|
92
|
+
krb5.conf file path.
|
93
|
+
kerb5_content: dict
|
94
|
+
Content of the krb5.conf.
|
95
|
+
keytab_path: str
|
96
|
+
Path to the keytab file.
|
97
|
+
keytab_content: dict
|
98
|
+
Content of the keytab file.
|
99
|
+
secret_id: str
|
100
|
+
secret id where the BDSSecret is stored.
|
101
|
+
|
102
|
+
kwargs
|
103
|
+
------
|
104
|
+
vault_id: str. OCID of the vault where the secret is stored. Required for saving secret.
|
105
|
+
key_id: str. OCID of the key used for encrypting the secret. Required for saving secret.
|
106
|
+
compartment_id: str. OCID of the compartment where the vault is located. Required for saving secret.
|
107
|
+
auth: dict. Dictionay returned from ads.common.auth.api_keys() or ads.common.auth.resource_principal(). By default, will follow what is set in `ads.set_auth`. Use this attribute to override the default.
|
108
|
+
"""
|
109
|
+
|
110
|
+
def __init__(
|
111
|
+
self,
|
112
|
+
principal: str = None,
|
113
|
+
hdfs_host: str = None,
|
114
|
+
hive_host: str = None,
|
115
|
+
hdfs_port: str = None,
|
116
|
+
hive_port: str = None,
|
117
|
+
kerb5_path: str = None,
|
118
|
+
kerb5_content: str = None,
|
119
|
+
keytab_path: str = None,
|
120
|
+
keytab_content: str = None,
|
121
|
+
keytab_dir: str = None,
|
122
|
+
secret_id: str = None,
|
123
|
+
**kwargs,
|
124
|
+
):
|
125
|
+
"""
|
126
|
+
Parameters
|
127
|
+
----------
|
128
|
+
principal: str
|
129
|
+
The unique identity to which Kerberos can assign tickets.
|
130
|
+
hdfs_host: str
|
131
|
+
hdfs host name from the bds cluster.
|
132
|
+
hive_host: str
|
133
|
+
hive host name from the bds cluster.
|
134
|
+
hdfs_port: str
|
135
|
+
hdfs port from the bds cluster.
|
136
|
+
hive_port: str
|
137
|
+
hive port from the bds cluster.
|
138
|
+
kerb5_path: str
|
139
|
+
krb5.conf file path.
|
140
|
+
kerb5_content: dict
|
141
|
+
Content of the krb5.conf.
|
142
|
+
keytab_path: str
|
143
|
+
Path to the keytab file.
|
144
|
+
keytab_content: dict
|
145
|
+
Content of the keytab file.
|
146
|
+
keytab_dir: (str, optional).
|
147
|
+
Default None. Local directory where the extracted keytab content is saved.
|
148
|
+
secret_id: str
|
149
|
+
secret id where the BDSSecret is stored.
|
150
|
+
|
151
|
+
|
152
|
+
kwargs
|
153
|
+
------
|
154
|
+
vault_id: str. OCID of the vault where the secret is stored. Required for saving secret.
|
155
|
+
key_id: str. OCID of the key used for encrypting the secret. Required for saving secret.
|
156
|
+
compartment_id: str. OCID of the compartment where the vault is located. Required for saving secret.
|
157
|
+
auth: dict. Dictionay returned from ads.common.auth.api_keys() or ads.common.auth.resource_principal(). By default, will follow what is set in `ads.set_auth`. Use this attribute to override the default.
|
158
|
+
|
159
|
+
"""
|
160
|
+
self.data = BDSSecret(
|
161
|
+
principal=principal,
|
162
|
+
hdfs_host=hdfs_host,
|
163
|
+
hive_host=hive_host,
|
164
|
+
hdfs_port=hdfs_port,
|
165
|
+
hive_port=hive_port,
|
166
|
+
kerb5_path=kerb5_path,
|
167
|
+
kerb5_content=kerb5_content,
|
168
|
+
keytab_path=keytab_path,
|
169
|
+
keytab_content=keytab_content,
|
170
|
+
secret_id=secret_id,
|
171
|
+
)
|
172
|
+
self.keytab_dir = keytab_dir
|
173
|
+
super().__init__(**kwargs)
|
174
|
+
|
175
|
+
def encode(self, serialize: bool = True) -> "ads.secrets.bds.BDSSecretKeeper":
|
176
|
+
"""
|
177
|
+
Prepares content to save in vault. The port, host name and the keytab and krb5.config files are base64 encoded and stored in `self.secret`
|
178
|
+
|
179
|
+
Parameters
|
180
|
+
----------
|
181
|
+
serialize: bool, optional
|
182
|
+
When set to True, loads the keytab and krb5.config file and encodes the content of both files.
|
183
|
+
|
184
|
+
Returns
|
185
|
+
-------
|
186
|
+
BDSSecretKeeper:
|
187
|
+
Returns self object
|
188
|
+
"""
|
189
|
+
if serialize:
|
190
|
+
if not self.data.keytab_path and not self.data.kerb5_path:
|
191
|
+
raise ValueError(
|
192
|
+
"Missing path to keytab or krb5.config file. Required keytab file path to be set in `keytab_path` and krb5.config file path to be set in `kerb5_path`."
|
193
|
+
)
|
194
|
+
if self.data.keytab_path:
|
195
|
+
with open(os.path.expanduser(self.data.keytab_path), "rb") as f:
|
196
|
+
encoded = self._encode(f.read())
|
197
|
+
self.keytab_content = encoded
|
198
|
+
|
199
|
+
if self.data.kerb5_path:
|
200
|
+
with open(os.path.expanduser(self.data.kerb5_path), "rb") as f:
|
201
|
+
encoded = self._encode(f.read())
|
202
|
+
self.kerb5_content = encoded
|
203
|
+
|
204
|
+
self.secret = {
|
205
|
+
**self.data.serialize(),
|
206
|
+
"keytab_content": self.keytab_content,
|
207
|
+
"kerb5_content": self.kerb5_content,
|
208
|
+
}
|
209
|
+
self.encoded = self.secret
|
210
|
+
else:
|
211
|
+
super().encode()
|
212
|
+
|
213
|
+
return self
|
214
|
+
|
215
|
+
def decode(self, save_files: bool = True) -> "ads.secrets.bds.BDSSecretKeeper":
|
216
|
+
"""
|
217
|
+
Converts the content in `self.secret` to `BDSSecret` and stores in `self.data`
|
218
|
+
|
219
|
+
If the `keytab_path` and `kerb5_path` are passed through the constructor, then retain it. We do not want to override what user has passed in
|
220
|
+
If the `keytab_path` and `kerb5_path` are not passed, but the sercret has `secret_id`, then we generate the keytab file in the location specified by `keytab_path` in the constructor.
|
221
|
+
|
222
|
+
Returns
|
223
|
+
-------
|
224
|
+
BDSSecretKeeper:
|
225
|
+
Returns self object
|
226
|
+
"""
|
227
|
+
content = json.loads(self._decode())
|
228
|
+
data = BDSSecret(
|
229
|
+
**content,
|
230
|
+
)
|
231
|
+
krb5_file_path = os.path.expanduser(DEFAULT_KRB5_CONFIG_PATH)
|
232
|
+
if hasattr(self, "data") and self.data.keytab_path and self.data.kerb5_path:
|
233
|
+
# If the keytab and kerb5 locations are passed in as a keyword argument inside
|
234
|
+
# `load_secret` method, then we need to retain that information after
|
235
|
+
# the secret was deserialized.
|
236
|
+
logger.debug(f"Setting keytab file to {data.keytab_path}")
|
237
|
+
data.keytab_path = self.data.keytab_path
|
238
|
+
data.kerb5_path = self.data.kerb5_path
|
239
|
+
if save_files:
|
240
|
+
os.makedirs(os.path.dirname(krb5_file_path), exist_ok=True)
|
241
|
+
if not os.path.exists(self.data.kerb5_path):
|
242
|
+
raise FileNotFoundError(
|
243
|
+
f"`kerb5_path` does not exists. Cannot load the kerb5 config from this location {self.data.kerb5_path}."
|
244
|
+
)
|
245
|
+
with open(self.data.kerb5_path) as rf:
|
246
|
+
with open(krb5_file_path, "wb") as wf:
|
247
|
+
wf.write(rf.read())
|
248
|
+
elif data.secret_id:
|
249
|
+
logger.debug(f"Secret ids corresponding to the keytab file found.")
|
250
|
+
|
251
|
+
if data.secret_id:
|
252
|
+
content = json.loads(
|
253
|
+
self._decode(self.get_secret(data.secret_id, decoded=False))
|
254
|
+
)
|
255
|
+
|
256
|
+
if save_files:
|
257
|
+
if content["keytab_content"]:
|
258
|
+
if data.keytab_path:
|
259
|
+
if self.keytab_dir:
|
260
|
+
data.keytab_path = os.path.abspath(
|
261
|
+
os.path.expanduser(
|
262
|
+
os.path.join(
|
263
|
+
self.keytab_dir,
|
264
|
+
os.path.basename(data.keytab_path),
|
265
|
+
)
|
266
|
+
)
|
267
|
+
)
|
268
|
+
os.makedirs(
|
269
|
+
os.path.dirname(data.keytab_path), exist_ok=True
|
270
|
+
)
|
271
|
+
else:
|
272
|
+
raise ValueError(
|
273
|
+
"`keytab_path` field not found. `keytab_path` cannot be None when `save_files` = True."
|
274
|
+
)
|
275
|
+
with open(
|
276
|
+
os.path.abspath(os.path.expanduser(data.keytab_path)), "wb"
|
277
|
+
) as wf:
|
278
|
+
wf.write(base64.b64decode(content["keytab_content"]))
|
279
|
+
|
280
|
+
if content["kerb5_content"]:
|
281
|
+
os.makedirs(os.path.dirname(krb5_file_path), exist_ok=True)
|
282
|
+
with open(
|
283
|
+
os.path.abspath(os.path.expanduser(krb5_file_path)), "wb"
|
284
|
+
) as wf:
|
285
|
+
wf.write(base64.b64decode(content["kerb5_content"]))
|
286
|
+
else:
|
287
|
+
logger.warning(
|
288
|
+
"Keytab and krb5 config information not found. If you have local keytab and krb5.config files, you can pass that as a keyword argument `keytab_path=<path to the keytab file>` and `kerb5_path=<path to the kerb5 file>` inside the `BDSSecretKeeper.load_secret` method"
|
289
|
+
)
|
290
|
+
self.data = data
|
291
|
+
return self
|
292
|
+
|
293
|
+
def save(
|
294
|
+
self,
|
295
|
+
name: str,
|
296
|
+
description: str,
|
297
|
+
freeform_tags: dict = None,
|
298
|
+
defined_tags: dict = None,
|
299
|
+
save_files: bool = True,
|
300
|
+
) -> "ads.secrets.bds.BDSSecretKeeper":
|
301
|
+
"""Saves credentials to Vault and returns self.
|
302
|
+
|
303
|
+
Parameters
|
304
|
+
----------
|
305
|
+
name : str
|
306
|
+
Name of the secret when saved in the Vault.
|
307
|
+
description : str
|
308
|
+
Description of the secret when saved in the Vault.
|
309
|
+
freeform_tags : (dict, optional). Default is None
|
310
|
+
freeform_tags to be used for saving the secret in OCI console.
|
311
|
+
defined_tags: (dict, optional). Default is None
|
312
|
+
Save the tags under predefined tags in OCI console.
|
313
|
+
save_files: (bool, optional). Default is False
|
314
|
+
If set to True, saves the contents of the keytab and krb5 file as separate secret.
|
315
|
+
|
316
|
+
Returns
|
317
|
+
-------
|
318
|
+
BDSSecretKeeper:
|
319
|
+
Returns self object
|
320
|
+
"""
|
321
|
+
if not save_files:
|
322
|
+
logger.info(
|
323
|
+
"`save_files` set to False. Not saving keytab or krb5.config file content to vault."
|
324
|
+
)
|
325
|
+
logger.debug(f"Encoding secrets. Save files is set to {save_files}")
|
326
|
+
self.encode(serialize=save_files)
|
327
|
+
|
328
|
+
secret_id = None
|
329
|
+
n = 2 if save_files else 1
|
330
|
+
with tqdm(total=n, leave=False) as pbar:
|
331
|
+
if save_files:
|
332
|
+
pbar.set_description(
|
333
|
+
f"Saving the keytab file and the krb5.config file."
|
334
|
+
)
|
335
|
+
secret_id = self.create_secret(
|
336
|
+
self._encode(
|
337
|
+
json.dumps(
|
338
|
+
{
|
339
|
+
"keytab_content": self.encoded["keytab_content"],
|
340
|
+
"kerb5_content": self.encoded["kerb5_content"],
|
341
|
+
}
|
342
|
+
).encode("utf-8")
|
343
|
+
),
|
344
|
+
encode=False,
|
345
|
+
secret_name=f"{name}_keytab_krb5",
|
346
|
+
description=f"Keytab file and krb5 config file.",
|
347
|
+
freeform_tags=freeform_tags,
|
348
|
+
defined_tags=defined_tags,
|
349
|
+
)
|
350
|
+
pbar.update()
|
351
|
+
|
352
|
+
self.data.secret_id = secret_id
|
353
|
+
|
354
|
+
pbar.set_description(f"Saving the credentials.")
|
355
|
+
self.secret_id = self.create_secret(
|
356
|
+
self._encode(json.dumps(self.data.serialize()).encode("utf-8")),
|
357
|
+
encode=False,
|
358
|
+
secret_name=name,
|
359
|
+
description=description,
|
360
|
+
freeform_tags=freeform_tags,
|
361
|
+
defined_tags=defined_tags,
|
362
|
+
)
|
363
|
+
pbar.update()
|
364
|
+
|
365
|
+
return self
|
ads/secrets/mysqldb.py
ADDED
@@ -0,0 +1,149 @@
|
|
1
|
+
#!/usr/bin/env python
|
2
|
+
# -*- coding: utf-8 -*--
|
3
|
+
|
4
|
+
# Copyright (c) 2022 Oracle and/or its affiliates
|
5
|
+
# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/
|
6
|
+
|
7
|
+
import ads
|
8
|
+
from ads.common.utils import MYSQL_DEFAULT_PORT
|
9
|
+
from ads.secrets import SecretKeeper, Secret
|
10
|
+
import json
|
11
|
+
|
12
|
+
|
13
|
+
logger = ads.getLogger("ads.secrets")
|
14
|
+
|
15
|
+
from dataclasses import dataclass, field
|
16
|
+
|
17
|
+
|
18
|
+
@dataclass
|
19
|
+
class MySQLDBSecret(Secret):
|
20
|
+
"""
|
21
|
+
Dataclass representing the attributes managed and serialized by MySQLDBSecretKeeper
|
22
|
+
"""
|
23
|
+
|
24
|
+
user_name: str
|
25
|
+
password: str
|
26
|
+
host: str
|
27
|
+
port: str
|
28
|
+
database: str = field(default=None)
|
29
|
+
|
30
|
+
|
31
|
+
class MySQLDBSecretKeeper(SecretKeeper):
|
32
|
+
"""
|
33
|
+
`MySQLDBSecretKeeper` provides an interface to save MySQL database credentials.
|
34
|
+
If you use Wallet file for connnecting to the database, please use ``ADBSecretKeeper``.
|
35
|
+
|
36
|
+
|
37
|
+
Examples
|
38
|
+
--------
|
39
|
+
>>> from ads.secrets.mysqldb import MySQLDBSecretKeeper
|
40
|
+
>>> vault_id = "ocid1.vault.oc1..<unique_ID>"
|
41
|
+
>>> key_id = "ocid1.key..<unique_ID>"
|
42
|
+
|
43
|
+
>>> import ads
|
44
|
+
>>> ads.set_auth("resource_principal") # If using resource principal for authentication
|
45
|
+
>>> connection_parameters={
|
46
|
+
... "user_name":"<your user name>",
|
47
|
+
... "password":"<your password>",
|
48
|
+
... "host":"<db host>",
|
49
|
+
... "port":"<db port>",
|
50
|
+
... "database":"<database>",
|
51
|
+
... }
|
52
|
+
>>> mysqldb_keeper = MySQLDBSecretKeeper(vault_id=vault_id, key_id=key_id, **connection_parameters)
|
53
|
+
>>> mysqldb_keeper.save("mysqldb_employee", "My DB credentials", freeform_tags={"schema":"emp"})
|
54
|
+
>>> print(mysqldb_keeper.secret_id) # Prints the secret_id of the stored credentials
|
55
|
+
>>> mysqldb_keeper.export_vault_details("mysqldb_employee_att.json") # Save the secret id and vault info to a json file
|
56
|
+
|
57
|
+
>>> # Loading credentails
|
58
|
+
>>> import ads
|
59
|
+
>>> ads.set_auth("resource_principal") # If using resource principal for authentication
|
60
|
+
>>> from ads.secrets.mysqldb import MySQLDBSecretKeeper
|
61
|
+
>>> secret_id = "ocid1.vaultsecret.oc1..<unique_ID>"
|
62
|
+
>>> with MySQLDBSecretKeeper.load_secret(source=secret_id) as mysqldb_creds:
|
63
|
+
... import pandas as pd
|
64
|
+
... df = pd.DataFrame.ads.read_sql("select * from EMPLOYEE", connection_parameters=mysqldb_creds, engine="mysql")
|
65
|
+
|
66
|
+
|
67
|
+
>>> mymysqldb_creds = MySQLDBSecretKeeper.load_secret(source='mysqldb_employee_att.json', format="json")
|
68
|
+
>>> pd.DataFrame.ads.read_sql("select * from ATTRITION_DATA", connection_parameters=mymysqldb_creds.to_dict(), engine="mysql").head(2)
|
69
|
+
|
70
|
+
"""
|
71
|
+
|
72
|
+
def __init__(
|
73
|
+
self,
|
74
|
+
user_name: str = None,
|
75
|
+
password: str = None,
|
76
|
+
host: str = None,
|
77
|
+
port: str = MYSQL_DEFAULT_PORT,
|
78
|
+
database: str = None,
|
79
|
+
repository_path: str = None,
|
80
|
+
repository_key: str = None,
|
81
|
+
**kwargs,
|
82
|
+
):
|
83
|
+
"""
|
84
|
+
Parameters
|
85
|
+
----------
|
86
|
+
user_name: (str, optional). Default None
|
87
|
+
user_name of the database
|
88
|
+
password: (str, optional). Default None
|
89
|
+
password for connecting to the database
|
90
|
+
host: (str, optional). Default None
|
91
|
+
Database host name
|
92
|
+
port: (str, optional). Default 1521
|
93
|
+
Port number
|
94
|
+
database: (str, optional). Default None
|
95
|
+
database name
|
96
|
+
repository_path: (str, optional). Default None.
|
97
|
+
Path to credentials repository. For more details refer `ads.database.connection`
|
98
|
+
repository_key: (str, optional). Default None.
|
99
|
+
Configuration key for loading the right configuration from repository. For more details refer `ads.database.connection`
|
100
|
+
kwargs:
|
101
|
+
vault_id: str. OCID of the vault where the secret is stored. Required for saving secret.
|
102
|
+
key_id: str. OCID of the key used for encrypting the secret. Required for saving secret.
|
103
|
+
compartment_id: str. OCID of the compartment where the vault is located. Required for saving secret.
|
104
|
+
auth: dict. Dictionay returned from ads.common.auth.api_keys() or ads.common.auth.resource_principal(). By default, will follow what is set in `ads.set_auth`. Use this attribute to override the default.
|
105
|
+
"""
|
106
|
+
if repository_path and repository_key:
|
107
|
+
from ads.database import connection
|
108
|
+
|
109
|
+
config_from_repo = connection.get_repository(
|
110
|
+
repository_key, repository_path
|
111
|
+
)
|
112
|
+
if user_name is None:
|
113
|
+
user_name = config_from_repo.get("username") or config_from_repo.get(
|
114
|
+
"user_name"
|
115
|
+
)
|
116
|
+
if password is None:
|
117
|
+
password = config_from_repo.get("password")
|
118
|
+
if database is None:
|
119
|
+
database = config_from_repo.get("database")
|
120
|
+
if host is None:
|
121
|
+
host = config_from_repo.get("host")
|
122
|
+
if port is None:
|
123
|
+
port = config_from_repo.get("port")
|
124
|
+
|
125
|
+
self.data = MySQLDBSecret(
|
126
|
+
user_name=user_name,
|
127
|
+
password=password,
|
128
|
+
host=host,
|
129
|
+
port=port,
|
130
|
+
database=database,
|
131
|
+
)
|
132
|
+
|
133
|
+
super().__init__(**kwargs)
|
134
|
+
|
135
|
+
def decode(self) -> "ads.secrets.mysqldb.MySQLDBSecretKeeper":
|
136
|
+
"""
|
137
|
+
Converts the content in `self.encoded` to `MySQLDBSecret` and stores in `self.data`
|
138
|
+
|
139
|
+
Returns
|
140
|
+
-------
|
141
|
+
MySQLDBSecretKeeper:
|
142
|
+
Returns self object
|
143
|
+
"""
|
144
|
+
content = json.loads(self._decode())
|
145
|
+
logger.debug(f"Decoded secret contains following keys - {list(content.keys())}")
|
146
|
+
self.data = MySQLDBSecret(
|
147
|
+
**content,
|
148
|
+
)
|
149
|
+
return self
|
ads/secrets/oracledb.py
ADDED
@@ -0,0 +1,160 @@
|
|
1
|
+
#!/usr/bin/env python
|
2
|
+
# -*- coding: utf-8 -*--
|
3
|
+
|
4
|
+
# Copyright (c) 2021, 2022 Oracle and/or its affiliates.
|
5
|
+
# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/
|
6
|
+
|
7
|
+
import ads
|
8
|
+
from ads.secrets import SecretKeeper, Secret
|
9
|
+
import json
|
10
|
+
|
11
|
+
|
12
|
+
logger = ads.getLogger("ads.secrets")
|
13
|
+
|
14
|
+
from dataclasses import dataclass, field
|
15
|
+
|
16
|
+
|
17
|
+
@dataclass
|
18
|
+
class OracleDBSecret(Secret):
|
19
|
+
"""
|
20
|
+
Dataclass representing the attributes managed and serialized by OracleDBSecretKeeper
|
21
|
+
"""
|
22
|
+
|
23
|
+
user_name: str
|
24
|
+
password: str
|
25
|
+
host: str
|
26
|
+
port: str
|
27
|
+
service_name: str = field(default=None)
|
28
|
+
sid: str = field(default=None)
|
29
|
+
dsn: str = field(default=None)
|
30
|
+
|
31
|
+
|
32
|
+
class OracleDBSecretKeeper(SecretKeeper):
|
33
|
+
"""
|
34
|
+
`OracleDBSecretKeeper` provides an interface to save Oracle database credentials.
|
35
|
+
If you use Wallet file for connnecting to the database, please use ``ADBSecretKeeper``.
|
36
|
+
|
37
|
+
|
38
|
+
Examples
|
39
|
+
--------
|
40
|
+
>>> from ads.secrets.oracledb import OracleDBSecretKeeper
|
41
|
+
>>> vault_id = "ocid1.vault.oc1..<unique_ID>"
|
42
|
+
>>> key_id = "ocid1.key..<unique_ID>"
|
43
|
+
|
44
|
+
>>> import ads
|
45
|
+
>>> ads.set_auth("resource_principal") # If using resource principal for authentication
|
46
|
+
>>> connection_parameters={
|
47
|
+
... "user_name":"<your user name>",
|
48
|
+
... "password":"<your password>",
|
49
|
+
... "service_name":"service_name",
|
50
|
+
... "host":"<db host>",
|
51
|
+
... "port":"<db port>",
|
52
|
+
... }
|
53
|
+
>>> oracledb_keeper = OracleDBSecretKeeper(vault_id=vault_id, key_id=key_id, **connection_parameters)
|
54
|
+
>>> oracledb_keeper.save("oracledb_employee", "My DB credentials", freeform_tags={"schema":"emp"})
|
55
|
+
>>> print(oracledb_keeper.secret_id) # Prints the secret_id of the stored credentials
|
56
|
+
>>> oracledb_keeper.export_vault_details("oracledb_employee_att.json") # Save the secret id and vault info to a json file
|
57
|
+
|
58
|
+
>>> # Loading credentails
|
59
|
+
>>> import ads
|
60
|
+
>>> ads.set_auth("resource_principal") # If using resource principal for authentication
|
61
|
+
>>> from ads.secrets.oracledb import OracleDBSecretKeeper
|
62
|
+
>>> secret_id = "ocid1.vaultsecret.oc1..<unique_ID>"
|
63
|
+
>>> with OracleDBSecretKeeper.load_secret(source=secret_id) as oracledb_creds:
|
64
|
+
... import pandas as pd
|
65
|
+
... df = pd.DataFrame.ads.read_sql("select * from EMPLOYEE", connection_parameters=oracledb_creds)
|
66
|
+
|
67
|
+
|
68
|
+
>>> myoracledb_creds = OracleDBSecretKeeper.load_secret(source='oracledb_employee_att.json', format="json")
|
69
|
+
>>> pd.DataFrame.ads.read_sql("select * from ATTRITION_DATA", connection_parameters=myoracledb_creds.to_dict()).head(2)
|
70
|
+
|
71
|
+
"""
|
72
|
+
|
73
|
+
def __init__(
|
74
|
+
self,
|
75
|
+
user_name: str = None,
|
76
|
+
password: str = None,
|
77
|
+
service_name: str = None,
|
78
|
+
sid: str = None,
|
79
|
+
host: str = None,
|
80
|
+
port: str = "1521",
|
81
|
+
dsn: str = None,
|
82
|
+
repository_path: str = None,
|
83
|
+
repository_key: str = None,
|
84
|
+
**kwargs,
|
85
|
+
):
|
86
|
+
"""
|
87
|
+
Parameters
|
88
|
+
----------
|
89
|
+
user_name: (str, optional). Default None
|
90
|
+
user_name of the database
|
91
|
+
password: (str, optional). Default None
|
92
|
+
password for connecting to the database
|
93
|
+
service_name: (str, optional). Default None
|
94
|
+
service name of the Oracle DB instance
|
95
|
+
sid: (str, optional). Default None
|
96
|
+
Provide sid if service name is not available.
|
97
|
+
host: (str, optional). Default None
|
98
|
+
Database host name
|
99
|
+
port: (str, optional). Default 1521
|
100
|
+
Port number
|
101
|
+
dsn: (str, optional). Default None
|
102
|
+
`dsn` string for connecting with oracledb. Refer `cx_Oracle` documentation
|
103
|
+
repository_path: (str, optional). Default None.
|
104
|
+
Path to credentials repository. For more details refer `ads.database.connection`
|
105
|
+
repository_key: (str, optional). Default None.
|
106
|
+
Configuration key for loading the right configuration from repository. For more details refer `ads.database.connection`
|
107
|
+
kwargs:
|
108
|
+
vault_id: str. OCID of the vault where the secret is stored. Required for saving secret.
|
109
|
+
key_id: str. OCID of the key used for encrypting the secret. Required for saving secret.
|
110
|
+
compartment_id: str. OCID of the compartment where the vault is located. Required for saving secret.
|
111
|
+
auth: dict. Dictionay returned from ads.common.auth.api_keys() or ads.common.auth.resource_principal(). By default, will follow what is set in `ads.set_auth`. Use this attribute to override the default.
|
112
|
+
"""
|
113
|
+
if repository_path and repository_key:
|
114
|
+
from ads.database import connection
|
115
|
+
|
116
|
+
config_from_repo = connection.get_repository(
|
117
|
+
repository_key, repository_path
|
118
|
+
)
|
119
|
+
if user_name is None:
|
120
|
+
user_name = config_from_repo.get("username") or config_from_repo.get(
|
121
|
+
"user_name"
|
122
|
+
)
|
123
|
+
if password is None:
|
124
|
+
password = config_from_repo.get("password")
|
125
|
+
if service_name is None:
|
126
|
+
service_name = config_from_repo.get("service_name")
|
127
|
+
if host is None:
|
128
|
+
host = config_from_repo.get("host")
|
129
|
+
if port is None:
|
130
|
+
port = config_from_repo.get("port")
|
131
|
+
if sid is None:
|
132
|
+
sid = config_from_repo.get("sid")
|
133
|
+
|
134
|
+
self.data = OracleDBSecret(
|
135
|
+
user_name=user_name,
|
136
|
+
password=password,
|
137
|
+
service_name=service_name,
|
138
|
+
sid=sid,
|
139
|
+
host=host,
|
140
|
+
port=port,
|
141
|
+
dsn=dsn,
|
142
|
+
)
|
143
|
+
|
144
|
+
super().__init__(**kwargs)
|
145
|
+
|
146
|
+
def decode(self) -> "ads.secrets.oracledb.OracleDBSecretKeeper":
|
147
|
+
"""
|
148
|
+
Converts the content in `self.encoded` to `OracleDBSecret` and stores in `self.data`
|
149
|
+
|
150
|
+
Returns
|
151
|
+
-------
|
152
|
+
OracleDBSecretKeeper:
|
153
|
+
Returns self object
|
154
|
+
"""
|
155
|
+
content = json.loads(self._decode())
|
156
|
+
logger.debug(f"Decoded secret contains following keys - {list(content.keys())}")
|
157
|
+
self.data = OracleDBSecret(
|
158
|
+
**content,
|
159
|
+
)
|
160
|
+
return self
|