acryl-datahub 1.1.1rc4__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.

Files changed (414) hide show
  1. {acryl_datahub-1.1.1rc4.dist-info → acryl_datahub-1.3.0.1rc9.dist-info}/METADATA +2615 -2547
  2. {acryl_datahub-1.1.1rc4.dist-info → acryl_datahub-1.3.0.1rc9.dist-info}/RECORD +412 -338
  3. {acryl_datahub-1.1.1rc4.dist-info → acryl_datahub-1.3.0.1rc9.dist-info}/entry_points.txt +5 -0
  4. datahub/_version.py +1 -1
  5. datahub/api/entities/assertion/assertion.py +1 -1
  6. datahub/api/entities/common/serialized_value.py +1 -1
  7. datahub/api/entities/corpgroup/corpgroup.py +1 -1
  8. datahub/api/entities/dataproduct/dataproduct.py +32 -3
  9. datahub/api/entities/dataset/dataset.py +26 -23
  10. datahub/api/entities/external/__init__.py +0 -0
  11. datahub/api/entities/external/external_entities.py +724 -0
  12. datahub/api/entities/external/external_tag.py +147 -0
  13. datahub/api/entities/external/lake_formation_external_entites.py +162 -0
  14. datahub/api/entities/external/restricted_text.py +172 -0
  15. datahub/api/entities/external/unity_catalog_external_entites.py +172 -0
  16. datahub/api/entities/forms/forms.py +3 -3
  17. datahub/api/entities/structuredproperties/structuredproperties.py +4 -4
  18. datahub/api/graphql/operation.py +10 -6
  19. datahub/cli/check_cli.py +88 -7
  20. datahub/cli/cli_utils.py +63 -0
  21. datahub/cli/config_utils.py +18 -10
  22. datahub/cli/container_cli.py +5 -0
  23. datahub/cli/delete_cli.py +125 -27
  24. datahub/cli/docker_check.py +110 -14
  25. datahub/cli/docker_cli.py +153 -229
  26. datahub/cli/exists_cli.py +0 -2
  27. datahub/cli/get_cli.py +0 -2
  28. datahub/cli/graphql_cli.py +1422 -0
  29. datahub/cli/iceberg_cli.py +5 -0
  30. datahub/cli/ingest_cli.py +3 -15
  31. datahub/cli/migrate.py +2 -0
  32. datahub/cli/put_cli.py +1 -4
  33. datahub/cli/quickstart_versioning.py +53 -10
  34. datahub/cli/specific/assertions_cli.py +37 -6
  35. datahub/cli/specific/datacontract_cli.py +54 -7
  36. datahub/cli/specific/dataproduct_cli.py +2 -15
  37. datahub/cli/specific/dataset_cli.py +1 -8
  38. datahub/cli/specific/forms_cli.py +0 -4
  39. datahub/cli/specific/group_cli.py +0 -2
  40. datahub/cli/specific/structuredproperties_cli.py +1 -4
  41. datahub/cli/specific/user_cli.py +172 -3
  42. datahub/cli/state_cli.py +0 -2
  43. datahub/cli/timeline_cli.py +0 -2
  44. datahub/configuration/common.py +40 -1
  45. datahub/configuration/connection_resolver.py +5 -2
  46. datahub/configuration/env_vars.py +331 -0
  47. datahub/configuration/import_resolver.py +7 -4
  48. datahub/configuration/kafka.py +21 -1
  49. datahub/configuration/pydantic_migration_helpers.py +6 -13
  50. datahub/configuration/source_common.py +3 -2
  51. datahub/configuration/validate_field_deprecation.py +5 -2
  52. datahub/configuration/validate_field_removal.py +8 -2
  53. datahub/configuration/validate_field_rename.py +6 -5
  54. datahub/configuration/validate_multiline_string.py +5 -2
  55. datahub/emitter/mce_builder.py +8 -4
  56. datahub/emitter/rest_emitter.py +103 -30
  57. datahub/entrypoints.py +6 -3
  58. datahub/ingestion/api/auto_work_units/auto_ensure_aspect_size.py +297 -1
  59. datahub/ingestion/api/auto_work_units/auto_validate_input_fields.py +87 -0
  60. datahub/ingestion/api/decorators.py +15 -3
  61. datahub/ingestion/api/report.py +381 -3
  62. datahub/ingestion/api/sink.py +27 -2
  63. datahub/ingestion/api/source.py +165 -58
  64. datahub/ingestion/api/source_protocols.py +23 -0
  65. datahub/ingestion/autogenerated/__init__.py +0 -0
  66. datahub/ingestion/autogenerated/capability_summary.json +3652 -0
  67. datahub/ingestion/autogenerated/lineage.json +402 -0
  68. datahub/ingestion/autogenerated/lineage_helper.py +177 -0
  69. datahub/ingestion/extractor/schema_util.py +13 -4
  70. datahub/ingestion/glossary/classification_mixin.py +5 -0
  71. datahub/ingestion/graph/client.py +330 -25
  72. datahub/ingestion/graph/config.py +3 -2
  73. datahub/ingestion/graph/filters.py +30 -11
  74. datahub/ingestion/reporting/datahub_ingestion_run_summary_provider.py +21 -11
  75. datahub/ingestion/run/pipeline.py +81 -11
  76. datahub/ingestion/run/pipeline_config.py +2 -2
  77. datahub/ingestion/sink/datahub_kafka.py +1 -0
  78. datahub/ingestion/sink/datahub_rest.py +13 -5
  79. datahub/ingestion/sink/file.py +1 -0
  80. datahub/ingestion/source/abs/config.py +1 -1
  81. datahub/ingestion/source/abs/datalake_profiler_config.py +1 -1
  82. datahub/ingestion/source/abs/source.py +15 -30
  83. datahub/ingestion/source/aws/aws_common.py +185 -13
  84. datahub/ingestion/source/aws/glue.py +517 -244
  85. datahub/ingestion/source/aws/platform_resource_repository.py +30 -0
  86. datahub/ingestion/source/aws/s3_boto_utils.py +100 -5
  87. datahub/ingestion/source/aws/tag_entities.py +270 -0
  88. datahub/ingestion/source/azure/azure_common.py +3 -3
  89. datahub/ingestion/source/bigquery_v2/bigquery.py +67 -24
  90. datahub/ingestion/source/bigquery_v2/bigquery_config.py +47 -19
  91. datahub/ingestion/source/bigquery_v2/bigquery_connection.py +12 -1
  92. datahub/ingestion/source/bigquery_v2/bigquery_queries.py +3 -0
  93. datahub/ingestion/source/bigquery_v2/bigquery_report.py +0 -2
  94. datahub/ingestion/source/bigquery_v2/bigquery_schema.py +23 -16
  95. datahub/ingestion/source/bigquery_v2/bigquery_schema_gen.py +20 -5
  96. datahub/ingestion/source/bigquery_v2/common.py +1 -1
  97. datahub/ingestion/source/bigquery_v2/profiler.py +4 -2
  98. datahub/ingestion/source/bigquery_v2/queries.py +3 -3
  99. datahub/ingestion/source/bigquery_v2/queries_extractor.py +45 -9
  100. datahub/ingestion/source/cassandra/cassandra.py +6 -8
  101. datahub/ingestion/source/cassandra/cassandra_api.py +17 -1
  102. datahub/ingestion/source/cassandra/cassandra_config.py +5 -0
  103. datahub/ingestion/source/cassandra/cassandra_profiling.py +7 -6
  104. datahub/ingestion/source/cassandra/cassandra_utils.py +1 -2
  105. datahub/ingestion/source/common/gcp_credentials_config.py +3 -1
  106. datahub/ingestion/source/common/subtypes.py +53 -0
  107. datahub/ingestion/source/data_lake_common/data_lake_utils.py +37 -0
  108. datahub/ingestion/source/data_lake_common/object_store.py +115 -27
  109. datahub/ingestion/source/data_lake_common/path_spec.py +72 -43
  110. datahub/ingestion/source/datahub/config.py +12 -9
  111. datahub/ingestion/source/datahub/datahub_database_reader.py +26 -11
  112. datahub/ingestion/source/datahub/datahub_source.py +10 -0
  113. datahub/ingestion/source/dbt/dbt_cloud.py +16 -5
  114. datahub/ingestion/source/dbt/dbt_common.py +224 -9
  115. datahub/ingestion/source/dbt/dbt_core.py +3 -0
  116. datahub/ingestion/source/debug/__init__.py +0 -0
  117. datahub/ingestion/source/debug/datahub_debug.py +300 -0
  118. datahub/ingestion/source/delta_lake/config.py +9 -5
  119. datahub/ingestion/source/delta_lake/source.py +8 -0
  120. datahub/ingestion/source/dremio/dremio_api.py +114 -73
  121. datahub/ingestion/source/dremio/dremio_aspects.py +3 -2
  122. datahub/ingestion/source/dremio/dremio_config.py +5 -4
  123. datahub/ingestion/source/dremio/dremio_reporting.py +22 -3
  124. datahub/ingestion/source/dremio/dremio_source.py +132 -98
  125. datahub/ingestion/source/dremio/dremio_sql_queries.py +82 -21
  126. datahub/ingestion/source/dynamodb/dynamodb.py +11 -8
  127. datahub/ingestion/source/excel/__init__.py +0 -0
  128. datahub/ingestion/source/excel/config.py +92 -0
  129. datahub/ingestion/source/excel/excel_file.py +539 -0
  130. datahub/ingestion/source/excel/profiling.py +308 -0
  131. datahub/ingestion/source/excel/report.py +49 -0
  132. datahub/ingestion/source/excel/source.py +662 -0
  133. datahub/ingestion/source/excel/util.py +18 -0
  134. datahub/ingestion/source/feast.py +8 -10
  135. datahub/ingestion/source/file.py +3 -0
  136. datahub/ingestion/source/fivetran/config.py +66 -7
  137. datahub/ingestion/source/fivetran/fivetran.py +227 -43
  138. datahub/ingestion/source/fivetran/fivetran_log_api.py +37 -8
  139. datahub/ingestion/source/fivetran/fivetran_query.py +51 -29
  140. datahub/ingestion/source/fivetran/fivetran_rest_api.py +65 -0
  141. datahub/ingestion/source/fivetran/response_models.py +97 -0
  142. datahub/ingestion/source/gc/datahub_gc.py +0 -2
  143. datahub/ingestion/source/gcs/gcs_source.py +32 -4
  144. datahub/ingestion/source/ge_data_profiler.py +108 -31
  145. datahub/ingestion/source/ge_profiling_config.py +26 -11
  146. datahub/ingestion/source/grafana/entity_mcp_builder.py +272 -0
  147. datahub/ingestion/source/grafana/field_utils.py +307 -0
  148. datahub/ingestion/source/grafana/grafana_api.py +142 -0
  149. datahub/ingestion/source/grafana/grafana_config.py +104 -0
  150. datahub/ingestion/source/grafana/grafana_source.py +522 -84
  151. datahub/ingestion/source/grafana/lineage.py +202 -0
  152. datahub/ingestion/source/grafana/models.py +137 -0
  153. datahub/ingestion/source/grafana/report.py +90 -0
  154. datahub/ingestion/source/grafana/types.py +16 -0
  155. datahub/ingestion/source/hex/api.py +28 -1
  156. datahub/ingestion/source/hex/hex.py +16 -5
  157. datahub/ingestion/source/hex/mapper.py +16 -2
  158. datahub/ingestion/source/hex/model.py +2 -0
  159. datahub/ingestion/source/hex/query_fetcher.py +1 -1
  160. datahub/ingestion/source/iceberg/iceberg.py +123 -59
  161. datahub/ingestion/source/iceberg/iceberg_profiler.py +4 -2
  162. datahub/ingestion/source/identity/azure_ad.py +1 -1
  163. datahub/ingestion/source/identity/okta.py +1 -14
  164. datahub/ingestion/source/kafka/kafka.py +16 -0
  165. datahub/ingestion/source/kafka_connect/common.py +2 -2
  166. datahub/ingestion/source/kafka_connect/sink_connectors.py +156 -47
  167. datahub/ingestion/source/kafka_connect/source_connectors.py +62 -4
  168. datahub/ingestion/source/looker/looker_common.py +148 -79
  169. datahub/ingestion/source/looker/looker_config.py +15 -4
  170. datahub/ingestion/source/looker/looker_constant.py +4 -0
  171. datahub/ingestion/source/looker/looker_lib_wrapper.py +36 -3
  172. datahub/ingestion/source/looker/looker_liquid_tag.py +56 -5
  173. datahub/ingestion/source/looker/looker_source.py +503 -547
  174. datahub/ingestion/source/looker/looker_view_id_cache.py +1 -1
  175. datahub/ingestion/source/looker/lookml_concept_context.py +1 -1
  176. datahub/ingestion/source/looker/lookml_config.py +31 -3
  177. datahub/ingestion/source/looker/lookml_refinement.py +1 -1
  178. datahub/ingestion/source/looker/lookml_source.py +96 -117
  179. datahub/ingestion/source/looker/view_upstream.py +494 -1
  180. datahub/ingestion/source/metabase.py +32 -6
  181. datahub/ingestion/source/metadata/business_glossary.py +7 -7
  182. datahub/ingestion/source/metadata/lineage.py +9 -9
  183. datahub/ingestion/source/mlflow.py +12 -2
  184. datahub/ingestion/source/mock_data/__init__.py +0 -0
  185. datahub/ingestion/source/mock_data/datahub_mock_data.py +533 -0
  186. datahub/ingestion/source/mock_data/datahub_mock_data_report.py +12 -0
  187. datahub/ingestion/source/mock_data/table_naming_helper.py +97 -0
  188. datahub/ingestion/source/mode.py +26 -5
  189. datahub/ingestion/source/mongodb.py +11 -1
  190. datahub/ingestion/source/neo4j/neo4j_source.py +83 -144
  191. datahub/ingestion/source/nifi.py +2 -2
  192. datahub/ingestion/source/openapi.py +1 -1
  193. datahub/ingestion/source/powerbi/config.py +47 -21
  194. datahub/ingestion/source/powerbi/m_query/data_classes.py +1 -0
  195. datahub/ingestion/source/powerbi/m_query/parser.py +2 -2
  196. datahub/ingestion/source/powerbi/m_query/pattern_handler.py +100 -10
  197. datahub/ingestion/source/powerbi/powerbi.py +10 -6
  198. datahub/ingestion/source/powerbi/rest_api_wrapper/powerbi_api.py +0 -1
  199. datahub/ingestion/source/powerbi_report_server/report_server.py +0 -23
  200. datahub/ingestion/source/powerbi_report_server/report_server_domain.py +2 -4
  201. datahub/ingestion/source/preset.py +3 -3
  202. datahub/ingestion/source/qlik_sense/data_classes.py +28 -8
  203. datahub/ingestion/source/qlik_sense/qlik_sense.py +2 -1
  204. datahub/ingestion/source/redash.py +1 -1
  205. datahub/ingestion/source/redshift/config.py +15 -9
  206. datahub/ingestion/source/redshift/datashares.py +1 -1
  207. datahub/ingestion/source/redshift/lineage.py +386 -687
  208. datahub/ingestion/source/redshift/query.py +23 -19
  209. datahub/ingestion/source/redshift/redshift.py +52 -111
  210. datahub/ingestion/source/redshift/redshift_schema.py +17 -12
  211. datahub/ingestion/source/redshift/report.py +0 -2
  212. datahub/ingestion/source/redshift/usage.py +6 -5
  213. datahub/ingestion/source/s3/report.py +4 -2
  214. datahub/ingestion/source/s3/source.py +449 -248
  215. datahub/ingestion/source/sac/sac.py +3 -1
  216. datahub/ingestion/source/salesforce.py +28 -13
  217. datahub/ingestion/source/schema/json_schema.py +14 -14
  218. datahub/ingestion/source/schema_inference/object.py +22 -6
  219. datahub/ingestion/source/sigma/data_classes.py +3 -0
  220. datahub/ingestion/source/sigma/sigma.py +7 -1
  221. datahub/ingestion/source/slack/slack.py +10 -16
  222. datahub/ingestion/source/snaplogic/__init__.py +0 -0
  223. datahub/ingestion/source/snaplogic/snaplogic.py +355 -0
  224. datahub/ingestion/source/snaplogic/snaplogic_config.py +37 -0
  225. datahub/ingestion/source/snaplogic/snaplogic_lineage_extractor.py +107 -0
  226. datahub/ingestion/source/snaplogic/snaplogic_parser.py +168 -0
  227. datahub/ingestion/source/snaplogic/snaplogic_utils.py +31 -0
  228. datahub/ingestion/source/snowflake/constants.py +3 -0
  229. datahub/ingestion/source/snowflake/snowflake_config.py +76 -23
  230. datahub/ingestion/source/snowflake/snowflake_connection.py +24 -8
  231. datahub/ingestion/source/snowflake/snowflake_lineage_v2.py +19 -6
  232. datahub/ingestion/source/snowflake/snowflake_queries.py +464 -97
  233. datahub/ingestion/source/snowflake/snowflake_query.py +77 -5
  234. datahub/ingestion/source/snowflake/snowflake_report.py +1 -2
  235. datahub/ingestion/source/snowflake/snowflake_schema.py +352 -16
  236. datahub/ingestion/source/snowflake/snowflake_schema_gen.py +51 -10
  237. datahub/ingestion/source/snowflake/snowflake_summary.py +7 -1
  238. datahub/ingestion/source/snowflake/snowflake_usage_v2.py +8 -2
  239. datahub/ingestion/source/snowflake/snowflake_utils.py +36 -15
  240. datahub/ingestion/source/snowflake/snowflake_v2.py +39 -4
  241. datahub/ingestion/source/snowflake/stored_proc_lineage.py +143 -0
  242. datahub/ingestion/source/sql/athena.py +217 -25
  243. datahub/ingestion/source/sql/athena_properties_extractor.py +795 -0
  244. datahub/ingestion/source/sql/clickhouse.py +24 -8
  245. datahub/ingestion/source/sql/cockroachdb.py +5 -4
  246. datahub/ingestion/source/sql/druid.py +2 -2
  247. datahub/ingestion/source/sql/hana.py +3 -1
  248. datahub/ingestion/source/sql/hive.py +4 -3
  249. datahub/ingestion/source/sql/hive_metastore.py +19 -20
  250. datahub/ingestion/source/sql/mariadb.py +0 -1
  251. datahub/ingestion/source/sql/mssql/job_models.py +3 -1
  252. datahub/ingestion/source/sql/mssql/source.py +336 -57
  253. datahub/ingestion/source/sql/mysql.py +154 -4
  254. datahub/ingestion/source/sql/oracle.py +5 -5
  255. datahub/ingestion/source/sql/postgres.py +142 -6
  256. datahub/ingestion/source/sql/presto.py +2 -1
  257. datahub/ingestion/source/sql/sql_common.py +281 -49
  258. datahub/ingestion/source/sql/sql_generic_profiler.py +2 -1
  259. datahub/ingestion/source/sql/sql_types.py +22 -0
  260. datahub/ingestion/source/sql/sqlalchemy_uri.py +39 -7
  261. datahub/ingestion/source/sql/teradata.py +1028 -245
  262. datahub/ingestion/source/sql/trino.py +11 -1
  263. datahub/ingestion/source/sql/two_tier_sql_source.py +2 -3
  264. datahub/ingestion/source/sql/vertica.py +14 -7
  265. datahub/ingestion/source/sql_queries.py +219 -121
  266. datahub/ingestion/source/state/checkpoint.py +8 -29
  267. datahub/ingestion/source/state/entity_removal_state.py +5 -2
  268. datahub/ingestion/source/state/redundant_run_skip_handler.py +21 -0
  269. datahub/ingestion/source/state/stateful_ingestion_base.py +36 -11
  270. datahub/ingestion/source/superset.py +314 -67
  271. datahub/ingestion/source/tableau/tableau.py +135 -59
  272. datahub/ingestion/source/tableau/tableau_common.py +9 -2
  273. datahub/ingestion/source/tableau/tableau_constant.py +1 -4
  274. datahub/ingestion/source/tableau/tableau_server_wrapper.py +3 -0
  275. datahub/ingestion/source/unity/config.py +160 -40
  276. datahub/ingestion/source/unity/connection.py +61 -0
  277. datahub/ingestion/source/unity/connection_test.py +1 -0
  278. datahub/ingestion/source/unity/platform_resource_repository.py +19 -0
  279. datahub/ingestion/source/unity/proxy.py +794 -51
  280. datahub/ingestion/source/unity/proxy_patch.py +321 -0
  281. datahub/ingestion/source/unity/proxy_types.py +36 -2
  282. datahub/ingestion/source/unity/report.py +15 -3
  283. datahub/ingestion/source/unity/source.py +465 -131
  284. datahub/ingestion/source/unity/tag_entities.py +197 -0
  285. datahub/ingestion/source/unity/usage.py +46 -4
  286. datahub/ingestion/source/usage/clickhouse_usage.py +4 -1
  287. datahub/ingestion/source/usage/starburst_trino_usage.py +5 -2
  288. datahub/ingestion/source/usage/usage_common.py +4 -3
  289. datahub/ingestion/source/vertexai/vertexai.py +1 -1
  290. datahub/ingestion/source_config/pulsar.py +3 -1
  291. datahub/ingestion/source_report/ingestion_stage.py +50 -11
  292. datahub/ingestion/transformer/add_dataset_ownership.py +18 -2
  293. datahub/ingestion/transformer/base_transformer.py +8 -5
  294. datahub/ingestion/transformer/set_browse_path.py +112 -0
  295. datahub/integrations/assertion/snowflake/compiler.py +4 -3
  296. datahub/metadata/_internal_schema_classes.py +6806 -4871
  297. datahub/metadata/_urns/urn_defs.py +1767 -1539
  298. datahub/metadata/com/linkedin/pegasus2avro/application/__init__.py +19 -0
  299. datahub/metadata/com/linkedin/pegasus2avro/common/__init__.py +2 -0
  300. datahub/metadata/com/linkedin/pegasus2avro/file/__init__.py +19 -0
  301. datahub/metadata/com/linkedin/pegasus2avro/identity/__init__.py +2 -0
  302. datahub/metadata/com/linkedin/pegasus2avro/logical/__init__.py +15 -0
  303. datahub/metadata/com/linkedin/pegasus2avro/metadata/key/__init__.py +6 -0
  304. datahub/metadata/com/linkedin/pegasus2avro/module/__init__.py +31 -0
  305. datahub/metadata/com/linkedin/pegasus2avro/platform/event/v1/__init__.py +4 -0
  306. datahub/metadata/com/linkedin/pegasus2avro/role/__init__.py +2 -0
  307. datahub/metadata/com/linkedin/pegasus2avro/settings/asset/__init__.py +19 -0
  308. datahub/metadata/com/linkedin/pegasus2avro/settings/global/__init__.py +8 -0
  309. datahub/metadata/com/linkedin/pegasus2avro/template/__init__.py +31 -0
  310. datahub/metadata/schema.avsc +18395 -16979
  311. datahub/metadata/schemas/Actors.avsc +38 -1
  312. datahub/metadata/schemas/ApplicationKey.avsc +31 -0
  313. datahub/metadata/schemas/ApplicationProperties.avsc +72 -0
  314. datahub/metadata/schemas/Applications.avsc +38 -0
  315. datahub/metadata/schemas/AssetSettings.avsc +63 -0
  316. datahub/metadata/schemas/ChartInfo.avsc +2 -1
  317. datahub/metadata/schemas/ChartKey.avsc +1 -0
  318. datahub/metadata/schemas/ContainerKey.avsc +1 -0
  319. datahub/metadata/schemas/ContainerProperties.avsc +8 -0
  320. datahub/metadata/schemas/CorpUserEditableInfo.avsc +1 -1
  321. datahub/metadata/schemas/CorpUserSettings.avsc +50 -0
  322. datahub/metadata/schemas/DashboardKey.avsc +1 -0
  323. datahub/metadata/schemas/DataFlowInfo.avsc +8 -0
  324. datahub/metadata/schemas/DataFlowKey.avsc +1 -0
  325. datahub/metadata/schemas/DataHubFileInfo.avsc +230 -0
  326. datahub/metadata/schemas/DataHubFileKey.avsc +21 -0
  327. datahub/metadata/schemas/DataHubPageModuleKey.avsc +21 -0
  328. datahub/metadata/schemas/DataHubPageModuleProperties.avsc +298 -0
  329. datahub/metadata/schemas/DataHubPageTemplateKey.avsc +21 -0
  330. datahub/metadata/schemas/DataHubPageTemplateProperties.avsc +251 -0
  331. datahub/metadata/schemas/DataHubPolicyInfo.avsc +12 -1
  332. datahub/metadata/schemas/DataJobInfo.avsc +8 -0
  333. datahub/metadata/schemas/DataJobInputOutput.avsc +8 -0
  334. datahub/metadata/schemas/DataJobKey.avsc +1 -0
  335. datahub/metadata/schemas/DataProcessKey.avsc +8 -0
  336. datahub/metadata/schemas/DataProductKey.avsc +3 -1
  337. datahub/metadata/schemas/DataProductProperties.avsc +1 -1
  338. datahub/metadata/schemas/DatasetKey.avsc +11 -1
  339. datahub/metadata/schemas/DatasetUsageStatistics.avsc +8 -0
  340. datahub/metadata/schemas/DomainKey.avsc +2 -1
  341. datahub/metadata/schemas/GlobalSettingsInfo.avsc +134 -0
  342. datahub/metadata/schemas/GlossaryNodeKey.avsc +2 -1
  343. datahub/metadata/schemas/GlossaryTermKey.avsc +3 -1
  344. datahub/metadata/schemas/IcebergWarehouseInfo.avsc +8 -0
  345. datahub/metadata/schemas/IncidentInfo.avsc +3 -3
  346. datahub/metadata/schemas/InstitutionalMemory.avsc +31 -0
  347. datahub/metadata/schemas/LogicalParent.avsc +145 -0
  348. datahub/metadata/schemas/MLFeatureKey.avsc +1 -0
  349. datahub/metadata/schemas/MLFeatureTableKey.avsc +1 -0
  350. datahub/metadata/schemas/MLModelDeploymentKey.avsc +8 -0
  351. datahub/metadata/schemas/MLModelGroupKey.avsc +11 -1
  352. datahub/metadata/schemas/MLModelKey.avsc +9 -0
  353. datahub/metadata/schemas/MLPrimaryKeyKey.avsc +1 -0
  354. datahub/metadata/schemas/MetadataChangeEvent.avsc +151 -47
  355. datahub/metadata/schemas/MetadataChangeLog.avsc +62 -44
  356. datahub/metadata/schemas/MetadataChangeProposal.avsc +61 -0
  357. datahub/metadata/schemas/NotebookKey.avsc +1 -0
  358. datahub/metadata/schemas/Operation.avsc +4 -2
  359. datahub/metadata/schemas/Ownership.avsc +69 -0
  360. datahub/metadata/schemas/QuerySubjects.avsc +1 -12
  361. datahub/metadata/schemas/RelationshipChangeEvent.avsc +215 -0
  362. datahub/metadata/schemas/SchemaFieldKey.avsc +4 -1
  363. datahub/metadata/schemas/StructuredProperties.avsc +69 -0
  364. datahub/metadata/schemas/StructuredPropertySettings.avsc +9 -0
  365. datahub/metadata/schemas/SystemMetadata.avsc +61 -0
  366. datahub/metadata/schemas/UpstreamLineage.avsc +9 -0
  367. datahub/sdk/__init__.py +2 -0
  368. datahub/sdk/_all_entities.py +7 -0
  369. datahub/sdk/_shared.py +249 -5
  370. datahub/sdk/chart.py +386 -0
  371. datahub/sdk/container.py +7 -0
  372. datahub/sdk/dashboard.py +453 -0
  373. datahub/sdk/dataflow.py +7 -0
  374. datahub/sdk/datajob.py +45 -13
  375. datahub/sdk/dataset.py +56 -2
  376. datahub/sdk/entity_client.py +111 -9
  377. datahub/sdk/lineage_client.py +663 -82
  378. datahub/sdk/main_client.py +50 -16
  379. datahub/sdk/mlmodel.py +120 -38
  380. datahub/sdk/mlmodelgroup.py +7 -0
  381. datahub/sdk/search_client.py +7 -3
  382. datahub/sdk/search_filters.py +304 -36
  383. datahub/secret/datahub_secret_store.py +3 -0
  384. datahub/secret/environment_secret_store.py +29 -0
  385. datahub/secret/file_secret_store.py +49 -0
  386. datahub/specific/aspect_helpers/fine_grained_lineage.py +76 -0
  387. datahub/specific/aspect_helpers/siblings.py +73 -0
  388. datahub/specific/aspect_helpers/structured_properties.py +27 -0
  389. datahub/specific/chart.py +1 -1
  390. datahub/specific/datajob.py +15 -1
  391. datahub/specific/dataproduct.py +4 -0
  392. datahub/specific/dataset.py +39 -59
  393. datahub/sql_parsing/split_statements.py +13 -0
  394. datahub/sql_parsing/sql_parsing_aggregator.py +70 -26
  395. datahub/sql_parsing/sqlglot_lineage.py +196 -42
  396. datahub/sql_parsing/sqlglot_utils.py +12 -4
  397. datahub/sql_parsing/tool_meta_extractor.py +1 -3
  398. datahub/telemetry/telemetry.py +28 -14
  399. datahub/testing/sdk_v2_helpers.py +7 -1
  400. datahub/upgrade/upgrade.py +73 -17
  401. datahub/utilities/file_backed_collections.py +8 -9
  402. datahub/utilities/is_pytest.py +3 -2
  403. datahub/utilities/logging_manager.py +22 -6
  404. datahub/utilities/mapping.py +29 -2
  405. datahub/utilities/sample_data.py +5 -4
  406. datahub/utilities/server_config_util.py +10 -1
  407. datahub/utilities/sqlalchemy_query_combiner.py +5 -2
  408. datahub/utilities/stats_collections.py +4 -0
  409. datahub/utilities/urns/urn.py +41 -2
  410. datahub/emitter/sql_parsing_builder.py +0 -306
  411. datahub/ingestion/source/redshift/lineage_v2.py +0 -466
  412. {acryl_datahub-1.1.1rc4.dist-info → acryl_datahub-1.3.0.1rc9.dist-info}/WHEEL +0 -0
  413. {acryl_datahub-1.1.1rc4.dist-info → acryl_datahub-1.3.0.1rc9.dist-info}/licenses/LICENSE +0 -0
  414. {acryl_datahub-1.1.1rc4.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: Set[NotebookId] = field(default_factory=set)
243
- downstream_notebooks: Set[NotebookId] = field(default_factory=set)
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(IngestionStageReport, SQLSourceReport):
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