acryl-datahub 1.1.0.1__py3-none-any.whl → 1.1.0.2rc1__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.1.0.1.dist-info → acryl_datahub-1.1.0.2rc1.dist-info}/METADATA +2516 -2516
- {acryl_datahub-1.1.0.1.dist-info → acryl_datahub-1.1.0.2rc1.dist-info}/RECORD +25 -23
- datahub/_version.py +1 -1
- datahub/api/entities/external/lake_formation_external_entites.py +161 -0
- datahub/api/entities/external/restricted_text.py +10 -10
- datahub/api/entities/external/unity_catalog_external_entites.py +5 -2
- datahub/emitter/rest_emitter.py +29 -4
- datahub/ingestion/graph/client.py +2 -0
- datahub/ingestion/graph/config.py +1 -0
- datahub/ingestion/reporting/datahub_ingestion_run_summary_provider.py +20 -10
- datahub/ingestion/sink/datahub_rest.py +1 -0
- datahub/ingestion/source/aws/aws_common.py +4 -0
- datahub/ingestion/source/aws/glue.py +488 -243
- datahub/ingestion/source/aws/tag_entities.py +292 -0
- datahub/ingestion/source/sql/mssql/source.py +207 -18
- datahub/ingestion/source/unity/source.py +2 -3
- datahub/metadata/_internal_schema_classes.py +499 -499
- datahub/metadata/_urns/urn_defs.py +1766 -1766
- datahub/metadata/schema.avsc +17480 -17093
- datahub/metadata/schemas/__init__.py +3 -3
- datahub/sdk/main_client.py +3 -3
- {acryl_datahub-1.1.0.1.dist-info → acryl_datahub-1.1.0.2rc1.dist-info}/WHEEL +0 -0
- {acryl_datahub-1.1.0.1.dist-info → acryl_datahub-1.1.0.2rc1.dist-info}/entry_points.txt +0 -0
- {acryl_datahub-1.1.0.1.dist-info → acryl_datahub-1.1.0.2rc1.dist-info}/licenses/LICENSE +0 -0
- {acryl_datahub-1.1.0.1.dist-info → acryl_datahub-1.1.0.2rc1.dist-info}/top_level.txt +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
acryl_datahub-1.1.0.
|
|
1
|
+
acryl_datahub-1.1.0.2rc1.dist-info/licenses/LICENSE,sha256=9xNHpsD0uYF5ONzXsKDCuHHB-xbiCrSbueWXqrTNsxk,11365
|
|
2
2
|
datahub/__init__.py,sha256=aq_i5lVREmoLfYIqcx_pEQicO855YlhD19tWc1eZZNI,59
|
|
3
3
|
datahub/__main__.py,sha256=pegIvQ9hzK7IhqVeUi1MeADSZ2QlP-D3K0OQdEg55RU,106
|
|
4
|
-
datahub/_version.py,sha256=
|
|
4
|
+
datahub/_version.py,sha256=xviXMZWidai-tecst_TvEVpDRvpRUSKWgx_4dTs7IJ8,323
|
|
5
5
|
datahub/entrypoints.py,sha256=H-YFTvxTJOgpWsFBVlxyb1opjkq-hjTzNmjy5Fq3RHg,8992
|
|
6
6
|
datahub/errors.py,sha256=p5rFAdAGVCk4Lqolol1YvthceadUSwpaCxLXRcyCCFQ,676
|
|
7
7
|
datahub/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -52,8 +52,9 @@ datahub/api/entities/dataset/dataset.py,sha256=BLOn7o-A3OLD4D2JTq8vF_dwTTW9HHDnD
|
|
|
52
52
|
datahub/api/entities/external/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
53
53
|
datahub/api/entities/external/external_entities.py,sha256=7HRt3Oz2sw_7BDxEVc6W7jK4UqHXLZuo_rGPJ5NdAoE,7727
|
|
54
54
|
datahub/api/entities/external/external_tag.py,sha256=LKz4j2KnBvo8xhGLxA9g1DWtHfHUA7WqO2vOIsqwy44,4490
|
|
55
|
-
datahub/api/entities/external/
|
|
56
|
-
datahub/api/entities/external/
|
|
55
|
+
datahub/api/entities/external/lake_formation_external_entites.py,sha256=7tX3oC5O7DoknMDY4TSzjEf6zfzErFWDYD-CrbmItpA,5703
|
|
56
|
+
datahub/api/entities/external/restricted_text.py,sha256=IX_HtG0pnPB7mnSkd_9ptlNLJar2Bq2cfwq9CqQ3giE,8643
|
|
57
|
+
datahub/api/entities/external/unity_catalog_external_entites.py,sha256=pzLifF6U8NzUz11z5Lhv8VJLHw5D_51wa5CRnYji4ZE,6072
|
|
57
58
|
datahub/api/entities/forms/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
58
59
|
datahub/api/entities/forms/forms.py,sha256=B1KnoMmaXwznWdbjltoLq3sH9qj-BpzyC7z7FcwwOM4,15812
|
|
59
60
|
datahub/api/entities/forms/forms_graphql_constants.py,sha256=DKpnKlMKTjmnyrCTvp63V4LX4THGTAMq3ep8THrSGP4,537
|
|
@@ -131,7 +132,7 @@ datahub/emitter/mcp_builder.py,sha256=8IwJAlolQkPpMqQJPLtGrsUqAcuFNs98nrI5iYUxga
|
|
|
131
132
|
datahub/emitter/mcp_patch_builder.py,sha256=u7cpW6DkiN7KpLapmMaXgL_FneoN69boxiANbVgMdSI,4564
|
|
132
133
|
datahub/emitter/request_helper.py,sha256=2Sij9VJqgA7xZI6I7IuxsA8ioakbz0FJ3gvazxU_z3M,5738
|
|
133
134
|
datahub/emitter/response_helper.py,sha256=qGm45n43CepW7j6kP9wTXuP-U-SZnn7hQdJTdVaoqhQ,7504
|
|
134
|
-
datahub/emitter/rest_emitter.py,sha256=
|
|
135
|
+
datahub/emitter/rest_emitter.py,sha256=ctPrtQ1S9wsy_lqE9LopP5pvmLn83Mu5R1mfSf9umdY,37467
|
|
135
136
|
datahub/emitter/serialization_helper.py,sha256=q12Avmf70Vy4ttQGMJoTKlE5EsybMKNg2w3MQeZiHvk,3652
|
|
136
137
|
datahub/emitter/sql_parsing_builder.py,sha256=Cr5imZrm3dYDSCACt5MFscgHCtVbHTD6IjUmsvsKoEs,11991
|
|
137
138
|
datahub/emitter/synchronized_file_emitter.py,sha256=s4ATuxalI4GDAkrZTaGSegxBdvvNPZ9jRSdtElU0kNs,1805
|
|
@@ -176,14 +177,14 @@ datahub/ingestion/glossary/classifier.py,sha256=daLxnVv_JlfB_jBOxH5LrU_xQRndrsGo
|
|
|
176
177
|
datahub/ingestion/glossary/classifier_registry.py,sha256=yFOYLQhDgCLqXYMG3L1BquXafeLcZDcmp8meyw6k9ts,307
|
|
177
178
|
datahub/ingestion/glossary/datahub_classifier.py,sha256=O7wm6gQT1Jf2QSKdWjJQbS5oSzJwplXzfza26Gdq5Mg,7555
|
|
178
179
|
datahub/ingestion/graph/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
179
|
-
datahub/ingestion/graph/client.py,sha256=
|
|
180
|
-
datahub/ingestion/graph/config.py,sha256=
|
|
180
|
+
datahub/ingestion/graph/client.py,sha256=apsLaAWqvJN6nIEL-T-BFkkvBhAr64RS07YRl0PoVu4,70790
|
|
181
|
+
datahub/ingestion/graph/config.py,sha256=rmkcqAL8fJoY9QyAeS0Xm8HvwHzV3pCjY-Om-50JJTI,1015
|
|
181
182
|
datahub/ingestion/graph/connections.py,sha256=9462L0ZWGKURyypAln25eMPhK3pcufBar9tNDoqspXs,741
|
|
182
183
|
datahub/ingestion/graph/entity_versioning.py,sha256=nrcNz0Qm6kpE6oTu_mrYUQDx14KPspBTc6R9SyFUY6c,6901
|
|
183
184
|
datahub/ingestion/graph/filters.py,sha256=OfjKhuNRHHLvhHk6Tfwd2IbMLPbbIq4VUyHaSpcDvKk,8664
|
|
184
185
|
datahub/ingestion/graph/links.py,sha256=UwWSdx-j0dPttfJOjfTf4ZmlO7iIsRz5p3nIsqGVHUA,2169
|
|
185
186
|
datahub/ingestion/reporting/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
186
|
-
datahub/ingestion/reporting/datahub_ingestion_run_summary_provider.py,sha256=
|
|
187
|
+
datahub/ingestion/reporting/datahub_ingestion_run_summary_provider.py,sha256=6P8pFLHF6R8d5iU_L_9wWKPj9gITxrqAemJlQGd-ZCs,10025
|
|
187
188
|
datahub/ingestion/reporting/file_reporter.py,sha256=tiWukmMxHrTQI3rOAumsq6lRlw8T6spqpS6XBDYnrZU,1640
|
|
188
189
|
datahub/ingestion/reporting/reporting_provider_registry.py,sha256=jTYSh3T4sensjnHQfPLiIcbA2dG8w0px9ghChAJjGdU,310
|
|
189
190
|
datahub/ingestion/run/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -196,7 +197,7 @@ datahub/ingestion/sink/blackhole.py,sha256=-jYcWo4i8q7312bCIoHrGr7nT9JdPvA7c4jvS
|
|
|
196
197
|
datahub/ingestion/sink/console.py,sha256=TZfhA0Ec2eNCrMH7RRy2JOdUE-U-hkoIQrPm1CmKLQs,591
|
|
197
198
|
datahub/ingestion/sink/datahub_kafka.py,sha256=_cjuXu5I6G0zJ2UK7hMbaKjMPZXeIwRMgm7CVeTiNtc,2578
|
|
198
199
|
datahub/ingestion/sink/datahub_lite.py,sha256=7u2aWm7ENLshKHl-PkjJg6Mrw4bWs8sTfKIBz4mm8Ak,1879
|
|
199
|
-
datahub/ingestion/sink/datahub_rest.py,sha256=
|
|
200
|
+
datahub/ingestion/sink/datahub_rest.py,sha256=xXCYqYMc9DuNQv22DBYrEpJFvGBrKVPmZuaZRbMOONA,13089
|
|
200
201
|
datahub/ingestion/sink/file.py,sha256=SxXJPJpkIGoaqRjCcSmj2ZE3xE4rLlBABBGwpTj5LWI,3271
|
|
201
202
|
datahub/ingestion/sink/sink_registry.py,sha256=JRBWx8qEYg0ubSTyhqwgSWctgxwyp6fva9GoN2LwBao,490
|
|
202
203
|
datahub/ingestion/source/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -233,11 +234,12 @@ datahub/ingestion/source/abs/source.py,sha256=cuMezUzr-Smp5tok2ceYor5I5jp52NDMjf
|
|
|
233
234
|
datahub/ingestion/source/apply/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
234
235
|
datahub/ingestion/source/apply/datahub_apply.py,sha256=xTD-Iq3UHhxcz61RwNuI2kJjRrnQEfZFSgvS1X6loV4,7703
|
|
235
236
|
datahub/ingestion/source/aws/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
236
|
-
datahub/ingestion/source/aws/aws_common.py,sha256=
|
|
237
|
-
datahub/ingestion/source/aws/glue.py,sha256=
|
|
237
|
+
datahub/ingestion/source/aws/aws_common.py,sha256=DN49pHY-AOVHqI3smF9cVPwvPmh5UqOF4ga-wga_gPc,17928
|
|
238
|
+
datahub/ingestion/source/aws/glue.py,sha256=E_oCgf-taI2ZVXSn9LA9MoDk6JJBFEDBUbNIFkqUUSA,66547
|
|
238
239
|
datahub/ingestion/source/aws/s3_boto_utils.py,sha256=Y54jlLV5gLcuZ4Zs57kIW5dYHD89RSFfsVNlFbRnSkQ,3901
|
|
239
240
|
datahub/ingestion/source/aws/s3_util.py,sha256=OFypcgmVC6jnZM90-gjcPpAMtTV1lbnreCaMhCzNlzs,2149
|
|
240
241
|
datahub/ingestion/source/aws/sagemaker.py,sha256=Bl2tkBYnrindgx61VHYgNovUF_Kp_fXNcivQn28vC2w,5254
|
|
242
|
+
datahub/ingestion/source/aws/tag_entities.py,sha256=mMA1u2rL4bdL3ZS7DAtkeeiTk1gVIk-Ct3klHE-ppVs,11273
|
|
241
243
|
datahub/ingestion/source/aws/sagemaker_processors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
242
244
|
datahub/ingestion/source/aws/sagemaker_processors/common.py,sha256=x4ijMxKjZ-oJdqGyTwBp2J50uxYT1ejlVlGs8-vDXMU,2234
|
|
243
245
|
datahub/ingestion/source/aws/sagemaker_processors/feature_groups.py,sha256=IUwPTSITL-RaO3i3lX_KaDwOGPNMXHf66PPWAcMglWI,10383
|
|
@@ -505,7 +507,7 @@ datahub/ingestion/source/sql/two_tier_sql_source.py,sha256=AB3Gtx4omAy_08zadHQpm
|
|
|
505
507
|
datahub/ingestion/source/sql/vertica.py,sha256=_9OgSgIgqBml0av063rb8nACiT3SAmzpw0ouyF91wv8,33382
|
|
506
508
|
datahub/ingestion/source/sql/mssql/__init__.py,sha256=1agpl8S_uDW40olkhCX_W19dbr5GO9qgjS3R7pLRZSk,87
|
|
507
509
|
datahub/ingestion/source/sql/mssql/job_models.py,sha256=nAo3rciu-w2-dXCz6_ekDEbGMEjCMEfh8WvSfXoF2l0,9359
|
|
508
|
-
datahub/ingestion/source/sql/mssql/source.py,sha256=
|
|
510
|
+
datahub/ingestion/source/sql/mssql/source.py,sha256=gMv7myHlhR9ja2YsLjt_hyeuoj1uOjtq3jmQkOtJz_E,42611
|
|
509
511
|
datahub/ingestion/source/sql/stored_procedures/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
510
512
|
datahub/ingestion/source/sql/stored_procedures/base.py,sha256=n0l5OaTuW-m3TRvkxs3TqvgMeWF6BagzW3tjyWUcC1A,8631
|
|
511
513
|
datahub/ingestion/source/sql/stored_procedures/lineage.py,sha256=fryLhuAlsjr9SHIjHJ-PmtCMx89bjzWVnJZ3f1bwQVU,1905
|
|
@@ -540,7 +542,7 @@ datahub/ingestion/source/unity/proxy.py,sha256=E8ZhWIY3j7gjEz8ttWOeHlom0jCMJXkWH
|
|
|
540
542
|
datahub/ingestion/source/unity/proxy_profiling.py,sha256=WLqvYP6MziaisA4LYL4T_GA-kPt6Xdde7bfaYsjYw40,9663
|
|
541
543
|
datahub/ingestion/source/unity/proxy_types.py,sha256=qrvHiwPzl5cPX-KRvcIGGeJVdr0I8XUQmoAI6ErZ-v8,9371
|
|
542
544
|
datahub/ingestion/source/unity/report.py,sha256=XFT9oQfvEB4RkTvWGgFOoQuLPUN_AIoPXZ79xeDhGHQ,2831
|
|
543
|
-
datahub/ingestion/source/unity/source.py,sha256=
|
|
545
|
+
datahub/ingestion/source/unity/source.py,sha256=C3mtTx_7R5TixxOv1EZtszzLww4i_o0CPFeSk4JNebQ,48959
|
|
544
546
|
datahub/ingestion/source/unity/tag_entities.py,sha256=iWl6nRAWSye1hoFDx_Xh4aT53PN0sGzlX7n1-oTVUv8,11568
|
|
545
547
|
datahub/ingestion/source/unity/usage.py,sha256=0wETBAaZvHI_EGgBlxX3bKsVHEAdnUV8_bKI_lbyWjY,11500
|
|
546
548
|
datahub/ingestion/source/usage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -604,12 +606,12 @@ datahub/lite/lite_registry.py,sha256=bpH0kasP-LtwwUFNA2QsOIehfekAYfJtN-AkQLmSWnw
|
|
|
604
606
|
datahub/lite/lite_server.py,sha256=p9Oa2nNs65mqcssSIVOr7VOzWqfVstz6ZQEdT4f82S0,1949
|
|
605
607
|
datahub/lite/lite_util.py,sha256=G0LQHKkyEb1pc_q183g6hflShclGx7kikgMaOxtVVcs,4545
|
|
606
608
|
datahub/metadata/__init__.py,sha256=AjhXPjI6cnpdcrBRrE5gOWo15vv2TTl2ctU4UAnUN7A,238
|
|
607
|
-
datahub/metadata/_internal_schema_classes.py,sha256=
|
|
608
|
-
datahub/metadata/schema.avsc,sha256=
|
|
609
|
+
datahub/metadata/_internal_schema_classes.py,sha256=o3pZiN2dkOTpOgSAqFBFclbhpegpQJ-s8xQLFcmi2uk,1018092
|
|
610
|
+
datahub/metadata/schema.avsc,sha256=77v5U9zCJnTt2FaWZ8tUVsbUD8WuTZhoLDfkzlW6APk,706092
|
|
609
611
|
datahub/metadata/schema_classes.py,sha256=tPT8iHCak4IsZi_oL0nirbPpI8ETTPTZzapqLRpeKU4,1326
|
|
610
612
|
datahub/metadata/urns.py,sha256=nfrCTExR-k2P9w272WVtWSN3xW1VUJngPwP3xnvULjU,1217
|
|
611
613
|
datahub/metadata/_urns/__init__.py,sha256=cOF3GHMDgPhmbLKbN02NPpuLGHSu0qNgQyBRv08eqF0,243
|
|
612
|
-
datahub/metadata/_urns/urn_defs.py,sha256=
|
|
614
|
+
datahub/metadata/_urns/urn_defs.py,sha256=yhU7EP7gJGBoO1EmePqnmWxWhkPx7Q_WzDTUyfpXsus,138516
|
|
613
615
|
datahub/metadata/com/__init__.py,sha256=gsAIuTxzfJdI7a9ybZlgMIHMAYksM1SxGxXjtySgKSc,202
|
|
614
616
|
datahub/metadata/com/linkedin/__init__.py,sha256=gsAIuTxzfJdI7a9ybZlgMIHMAYksM1SxGxXjtySgKSc,202
|
|
615
617
|
datahub/metadata/com/linkedin/events/__init__.py,sha256=s_dR0plZF-rOxxIbE8ojekJqwiHzl2WYR-Z3kW6kKS0,298
|
|
@@ -910,7 +912,7 @@ datahub/metadata/schemas/VersionProperties.avsc,sha256=ME8V01JzG8lEsLXgYWnSYCehm
|
|
|
910
912
|
datahub/metadata/schemas/VersionSetKey.avsc,sha256=psjGNNcFua3Zs9Xlh4HnUHNmBEU74uYdJR5g20NhRJU,659
|
|
911
913
|
datahub/metadata/schemas/VersionSetProperties.avsc,sha256=fxNxEMxGdUDi_-T0sd6KJks5BWEo5AzboQxpZYKLbiQ,1434
|
|
912
914
|
datahub/metadata/schemas/ViewProperties.avsc,sha256=3HhcbH5493dJUnEUtFMYMVfbYQ52aDedm5L4j77Nym4,1032
|
|
913
|
-
datahub/metadata/schemas/__init__.py,sha256=
|
|
915
|
+
datahub/metadata/schemas/__init__.py,sha256=uvLNC3VyCkWA_v8e9FdA1leFf46NFKDD0AajCfihepI,581
|
|
914
916
|
datahub/pydantic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
915
917
|
datahub/pydantic/compat.py,sha256=TUEo4kSEeOWVAhV6LQtst1phrpVgGtK4uif4OI5vQ2M,1937
|
|
916
918
|
datahub/sdk/__init__.py,sha256=66OOcFi7qlnL6q72c_yUX2mWU2HudbOdRsC5CIoDxow,1922
|
|
@@ -927,7 +929,7 @@ datahub/sdk/dataset.py,sha256=2-iD-HqjgFpCBmU3k8O5tkltmwFj4jaumADiX8sexJU,29465
|
|
|
927
929
|
datahub/sdk/entity.py,sha256=Q29AbpS58L4gD8ETwoNIwG-ouytz4c0MSSFi6-jLl_4,6742
|
|
928
930
|
datahub/sdk/entity_client.py,sha256=xHLGLn6oJfxmHLXo5w4-isPFZGcf8yR5IwyC6pvl_I8,8903
|
|
929
931
|
datahub/sdk/lineage_client.py,sha256=u4bzs6xpdzWhZGx-V0rj1tvQxesVSEuxvxjRQRhZMSg,33822
|
|
930
|
-
datahub/sdk/main_client.py,sha256=
|
|
932
|
+
datahub/sdk/main_client.py,sha256=nB9CsQxq7fgW7zXtDwSgu51V2OGT12O1zaYZv9oR2t0,5137
|
|
931
933
|
datahub/sdk/mlmodel.py,sha256=cO5R8BYVljmQ0w33RIOuZmj4nq8OJCDVAZGTQI6YFS8,12628
|
|
932
934
|
datahub/sdk/mlmodelgroup.py,sha256=wlZZHny0UORpF0fRYuVkWLSQwIHX_fWl5lPb1NKR6dM,8194
|
|
933
935
|
datahub/sdk/resolver_client.py,sha256=nKMAZJt2tRSGfKSzoREIh43PXqjM3umLiYkYHJjo1io,3243
|
|
@@ -1071,8 +1073,8 @@ datahub_provider/operators/datahub_assertion_operator.py,sha256=uvTQ-jk2F0sbqqxp
|
|
|
1071
1073
|
datahub_provider/operators/datahub_assertion_sensor.py,sha256=lCBj_3x1cf5GMNpHdfkpHuyHfVxsm6ff5x2Z5iizcAo,140
|
|
1072
1074
|
datahub_provider/operators/datahub_operation_operator.py,sha256=aevDp2FzX7FxGlXrR0khoHNbxbhKR2qPEX5e8O2Jyzw,174
|
|
1073
1075
|
datahub_provider/operators/datahub_operation_sensor.py,sha256=8fcdVBCEPgqy1etTXgLoiHoJrRt_nzFZQMdSzHqSG7M,168
|
|
1074
|
-
acryl_datahub-1.1.0.
|
|
1075
|
-
acryl_datahub-1.1.0.
|
|
1076
|
-
acryl_datahub-1.1.0.
|
|
1077
|
-
acryl_datahub-1.1.0.
|
|
1078
|
-
acryl_datahub-1.1.0.
|
|
1076
|
+
acryl_datahub-1.1.0.2rc1.dist-info/METADATA,sha256=SztUJwVSty1c3J3bokL--2m9i0SyP1Q_ayGeXT0kMCA,180763
|
|
1077
|
+
acryl_datahub-1.1.0.2rc1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
1078
|
+
acryl_datahub-1.1.0.2rc1.dist-info/entry_points.txt,sha256=o3mDeJXSKhsy7XLkuogihraiabBdLn9HaizYXPrxmk0,9710
|
|
1079
|
+
acryl_datahub-1.1.0.2rc1.dist-info/top_level.txt,sha256=iLjSrLK5ox1YVYcglRUkcvfZPvKlobBWx7CTUXx8_GI,25
|
|
1080
|
+
acryl_datahub-1.1.0.2rc1.dist-info/RECORD,,
|
datahub/_version.py
CHANGED
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
# Import RestrictedText from your existing module
|
|
2
|
+
# Uncomment and adjust the import path as needed:
|
|
3
|
+
# from your_restricted_text_module import RestrictedText
|
|
4
|
+
# The following is a list of tag constraints:
|
|
5
|
+
# You can assign a maximum of 50 tags to a single securable object.
|
|
6
|
+
# The maximum length of a tag key is 255 characters.
|
|
7
|
+
# The maximum length of a tag value is 1000 characters.
|
|
8
|
+
# The following characters are not allowed in tag keys:
|
|
9
|
+
# . , - = / :
|
|
10
|
+
# Tag search using the workspace search UI is supported only for tables, views, and table columns.
|
|
11
|
+
# Tag search requires exact term matching.
|
|
12
|
+
# https://learn.microsoft.com/en-us/azure/databricks/database-objects/tags#constraint
|
|
13
|
+
from typing import Any, Dict, Optional, Union
|
|
14
|
+
|
|
15
|
+
from typing_extensions import ClassVar
|
|
16
|
+
|
|
17
|
+
from datahub.api.entities.external.external_tag import ExternalTag
|
|
18
|
+
from datahub.api.entities.external.restricted_text import RestrictedText
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class LakeFormationTagKeyText(RestrictedText):
|
|
22
|
+
"""RestrictedText configured for Unity Catalog tag keys."""
|
|
23
|
+
|
|
24
|
+
_default_max_length: ClassVar[int] = 50
|
|
25
|
+
# Unity Catalog tag keys: alphanumeric, hyphens, underscores, periods only
|
|
26
|
+
_default_replacement_char: ClassVar[str] = "_"
|
|
27
|
+
_default_truncation_suffix: ClassVar[str] = "" # No suffix for clean identifiers
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class LakeFormationTagValueText(RestrictedText):
|
|
31
|
+
"""RestrictedText configured for Unity Catalog tag values."""
|
|
32
|
+
|
|
33
|
+
_default_max_length: ClassVar[int] = 50
|
|
34
|
+
# Unity Catalog tag values are more permissive but still have some restrictions
|
|
35
|
+
_default_replacement_char: ClassVar[str] = " "
|
|
36
|
+
_default_truncation_suffix: ClassVar[str] = "..."
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class LakeFormationTag(ExternalTag):
|
|
40
|
+
"""
|
|
41
|
+
A tag type specifically designed for LakeFormation tag restrictions.
|
|
42
|
+
|
|
43
|
+
LakeFormation Tag Restrictions:
|
|
44
|
+
- Key: Max 127 characters, alphanumeric + hyphens, underscores, periods only
|
|
45
|
+
- Value: Max 256 characters, more permissive but no control characters
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
key: LakeFormationTagKeyText
|
|
49
|
+
value: Optional[LakeFormationTagValueText] = None
|
|
50
|
+
catalog: Optional[str] = None
|
|
51
|
+
|
|
52
|
+
def __init__(
|
|
53
|
+
self,
|
|
54
|
+
key: Optional[Union[str, LakeFormationTagKeyText]] = None,
|
|
55
|
+
value: Optional[Union[str, LakeFormationTagValueText]] = None,
|
|
56
|
+
**data: Any,
|
|
57
|
+
) -> None:
|
|
58
|
+
"""
|
|
59
|
+
Initialize LakeFormation Tag from either a DataHub Tag URN or explicit key/value.
|
|
60
|
+
|
|
61
|
+
Args:
|
|
62
|
+
key: Explicit key value (optional for Pydantic initialization)
|
|
63
|
+
value: Explicit value (optional)
|
|
64
|
+
**data: Additional Pydantic data
|
|
65
|
+
"""
|
|
66
|
+
if key is not None:
|
|
67
|
+
# Direct initialization with key/value
|
|
68
|
+
processed_key = (
|
|
69
|
+
LakeFormationTagKeyText(key)
|
|
70
|
+
if not isinstance(key, LakeFormationTagKeyText)
|
|
71
|
+
else key
|
|
72
|
+
)
|
|
73
|
+
processed_value = None
|
|
74
|
+
if value is not None:
|
|
75
|
+
processed_value = (
|
|
76
|
+
LakeFormationTagValueText(value)
|
|
77
|
+
if not isinstance(value, LakeFormationTagValueText)
|
|
78
|
+
else value
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
super().__init__(
|
|
82
|
+
key=processed_key,
|
|
83
|
+
value=processed_value,
|
|
84
|
+
**data,
|
|
85
|
+
)
|
|
86
|
+
else:
|
|
87
|
+
# Standard pydantic initialization
|
|
88
|
+
super().__init__(**data)
|
|
89
|
+
|
|
90
|
+
def __eq__(self, other: object) -> bool:
|
|
91
|
+
"""Check equality based on key and value."""
|
|
92
|
+
if not isinstance(other, LakeFormationTag):
|
|
93
|
+
return False
|
|
94
|
+
return str(self.key) == str(other.key) and (
|
|
95
|
+
str(self.value) if self.value else None
|
|
96
|
+
) == (str(other.value) if other.value else None)
|
|
97
|
+
|
|
98
|
+
def __hash__(self) -> int:
|
|
99
|
+
"""Make LakeFormationTag hashable based on key and value."""
|
|
100
|
+
return hash((str(self.key), str(self.value) if self.value else None))
|
|
101
|
+
|
|
102
|
+
@classmethod
|
|
103
|
+
def from_dict(cls, tag_dict: Dict[str, Any]) -> "LakeFormationTag":
|
|
104
|
+
"""
|
|
105
|
+
Create a LakeFormationTag from a dictionary with 'key' and optional 'value'.
|
|
106
|
+
|
|
107
|
+
Args:
|
|
108
|
+
tag_dict: Dictionary with 'key' and optional 'value' keys
|
|
109
|
+
|
|
110
|
+
Returns:
|
|
111
|
+
LakeFormationTag instance
|
|
112
|
+
"""
|
|
113
|
+
return cls(key=tag_dict["key"], value=tag_dict.get("value"))
|
|
114
|
+
|
|
115
|
+
@classmethod
|
|
116
|
+
def from_key_value(
|
|
117
|
+
cls, key: str, value: Optional[str] = None
|
|
118
|
+
) -> "LakeFormationTag":
|
|
119
|
+
"""
|
|
120
|
+
Create a LakeFormationTagPlatformResource from explicit key and value.
|
|
121
|
+
|
|
122
|
+
Overrides the parent method to return the correct type.
|
|
123
|
+
|
|
124
|
+
Args:
|
|
125
|
+
key: Tag key
|
|
126
|
+
value: Optional tag value
|
|
127
|
+
|
|
128
|
+
Returns:
|
|
129
|
+
LakeFormationTag instance
|
|
130
|
+
"""
|
|
131
|
+
return cls(key=key, value=value)
|
|
132
|
+
|
|
133
|
+
def to_dict(self) -> Dict[str, str]:
|
|
134
|
+
"""
|
|
135
|
+
Convert to dictionary format suitable for LakeFormation tag.
|
|
136
|
+
|
|
137
|
+
Returns:
|
|
138
|
+
Dictionary with 'key' and optionally 'value'
|
|
139
|
+
"""
|
|
140
|
+
result: Dict[str, str] = {"key": self.key.original}
|
|
141
|
+
if self.value is not None:
|
|
142
|
+
result["value"] = self.value.original
|
|
143
|
+
return result
|
|
144
|
+
|
|
145
|
+
def to_display_dict(self) -> Dict[str, str]:
|
|
146
|
+
"""
|
|
147
|
+
Convert to dictionary format showing processed values.
|
|
148
|
+
|
|
149
|
+
Returns:
|
|
150
|
+
Dictionary with processed 'key' and optional 'value'
|
|
151
|
+
"""
|
|
152
|
+
result: Dict[str, str] = {"key": str(self.key)}
|
|
153
|
+
if self.value is not None:
|
|
154
|
+
result["value"] = str(self.value)
|
|
155
|
+
return result
|
|
156
|
+
|
|
157
|
+
def __repr__(self) -> str:
|
|
158
|
+
if self.value:
|
|
159
|
+
return f"LakeFormationTag(key={self.key!r}, value={self.value!r})"
|
|
160
|
+
else:
|
|
161
|
+
return f"LakeFormationTag(key={self.key!r})"
|
|
@@ -35,12 +35,12 @@ class RestrictedTextConfig:
|
|
|
35
35
|
def __init__(
|
|
36
36
|
self,
|
|
37
37
|
max_length: Optional[int] = None,
|
|
38
|
-
|
|
38
|
+
forbidden_chars: Optional[Set[str]] = None,
|
|
39
39
|
replacement_char: Optional[str] = None,
|
|
40
40
|
truncation_suffix: Optional[str] = None,
|
|
41
41
|
):
|
|
42
42
|
self.max_length = max_length
|
|
43
|
-
self.
|
|
43
|
+
self.forbidden_chars = forbidden_chars
|
|
44
44
|
self.replacement_char = replacement_char
|
|
45
45
|
self.truncation_suffix = truncation_suffix
|
|
46
46
|
|
|
@@ -81,7 +81,7 @@ class RestrictedText(str):
|
|
|
81
81
|
|
|
82
82
|
# Default configuration
|
|
83
83
|
_default_max_length: ClassVar[Optional[int]] = 50
|
|
84
|
-
|
|
84
|
+
_default_forbidden_chars: ClassVar[Set[str]] = {" ", "\t", "\n", "\r"}
|
|
85
85
|
_default_replacement_char: ClassVar[str] = "_"
|
|
86
86
|
_default_truncation_suffix: ClassVar[str] = "..."
|
|
87
87
|
|
|
@@ -94,7 +94,7 @@ class RestrictedText(str):
|
|
|
94
94
|
"""Initialize the RestrictedText with a value."""
|
|
95
95
|
self.original: str = value
|
|
96
96
|
self.max_length = self._default_max_length
|
|
97
|
-
self.
|
|
97
|
+
self.forbidden_chars = self._default_forbidden_chars
|
|
98
98
|
self.replacement_char = self._default_replacement_char
|
|
99
99
|
self.truncation_suffix = self._default_truncation_suffix
|
|
100
100
|
|
|
@@ -104,15 +104,15 @@ class RestrictedText(str):
|
|
|
104
104
|
def _configure(
|
|
105
105
|
self,
|
|
106
106
|
max_length: Optional[int] = None,
|
|
107
|
-
|
|
107
|
+
forbidden_chars: Optional[Set[str]] = None,
|
|
108
108
|
replacement_char: Optional[str] = None,
|
|
109
109
|
truncation_suffix: Optional[str] = None,
|
|
110
110
|
) -> "RestrictedText":
|
|
111
111
|
"""Configure this instance with custom settings."""
|
|
112
112
|
if max_length is not None:
|
|
113
113
|
self.max_length = max_length
|
|
114
|
-
if
|
|
115
|
-
self.
|
|
114
|
+
if forbidden_chars is not None:
|
|
115
|
+
self.forbidden_chars = forbidden_chars
|
|
116
116
|
if replacement_char is not None:
|
|
117
117
|
self.replacement_char = replacement_char
|
|
118
118
|
if truncation_suffix is not None:
|
|
@@ -126,7 +126,7 @@ class RestrictedText(str):
|
|
|
126
126
|
"""Process the value by replacing characters and truncating."""
|
|
127
127
|
# Replace specified characters
|
|
128
128
|
processed = value
|
|
129
|
-
for char in self.
|
|
129
|
+
for char in self.forbidden_chars:
|
|
130
130
|
processed = processed.replace(char, self.replacement_char)
|
|
131
131
|
|
|
132
132
|
# Truncate if necessary
|
|
@@ -174,7 +174,7 @@ class RestrictedText(str):
|
|
|
174
174
|
"""
|
|
175
175
|
return RestrictedTextConfig(
|
|
176
176
|
max_length=max_length,
|
|
177
|
-
|
|
177
|
+
forbidden_chars=forbidden_chars,
|
|
178
178
|
replacement_char=replacement_char,
|
|
179
179
|
truncation_suffix=truncation_suffix,
|
|
180
180
|
)
|
|
@@ -234,7 +234,7 @@ class RestrictedText(str):
|
|
|
234
234
|
config = field.default
|
|
235
235
|
instance._configure(
|
|
236
236
|
max_length=config.max_length,
|
|
237
|
-
|
|
237
|
+
forbidden_chars=config.forbidden_chars,
|
|
238
238
|
replacement_char=config.replacement_char,
|
|
239
239
|
truncation_suffix=config.truncation_suffix,
|
|
240
240
|
)
|
|
@@ -23,7 +23,7 @@ class UnityCatalogTagKeyText(RestrictedText):
|
|
|
23
23
|
|
|
24
24
|
_default_max_length: ClassVar[int] = 255
|
|
25
25
|
# Unity Catalog tag keys: alphanumeric, hyphens, underscores, periods only
|
|
26
|
-
|
|
26
|
+
_default_forbidden_chars: ClassVar[Set[str]] = {
|
|
27
27
|
"\t",
|
|
28
28
|
"\n",
|
|
29
29
|
"\r",
|
|
@@ -43,7 +43,7 @@ class UnityCatalogTagValueText(RestrictedText):
|
|
|
43
43
|
|
|
44
44
|
_default_max_length: ClassVar[int] = 1000
|
|
45
45
|
# Unity Catalog tag values are more permissive but still have some restrictions
|
|
46
|
-
|
|
46
|
+
_default_forbidden_chars: ClassVar[Set[str]] = {"\t", "\n", "\r"}
|
|
47
47
|
_default_replacement_char: ClassVar[str] = " "
|
|
48
48
|
_default_truncation_suffix: ClassVar[str] = "..."
|
|
49
49
|
|
|
@@ -88,6 +88,9 @@ class UnityCatalogTag(ExternalTag):
|
|
|
88
88
|
if not isinstance(value, UnityCatalogTagValueText)
|
|
89
89
|
else value
|
|
90
90
|
)
|
|
91
|
+
# If value is an empty string, set it to None to not generater empty value in DataHub tag which results in key: tags
|
|
92
|
+
if not str(value):
|
|
93
|
+
processed_value = None
|
|
91
94
|
|
|
92
95
|
super().__init__(
|
|
93
96
|
key=processed_key,
|
datahub/emitter/rest_emitter.py
CHANGED
|
@@ -314,6 +314,7 @@ class DataHubRestEmitter(Closeable, Emitter):
|
|
|
314
314
|
openapi_ingestion: Optional[bool] = None,
|
|
315
315
|
client_mode: Optional[ClientMode] = None,
|
|
316
316
|
datahub_component: Optional[str] = None,
|
|
317
|
+
server_config_refresh_interval: Optional[int] = None,
|
|
317
318
|
):
|
|
318
319
|
if not gms_server:
|
|
319
320
|
raise ConfigurationError("gms server is required")
|
|
@@ -329,6 +330,8 @@ class DataHubRestEmitter(Closeable, Emitter):
|
|
|
329
330
|
self._openapi_ingestion = (
|
|
330
331
|
openapi_ingestion # Re-evaluated after test connection
|
|
331
332
|
)
|
|
333
|
+
self._server_config_refresh_interval = server_config_refresh_interval
|
|
334
|
+
self._config_fetch_time: Optional[float] = None
|
|
332
335
|
|
|
333
336
|
headers = {
|
|
334
337
|
"X-RestLi-Protocol-Version": "2.0.0",
|
|
@@ -398,7 +401,17 @@ class DataHubRestEmitter(Closeable, Emitter):
|
|
|
398
401
|
Raises:
|
|
399
402
|
ConfigurationError: If there's an error fetching or validating the configuration
|
|
400
403
|
"""
|
|
401
|
-
|
|
404
|
+
|
|
405
|
+
if (
|
|
406
|
+
not hasattr(self, "_server_config")
|
|
407
|
+
or self._server_config is None
|
|
408
|
+
or (
|
|
409
|
+
self._server_config_refresh_interval is not None
|
|
410
|
+
and self._config_fetch_time is not None
|
|
411
|
+
and (time.time() - self._config_fetch_time)
|
|
412
|
+
> self._server_config_refresh_interval
|
|
413
|
+
)
|
|
414
|
+
):
|
|
402
415
|
if self._session is None or self._gms_server is None:
|
|
403
416
|
raise ConfigurationError(
|
|
404
417
|
"Session and URL are required to load configuration"
|
|
@@ -419,6 +432,7 @@ class DataHubRestEmitter(Closeable, Emitter):
|
|
|
419
432
|
)
|
|
420
433
|
|
|
421
434
|
self._server_config = RestServiceConfig(raw_config=raw_config)
|
|
435
|
+
self._config_fetch_time = time.time()
|
|
422
436
|
self._post_fetch_server_config()
|
|
423
437
|
|
|
424
438
|
else:
|
|
@@ -453,6 +467,8 @@ class DataHubRestEmitter(Closeable, Emitter):
|
|
|
453
467
|
DEFAULT_REST_EMITTER_ENDPOINT == RestSinkEndpoint.OPENAPI
|
|
454
468
|
)
|
|
455
469
|
|
|
470
|
+
def test_connection(self) -> None:
|
|
471
|
+
self.fetch_server_config()
|
|
456
472
|
logger.debug(
|
|
457
473
|
f"Using {'OpenAPI' if self._openapi_ingestion else 'Restli'} for ingestion."
|
|
458
474
|
)
|
|
@@ -460,12 +476,21 @@ class DataHubRestEmitter(Closeable, Emitter):
|
|
|
460
476
|
f"{EmitMode.ASYNC_WAIT} {'IS' if self._should_trace(emit_mode=EmitMode.ASYNC_WAIT, warn=False) else 'IS NOT'} supported."
|
|
461
477
|
)
|
|
462
478
|
|
|
463
|
-
def test_connection(self) -> None:
|
|
464
|
-
self.fetch_server_config()
|
|
465
|
-
|
|
466
479
|
def get_server_config(self) -> dict:
|
|
467
480
|
return self.server_config.raw_config
|
|
468
481
|
|
|
482
|
+
def invalidate_config_cache(self) -> None:
|
|
483
|
+
"""Manually invalidate the configuration cache."""
|
|
484
|
+
if (
|
|
485
|
+
hasattr(self, "_server_config")
|
|
486
|
+
and self._server_config is not None
|
|
487
|
+
and self._server_config_refresh_interval is not None
|
|
488
|
+
):
|
|
489
|
+
# Set fetch time to beyond TTL in the past to force refresh on next access
|
|
490
|
+
self._config_fetch_time = (
|
|
491
|
+
time.time() - self._server_config_refresh_interval - 1
|
|
492
|
+
)
|
|
493
|
+
|
|
469
494
|
def to_graph(self) -> "DataHubGraph":
|
|
470
495
|
from datahub.ingestion.graph.client import DataHubGraph
|
|
471
496
|
|
|
@@ -159,6 +159,7 @@ class DataHubGraph(DatahubRestEmitter, EntityVersioningAPI):
|
|
|
159
159
|
openapi_ingestion=self.config.openapi_ingestion,
|
|
160
160
|
client_mode=config.client_mode,
|
|
161
161
|
datahub_component=config.datahub_component,
|
|
162
|
+
server_config_refresh_interval=config.server_config_refresh_interval,
|
|
162
163
|
)
|
|
163
164
|
self.server_id: str = _MISSING_SERVER_ID
|
|
164
165
|
|
|
@@ -234,6 +235,7 @@ class DataHubGraph(DatahubRestEmitter, EntityVersioningAPI):
|
|
|
234
235
|
client_certificate_path=session_config.client_certificate_path,
|
|
235
236
|
client_mode=session_config.client_mode,
|
|
236
237
|
datahub_component=session_config.datahub_component,
|
|
238
|
+
server_config_refresh_interval=emitter._server_config_refresh_interval,
|
|
237
239
|
)
|
|
238
240
|
)
|
|
239
241
|
|
|
@@ -29,6 +29,7 @@ class DatahubClientConfig(ConfigModel):
|
|
|
29
29
|
openapi_ingestion: Optional[bool] = None
|
|
30
30
|
client_mode: Optional[ClientMode] = None
|
|
31
31
|
datahub_component: Optional[str] = None
|
|
32
|
+
server_config_refresh_interval: Optional[int] = None
|
|
32
33
|
|
|
33
34
|
class Config:
|
|
34
35
|
extra = "ignore"
|
|
@@ -13,6 +13,7 @@ from datahub.configuration.common import (
|
|
|
13
13
|
from datahub.emitter.aspect import JSON_CONTENT_TYPE
|
|
14
14
|
from datahub.emitter.mce_builder import datahub_guid, make_data_platform_urn
|
|
15
15
|
from datahub.emitter.mcp import MetadataChangeProposalWrapper
|
|
16
|
+
from datahub.emitter.rest_emitter import EmitMode
|
|
16
17
|
from datahub.ingestion.api.common import PipelineContext, RecordEnvelope
|
|
17
18
|
from datahub.ingestion.api.pipeline_run_listener import PipelineRunListener
|
|
18
19
|
from datahub.ingestion.api.sink import NoopWriteCallback, Sink
|
|
@@ -111,6 +112,7 @@ class DatahubIngestionRunSummaryProvider(PipelineRunListener):
|
|
|
111
112
|
def __init__(self, sink: Sink, report_recipe: bool, ctx: PipelineContext) -> None:
|
|
112
113
|
assert ctx.pipeline_config is not None
|
|
113
114
|
|
|
115
|
+
self.ctx = ctx
|
|
114
116
|
self.sink: Sink = sink
|
|
115
117
|
self.report_recipe = report_recipe
|
|
116
118
|
ingestion_source_key = self.generate_unique_key(ctx.pipeline_config)
|
|
@@ -191,18 +193,25 @@ class DatahubIngestionRunSummaryProvider(PipelineRunListener):
|
|
|
191
193
|
)
|
|
192
194
|
return json.dumps(converted_recipe)
|
|
193
195
|
|
|
194
|
-
def _emit_aspect(
|
|
195
|
-
self
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
),
|
|
201
|
-
metadata={},
|
|
202
|
-
),
|
|
203
|
-
NoopWriteCallback(),
|
|
196
|
+
def _emit_aspect(
|
|
197
|
+
self, entity_urn: Urn, aspect_value: _Aspect, try_sync: bool = False
|
|
198
|
+
) -> None:
|
|
199
|
+
mcp = MetadataChangeProposalWrapper(
|
|
200
|
+
entityUrn=str(entity_urn),
|
|
201
|
+
aspect=aspect_value,
|
|
204
202
|
)
|
|
205
203
|
|
|
204
|
+
if try_sync and self.ctx.graph:
|
|
205
|
+
self.ctx.graph.emit_mcp(mcp, emit_mode=EmitMode.SYNC_PRIMARY)
|
|
206
|
+
else:
|
|
207
|
+
self.sink.write_record_async(
|
|
208
|
+
RecordEnvelope(
|
|
209
|
+
record=mcp,
|
|
210
|
+
metadata={},
|
|
211
|
+
),
|
|
212
|
+
NoopWriteCallback(),
|
|
213
|
+
)
|
|
214
|
+
|
|
206
215
|
def on_start(self, ctx: PipelineContext) -> None:
|
|
207
216
|
assert ctx.pipeline_config is not None
|
|
208
217
|
# Construct the dataHubExecutionRequestInput aspect
|
|
@@ -223,6 +232,7 @@ class DatahubIngestionRunSummaryProvider(PipelineRunListener):
|
|
|
223
232
|
self._emit_aspect(
|
|
224
233
|
entity_urn=self.execution_request_input_urn,
|
|
225
234
|
aspect_value=execution_input_aspect,
|
|
235
|
+
try_sync=True,
|
|
226
236
|
)
|
|
227
237
|
|
|
228
238
|
def on_completion(
|
|
@@ -70,6 +70,7 @@ _DEFAULT_REST_SINK_MODE = pydantic.parse_obj_as(
|
|
|
70
70
|
class DatahubRestSinkConfig(DatahubClientConfig):
|
|
71
71
|
mode: RestSinkMode = _DEFAULT_REST_SINK_MODE
|
|
72
72
|
endpoint: RestSinkEndpoint = DEFAULT_REST_EMITTER_ENDPOINT
|
|
73
|
+
server_config_refresh_interval: Optional[int] = None
|
|
73
74
|
|
|
74
75
|
# These only apply in async modes.
|
|
75
76
|
max_threads: pydantic.PositiveInt = _DEFAULT_REST_SINK_MAX_THREADS
|
|
@@ -24,6 +24,7 @@ logger = logging.getLogger(__name__)
|
|
|
24
24
|
if TYPE_CHECKING:
|
|
25
25
|
from mypy_boto3_dynamodb import DynamoDBClient
|
|
26
26
|
from mypy_boto3_glue import GlueClient
|
|
27
|
+
from mypy_boto3_lakeformation import LakeFormationClient
|
|
27
28
|
from mypy_boto3_s3 import S3Client, S3ServiceResource
|
|
28
29
|
from mypy_boto3_sagemaker import SageMakerClient
|
|
29
30
|
from mypy_boto3_sts import STSClient
|
|
@@ -454,6 +455,9 @@ class AwsConnectionConfig(ConfigModel):
|
|
|
454
455
|
def get_sagemaker_client(self) -> "SageMakerClient":
|
|
455
456
|
return self.get_session().client("sagemaker", config=self._aws_config())
|
|
456
457
|
|
|
458
|
+
def get_lakeformation_client(self) -> "LakeFormationClient":
|
|
459
|
+
return self.get_session().client("lakeformation", config=self._aws_config())
|
|
460
|
+
|
|
457
461
|
|
|
458
462
|
class AwsSourceConfig(EnvConfigMixin, AwsConnectionConfig):
|
|
459
463
|
"""
|