acryl-datahub 1.0.0rc18__py3-none-any.whl → 1.3.0.1rc9__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 acryl-datahub might be problematic. Click here for more details.
- {acryl_datahub-1.0.0rc18.dist-info → acryl_datahub-1.3.0.1rc9.dist-info}/METADATA +2686 -2563
- {acryl_datahub-1.0.0rc18.dist-info → acryl_datahub-1.3.0.1rc9.dist-info}/RECORD +499 -392
- {acryl_datahub-1.0.0rc18.dist-info → acryl_datahub-1.3.0.1rc9.dist-info}/WHEEL +1 -1
- {acryl_datahub-1.0.0rc18.dist-info → acryl_datahub-1.3.0.1rc9.dist-info}/entry_points.txt +7 -1
- datahub/_version.py +1 -1
- datahub/api/circuit_breaker/operation_circuit_breaker.py +2 -2
- datahub/api/entities/assertion/assertion.py +1 -1
- datahub/api/entities/common/serialized_value.py +1 -1
- datahub/api/entities/corpgroup/corpgroup.py +1 -1
- datahub/api/entities/datacontract/datacontract.py +35 -3
- datahub/api/entities/datajob/dataflow.py +18 -3
- datahub/api/entities/datajob/datajob.py +24 -4
- datahub/api/entities/dataprocess/dataprocess_instance.py +4 -0
- datahub/api/entities/dataproduct/dataproduct.py +32 -3
- datahub/api/entities/dataset/dataset.py +47 -72
- datahub/api/entities/external/__init__.py +0 -0
- datahub/api/entities/external/external_entities.py +724 -0
- datahub/api/entities/external/external_tag.py +147 -0
- datahub/api/entities/external/lake_formation_external_entites.py +162 -0
- datahub/api/entities/external/restricted_text.py +172 -0
- datahub/api/entities/external/unity_catalog_external_entites.py +172 -0
- datahub/api/entities/forms/forms.py +37 -37
- datahub/api/entities/structuredproperties/structuredproperties.py +6 -6
- datahub/api/graphql/assertion.py +1 -1
- datahub/api/graphql/base.py +8 -6
- datahub/api/graphql/operation.py +14 -10
- datahub/cli/check_cli.py +91 -9
- datahub/cli/cli_utils.py +63 -0
- datahub/cli/config_utils.py +20 -12
- datahub/cli/container_cli.py +5 -0
- datahub/cli/delete_cli.py +133 -34
- datahub/cli/docker_check.py +110 -14
- datahub/cli/docker_cli.py +155 -231
- datahub/cli/exists_cli.py +2 -3
- datahub/cli/get_cli.py +2 -3
- datahub/cli/graphql_cli.py +1422 -0
- datahub/cli/iceberg_cli.py +11 -5
- datahub/cli/ingest_cli.py +25 -26
- datahub/cli/migrate.py +12 -9
- datahub/cli/migration_utils.py +4 -3
- datahub/cli/put_cli.py +4 -6
- datahub/cli/quickstart_versioning.py +53 -10
- datahub/cli/specific/assertions_cli.py +39 -7
- datahub/cli/specific/datacontract_cli.py +57 -9
- datahub/cli/specific/dataproduct_cli.py +12 -24
- datahub/cli/specific/dataset_cli.py +31 -21
- datahub/cli/specific/forms_cli.py +2 -5
- datahub/cli/specific/group_cli.py +2 -3
- datahub/cli/specific/structuredproperties_cli.py +5 -7
- datahub/cli/specific/user_cli.py +174 -4
- datahub/cli/state_cli.py +2 -3
- datahub/cli/timeline_cli.py +2 -3
- datahub/configuration/common.py +46 -2
- datahub/configuration/connection_resolver.py +5 -2
- datahub/configuration/env_vars.py +331 -0
- datahub/configuration/import_resolver.py +7 -4
- datahub/configuration/kafka.py +21 -1
- datahub/configuration/pydantic_migration_helpers.py +6 -13
- datahub/configuration/source_common.py +4 -3
- datahub/configuration/validate_field_deprecation.py +5 -2
- datahub/configuration/validate_field_removal.py +8 -2
- datahub/configuration/validate_field_rename.py +6 -5
- datahub/configuration/validate_multiline_string.py +5 -2
- datahub/emitter/mce_builder.py +12 -8
- datahub/emitter/mcp.py +20 -5
- datahub/emitter/mcp_builder.py +12 -0
- datahub/emitter/request_helper.py +138 -15
- datahub/emitter/response_helper.py +111 -19
- datahub/emitter/rest_emitter.py +399 -163
- datahub/entrypoints.py +10 -5
- datahub/errors.py +12 -0
- datahub/ingestion/api/auto_work_units/auto_ensure_aspect_size.py +299 -2
- datahub/ingestion/api/auto_work_units/auto_validate_input_fields.py +87 -0
- datahub/ingestion/api/common.py +9 -0
- datahub/ingestion/api/decorators.py +15 -3
- datahub/ingestion/api/report.py +381 -3
- datahub/ingestion/api/sink.py +27 -2
- datahub/ingestion/api/source.py +174 -62
- datahub/ingestion/api/source_helpers.py +41 -3
- datahub/ingestion/api/source_protocols.py +23 -0
- datahub/ingestion/autogenerated/__init__.py +0 -0
- datahub/ingestion/autogenerated/capability_summary.json +3652 -0
- datahub/ingestion/autogenerated/lineage.json +402 -0
- datahub/ingestion/autogenerated/lineage_helper.py +177 -0
- datahub/ingestion/extractor/schema_util.py +31 -5
- datahub/ingestion/glossary/classification_mixin.py +9 -2
- datahub/ingestion/graph/client.py +492 -55
- datahub/ingestion/graph/config.py +18 -2
- datahub/ingestion/graph/filters.py +96 -32
- datahub/ingestion/graph/links.py +55 -0
- datahub/ingestion/reporting/datahub_ingestion_run_summary_provider.py +21 -11
- datahub/ingestion/run/pipeline.py +90 -23
- datahub/ingestion/run/pipeline_config.py +3 -3
- datahub/ingestion/sink/datahub_kafka.py +1 -0
- datahub/ingestion/sink/datahub_rest.py +31 -23
- datahub/ingestion/sink/file.py +1 -0
- datahub/ingestion/source/abs/config.py +1 -1
- datahub/ingestion/source/abs/datalake_profiler_config.py +1 -1
- datahub/ingestion/source/abs/source.py +15 -30
- datahub/ingestion/source/apply/datahub_apply.py +6 -5
- datahub/ingestion/source/aws/aws_common.py +185 -13
- datahub/ingestion/source/aws/glue.py +517 -244
- datahub/ingestion/source/aws/platform_resource_repository.py +30 -0
- datahub/ingestion/source/aws/s3_boto_utils.py +100 -5
- datahub/ingestion/source/aws/sagemaker_processors/feature_groups.py +1 -1
- datahub/ingestion/source/aws/sagemaker_processors/models.py +4 -4
- datahub/ingestion/source/aws/tag_entities.py +270 -0
- datahub/ingestion/source/azure/azure_common.py +3 -3
- datahub/ingestion/source/bigquery_v2/bigquery.py +51 -7
- datahub/ingestion/source/bigquery_v2/bigquery_config.py +51 -81
- datahub/ingestion/source/bigquery_v2/bigquery_connection.py +81 -0
- datahub/ingestion/source/bigquery_v2/bigquery_queries.py +6 -1
- datahub/ingestion/source/bigquery_v2/bigquery_report.py +0 -2
- datahub/ingestion/source/bigquery_v2/bigquery_schema.py +23 -16
- datahub/ingestion/source/bigquery_v2/bigquery_schema_gen.py +20 -5
- datahub/ingestion/source/bigquery_v2/common.py +1 -1
- datahub/ingestion/source/bigquery_v2/lineage.py +1 -1
- datahub/ingestion/source/bigquery_v2/profiler.py +4 -2
- datahub/ingestion/source/bigquery_v2/queries.py +3 -3
- datahub/ingestion/source/bigquery_v2/queries_extractor.py +45 -9
- datahub/ingestion/source/cassandra/cassandra.py +7 -18
- datahub/ingestion/source/cassandra/cassandra_api.py +36 -0
- datahub/ingestion/source/cassandra/cassandra_config.py +20 -0
- datahub/ingestion/source/cassandra/cassandra_profiling.py +26 -24
- datahub/ingestion/source/cassandra/cassandra_utils.py +1 -2
- datahub/ingestion/source/common/data_platforms.py +23 -0
- datahub/ingestion/source/common/gcp_credentials_config.py +9 -1
- datahub/ingestion/source/common/subtypes.py +73 -1
- datahub/ingestion/source/data_lake_common/data_lake_utils.py +59 -10
- datahub/ingestion/source/data_lake_common/object_store.py +732 -0
- datahub/ingestion/source/data_lake_common/path_spec.py +87 -38
- datahub/ingestion/source/datahub/config.py +19 -5
- datahub/ingestion/source/datahub/datahub_database_reader.py +205 -36
- datahub/ingestion/source/datahub/datahub_source.py +11 -1
- datahub/ingestion/source/dbt/dbt_cloud.py +17 -10
- datahub/ingestion/source/dbt/dbt_common.py +270 -26
- datahub/ingestion/source/dbt/dbt_core.py +88 -47
- datahub/ingestion/source/dbt/dbt_tests.py +8 -6
- datahub/ingestion/source/debug/__init__.py +0 -0
- datahub/ingestion/source/debug/datahub_debug.py +300 -0
- datahub/ingestion/source/delta_lake/config.py +9 -5
- datahub/ingestion/source/delta_lake/source.py +8 -0
- datahub/ingestion/source/dremio/dremio_api.py +114 -73
- datahub/ingestion/source/dremio/dremio_aspects.py +3 -2
- datahub/ingestion/source/dremio/dremio_config.py +5 -4
- datahub/ingestion/source/dremio/dremio_datahub_source_mapping.py +1 -1
- datahub/ingestion/source/dremio/dremio_entities.py +6 -5
- datahub/ingestion/source/dremio/dremio_reporting.py +22 -3
- datahub/ingestion/source/dremio/dremio_source.py +228 -215
- datahub/ingestion/source/dremio/dremio_sql_queries.py +82 -21
- datahub/ingestion/source/dynamodb/dynamodb.py +19 -13
- datahub/ingestion/source/excel/__init__.py +0 -0
- datahub/ingestion/source/excel/config.py +92 -0
- datahub/ingestion/source/excel/excel_file.py +539 -0
- datahub/ingestion/source/excel/profiling.py +308 -0
- datahub/ingestion/source/excel/report.py +49 -0
- datahub/ingestion/source/excel/source.py +662 -0
- datahub/ingestion/source/excel/util.py +18 -0
- datahub/ingestion/source/feast.py +12 -14
- datahub/ingestion/source/file.py +3 -0
- datahub/ingestion/source/fivetran/config.py +67 -8
- datahub/ingestion/source/fivetran/fivetran.py +228 -43
- datahub/ingestion/source/fivetran/fivetran_log_api.py +42 -9
- datahub/ingestion/source/fivetran/fivetran_query.py +58 -36
- datahub/ingestion/source/fivetran/fivetran_rest_api.py +65 -0
- datahub/ingestion/source/fivetran/response_models.py +97 -0
- datahub/ingestion/source/gc/datahub_gc.py +0 -2
- datahub/ingestion/source/gc/soft_deleted_entity_cleanup.py +101 -104
- datahub/ingestion/source/gcs/gcs_source.py +53 -10
- datahub/ingestion/source/gcs/gcs_utils.py +36 -9
- datahub/ingestion/source/ge_data_profiler.py +146 -33
- datahub/ingestion/source/ge_profiling_config.py +26 -11
- datahub/ingestion/source/grafana/entity_mcp_builder.py +272 -0
- datahub/ingestion/source/grafana/field_utils.py +307 -0
- datahub/ingestion/source/grafana/grafana_api.py +142 -0
- datahub/ingestion/source/grafana/grafana_config.py +104 -0
- datahub/ingestion/source/grafana/grafana_source.py +522 -84
- datahub/ingestion/source/grafana/lineage.py +202 -0
- datahub/ingestion/source/grafana/models.py +137 -0
- datahub/ingestion/source/grafana/report.py +90 -0
- datahub/ingestion/source/grafana/types.py +16 -0
- datahub/ingestion/source/hex/__init__.py +0 -0
- datahub/ingestion/source/hex/api.py +402 -0
- datahub/ingestion/source/hex/constants.py +8 -0
- datahub/ingestion/source/hex/hex.py +311 -0
- datahub/ingestion/source/hex/mapper.py +412 -0
- datahub/ingestion/source/hex/model.py +78 -0
- datahub/ingestion/source/hex/query_fetcher.py +307 -0
- datahub/ingestion/source/iceberg/iceberg.py +385 -164
- datahub/ingestion/source/iceberg/iceberg_common.py +2 -2
- datahub/ingestion/source/iceberg/iceberg_profiler.py +25 -20
- datahub/ingestion/source/identity/azure_ad.py +1 -1
- datahub/ingestion/source/identity/okta.py +1 -14
- datahub/ingestion/source/kafka/kafka.py +28 -71
- datahub/ingestion/source/kafka/kafka_config.py +78 -0
- datahub/ingestion/source/kafka_connect/common.py +2 -2
- datahub/ingestion/source/kafka_connect/sink_connectors.py +157 -48
- datahub/ingestion/source/kafka_connect/source_connectors.py +63 -5
- datahub/ingestion/source/ldap.py +1 -1
- datahub/ingestion/source/looker/looker_common.py +216 -86
- datahub/ingestion/source/looker/looker_config.py +15 -4
- datahub/ingestion/source/looker/looker_constant.py +4 -0
- datahub/ingestion/source/looker/looker_lib_wrapper.py +37 -4
- datahub/ingestion/source/looker/looker_liquid_tag.py +56 -5
- datahub/ingestion/source/looker/looker_source.py +539 -555
- datahub/ingestion/source/looker/looker_view_id_cache.py +1 -1
- datahub/ingestion/source/looker/lookml_concept_context.py +1 -1
- datahub/ingestion/source/looker/lookml_config.py +31 -3
- datahub/ingestion/source/looker/lookml_refinement.py +1 -1
- datahub/ingestion/source/looker/lookml_source.py +103 -118
- datahub/ingestion/source/looker/view_upstream.py +494 -1
- datahub/ingestion/source/metabase.py +32 -6
- datahub/ingestion/source/metadata/business_glossary.py +7 -7
- datahub/ingestion/source/metadata/lineage.py +11 -10
- datahub/ingestion/source/mlflow.py +254 -23
- datahub/ingestion/source/mock_data/__init__.py +0 -0
- datahub/ingestion/source/mock_data/datahub_mock_data.py +533 -0
- datahub/ingestion/source/mock_data/datahub_mock_data_report.py +12 -0
- datahub/ingestion/source/mock_data/table_naming_helper.py +97 -0
- datahub/ingestion/source/mode.py +359 -181
- datahub/ingestion/source/mongodb.py +11 -1
- datahub/ingestion/source/neo4j/neo4j_source.py +122 -153
- datahub/ingestion/source/nifi.py +5 -5
- datahub/ingestion/source/openapi.py +85 -38
- datahub/ingestion/source/openapi_parser.py +59 -40
- datahub/ingestion/source/powerbi/config.py +92 -27
- datahub/ingestion/source/powerbi/m_query/data_classes.py +3 -0
- datahub/ingestion/source/powerbi/m_query/odbc.py +185 -0
- datahub/ingestion/source/powerbi/m_query/parser.py +2 -2
- datahub/ingestion/source/powerbi/m_query/pattern_handler.py +358 -14
- datahub/ingestion/source/powerbi/m_query/resolver.py +10 -0
- datahub/ingestion/source/powerbi/powerbi.py +66 -32
- datahub/ingestion/source/powerbi/rest_api_wrapper/data_resolver.py +2 -2
- datahub/ingestion/source/powerbi/rest_api_wrapper/powerbi_api.py +11 -12
- datahub/ingestion/source/powerbi_report_server/report_server.py +0 -23
- datahub/ingestion/source/powerbi_report_server/report_server_domain.py +2 -4
- datahub/ingestion/source/preset.py +3 -3
- datahub/ingestion/source/qlik_sense/data_classes.py +28 -8
- datahub/ingestion/source/qlik_sense/qlik_sense.py +2 -1
- datahub/ingestion/source/redash.py +1 -1
- datahub/ingestion/source/redshift/config.py +15 -9
- datahub/ingestion/source/redshift/datashares.py +1 -1
- datahub/ingestion/source/redshift/lineage.py +386 -687
- datahub/ingestion/source/redshift/profile.py +2 -2
- datahub/ingestion/source/redshift/query.py +24 -20
- datahub/ingestion/source/redshift/redshift.py +52 -111
- datahub/ingestion/source/redshift/redshift_schema.py +17 -12
- datahub/ingestion/source/redshift/report.py +0 -2
- datahub/ingestion/source/redshift/usage.py +13 -11
- datahub/ingestion/source/s3/report.py +4 -2
- datahub/ingestion/source/s3/source.py +515 -244
- datahub/ingestion/source/sac/sac.py +3 -1
- datahub/ingestion/source/salesforce.py +28 -13
- datahub/ingestion/source/schema/json_schema.py +14 -14
- datahub/ingestion/source/schema_inference/object.py +22 -6
- datahub/ingestion/source/sigma/config.py +75 -8
- datahub/ingestion/source/sigma/data_classes.py +3 -0
- datahub/ingestion/source/sigma/sigma.py +36 -7
- datahub/ingestion/source/sigma/sigma_api.py +99 -58
- datahub/ingestion/source/slack/slack.py +403 -140
- datahub/ingestion/source/snaplogic/__init__.py +0 -0
- datahub/ingestion/source/snaplogic/snaplogic.py +355 -0
- datahub/ingestion/source/snaplogic/snaplogic_config.py +37 -0
- datahub/ingestion/source/snaplogic/snaplogic_lineage_extractor.py +107 -0
- datahub/ingestion/source/snaplogic/snaplogic_parser.py +168 -0
- datahub/ingestion/source/snaplogic/snaplogic_utils.py +31 -0
- datahub/ingestion/source/snowflake/constants.py +4 -0
- datahub/ingestion/source/snowflake/snowflake_config.py +103 -34
- datahub/ingestion/source/snowflake/snowflake_connection.py +47 -25
- datahub/ingestion/source/snowflake/snowflake_lineage_v2.py +25 -6
- datahub/ingestion/source/snowflake/snowflake_profiler.py +1 -6
- datahub/ingestion/source/snowflake/snowflake_queries.py +511 -107
- datahub/ingestion/source/snowflake/snowflake_query.py +100 -72
- datahub/ingestion/source/snowflake/snowflake_report.py +4 -2
- datahub/ingestion/source/snowflake/snowflake_schema.py +381 -16
- datahub/ingestion/source/snowflake/snowflake_schema_gen.py +163 -52
- datahub/ingestion/source/snowflake/snowflake_summary.py +7 -1
- datahub/ingestion/source/snowflake/snowflake_tag.py +4 -1
- datahub/ingestion/source/snowflake/snowflake_usage_v2.py +8 -2
- datahub/ingestion/source/snowflake/snowflake_utils.py +62 -17
- datahub/ingestion/source/snowflake/snowflake_v2.py +56 -10
- datahub/ingestion/source/snowflake/stored_proc_lineage.py +143 -0
- datahub/ingestion/source/sql/athena.py +219 -26
- datahub/ingestion/source/sql/athena_properties_extractor.py +795 -0
- datahub/ingestion/source/sql/clickhouse.py +29 -9
- datahub/ingestion/source/sql/cockroachdb.py +5 -4
- datahub/ingestion/source/sql/druid.py +9 -4
- datahub/ingestion/source/sql/hana.py +3 -1
- datahub/ingestion/source/sql/hive.py +28 -8
- datahub/ingestion/source/sql/hive_metastore.py +24 -25
- datahub/ingestion/source/sql/mariadb.py +0 -1
- datahub/ingestion/source/sql/mssql/job_models.py +18 -2
- datahub/ingestion/source/sql/mssql/source.py +376 -62
- datahub/ingestion/source/sql/mysql.py +154 -4
- datahub/ingestion/source/sql/oracle.py +62 -11
- datahub/ingestion/source/sql/postgres.py +142 -6
- datahub/ingestion/source/sql/presto.py +20 -2
- datahub/ingestion/source/sql/sql_common.py +281 -49
- datahub/ingestion/source/sql/sql_config.py +1 -34
- datahub/ingestion/source/sql/sql_generic_profiler.py +2 -1
- datahub/ingestion/source/sql/sql_types.py +27 -2
- datahub/ingestion/source/sql/sqlalchemy_uri.py +68 -0
- datahub/ingestion/source/sql/stored_procedures/__init__.py +0 -0
- datahub/ingestion/source/sql/stored_procedures/base.py +253 -0
- datahub/ingestion/source/sql/{mssql/stored_procedure_lineage.py → stored_procedures/lineage.py} +2 -29
- datahub/ingestion/source/sql/teradata.py +1028 -245
- datahub/ingestion/source/sql/trino.py +43 -10
- datahub/ingestion/source/sql/two_tier_sql_source.py +3 -4
- datahub/ingestion/source/sql/vertica.py +14 -7
- datahub/ingestion/source/sql_queries.py +219 -121
- datahub/ingestion/source/state/checkpoint.py +8 -29
- datahub/ingestion/source/state/entity_removal_state.py +5 -2
- datahub/ingestion/source/state/redundant_run_skip_handler.py +21 -0
- datahub/ingestion/source/state/stale_entity_removal_handler.py +0 -1
- datahub/ingestion/source/state/stateful_ingestion_base.py +36 -11
- datahub/ingestion/source/state_provider/datahub_ingestion_checkpointing_provider.py +2 -1
- datahub/ingestion/source/superset.py +810 -126
- datahub/ingestion/source/tableau/tableau.py +172 -69
- datahub/ingestion/source/tableau/tableau_common.py +11 -4
- datahub/ingestion/source/tableau/tableau_constant.py +1 -4
- datahub/ingestion/source/tableau/tableau_server_wrapper.py +3 -0
- datahub/ingestion/source/tableau/tableau_validation.py +1 -1
- datahub/ingestion/source/unity/config.py +161 -40
- datahub/ingestion/source/unity/connection.py +61 -0
- datahub/ingestion/source/unity/connection_test.py +1 -0
- datahub/ingestion/source/unity/platform_resource_repository.py +19 -0
- datahub/ingestion/source/unity/proxy.py +794 -51
- datahub/ingestion/source/unity/proxy_patch.py +321 -0
- datahub/ingestion/source/unity/proxy_types.py +36 -2
- datahub/ingestion/source/unity/report.py +15 -3
- datahub/ingestion/source/unity/source.py +465 -131
- datahub/ingestion/source/unity/tag_entities.py +197 -0
- datahub/ingestion/source/unity/usage.py +46 -4
- datahub/ingestion/source/usage/clickhouse_usage.py +11 -4
- datahub/ingestion/source/usage/starburst_trino_usage.py +10 -5
- datahub/ingestion/source/usage/usage_common.py +4 -68
- datahub/ingestion/source/vertexai/__init__.py +0 -0
- datahub/ingestion/source/vertexai/vertexai.py +1367 -0
- datahub/ingestion/source/vertexai/vertexai_config.py +29 -0
- datahub/ingestion/source/vertexai/vertexai_result_type_utils.py +89 -0
- datahub/ingestion/source_config/pulsar.py +3 -1
- datahub/ingestion/source_report/ingestion_stage.py +50 -11
- datahub/ingestion/transformer/add_dataset_dataproduct.py +1 -1
- datahub/ingestion/transformer/add_dataset_ownership.py +19 -3
- datahub/ingestion/transformer/base_transformer.py +8 -5
- datahub/ingestion/transformer/dataset_domain.py +1 -1
- datahub/ingestion/transformer/set_browse_path.py +112 -0
- datahub/integrations/assertion/common.py +3 -2
- datahub/integrations/assertion/snowflake/compiler.py +4 -3
- datahub/lite/lite_util.py +2 -2
- datahub/metadata/{_schema_classes.py → _internal_schema_classes.py} +3095 -631
- datahub/metadata/_urns/urn_defs.py +1866 -1582
- datahub/metadata/com/linkedin/pegasus2avro/application/__init__.py +19 -0
- datahub/metadata/com/linkedin/pegasus2avro/common/__init__.py +2 -0
- datahub/metadata/com/linkedin/pegasus2avro/dataplatform/slack/__init__.py +15 -0
- datahub/metadata/com/linkedin/pegasus2avro/event/__init__.py +11 -0
- datahub/metadata/com/linkedin/pegasus2avro/event/notification/__init__.py +15 -0
- datahub/metadata/com/linkedin/pegasus2avro/event/notification/settings/__init__.py +19 -0
- datahub/metadata/com/linkedin/pegasus2avro/file/__init__.py +19 -0
- datahub/metadata/com/linkedin/pegasus2avro/identity/__init__.py +2 -0
- datahub/metadata/com/linkedin/pegasus2avro/logical/__init__.py +15 -0
- datahub/metadata/com/linkedin/pegasus2avro/metadata/key/__init__.py +8 -0
- datahub/metadata/com/linkedin/pegasus2avro/module/__init__.py +31 -0
- datahub/metadata/com/linkedin/pegasus2avro/platform/event/v1/__init__.py +4 -0
- datahub/metadata/com/linkedin/pegasus2avro/role/__init__.py +2 -0
- datahub/metadata/com/linkedin/pegasus2avro/settings/asset/__init__.py +19 -0
- datahub/metadata/com/linkedin/pegasus2avro/settings/global/__init__.py +8 -0
- datahub/metadata/com/linkedin/pegasus2avro/template/__init__.py +31 -0
- datahub/metadata/schema.avsc +18404 -16617
- datahub/metadata/schema_classes.py +3 -3
- datahub/metadata/schemas/Actors.avsc +38 -1
- datahub/metadata/schemas/ApplicationKey.avsc +31 -0
- datahub/metadata/schemas/ApplicationProperties.avsc +72 -0
- datahub/metadata/schemas/Applications.avsc +38 -0
- datahub/metadata/schemas/AssetSettings.avsc +63 -0
- datahub/metadata/schemas/ChartInfo.avsc +2 -1
- datahub/metadata/schemas/ChartKey.avsc +1 -0
- datahub/metadata/schemas/ContainerKey.avsc +1 -0
- datahub/metadata/schemas/ContainerProperties.avsc +8 -0
- datahub/metadata/schemas/CorpUserEditableInfo.avsc +15 -1
- datahub/metadata/schemas/CorpUserKey.avsc +2 -1
- datahub/metadata/schemas/CorpUserSettings.avsc +145 -0
- datahub/metadata/schemas/DashboardKey.avsc +1 -0
- datahub/metadata/schemas/DataContractKey.avsc +2 -1
- datahub/metadata/schemas/DataFlowInfo.avsc +8 -0
- datahub/metadata/schemas/DataFlowKey.avsc +1 -0
- datahub/metadata/schemas/DataHubFileInfo.avsc +230 -0
- datahub/metadata/schemas/DataHubFileKey.avsc +21 -0
- datahub/metadata/schemas/DataHubIngestionSourceKey.avsc +2 -1
- datahub/metadata/schemas/DataHubOpenAPISchemaKey.avsc +22 -0
- datahub/metadata/schemas/DataHubPageModuleKey.avsc +21 -0
- datahub/metadata/schemas/DataHubPageModuleProperties.avsc +298 -0
- datahub/metadata/schemas/DataHubPageTemplateKey.avsc +21 -0
- datahub/metadata/schemas/DataHubPageTemplateProperties.avsc +251 -0
- datahub/metadata/schemas/DataHubPolicyInfo.avsc +12 -1
- datahub/metadata/schemas/DataJobInfo.avsc +8 -0
- datahub/metadata/schemas/DataJobInputOutput.avsc +8 -0
- datahub/metadata/schemas/DataJobKey.avsc +1 -0
- datahub/metadata/schemas/DataProcessInstanceInput.avsc +2 -1
- datahub/metadata/schemas/DataProcessInstanceOutput.avsc +2 -1
- datahub/metadata/schemas/DataProcessKey.avsc +8 -0
- datahub/metadata/schemas/DataProductKey.avsc +3 -1
- datahub/metadata/schemas/DataProductProperties.avsc +1 -1
- datahub/metadata/schemas/DataTransformLogic.avsc +4 -2
- datahub/metadata/schemas/DatasetKey.avsc +11 -1
- datahub/metadata/schemas/DatasetUsageStatistics.avsc +8 -0
- datahub/metadata/schemas/Deprecation.avsc +2 -0
- datahub/metadata/schemas/DomainKey.avsc +2 -1
- datahub/metadata/schemas/ExecutionRequestInput.avsc +5 -0
- datahub/metadata/schemas/FormInfo.avsc +5 -0
- datahub/metadata/schemas/GlobalSettingsInfo.avsc +134 -0
- datahub/metadata/schemas/GlossaryNodeKey.avsc +2 -1
- datahub/metadata/schemas/GlossaryTermKey.avsc +3 -1
- datahub/metadata/schemas/IcebergWarehouseInfo.avsc +8 -0
- datahub/metadata/schemas/IncidentInfo.avsc +3 -3
- datahub/metadata/schemas/InstitutionalMemory.avsc +31 -0
- datahub/metadata/schemas/LogicalParent.avsc +145 -0
- datahub/metadata/schemas/MLFeatureKey.avsc +1 -0
- datahub/metadata/schemas/MLFeatureTableKey.avsc +1 -0
- datahub/metadata/schemas/MLModelDeploymentKey.avsc +8 -0
- datahub/metadata/schemas/MLModelDeploymentProperties.avsc +3 -0
- datahub/metadata/schemas/MLModelGroupKey.avsc +11 -1
- datahub/metadata/schemas/MLModelGroupProperties.avsc +16 -0
- datahub/metadata/schemas/MLModelKey.avsc +9 -0
- datahub/metadata/schemas/MLPrimaryKeyKey.avsc +1 -0
- datahub/metadata/schemas/MetadataChangeEvent.avsc +189 -47
- datahub/metadata/schemas/MetadataChangeLog.avsc +65 -44
- datahub/metadata/schemas/MetadataChangeProposal.avsc +64 -0
- datahub/metadata/schemas/NotebookKey.avsc +1 -0
- datahub/metadata/schemas/Operation.avsc +21 -2
- datahub/metadata/schemas/Ownership.avsc +69 -0
- datahub/metadata/schemas/QueryProperties.avsc +24 -2
- datahub/metadata/schemas/QuerySubjects.avsc +1 -12
- datahub/metadata/schemas/RelationshipChangeEvent.avsc +215 -0
- datahub/metadata/schemas/SchemaFieldKey.avsc +4 -1
- datahub/metadata/schemas/Siblings.avsc +2 -0
- datahub/metadata/schemas/SlackUserInfo.avsc +160 -0
- datahub/metadata/schemas/StructuredProperties.avsc +69 -0
- datahub/metadata/schemas/StructuredPropertySettings.avsc +9 -0
- datahub/metadata/schemas/SystemMetadata.avsc +147 -0
- datahub/metadata/schemas/UpstreamLineage.avsc +9 -0
- datahub/metadata/schemas/__init__.py +3 -3
- datahub/sdk/__init__.py +7 -0
- datahub/sdk/_all_entities.py +15 -0
- datahub/sdk/_shared.py +393 -10
- datahub/sdk/_utils.py +4 -0
- datahub/sdk/chart.py +386 -0
- datahub/sdk/container.py +7 -0
- datahub/sdk/dashboard.py +453 -0
- datahub/sdk/dataflow.py +309 -0
- datahub/sdk/datajob.py +367 -0
- datahub/sdk/dataset.py +180 -4
- datahub/sdk/entity.py +99 -3
- datahub/sdk/entity_client.py +154 -12
- datahub/sdk/lineage_client.py +943 -0
- datahub/sdk/main_client.py +83 -8
- datahub/sdk/mlmodel.py +383 -0
- datahub/sdk/mlmodelgroup.py +240 -0
- datahub/sdk/search_client.py +85 -8
- datahub/sdk/search_filters.py +393 -68
- datahub/secret/datahub_secret_store.py +5 -1
- datahub/secret/environment_secret_store.py +29 -0
- datahub/secret/file_secret_store.py +49 -0
- datahub/specific/aspect_helpers/fine_grained_lineage.py +76 -0
- datahub/specific/aspect_helpers/siblings.py +73 -0
- datahub/specific/aspect_helpers/structured_properties.py +27 -0
- datahub/specific/chart.py +1 -1
- datahub/specific/datajob.py +15 -1
- datahub/specific/dataproduct.py +4 -0
- datahub/specific/dataset.py +51 -59
- datahub/sql_parsing/_sqlglot_patch.py +1 -2
- datahub/sql_parsing/fingerprint_utils.py +6 -0
- datahub/sql_parsing/split_statements.py +30 -3
- datahub/sql_parsing/sql_parsing_aggregator.py +144 -63
- datahub/sql_parsing/sqlglot_lineage.py +517 -44
- datahub/sql_parsing/sqlglot_utils.py +30 -18
- datahub/sql_parsing/tool_meta_extractor.py +25 -2
- datahub/telemetry/telemetry.py +30 -16
- datahub/testing/check_imports.py +1 -1
- datahub/testing/docker_utils.py +8 -2
- datahub/testing/mce_helpers.py +421 -0
- datahub/testing/mcp_diff.py +17 -21
- datahub/testing/sdk_v2_helpers.py +18 -0
- datahub/upgrade/upgrade.py +86 -30
- datahub/utilities/file_backed_collections.py +14 -15
- datahub/utilities/hive_schema_to_avro.py +2 -2
- datahub/utilities/ingest_utils.py +2 -2
- datahub/utilities/is_pytest.py +3 -2
- datahub/utilities/logging_manager.py +30 -7
- datahub/utilities/mapping.py +29 -2
- datahub/utilities/sample_data.py +5 -4
- datahub/utilities/server_config_util.py +298 -10
- datahub/utilities/sqlalchemy_query_combiner.py +6 -4
- datahub/utilities/stats_collections.py +4 -0
- datahub/utilities/threaded_iterator_executor.py +16 -3
- datahub/utilities/urn_encoder.py +1 -1
- datahub/utilities/urns/urn.py +41 -2
- datahub/emitter/sql_parsing_builder.py +0 -306
- datahub/ingestion/source/redshift/lineage_v2.py +0 -458
- datahub/ingestion/source/vertexai.py +0 -697
- datahub/ingestion/transformer/system_metadata_transformer.py +0 -45
- {acryl_datahub-1.0.0rc18.dist-info → acryl_datahub-1.3.0.1rc9.dist-info/licenses}/LICENSE +0 -0
- {acryl_datahub-1.0.0rc18.dist-info → acryl_datahub-1.3.0.1rc9.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Proxy authentication patch for databricks-sql < 3.0 compatibility.
|
|
3
|
+
|
|
4
|
+
This module provides proxy authentication fixes for databricks-sql connector < 3.0
|
|
5
|
+
to resolve "407 Proxy Authentication Required" errors that occur even when
|
|
6
|
+
proxy environment variables are correctly set.
|
|
7
|
+
|
|
8
|
+
The patch implements the same fix as Databricks PR #354:
|
|
9
|
+
https://github.com/databricks/databricks-sql-python/pull/354
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import logging
|
|
13
|
+
import os
|
|
14
|
+
import urllib.parse
|
|
15
|
+
from typing import Dict, Optional
|
|
16
|
+
|
|
17
|
+
logger: logging.Logger = logging.getLogger(__name__)
|
|
18
|
+
|
|
19
|
+
PROXY_VARS = ["HTTP_PROXY", "HTTPS_PROXY", "http_proxy", "https_proxy"]
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def mask_proxy_credentials(url: Optional[str]) -> str:
|
|
23
|
+
"""Mask credentials in proxy URL for safe logging."""
|
|
24
|
+
if not url:
|
|
25
|
+
return "None"
|
|
26
|
+
|
|
27
|
+
try:
|
|
28
|
+
parsed = urllib.parse.urlparse(url)
|
|
29
|
+
if parsed.username:
|
|
30
|
+
# Replace credentials with masked version
|
|
31
|
+
masked_netloc = parsed.netloc
|
|
32
|
+
if parsed.username and parsed.password:
|
|
33
|
+
masked_netloc = masked_netloc.replace(
|
|
34
|
+
f"{parsed.username}:{parsed.password}@", f"{parsed.username}:***@"
|
|
35
|
+
)
|
|
36
|
+
elif parsed.username:
|
|
37
|
+
masked_netloc = masked_netloc.replace(
|
|
38
|
+
f"{parsed.username}@", f"{parsed.username}:***@"
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
return urllib.parse.urlunparse(
|
|
42
|
+
(
|
|
43
|
+
parsed.scheme,
|
|
44
|
+
masked_netloc,
|
|
45
|
+
parsed.path,
|
|
46
|
+
parsed.params,
|
|
47
|
+
parsed.query,
|
|
48
|
+
parsed.fragment,
|
|
49
|
+
)
|
|
50
|
+
)
|
|
51
|
+
else:
|
|
52
|
+
return url
|
|
53
|
+
except Exception:
|
|
54
|
+
return "***INVALID_URL***"
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def _ensure_thrift_imports():
|
|
58
|
+
"""Ensure required thrift imports are loaded before accessing thrift_http_client.
|
|
59
|
+
|
|
60
|
+
The databricks-sql thrift_http_client requires thrift.transport.THttpClient.THttpClient
|
|
61
|
+
to be accessible. This is achieved by importing the required modules in the right order.
|
|
62
|
+
"""
|
|
63
|
+
try:
|
|
64
|
+
# Import thrift submodules - this makes them accessible as attributes
|
|
65
|
+
import thrift.transport.THttpClient # noqa: F401 # Used to make thrift.transport accessible
|
|
66
|
+
|
|
67
|
+
logger.debug("Successfully imported required thrift modules")
|
|
68
|
+
except Exception as e:
|
|
69
|
+
logger.debug(f"Could not import thrift modules: {e}")
|
|
70
|
+
raise
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def _log_proxy_environment():
|
|
74
|
+
"""Log detected proxy environment variables for debugging."""
|
|
75
|
+
proxy_env_vars = {}
|
|
76
|
+
for var in PROXY_VARS:
|
|
77
|
+
value = os.environ.get(var)
|
|
78
|
+
if value:
|
|
79
|
+
masked_value = mask_proxy_credentials(value)
|
|
80
|
+
proxy_env_vars[var] = masked_value
|
|
81
|
+
|
|
82
|
+
if proxy_env_vars:
|
|
83
|
+
logger.info(f"Detected proxy environment variables: {proxy_env_vars}")
|
|
84
|
+
else:
|
|
85
|
+
logger.debug("No proxy environment variables detected")
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def _basic_proxy_auth_header(proxy_url: str) -> Optional[Dict[str, str]]:
|
|
89
|
+
"""Create proxy authentication header using the same method as Databricks >= 3.0.
|
|
90
|
+
|
|
91
|
+
Based on the basic_proxy_auth_header method from databricks-sql-connector >= 3.0:
|
|
92
|
+
https://github.com/databricks/databricks-sql-python/pull/354
|
|
93
|
+
"""
|
|
94
|
+
try:
|
|
95
|
+
from urllib3.util import make_headers
|
|
96
|
+
|
|
97
|
+
parsed = urllib.parse.urlparse(proxy_url)
|
|
98
|
+
if parsed.username and parsed.password:
|
|
99
|
+
# Code reused from https://github.com/databricks/databricks-sql-python/pull/354
|
|
100
|
+
# URL decode the username and password (same as Databricks method)
|
|
101
|
+
username = urllib.parse.unquote(parsed.username)
|
|
102
|
+
password = urllib.parse.unquote(parsed.password)
|
|
103
|
+
auth_string = f"{username}:{password}"
|
|
104
|
+
|
|
105
|
+
# Create proxy URL without credentials
|
|
106
|
+
proxy_host_port = f"{parsed.scheme}://{parsed.hostname}"
|
|
107
|
+
if parsed.port:
|
|
108
|
+
proxy_host_port += f":{parsed.port}"
|
|
109
|
+
|
|
110
|
+
# Code reused from https://github.com/databricks/databricks-sql-python/pull/354
|
|
111
|
+
# Use make_headers like the newer Databricks version does
|
|
112
|
+
proxy_headers = make_headers(proxy_basic_auth=auth_string)
|
|
113
|
+
|
|
114
|
+
return {
|
|
115
|
+
"proxy_url": proxy_host_port,
|
|
116
|
+
"proxy_headers": proxy_headers,
|
|
117
|
+
"auth_string": auth_string, # Keep for backward compatibility with tests
|
|
118
|
+
}
|
|
119
|
+
except Exception as e:
|
|
120
|
+
logger.debug(f"Failed to create proxy auth header from URL {proxy_url}: {e}")
|
|
121
|
+
|
|
122
|
+
return None
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
def _handle_proxy_connection(self, original_open, pool_kwargs):
|
|
126
|
+
"""Handle proxy connection setup with authentication headers."""
|
|
127
|
+
from urllib3.poolmanager import ProxyManager
|
|
128
|
+
|
|
129
|
+
logger.info(f"Using proxy for connection to {self.host}:{self.port}")
|
|
130
|
+
proxy_uri = getattr(self, "proxy_uri", None)
|
|
131
|
+
logger.debug(
|
|
132
|
+
f"Proxy URI: {mask_proxy_credentials(proxy_uri) if proxy_uri else 'None'}"
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
# Compute proxy authentication headers properly (the bug fix!)
|
|
136
|
+
proxy_headers = None
|
|
137
|
+
proxy_env_found = None
|
|
138
|
+
for env_var in ["HTTPS_PROXY", "https_proxy", "HTTP_PROXY", "http_proxy"]:
|
|
139
|
+
proxy_url = os.environ.get(env_var)
|
|
140
|
+
if proxy_url:
|
|
141
|
+
logger.debug(
|
|
142
|
+
f"Found proxy URL in {env_var}: {mask_proxy_credentials(proxy_url)}"
|
|
143
|
+
)
|
|
144
|
+
auth_info = _basic_proxy_auth_header(proxy_url)
|
|
145
|
+
if auth_info:
|
|
146
|
+
proxy_headers = auth_info["proxy_headers"]
|
|
147
|
+
proxy_env_found = env_var
|
|
148
|
+
logger.debug(f"Successfully created proxy headers from {env_var}")
|
|
149
|
+
break
|
|
150
|
+
else:
|
|
151
|
+
logger.debug(
|
|
152
|
+
f"No authentication info found in proxy URL from {env_var}"
|
|
153
|
+
)
|
|
154
|
+
|
|
155
|
+
if proxy_headers:
|
|
156
|
+
logger.info(f"Using proxy authentication headers from {proxy_env_found}")
|
|
157
|
+
else:
|
|
158
|
+
logger.warning(
|
|
159
|
+
"No proxy authentication headers could be created from environment variables"
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
proxy_manager = ProxyManager(
|
|
163
|
+
self.proxy_uri,
|
|
164
|
+
num_pools=1,
|
|
165
|
+
proxy_headers=proxy_headers,
|
|
166
|
+
)
|
|
167
|
+
|
|
168
|
+
# Validate proxy manager attributes
|
|
169
|
+
if not hasattr(self, "realhost") or not hasattr(self, "realport"):
|
|
170
|
+
logger.warning(
|
|
171
|
+
"THttpClient missing realhost/realport attributes, falling back to original"
|
|
172
|
+
)
|
|
173
|
+
return original_open(self)
|
|
174
|
+
|
|
175
|
+
# Set up the connection pool
|
|
176
|
+
self._THttpClient__pool = proxy_manager.connection_from_host(
|
|
177
|
+
host=self.realhost,
|
|
178
|
+
port=self.realport,
|
|
179
|
+
scheme=self.scheme,
|
|
180
|
+
pool_kwargs=pool_kwargs, # type: ignore
|
|
181
|
+
)
|
|
182
|
+
logger.debug(f"Created proxy connection pool for {self.realhost}:{self.realport}")
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
def _create_patched_open_method(original_open):
|
|
186
|
+
"""Create the patched THttpClient.open method with proxy authentication fix."""
|
|
187
|
+
|
|
188
|
+
def patched_open(self):
|
|
189
|
+
"""Patched version of THttpClient.open following databricks-sql >= 3.0 structure.
|
|
190
|
+
|
|
191
|
+
This is largely copied from the >= 3.0 implementation:
|
|
192
|
+
https://github.com/databricks/databricks-sql-python/pull/354/files
|
|
193
|
+
"""
|
|
194
|
+
logger.debug(
|
|
195
|
+
f"Patched THttpClient.open called for host={getattr(self, 'host', 'unknown')}, scheme={getattr(self, 'scheme', 'unknown')}"
|
|
196
|
+
)
|
|
197
|
+
|
|
198
|
+
try:
|
|
199
|
+
# Validate required attributes
|
|
200
|
+
required_attrs = ["scheme", "host", "port", "max_connections"]
|
|
201
|
+
missing_attrs = [attr for attr in required_attrs if not hasattr(self, attr)]
|
|
202
|
+
if missing_attrs:
|
|
203
|
+
logger.warning(
|
|
204
|
+
f"THttpClient missing required attributes: {missing_attrs}, falling back to original"
|
|
205
|
+
)
|
|
206
|
+
return original_open(self)
|
|
207
|
+
|
|
208
|
+
# Code structure reused from https://github.com/databricks/databricks-sql-python/pull/354
|
|
209
|
+
# Determine pool class based on scheme
|
|
210
|
+
if self.scheme == "http":
|
|
211
|
+
from urllib3 import HTTPConnectionPool
|
|
212
|
+
|
|
213
|
+
pool_class = HTTPConnectionPool
|
|
214
|
+
elif self.scheme == "https":
|
|
215
|
+
from urllib3 import HTTPSConnectionPool
|
|
216
|
+
|
|
217
|
+
pool_class = HTTPSConnectionPool
|
|
218
|
+
else:
|
|
219
|
+
logger.warning(
|
|
220
|
+
f"Unknown scheme '{self.scheme}', falling back to original"
|
|
221
|
+
)
|
|
222
|
+
return original_open(self)
|
|
223
|
+
|
|
224
|
+
_pool_kwargs = {"maxsize": self.max_connections}
|
|
225
|
+
logger.debug(f"Pool kwargs: {_pool_kwargs}")
|
|
226
|
+
|
|
227
|
+
if self.using_proxy():
|
|
228
|
+
return _handle_proxy_connection(self, original_open, _pool_kwargs)
|
|
229
|
+
else:
|
|
230
|
+
logger.debug(f"Direct connection (no proxy) to {self.host}:{self.port}")
|
|
231
|
+
self._THttpClient__pool = pool_class(
|
|
232
|
+
self.host, self.port, **_pool_kwargs
|
|
233
|
+
)
|
|
234
|
+
|
|
235
|
+
logger.debug("Patched THttpClient.open completed successfully")
|
|
236
|
+
|
|
237
|
+
except Exception as e:
|
|
238
|
+
logger.warning(
|
|
239
|
+
f"Error in proxy auth patch: {e}, falling back to original",
|
|
240
|
+
exc_info=True,
|
|
241
|
+
)
|
|
242
|
+
# Fallback to original implementation
|
|
243
|
+
try:
|
|
244
|
+
return original_open(self)
|
|
245
|
+
except Exception as fallback_error:
|
|
246
|
+
logger.error(
|
|
247
|
+
f"Fallback to original THttpClient.open also failed: {fallback_error}",
|
|
248
|
+
exc_info=True,
|
|
249
|
+
)
|
|
250
|
+
raise
|
|
251
|
+
|
|
252
|
+
return patched_open
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
def apply_databricks_proxy_fix():
|
|
256
|
+
"""Apply the databricks-sql < 3.0 proxy authentication fix at module import time.
|
|
257
|
+
|
|
258
|
+
This implements the same fix as Databricks PR #354 to resolve
|
|
259
|
+
"407 Proxy Authentication Required" errors that occur even when
|
|
260
|
+
all proxy environment variables are correctly set.
|
|
261
|
+
|
|
262
|
+
Note: This fix may not work with all thrift versions due to compatibility issues
|
|
263
|
+
between databricks-sql-connector 2.9.6 and newer thrift versions. The fix will
|
|
264
|
+
gracefully fail with a warning if thrift compatibility issues are detected.
|
|
265
|
+
The main SQL functionality will continue to work normally without this fix.
|
|
266
|
+
"""
|
|
267
|
+
_log_proxy_environment()
|
|
268
|
+
logger.info("Applying databricks-sql proxy authentication fix...")
|
|
269
|
+
|
|
270
|
+
try:
|
|
271
|
+
_ensure_thrift_imports()
|
|
272
|
+
import databricks.sql.auth.thrift_http_client as thrift_http
|
|
273
|
+
|
|
274
|
+
# Store original method for fallback
|
|
275
|
+
original_open = getattr(thrift_http.THttpClient, "open", None)
|
|
276
|
+
if not original_open:
|
|
277
|
+
logger.warning("Could not find THttpClient.open method to patch")
|
|
278
|
+
return False
|
|
279
|
+
|
|
280
|
+
logger.debug(f"Found THttpClient.open method at {original_open}")
|
|
281
|
+
|
|
282
|
+
# Apply the patch
|
|
283
|
+
patched_open = _create_patched_open_method(original_open)
|
|
284
|
+
thrift_http.THttpClient.open = patched_open
|
|
285
|
+
logger.info("Successfully applied databricks-sql proxy authentication fix")
|
|
286
|
+
|
|
287
|
+
# Verify the patch was applied
|
|
288
|
+
current_method = getattr(thrift_http.THttpClient, "open", None)
|
|
289
|
+
if current_method == patched_open:
|
|
290
|
+
logger.debug(
|
|
291
|
+
"Patch verification successful: THttpClient.open is now the patched version"
|
|
292
|
+
)
|
|
293
|
+
return True
|
|
294
|
+
else:
|
|
295
|
+
logger.warning(
|
|
296
|
+
"Patch verification failed: THttpClient.open was not replaced correctly"
|
|
297
|
+
)
|
|
298
|
+
return False
|
|
299
|
+
|
|
300
|
+
except ImportError as e:
|
|
301
|
+
logger.debug(f"Could not import databricks-sql internals for proxy patch: {e}")
|
|
302
|
+
return False
|
|
303
|
+
except AttributeError as e:
|
|
304
|
+
if "thrift" in str(e).lower() and "transport" in str(e).lower():
|
|
305
|
+
warning_msg = (
|
|
306
|
+
f"Databricks-sql proxy authentication patch could not be applied due to thrift version incompatibility: {e}. "
|
|
307
|
+
"In most environments, the SQL connection will still work without this patch."
|
|
308
|
+
)
|
|
309
|
+
logger.warning(warning_msg)
|
|
310
|
+
# Import here to avoid circular imports
|
|
311
|
+
from datahub.utilities.global_warning_util import add_global_warning
|
|
312
|
+
|
|
313
|
+
add_global_warning(warning_msg)
|
|
314
|
+
else:
|
|
315
|
+
logger.error(
|
|
316
|
+
f"Failed to apply databricks-sql proxy patch: {e}", exc_info=True
|
|
317
|
+
)
|
|
318
|
+
return False
|
|
319
|
+
except Exception as e:
|
|
320
|
+
logger.error(f"Failed to apply databricks-sql proxy patch: {e}", exc_info=True)
|
|
321
|
+
return False
|
|
@@ -148,6 +148,7 @@ class TableReference:
|
|
|
148
148
|
catalog: str
|
|
149
149
|
schema: str
|
|
150
150
|
table: str
|
|
151
|
+
last_updated: Optional[datetime] = None
|
|
151
152
|
|
|
152
153
|
@classmethod
|
|
153
154
|
def create(cls, table: "Table") -> "TableReference":
|
|
@@ -172,6 +173,7 @@ class TableReference:
|
|
|
172
173
|
d["catalog_name"],
|
|
173
174
|
d["schema_name"],
|
|
174
175
|
d.get("table_name", d["name"]), # column vs table query output
|
|
176
|
+
last_updated=d.get("last_updated"),
|
|
175
177
|
)
|
|
176
178
|
except Exception as e:
|
|
177
179
|
logger.warning(f"Failed to create TableReference from {d}: {e}")
|
|
@@ -199,6 +201,7 @@ class ExternalTableReference:
|
|
|
199
201
|
name: Optional[str]
|
|
200
202
|
type: Optional[SecurableType]
|
|
201
203
|
storage_location: Optional[str]
|
|
204
|
+
last_updated: Optional[datetime] = None
|
|
202
205
|
|
|
203
206
|
@classmethod
|
|
204
207
|
def create_from_lineage(cls, d: dict) -> Optional["ExternalTableReference"]:
|
|
@@ -215,12 +218,19 @@ class ExternalTableReference:
|
|
|
215
218
|
name=d.get("securable_name"),
|
|
216
219
|
type=securable_type,
|
|
217
220
|
storage_location=d.get("storage_location"),
|
|
221
|
+
last_updated=d.get("last_updated"),
|
|
218
222
|
)
|
|
219
223
|
except Exception as e:
|
|
220
224
|
logger.warning(f"Failed to create ExternalTableReference from {d}: {e}")
|
|
221
225
|
return None
|
|
222
226
|
|
|
223
227
|
|
|
228
|
+
@dataclass(frozen=True, order=True)
|
|
229
|
+
class NotebookReference:
|
|
230
|
+
id: int
|
|
231
|
+
last_updated: Optional[datetime] = None
|
|
232
|
+
|
|
233
|
+
|
|
224
234
|
@dataclass
|
|
225
235
|
class Table(CommonProperty):
|
|
226
236
|
schema: Schema
|
|
@@ -239,8 +249,8 @@ class Table(CommonProperty):
|
|
|
239
249
|
properties: Dict[str, str]
|
|
240
250
|
upstreams: Dict[TableReference, Dict[str, List[str]]] = field(default_factory=dict)
|
|
241
251
|
external_upstreams: Set[ExternalTableReference] = field(default_factory=set)
|
|
242
|
-
upstream_notebooks:
|
|
243
|
-
downstream_notebooks:
|
|
252
|
+
upstream_notebooks: Dict[int, NotebookReference] = field(default_factory=dict)
|
|
253
|
+
downstream_notebooks: Dict[int, NotebookReference] = field(default_factory=dict)
|
|
244
254
|
|
|
245
255
|
ref: TableReference = field(init=False)
|
|
246
256
|
|
|
@@ -327,3 +337,27 @@ class Notebook:
|
|
|
327
337
|
"upstreams": frozenset([*notebook.upstreams, upstream]),
|
|
328
338
|
}
|
|
329
339
|
)
|
|
340
|
+
|
|
341
|
+
|
|
342
|
+
@dataclass
|
|
343
|
+
class Model:
|
|
344
|
+
id: str
|
|
345
|
+
name: str
|
|
346
|
+
schema_name: str
|
|
347
|
+
catalog_name: str
|
|
348
|
+
description: Optional[str]
|
|
349
|
+
created_at: Optional[datetime]
|
|
350
|
+
updated_at: Optional[datetime]
|
|
351
|
+
|
|
352
|
+
|
|
353
|
+
@dataclass
|
|
354
|
+
class ModelVersion:
|
|
355
|
+
id: str
|
|
356
|
+
name: str
|
|
357
|
+
model: Model
|
|
358
|
+
version: str
|
|
359
|
+
aliases: Optional[List[str]]
|
|
360
|
+
description: Optional[str]
|
|
361
|
+
created_at: Optional[datetime]
|
|
362
|
+
updated_at: Optional[datetime]
|
|
363
|
+
created_by: Optional[str]
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
from dataclasses import dataclass, field
|
|
2
|
-
from typing import Optional, Tuple
|
|
2
|
+
from typing import TYPE_CHECKING, Optional, Tuple
|
|
3
3
|
|
|
4
4
|
from datahub.ingestion.api.report import EntityFilterReport, Report
|
|
5
5
|
from datahub.ingestion.source.sql.sql_report import SQLSourceReport
|
|
6
|
-
from datahub.ingestion.source_report.ingestion_stage import IngestionStageReport
|
|
7
6
|
from datahub.utilities.lossy_collections import LossyDict, LossyList
|
|
8
7
|
from datahub.utilities.perf_timer import PerfTimer
|
|
9
8
|
|
|
9
|
+
if TYPE_CHECKING:
|
|
10
|
+
from datahub.ingestion.source.unity.platform_resource_repository import (
|
|
11
|
+
UnityCatalogPlatformResourceRepository,
|
|
12
|
+
)
|
|
13
|
+
|
|
10
14
|
|
|
11
15
|
@dataclass
|
|
12
16
|
class UnityCatalogUsagePerfReport(Report):
|
|
@@ -19,13 +23,17 @@ class UnityCatalogUsagePerfReport(Report):
|
|
|
19
23
|
|
|
20
24
|
|
|
21
25
|
@dataclass
|
|
22
|
-
class UnityCatalogReport(
|
|
26
|
+
class UnityCatalogReport(SQLSourceReport):
|
|
23
27
|
metastores: EntityFilterReport = EntityFilterReport.field(type="metastore")
|
|
24
28
|
catalogs: EntityFilterReport = EntityFilterReport.field(type="catalog")
|
|
25
29
|
schemas: EntityFilterReport = EntityFilterReport.field(type="schema")
|
|
26
30
|
tables: EntityFilterReport = EntityFilterReport.field(type="table/view")
|
|
27
31
|
table_profiles: EntityFilterReport = EntityFilterReport.field(type="table profile")
|
|
28
32
|
notebooks: EntityFilterReport = EntityFilterReport.field(type="notebook")
|
|
33
|
+
ml_models: EntityFilterReport = EntityFilterReport.field(type="ml_model")
|
|
34
|
+
ml_model_versions: EntityFilterReport = EntityFilterReport.field(
|
|
35
|
+
type="ml_model_version"
|
|
36
|
+
)
|
|
29
37
|
|
|
30
38
|
hive_metastore_catalog_found: Optional[bool] = None
|
|
31
39
|
|
|
@@ -59,5 +67,9 @@ class UnityCatalogReport(IngestionStageReport, SQLSourceReport):
|
|
|
59
67
|
num_catalogs_missing_name: int = 0
|
|
60
68
|
num_schemas_missing_name: int = 0
|
|
61
69
|
num_tables_missing_name: int = 0
|
|
70
|
+
num_ml_models_missing_name: int = 0
|
|
62
71
|
num_columns_missing_name: int = 0
|
|
63
72
|
num_queries_missing_info: int = 0
|
|
73
|
+
|
|
74
|
+
# Platform resource repository for automatic cache statistics via SupportsAsObj
|
|
75
|
+
tag_urn_resolver_cache: Optional["UnityCatalogPlatformResourceRepository"] = None
|