openmetadata-ingestion 1.3.4.0__py3-none-any.whl → 1.4.0.0rc2__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 openmetadata-ingestion might be problematic. Click here for more details.
- metadata/__version__.py +13 -0
- metadata/automations/runner.py +9 -0
- metadata/cli/app.py +0 -1
- metadata/cli/lineage.py +5 -1
- metadata/cli/restore.py +7 -0
- metadata/cmd.py +2 -345
- metadata/data_insight/processor/reports/cost_analysis_report_data_processor.py +0 -1
- metadata/data_quality/api/models.py +1 -0
- metadata/data_quality/processor/test_case_runner.py +9 -2
- metadata/data_quality/source/test_suite.py +14 -3
- metadata/data_quality/validations/base_test_handler.py +1 -1
- metadata/data_quality/validations/column/base/columnValuesMissingCount.py +4 -1
- metadata/data_quality/validations/column/sqlalchemy/columnValuesToBeUnique.py +28 -17
- metadata/data_quality/validations/mixins/sqa_validator_mixin.py +4 -1
- metadata/data_quality/validations/table/base/tableCustomSQLQuery.py +1 -1
- metadata/examples/workflows/airbyte.yaml +1 -0
- metadata/examples/workflows/airflow.yaml +1 -1
- metadata/examples/workflows/airflow_backend.yaml +1 -1
- metadata/examples/workflows/airflow_postgres.yaml +1 -1
- metadata/examples/workflows/amundsen.yaml +1 -0
- metadata/examples/workflows/athena.yaml +1 -0
- metadata/examples/workflows/athena_lineage.yaml +1 -1
- metadata/examples/workflows/athena_usage.yaml +1 -0
- metadata/examples/workflows/atlas.yaml +1 -0
- metadata/examples/workflows/azuresql.yaml +1 -0
- metadata/examples/workflows/azuresql_lineage.yaml +1 -0
- metadata/examples/workflows/azuresql_usage.yaml +1 -0
- metadata/examples/workflows/bigquery.yaml +1 -0
- metadata/examples/workflows/bigquery_lineage.yaml +1 -0
- metadata/examples/workflows/bigquery_profiler.yaml +1 -0
- metadata/examples/workflows/bigquery_usage.yaml +1 -0
- metadata/examples/workflows/bigtable.yaml +1 -1
- metadata/examples/workflows/clickhouse.yaml +1 -0
- metadata/examples/workflows/clickhouse_lineage.yaml +1 -0
- metadata/examples/workflows/clickhouse_usage.yaml +1 -0
- metadata/examples/workflows/couchbase.yaml +1 -1
- metadata/examples/workflows/dagster.yaml +1 -0
- metadata/examples/workflows/data_insight.yaml +1 -1
- metadata/examples/workflows/databricks.yaml +1 -0
- metadata/examples/workflows/databricks_lineage.yaml +1 -0
- metadata/examples/workflows/databricks_pipeline.yaml +1 -0
- metadata/examples/workflows/databricks_usage.yaml +1 -0
- metadata/examples/workflows/datalake_azure_client_secret.yaml +1 -0
- metadata/examples/workflows/datalake_gcs.yaml +1 -0
- metadata/examples/workflows/datalake_profiler.yaml +1 -0
- metadata/examples/workflows/datalake_s3.yaml +1 -0
- metadata/examples/workflows/db2.yaml +1 -0
- metadata/examples/workflows/db2_profiler.yaml +1 -0
- metadata/examples/workflows/dbt.yaml +2 -0
- metadata/examples/workflows/deltalake.yaml +1 -0
- metadata/examples/workflows/domodashboard.yaml +1 -0
- metadata/examples/workflows/dynamodb.yaml +1 -0
- metadata/examples/workflows/elasticsearch.yaml +1 -1
- metadata/examples/workflows/fivetran.yaml +1 -0
- metadata/examples/workflows/glue.yaml +1 -0
- metadata/examples/workflows/gluepipeline.yaml +1 -0
- metadata/examples/workflows/hive.yaml +1 -0
- metadata/examples/workflows/impala.yaml +1 -0
- metadata/examples/workflows/kafka.yaml +1 -1
- metadata/examples/workflows/kafka_connect.yaml +30 -0
- metadata/examples/workflows/kinesis.yaml +1 -1
- metadata/examples/workflows/lightdash.yaml +1 -0
- metadata/examples/workflows/looker.yaml +1 -0
- metadata/examples/workflows/mariadb.yaml +1 -0
- metadata/examples/workflows/metabase.yaml +1 -0
- metadata/examples/workflows/mlflow.yaml +1 -0
- metadata/examples/workflows/mode.yaml +3 -1
- metadata/examples/workflows/mongodb.yaml +1 -0
- metadata/examples/workflows/mssql.yaml +1 -0
- metadata/examples/workflows/mssql_lineage.yaml +1 -0
- metadata/examples/workflows/mssql_usage.yaml +1 -0
- metadata/examples/workflows/mstr.yaml +1 -0
- metadata/examples/workflows/mysql.yaml +1 -0
- metadata/examples/workflows/mysql_profiler.yaml +1 -0
- metadata/examples/workflows/openmetadata.yaml +1 -0
- metadata/examples/workflows/oracle.yaml +1 -0
- metadata/examples/workflows/oracle_lineage.yaml +1 -1
- metadata/examples/workflows/oracle_usage.yaml +1 -0
- metadata/examples/workflows/pinotdb.yaml +1 -0
- metadata/examples/workflows/postgres.yaml +1 -0
- metadata/examples/workflows/postgres_lineage.yaml +1 -1
- metadata/examples/workflows/postgres_usage.yaml +1 -1
- metadata/examples/workflows/powerbi.yaml +52 -0
- metadata/examples/workflows/presto.yaml +1 -0
- metadata/examples/workflows/qlik_sense.yaml +6 -4
- metadata/examples/workflows/qlikcloud.yaml +31 -0
- metadata/examples/workflows/query_log_usage.yaml +1 -0
- metadata/examples/workflows/quicksight.yaml +1 -0
- metadata/examples/workflows/redash.yaml +1 -0
- metadata/examples/workflows/redpanda.yaml +1 -0
- metadata/examples/workflows/redshift.yaml +1 -0
- metadata/examples/workflows/redshift_lineage.yaml +1 -0
- metadata/examples/workflows/redshift_profiler.yaml +1 -0
- metadata/examples/workflows/redshift_usage.yaml +1 -0
- metadata/examples/workflows/sagemaker.yaml +1 -1
- metadata/examples/workflows/salesforce.yaml +1 -0
- metadata/examples/workflows/sas.yaml +1 -1
- metadata/examples/workflows/singlestore.yaml +1 -0
- metadata/examples/workflows/snowflake.yaml +1 -0
- metadata/examples/workflows/snowflake_lineage.yaml +1 -0
- metadata/examples/workflows/snowflake_usage.yaml +1 -0
- metadata/examples/workflows/spline.yaml +5 -4
- metadata/examples/workflows/sqlite.yaml +1 -0
- metadata/examples/workflows/superset.yaml +1 -0
- metadata/examples/workflows/tableau.yaml +1 -0
- metadata/examples/workflows/test_suite.yaml +13 -16
- metadata/examples/workflows/trino.yaml +1 -0
- metadata/examples/workflows/trino_lineage.yaml +1 -0
- metadata/examples/workflows/trino_usage.yaml +1 -0
- metadata/examples/workflows/unity_catalog.yaml +1 -1
- metadata/examples/workflows/unity_catalog_lineage.yaml +1 -1
- metadata/examples/workflows/unity_catalog_usage.yaml +1 -1
- metadata/examples/workflows/vertica.yaml +1 -0
- metadata/generated/antlr/EntityLinkLexer.py +354 -349
- metadata/generated/schema/analytics/__init__.py +1 -1
- metadata/generated/schema/analytics/basic.py +1 -1
- metadata/generated/schema/analytics/reportData.py +1 -1
- metadata/generated/schema/analytics/reportDataType/__init__.py +1 -1
- metadata/generated/schema/analytics/reportDataType/aggregatedCostAnalysisReportData.py +1 -1
- metadata/generated/schema/analytics/reportDataType/entityReportData.py +1 -1
- metadata/generated/schema/analytics/reportDataType/rawCostAnalysisReportData.py +1 -1
- metadata/generated/schema/analytics/reportDataType/webAnalyticEntityViewReportData.py +1 -1
- metadata/generated/schema/analytics/reportDataType/webAnalyticUserActivityReportData.py +1 -1
- metadata/generated/schema/analytics/webAnalyticEvent.py +1 -1
- metadata/generated/schema/analytics/webAnalyticEventData.py +1 -1
- metadata/generated/schema/analytics/webAnalyticEventType/__init__.py +1 -1
- metadata/generated/schema/analytics/webAnalyticEventType/customEvent.py +1 -1
- metadata/generated/schema/analytics/webAnalyticEventType/pageViewEvent.py +1 -1
- metadata/generated/schema/api/__init__.py +1 -1
- metadata/generated/schema/api/addGlossaryToAssetsRequest.py +1 -1
- metadata/generated/schema/api/analytics/__init__.py +1 -1
- metadata/generated/schema/api/analytics/createWebAnalyticEvent.py +1 -1
- metadata/generated/schema/api/automations/__init__.py +1 -1
- metadata/generated/schema/api/automations/createWorkflow.py +1 -1
- metadata/generated/schema/api/bulkAssets.py +1 -1
- metadata/generated/schema/api/classification/__init__.py +1 -1
- metadata/generated/schema/api/classification/createClassification.py +2 -3
- metadata/generated/schema/api/classification/createTag.py +2 -3
- metadata/generated/schema/api/classification/loadTags.py +1 -1
- metadata/generated/schema/api/createBot.py +1 -1
- metadata/generated/schema/api/createEventPublisherJob.py +1 -1
- metadata/generated/schema/api/createType.py +1 -1
- metadata/generated/schema/api/data/__init__.py +1 -1
- metadata/generated/schema/api/data/createChart.py +1 -1
- metadata/generated/schema/api/data/createContainer.py +4 -1
- metadata/generated/schema/api/data/createCustomProperty.py +1 -1
- metadata/generated/schema/api/data/createDashboard.py +1 -1
- metadata/generated/schema/api/data/createDashboardDataModel.py +1 -1
- metadata/generated/schema/api/data/createDatabase.py +1 -1
- metadata/generated/schema/api/data/createDatabaseSchema.py +1 -1
- metadata/generated/schema/api/data/createGlossary.py +1 -1
- metadata/generated/schema/api/data/createGlossaryTerm.py +1 -1
- metadata/generated/schema/api/data/createMlModel.py +1 -1
- metadata/generated/schema/api/data/createPipeline.py +1 -1
- metadata/generated/schema/api/data/createQuery.py +1 -1
- metadata/generated/schema/api/data/createSearchIndex.py +1 -1
- metadata/generated/schema/api/data/createStoredProcedure.py +1 -1
- metadata/generated/schema/api/data/createTable.py +4 -3
- metadata/generated/schema/api/data/createTableProfile.py +1 -1
- metadata/generated/schema/api/data/createTopic.py +1 -1
- metadata/generated/schema/api/data/loadGlossary.py +1 -1
- metadata/generated/schema/api/data/restoreEntity.py +1 -1
- metadata/generated/schema/api/dataInsight/__init__.py +1 -1
- metadata/generated/schema/api/dataInsight/createDataInsightChart.py +1 -1
- metadata/generated/schema/api/dataInsight/kpi/__init__.py +1 -1
- metadata/generated/schema/api/dataInsight/kpi/createKpiRequest.py +1 -1
- metadata/generated/schema/api/docStore/__init__.py +1 -1
- metadata/generated/schema/api/docStore/createDocument.py +1 -1
- metadata/generated/schema/api/domains/__init__.py +1 -1
- metadata/generated/schema/api/domains/createDataProduct.py +1 -1
- metadata/generated/schema/api/domains/createDomain.py +1 -1
- metadata/generated/schema/api/feed/__init__.py +1 -1
- metadata/generated/schema/api/feed/closeTask.py +1 -1
- metadata/generated/schema/api/feed/createPost.py +1 -1
- metadata/generated/schema/api/feed/createSuggestion.py +1 -1
- metadata/generated/schema/api/feed/createThread.py +1 -1
- metadata/generated/schema/api/feed/resolveTask.py +1 -1
- metadata/generated/schema/api/feed/threadCount.py +1 -1
- metadata/generated/schema/api/lineage/__init__.py +1 -1
- metadata/generated/schema/api/lineage/addLineage.py +1 -1
- metadata/generated/schema/api/openMetadataServerVersion.py +1 -1
- metadata/generated/schema/api/policies/__init__.py +1 -1
- metadata/generated/schema/api/policies/createPolicy.py +1 -1
- metadata/generated/schema/api/services/__init__.py +1 -1
- metadata/generated/schema/api/services/createDashboardService.py +1 -1
- metadata/generated/schema/api/services/createDatabaseService.py +1 -1
- metadata/generated/schema/api/services/createMessagingService.py +1 -1
- metadata/generated/schema/api/services/createMetadataService.py +1 -1
- metadata/generated/schema/api/services/createMlModelService.py +1 -1
- metadata/generated/schema/api/services/createPipelineService.py +1 -1
- metadata/generated/schema/api/services/createSearchService.py +1 -1
- metadata/generated/schema/api/services/createStorageService.py +1 -1
- metadata/generated/schema/api/services/ingestionPipelines/__init__.py +1 -1
- metadata/generated/schema/api/services/ingestionPipelines/createIngestionPipeline.py +1 -1
- metadata/generated/schema/api/setOwner.py +1 -1
- metadata/generated/schema/api/teams/__init__.py +1 -1
- metadata/generated/schema/api/teams/createPersona.py +1 -1
- metadata/generated/schema/api/teams/createRole.py +1 -1
- metadata/generated/schema/api/teams/createTeam.py +1 -1
- metadata/generated/schema/api/teams/createUser.py +2 -2
- metadata/generated/schema/api/tests/__init__.py +1 -1
- metadata/generated/schema/api/tests/createCustomMetric.py +1 -1
- metadata/generated/schema/api/tests/createLogicalTestCases.py +1 -1
- metadata/generated/schema/api/tests/createTestCase.py +2 -2
- metadata/generated/schema/api/tests/createTestCaseResolutionStatus.py +1 -1
- metadata/generated/schema/api/tests/createTestDefinition.py +2 -2
- metadata/generated/schema/api/tests/createTestSuite.py +1 -1
- metadata/generated/schema/api/voteRequest.py +1 -1
- metadata/generated/schema/auth/__init__.py +1 -1
- metadata/generated/schema/auth/basicAuth.py +1 -1
- metadata/generated/schema/auth/basicLoginRequest.py +1 -1
- metadata/generated/schema/auth/changePasswordRequest.py +1 -1
- metadata/generated/schema/auth/createPersonalToken.py +1 -1
- metadata/generated/schema/auth/emailRequest.py +1 -1
- metadata/generated/schema/auth/emailVerificationToken.py +1 -1
- metadata/generated/schema/auth/generateToken.py +1 -1
- metadata/generated/schema/auth/jwtAuth.py +1 -1
- metadata/generated/schema/auth/loginRequest.py +1 -1
- metadata/generated/schema/auth/logoutRequest.py +1 -1
- metadata/generated/schema/auth/passwordResetRequest.py +1 -1
- metadata/generated/schema/auth/passwordResetToken.py +1 -1
- metadata/generated/schema/auth/personalAccessToken.py +1 -1
- metadata/generated/schema/auth/refreshToken.py +1 -1
- metadata/generated/schema/auth/registrationRequest.py +1 -1
- metadata/generated/schema/auth/revokePersonalToken.py +1 -1
- metadata/generated/schema/auth/revokeToken.py +1 -1
- metadata/generated/schema/auth/serviceTokenEnum.py +1 -1
- metadata/generated/schema/auth/ssoAuth.py +1 -1
- metadata/generated/schema/auth/tokenRefreshRequest.py +1 -1
- metadata/generated/schema/configuration/__init__.py +1 -1
- metadata/generated/schema/configuration/appsPrivateConfiguration.py +1 -1
- metadata/generated/schema/configuration/authConfig.py +1 -1
- metadata/generated/schema/configuration/authenticationConfiguration.py +1 -1
- metadata/generated/schema/configuration/authorizerConfiguration.py +4 -1
- metadata/generated/schema/configuration/changeEventConfiguration.py +1 -1
- metadata/generated/schema/configuration/dataQualityConfiguration.py +1 -1
- metadata/generated/schema/configuration/elasticSearchConfiguration.py +4 -1
- metadata/generated/schema/configuration/eventHandlerConfiguration.py +1 -1
- metadata/generated/schema/configuration/fernetConfiguration.py +1 -1
- metadata/generated/schema/configuration/jwtTokenConfiguration.py +1 -1
- metadata/generated/schema/configuration/kafkaEventConfiguration.py +1 -1
- metadata/generated/schema/configuration/ldapConfiguration.py +1 -1
- metadata/generated/schema/configuration/ldapTrustStoreConfig/__init__.py +1 -1
- metadata/generated/schema/configuration/ldapTrustStoreConfig/customTrustManagerConfig.py +1 -1
- metadata/generated/schema/configuration/ldapTrustStoreConfig/hostNameConfig.py +1 -1
- metadata/generated/schema/configuration/ldapTrustStoreConfig/jvmDefaultConfig.py +1 -1
- metadata/generated/schema/configuration/ldapTrustStoreConfig/trustAllConfig.py +1 -1
- metadata/generated/schema/configuration/ldapTrustStoreConfig/truststoreConfig.py +1 -1
- metadata/generated/schema/configuration/loginConfiguration.py +1 -1
- metadata/generated/schema/configuration/logoConfiguration.py +1 -1
- metadata/generated/schema/configuration/pipelineServiceClientConfiguration.py +1 -1
- metadata/generated/schema/configuration/profilerConfiguration.py +66 -0
- metadata/generated/schema/configuration/slackAppConfiguration.py +1 -1
- metadata/generated/schema/configuration/taskNotificationConfiguration.py +1 -1
- metadata/generated/schema/configuration/testResultNotificationConfiguration.py +1 -1
- metadata/generated/schema/configuration/themeConfiguration.py +32 -0
- metadata/generated/schema/configuration/uiThemePreference.py +23 -0
- metadata/generated/schema/dataInsight/__init__.py +1 -1
- metadata/generated/schema/dataInsight/dataInsightChart.py +1 -1
- metadata/generated/schema/dataInsight/dataInsightChartResult.py +1 -1
- metadata/generated/schema/dataInsight/kpi/__init__.py +1 -1
- metadata/generated/schema/dataInsight/kpi/basic.py +1 -1
- metadata/generated/schema/dataInsight/kpi/kpi.py +1 -1
- metadata/generated/schema/dataInsight/type/__init__.py +1 -1
- metadata/generated/schema/dataInsight/type/aggregatedUnusedAssetsCount.py +1 -1
- metadata/generated/schema/dataInsight/type/aggregatedUnusedAssetsSize.py +1 -1
- metadata/generated/schema/dataInsight/type/aggregatedUsedVsUnusedAssetsCount.py +1 -1
- metadata/generated/schema/dataInsight/type/aggregatedUsedVsUnusedAssetsSize.py +1 -1
- metadata/generated/schema/dataInsight/type/dailyActiveUsers.py +1 -1
- metadata/generated/schema/dataInsight/type/mostActiveUsers.py +1 -1
- metadata/generated/schema/dataInsight/type/mostViewedEntities.py +1 -1
- metadata/generated/schema/dataInsight/type/pageViewsByEntities.py +1 -1
- metadata/generated/schema/dataInsight/type/percentageOfEntitiesWithDescriptionByType.py +1 -1
- metadata/generated/schema/dataInsight/type/percentageOfEntitiesWithOwnerByType.py +1 -1
- metadata/generated/schema/dataInsight/type/percentageOfServicesWithDescription.py +1 -1
- metadata/generated/schema/dataInsight/type/percentageOfServicesWithOwner.py +1 -1
- metadata/generated/schema/dataInsight/type/totalEntitiesByTier.py +1 -1
- metadata/generated/schema/dataInsight/type/totalEntitiesByType.py +1 -1
- metadata/generated/schema/dataInsight/type/unusedAssets.py +1 -1
- metadata/generated/schema/email/__init__.py +1 -1
- metadata/generated/schema/email/emailRequest.py +1 -1
- metadata/generated/schema/email/smtpSettings.py +3 -3
- metadata/generated/schema/entity/__init__.py +1 -1
- metadata/generated/schema/entity/applications/__init__.py +1 -1
- metadata/generated/schema/entity/applications/app.py +1 -1
- metadata/generated/schema/entity/applications/appRunRecord.py +1 -1
- metadata/generated/schema/entity/applications/configuration/__init__.py +1 -1
- metadata/generated/schema/entity/applications/configuration/applicationConfig.py +3 -3
- metadata/generated/schema/entity/applications/configuration/external/__init__.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/automator/__init__.py +5 -0
- metadata/generated/schema/entity/applications/configuration/external/automator/addDescriptionAction.py +36 -0
- metadata/generated/schema/entity/applications/configuration/external/automator/addDomainAction.py +31 -0
- metadata/generated/schema/entity/applications/configuration/external/automator/addOwnerAction.py +31 -0
- metadata/generated/schema/entity/applications/configuration/external/automator/addTagsAction.py +36 -0
- metadata/generated/schema/entity/applications/configuration/external/automator/addTierAction.py +31 -0
- metadata/generated/schema/entity/applications/configuration/external/automator/lineagePropagationAction.py +28 -0
- metadata/generated/schema/entity/applications/configuration/external/automator/mlTaggingAction.py +22 -0
- metadata/generated/schema/entity/applications/configuration/external/automator/removeDescriptionAction.py +30 -0
- metadata/generated/schema/entity/applications/configuration/external/automator/removeDomainAction.py +22 -0
- metadata/generated/schema/entity/applications/configuration/external/automator/removeOwnerAction.py +22 -0
- metadata/generated/schema/entity/applications/configuration/external/automator/removeTagsAction.py +31 -0
- metadata/generated/schema/entity/applications/configuration/external/automator/removeTierAction.py +22 -0
- metadata/generated/schema/entity/applications/configuration/external/automatorAppConfig.py +75 -0
- metadata/generated/schema/entity/applications/configuration/external/metaPilotAppConfig.py +1 -1
- metadata/generated/schema/entity/applications/configuration/internal/__init__.py +1 -1
- metadata/generated/schema/entity/applications/configuration/internal/dataInsightsAppConfig.py +1 -1
- metadata/generated/schema/entity/applications/configuration/internal/dataInsightsReportAppConfig.py +1 -1
- metadata/generated/schema/entity/applications/configuration/internal/searchIndexingAppConfig.py +1 -1
- metadata/generated/schema/entity/applications/configuration/private/external/__init__.py +1 -1
- metadata/generated/schema/entity/applications/configuration/private/external/metaPilotAppPrivateConfig.py +1 -1
- metadata/generated/schema/entity/applications/createAppRequest.py +1 -1
- metadata/generated/schema/entity/applications/jobStatus.py +1 -1
- metadata/generated/schema/entity/applications/liveExecutionContext.py +1 -1
- metadata/generated/schema/entity/applications/marketplace/__init__.py +1 -1
- metadata/generated/schema/entity/applications/marketplace/appMarketPlaceDefinition.py +1 -1
- metadata/generated/schema/entity/applications/marketplace/createAppMarketPlaceDefinitionReq.py +1 -1
- metadata/generated/schema/entity/applications/scheduledExecutionContext.py +1 -1
- metadata/generated/schema/entity/automations/__init__.py +1 -1
- metadata/generated/schema/entity/automations/testServiceConnection.py +1 -1
- metadata/generated/schema/entity/automations/workflow.py +1 -1
- metadata/generated/schema/entity/bot.py +1 -1
- metadata/generated/schema/entity/classification/__init__.py +1 -1
- metadata/generated/schema/entity/classification/classification.py +2 -3
- metadata/generated/schema/entity/classification/tag.py +3 -9
- metadata/generated/schema/entity/data/__init__.py +1 -1
- metadata/generated/schema/entity/data/chart.py +1 -1
- metadata/generated/schema/entity/data/container.py +4 -1
- metadata/generated/schema/entity/data/dashboard.py +1 -1
- metadata/generated/schema/entity/data/dashboardDataModel.py +2 -2
- metadata/generated/schema/entity/data/database.py +1 -1
- metadata/generated/schema/entity/data/databaseSchema.py +1 -1
- metadata/generated/schema/entity/data/glossary.py +1 -1
- metadata/generated/schema/entity/data/glossaryTerm.py +4 -1
- metadata/generated/schema/entity/data/metrics.py +1 -1
- metadata/generated/schema/entity/data/mlmodel.py +2 -2
- metadata/generated/schema/entity/data/pipeline.py +1 -1
- metadata/generated/schema/entity/data/query.py +1 -1
- metadata/generated/schema/entity/data/report.py +1 -1
- metadata/generated/schema/entity/data/searchIndex.py +1 -1
- metadata/generated/schema/entity/data/storedProcedure.py +1 -1
- metadata/generated/schema/entity/data/table.py +26 -24
- metadata/generated/schema/entity/data/topic.py +1 -1
- metadata/generated/schema/entity/docStore/__init__.py +1 -1
- metadata/generated/schema/entity/docStore/document.py +1 -1
- metadata/generated/schema/entity/domains/__init__.py +1 -1
- metadata/generated/schema/entity/domains/dataProduct.py +1 -1
- metadata/generated/schema/entity/domains/domain.py +1 -1
- metadata/generated/schema/entity/events/__init__.py +1 -1
- metadata/generated/schema/entity/events/webhook.py +1 -1
- metadata/generated/schema/entity/feed/__init__.py +1 -1
- metadata/generated/schema/entity/feed/assets.py +18 -0
- metadata/generated/schema/entity/feed/customProperty.py +17 -0
- metadata/generated/schema/entity/feed/description.py +24 -0
- metadata/generated/schema/entity/feed/domain.py +23 -0
- metadata/generated/schema/entity/feed/entityInfo.py +19 -0
- metadata/generated/schema/entity/feed/owner.py +23 -0
- metadata/generated/schema/entity/feed/suggestion.py +1 -1
- metadata/generated/schema/entity/feed/tag.py +23 -0
- metadata/generated/schema/entity/feed/testCaseResult.py +23 -0
- metadata/generated/schema/entity/feed/thread.py +81 -2
- metadata/generated/schema/entity/policies/__init__.py +1 -1
- metadata/generated/schema/entity/policies/accessControl/__init__.py +1 -1
- metadata/generated/schema/entity/policies/accessControl/resourceDescriptor.py +3 -1
- metadata/generated/schema/entity/policies/accessControl/resourcePermission.py +1 -1
- metadata/generated/schema/entity/policies/accessControl/rule.py +1 -1
- metadata/generated/schema/entity/policies/filters.py +3 -3
- metadata/generated/schema/entity/policies/policy.py +1 -1
- metadata/generated/schema/entity/services/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/common/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/common/sslCertPaths.py +1 -1
- metadata/generated/schema/entity/services/connections/common/sslCertValues.py +1 -1
- metadata/generated/schema/entity/services/connections/common/sslConfig.py +1 -1
- metadata/generated/schema/entity/services/connections/connectionBasicType.py +5 -1
- metadata/generated/schema/entity/services/connections/dashboard/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/customDashboardConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/domoDashboardConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/lightdashConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/lookerConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/metabaseConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/modeConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/mstrConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/powerBIConnection.py +33 -2
- metadata/generated/schema/entity/services/connections/dashboard/powerbi/__init__.py +3 -0
- metadata/generated/schema/entity/services/connections/dashboard/powerbi/azureConfig.py +37 -0
- metadata/generated/schema/entity/services/connections/dashboard/powerbi/bucketDetails.py +25 -0
- metadata/generated/schema/entity/services/connections/dashboard/powerbi/gcsConfig.py +37 -0
- metadata/generated/schema/entity/services/connections/dashboard/powerbi/s3Config.py +37 -0
- metadata/generated/schema/entity/services/connections/dashboard/qlikCloudConnection.py +38 -0
- metadata/generated/schema/entity/services/connections/dashboard/qlikSenseConnection.py +6 -15
- metadata/generated/schema/entity/services/connections/dashboard/quickSightConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/redashConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/supersetConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/tableauConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/database/athenaConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/azureSQLConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/bigQueryConnection.py +4 -1
- metadata/generated/schema/entity/services/connections/database/bigTableConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/clickhouseConnection.py +4 -1
- metadata/generated/schema/entity/services/connections/database/common/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/database/common/azureConfig.py +1 -1
- metadata/generated/schema/entity/services/connections/database/common/basicAuth.py +1 -1
- metadata/generated/schema/entity/services/connections/database/common/iamAuthConfig.py +1 -1
- metadata/generated/schema/entity/services/connections/database/common/jwtAuth.py +1 -1
- metadata/generated/schema/entity/services/connections/database/couchbaseConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/customDatabaseConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/databricksConnection.py +4 -1
- metadata/generated/schema/entity/services/connections/database/datalake/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/database/datalake/azureConfig.py +1 -1
- metadata/generated/schema/entity/services/connections/database/datalake/gcsConfig.py +1 -1
- metadata/generated/schema/entity/services/connections/database/datalake/s3Config.py +1 -1
- metadata/generated/schema/entity/services/connections/database/datalakeConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/db2Connection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/deltaLakeConnection.py +2 -2
- metadata/generated/schema/entity/services/connections/database/domoDatabaseConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/dorisConnection.py +4 -13
- metadata/generated/schema/entity/services/connections/database/druidConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/dynamoDBConnection.py +4 -1
- metadata/generated/schema/entity/services/connections/database/glueConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/greenplumConnection.py +2 -15
- metadata/generated/schema/entity/services/connections/database/hiveConnection.py +4 -1
- metadata/generated/schema/entity/services/connections/database/iceberg/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/database/iceberg/dynamoDbCatalogConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/iceberg/glueCatalogConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/iceberg/hiveCatalogConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/iceberg/icebergCatalog.py +1 -1
- metadata/generated/schema/entity/services/connections/database/iceberg/icebergFileSystem.py +1 -1
- metadata/generated/schema/entity/services/connections/database/iceberg/restCatalogConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/icebergConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/impalaConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/mariaDBConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/mongoDBConnection.py +4 -1
- metadata/generated/schema/entity/services/connections/database/mssqlConnection.py +4 -1
- metadata/generated/schema/entity/services/connections/database/mysqlConnection.py +7 -13
- metadata/generated/schema/entity/services/connections/database/oracleConnection.py +4 -1
- metadata/generated/schema/entity/services/connections/database/pinotDBConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/postgresConnection.py +5 -15
- metadata/generated/schema/entity/services/connections/database/prestoConnection.py +11 -1
- metadata/generated/schema/entity/services/connections/database/redshiftConnection.py +5 -15
- metadata/generated/schema/entity/services/connections/database/salesforceConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/sapHana/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/database/sapHana/sapHanaHDBConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/sapHana/sapHanaSQLConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/sapHanaConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/sasConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/singleStoreConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/snowflakeConnection.py +4 -1
- metadata/generated/schema/entity/services/connections/database/sqliteConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/trinoConnection.py +12 -3
- metadata/generated/schema/entity/services/connections/database/unityCatalogConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/verticaConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/messaging/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/messaging/customMessagingConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/messaging/kafkaConnection.py +7 -1
- metadata/generated/schema/entity/services/connections/messaging/kinesisConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/messaging/pulsarConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/messaging/redpandaConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/messaging/saslMechanismType.py +1 -1
- metadata/generated/schema/entity/services/connections/metadata/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/metadata/alationConnection.py +7 -3
- metadata/generated/schema/entity/services/connections/metadata/amundsenConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/metadata/atlasConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/metadata/metadataESConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/metadata/openMetadataConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/mlmodel/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/mlmodel/customMlModelConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/mlmodel/mlflowConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/mlmodel/sageMakerConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/mlmodel/sklearnConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/pipeline/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/pipeline/airbyteConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/pipeline/airflowConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/pipeline/backendConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/pipeline/customPipelineConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/pipeline/dagsterConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/pipeline/databricksPipelineConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/pipeline/domoPipelineConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/pipeline/fivetranConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/pipeline/gluePipelineConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/pipeline/kafkaConnectConnection.py +61 -0
- metadata/generated/schema/entity/services/connections/pipeline/nifiConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/pipeline/openLineageConnection.py +73 -0
- metadata/generated/schema/entity/services/connections/pipeline/sparkConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/pipeline/splineConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/search/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/search/customSearchConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/search/elasticSearch/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/search/elasticSearch/apiAuth.py +1 -1
- metadata/generated/schema/entity/services/connections/search/elasticSearch/basicAuth.py +1 -1
- metadata/generated/schema/entity/services/connections/search/elasticSearchConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/search/openSearchConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/serviceConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/storage/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/storage/adlsConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/storage/customStorageConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/storage/gcsConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/storage/s3Connection.py +5 -2
- metadata/generated/schema/entity/services/connections/testConnectionDefinition.py +1 -1
- metadata/generated/schema/entity/services/connections/testConnectionResult.py +1 -1
- metadata/generated/schema/entity/services/dashboardService.py +4 -1
- metadata/generated/schema/entity/services/databaseService.py +1 -1
- metadata/generated/schema/entity/services/ingestionPipelines/__init__.py +1 -1
- metadata/generated/schema/entity/services/ingestionPipelines/ingestionPipeline.py +1 -1
- metadata/generated/schema/entity/services/ingestionPipelines/pipelineServiceClientResponse.py +1 -1
- metadata/generated/schema/entity/services/ingestionPipelines/status.py +1 -1
- metadata/generated/schema/entity/services/messagingService.py +1 -1
- metadata/generated/schema/entity/services/metadataService.py +1 -1
- metadata/generated/schema/entity/services/mlmodelService.py +1 -1
- metadata/generated/schema/entity/services/pipelineService.py +7 -1
- metadata/generated/schema/entity/services/searchService.py +1 -1
- metadata/generated/schema/entity/services/serviceType.py +1 -1
- metadata/generated/schema/entity/services/storageService.py +1 -1
- metadata/generated/schema/entity/teams/__init__.py +1 -1
- metadata/generated/schema/entity/teams/persona.py +1 -1
- metadata/generated/schema/entity/teams/role.py +1 -1
- metadata/generated/schema/entity/teams/team.py +1 -1
- metadata/generated/schema/entity/teams/teamHierarchy.py +1 -1
- metadata/generated/schema/entity/teams/user.py +2 -2
- metadata/generated/schema/entity/type.py +1 -1
- metadata/generated/schema/entity/utils/__init__.py +1 -1
- metadata/generated/schema/entity/utils/entitiesCount.py +1 -1
- metadata/generated/schema/entity/utils/servicesCount.py +1 -1
- metadata/generated/schema/entity/utils/supersetApiConnection.py +1 -1
- metadata/generated/schema/events/__init__.py +1 -1
- metadata/generated/schema/events/alertMetrics.py +1 -1
- metadata/generated/schema/events/api/__init__.py +1 -1
- metadata/generated/schema/events/api/createEventSubscription.py +1 -1
- metadata/generated/schema/events/emailAlertConfig.py +1 -1
- metadata/generated/schema/events/eventFilterRule.py +10 -1
- metadata/generated/schema/events/eventSubscription.py +6 -2
- metadata/generated/schema/events/eventSubscriptionOffset.py +1 -1
- metadata/generated/schema/events/failedEvent.py +1 -1
- metadata/generated/schema/events/filterResourceDescriptor.py +1 -1
- metadata/generated/schema/events/subscriptionResourceDescriptor.py +1 -1
- metadata/generated/schema/metadataIngestion/__init__.py +1 -1
- metadata/generated/schema/metadataIngestion/application.py +1 -1
- metadata/generated/schema/metadataIngestion/applicationPipeline.py +1 -1
- metadata/generated/schema/metadataIngestion/dashboardServiceMetadataPipeline.py +19 -6
- metadata/generated/schema/metadataIngestion/dataInsightPipeline.py +1 -1
- metadata/generated/schema/metadataIngestion/databaseServiceMetadataPipeline.py +37 -1
- metadata/generated/schema/metadataIngestion/databaseServiceProfilerPipeline.py +23 -23
- metadata/generated/schema/metadataIngestion/databaseServiceQueryLineagePipeline.py +1 -1
- metadata/generated/schema/metadataIngestion/databaseServiceQueryUsagePipeline.py +1 -1
- metadata/generated/schema/metadataIngestion/dbtPipeline.py +1 -1
- metadata/generated/schema/metadataIngestion/dbtconfig/__init__.py +1 -1
- metadata/generated/schema/metadataIngestion/dbtconfig/dbtAzureConfig.py +1 -1
- metadata/generated/schema/metadataIngestion/dbtconfig/dbtBucketDetails.py +1 -1
- metadata/generated/schema/metadataIngestion/dbtconfig/dbtCloudConfig.py +1 -1
- metadata/generated/schema/metadataIngestion/dbtconfig/dbtGCSConfig.py +1 -1
- metadata/generated/schema/metadataIngestion/dbtconfig/dbtHttpConfig.py +1 -1
- metadata/generated/schema/metadataIngestion/dbtconfig/dbtLocalConfig.py +1 -1
- metadata/generated/schema/metadataIngestion/dbtconfig/dbtS3Config.py +1 -1
- metadata/generated/schema/metadataIngestion/messagingServiceMetadataPipeline.py +1 -1
- metadata/generated/schema/metadataIngestion/metadataToElasticSearchPipeline.py +1 -1
- metadata/generated/schema/metadataIngestion/mlmodelServiceMetadataPipeline.py +1 -1
- metadata/generated/schema/metadataIngestion/pipelineServiceMetadataPipeline.py +22 -4
- metadata/generated/schema/metadataIngestion/searchServiceMetadataPipeline.py +1 -1
- metadata/generated/schema/metadataIngestion/storage/__init__.py +1 -1
- metadata/generated/schema/metadataIngestion/storage/containerMetadataConfig.py +1 -1
- metadata/generated/schema/metadataIngestion/storage/manifestMetadataConfig.py +1 -1
- metadata/generated/schema/metadataIngestion/storage/storageBucketDetails.py +1 -1
- metadata/generated/schema/metadataIngestion/storage/storageMetadataADLSConfig.py +1 -1
- metadata/generated/schema/metadataIngestion/storage/storageMetadataGCSConfig.py +1 -1
- metadata/generated/schema/metadataIngestion/storage/storageMetadataHttpConfig.py +1 -1
- metadata/generated/schema/metadataIngestion/storage/storageMetadataLocalConfig.py +1 -1
- metadata/generated/schema/metadataIngestion/storage/storageMetadataS3Config.py +1 -1
- metadata/generated/schema/metadataIngestion/storageServiceMetadataPipeline.py +1 -1
- metadata/generated/schema/metadataIngestion/testSuitePipeline.py +1 -1
- metadata/generated/schema/metadataIngestion/workflow.py +1 -1
- metadata/generated/schema/monitoring/__init__.py +1 -1
- metadata/generated/schema/monitoring/eventMonitorProvider.py +1 -1
- metadata/generated/schema/security/__init__.py +1 -1
- metadata/generated/schema/security/client/__init__.py +1 -1
- metadata/generated/schema/security/client/auth0SSOClientConfig.py +1 -1
- metadata/generated/schema/security/client/azureSSOClientConfig.py +1 -1
- metadata/generated/schema/security/client/customOidcSSOClientConfig.py +1 -1
- metadata/generated/schema/security/client/googleSSOClientConfig.py +1 -1
- metadata/generated/schema/security/client/oidcClientConfig.py +1 -1
- metadata/generated/schema/security/client/oktaSSOClientConfig.py +1 -1
- metadata/generated/schema/security/client/openMetadataJWTClientConfig.py +1 -1
- metadata/generated/schema/security/client/samlSSOClientConfig.py +1 -1
- metadata/generated/schema/security/credentials/__init__.py +1 -1
- metadata/generated/schema/security/credentials/accessTokenAuth.py +1 -1
- metadata/generated/schema/security/credentials/apiAccessTokenAuth.py +1 -1
- metadata/generated/schema/security/credentials/awsCredentials.py +1 -1
- metadata/generated/schema/security/credentials/azureCredentials.py +1 -1
- metadata/generated/schema/security/credentials/basicAuth.py +1 -1
- metadata/generated/schema/security/credentials/bitbucketCredentials.py +1 -1
- metadata/generated/schema/security/credentials/gcpCredentials.py +1 -1
- metadata/generated/schema/security/credentials/gcpExternalAccount.py +1 -1
- metadata/generated/schema/security/credentials/gcpValues.py +1 -1
- metadata/generated/schema/security/credentials/gitCredentials.py +1 -1
- metadata/generated/schema/security/credentials/githubCredentials.py +1 -1
- metadata/generated/schema/security/secrets/__init__.py +1 -1
- metadata/generated/schema/security/secrets/secretsManagerClientLoader.py +1 -1
- metadata/generated/schema/security/secrets/secretsManagerConfiguration.py +1 -1
- metadata/generated/schema/security/secrets/secretsManagerProvider.py +1 -1
- metadata/generated/schema/security/securityConfiguration.py +1 -1
- metadata/generated/schema/security/ssl/__init__.py +1 -1
- metadata/generated/schema/security/ssl/validateSSLClientConfig.py +16 -4
- metadata/generated/schema/security/ssl/verifySSLConfig.py +10 -1
- metadata/generated/schema/settings/__init__.py +1 -1
- metadata/generated/schema/settings/settings.py +5 -2
- metadata/generated/schema/system/__init__.py +1 -1
- metadata/generated/schema/system/entityError.py +1 -1
- metadata/generated/schema/system/eventPublisherJob.py +1 -1
- metadata/generated/schema/system/indexingError.py +1 -1
- metadata/generated/schema/system/ui/__init__.py +1 -1
- metadata/generated/schema/system/ui/knowledgePanel.py +1 -1
- metadata/generated/schema/system/ui/page.py +1 -1
- metadata/generated/schema/system/validationResponse.py +1 -1
- metadata/generated/schema/tests/__init__.py +1 -1
- metadata/generated/schema/tests/assigned.py +1 -1
- metadata/generated/schema/tests/basic.py +31 -15
- metadata/generated/schema/tests/customMetric.py +1 -1
- metadata/generated/schema/tests/resolved.py +1 -1
- metadata/generated/schema/tests/testCase.py +13 -2
- metadata/generated/schema/tests/testCaseResolutionStatus.py +1 -1
- metadata/generated/schema/tests/testDefinition.py +22 -2
- metadata/generated/schema/tests/testSuite.py +1 -1
- metadata/generated/schema/type/__init__.py +1 -1
- metadata/generated/schema/type/auditLog.py +1 -1
- metadata/generated/schema/type/basic.py +7 -1
- metadata/generated/schema/type/bulkOperationResult.py +1 -1
- metadata/generated/schema/type/changeEvent.py +1 -1
- metadata/generated/schema/type/changeEventType.py +1 -1
- metadata/generated/schema/type/collectionDescriptor.py +1 -1
- metadata/generated/schema/type/csvDocumentation.py +1 -1
- metadata/generated/schema/type/csvErrorType.py +1 -1
- metadata/generated/schema/type/csvFile.py +1 -1
- metadata/generated/schema/type/csvImportResult.py +1 -1
- metadata/generated/schema/type/customProperties/__init__.py +1 -1
- metadata/generated/schema/type/customProperties/complexTypes.py +86 -0
- metadata/generated/schema/type/customProperties/enumConfig.py +1 -1
- metadata/generated/schema/type/customProperty.py +3 -3
- metadata/generated/schema/type/dailyCount.py +1 -1
- metadata/generated/schema/type/databaseConnectionConfig.py +1 -1
- metadata/generated/schema/type/entityHierarchy.py +39 -0
- metadata/generated/schema/type/entityHistory.py +1 -1
- metadata/generated/schema/type/entityLineage.py +3 -1
- metadata/generated/schema/type/entityReference.py +1 -1
- metadata/generated/schema/type/entityReferenceList.py +1 -1
- metadata/generated/schema/type/entityRelationship.py +1 -1
- metadata/generated/schema/type/entityUsage.py +1 -1
- metadata/generated/schema/type/filterPattern.py +1 -1
- metadata/generated/schema/type/function.py +1 -1
- metadata/generated/schema/type/include.py +1 -1
- metadata/generated/schema/type/jdbcConnection.py +1 -1
- metadata/generated/schema/type/lifeCycle.py +1 -1
- metadata/generated/schema/type/paging.py +4 -1
- metadata/generated/schema/type/profile.py +1 -1
- metadata/generated/schema/type/queryParserData.py +1 -1
- metadata/generated/schema/type/reaction.py +1 -1
- metadata/generated/schema/type/schedule.py +1 -1
- metadata/generated/schema/type/schema.py +1 -1
- metadata/generated/schema/type/tableQuery.py +1 -1
- metadata/generated/schema/type/tableUsageCount.py +1 -1
- metadata/generated/schema/type/tagLabel.py +1 -1
- metadata/generated/schema/type/usageDetails.py +1 -1
- metadata/generated/schema/type/usageRequest.py +1 -1
- metadata/generated/schema/type/votes.py +1 -1
- metadata/great_expectations/action.py +0 -1
- metadata/ingestion/api/delete.py +33 -1
- metadata/ingestion/api/step.py +6 -1
- metadata/ingestion/api/topology_runner.py +122 -25
- metadata/ingestion/bulksink/metadata_usage.py +6 -1
- metadata/ingestion/lineage/models.py +34 -1
- metadata/ingestion/lineage/parser.py +15 -8
- metadata/ingestion/lineage/sql_lineage.py +21 -3
- metadata/ingestion/models/custom_properties.py +3 -0
- metadata/ingestion/models/life_cycle.py +4 -1
- metadata/ingestion/models/patch_request.py +177 -35
- metadata/ingestion/models/topology.py +81 -1
- metadata/ingestion/ometa/client.py +3 -0
- metadata/ingestion/ometa/mixins/es_mixin.py +95 -42
- metadata/ingestion/ometa/mixins/lineage_mixin.py +169 -4
- metadata/ingestion/ometa/mixins/patch_mixin.py +9 -4
- metadata/ingestion/ometa/mixins/server_mixin.py +50 -5
- metadata/ingestion/ometa/mixins/tests_mixin.py +55 -1
- metadata/ingestion/ometa/mixins/user_mixin.py +18 -6
- metadata/ingestion/ometa/ometa_api.py +6 -1
- metadata/ingestion/ometa/routes.py +3 -0
- metadata/ingestion/ometa/utils.py +2 -0
- metadata/ingestion/processor/query_parser.py +36 -26
- metadata/ingestion/sink/file.py +4 -1
- metadata/ingestion/sink/metadata_rest.py +19 -5
- metadata/ingestion/source/dashboard/dashboard_service.py +75 -16
- metadata/ingestion/source/dashboard/domodashboard/metadata.py +7 -5
- metadata/ingestion/source/dashboard/lightdash/metadata.py +7 -5
- metadata/ingestion/source/dashboard/looker/metadata.py +25 -18
- metadata/ingestion/source/dashboard/metabase/client.py +39 -8
- metadata/ingestion/source/dashboard/metabase/connection.py +2 -1
- metadata/ingestion/source/dashboard/metabase/metadata.py +9 -7
- metadata/ingestion/source/dashboard/metabase/models.py +1 -1
- metadata/ingestion/source/dashboard/mode/metadata.py +7 -5
- metadata/ingestion/source/dashboard/mstr/metadata.py +10 -5
- metadata/ingestion/source/dashboard/powerbi/client.py +13 -3
- metadata/ingestion/source/dashboard/powerbi/connection.py +13 -5
- metadata/ingestion/source/dashboard/powerbi/file_client.py +327 -0
- metadata/ingestion/source/dashboard/powerbi/metadata.py +156 -53
- metadata/ingestion/source/dashboard/powerbi/models.py +26 -0
- metadata/ingestion/source/dashboard/qlikcloud/__init__.py +0 -0
- metadata/ingestion/source/dashboard/qlikcloud/client.py +167 -0
- metadata/ingestion/source/dashboard/qlikcloud/connection.py +56 -0
- metadata/ingestion/source/dashboard/qlikcloud/constants.py +66 -0
- metadata/ingestion/source/dashboard/qlikcloud/metadata.py +249 -0
- metadata/ingestion/source/dashboard/qlikcloud/models.py +33 -0
- metadata/ingestion/source/dashboard/qliksense/client.py +9 -26
- metadata/ingestion/source/dashboard/qliksense/metadata.py +30 -17
- metadata/ingestion/source/dashboard/qliksense/models.py +1 -0
- metadata/ingestion/source/dashboard/quicksight/metadata.py +7 -5
- metadata/ingestion/source/dashboard/redash/metadata.py +10 -5
- metadata/ingestion/source/dashboard/superset/api_source.py +10 -5
- metadata/ingestion/source/dashboard/superset/db_source.py +12 -6
- metadata/ingestion/source/dashboard/superset/metadata.py +8 -1
- metadata/ingestion/source/dashboard/superset/mixin.py +20 -3
- metadata/ingestion/source/dashboard/superset/models.py +2 -0
- metadata/ingestion/source/dashboard/superset/queries.py +23 -6
- metadata/ingestion/source/dashboard/tableau/metadata.py +71 -10
- metadata/ingestion/source/database/athena/client.py +1 -1
- metadata/ingestion/source/database/athena/lineage.py +2 -0
- metadata/ingestion/source/database/athena/metadata.py +83 -15
- metadata/ingestion/source/database/athena/models.py +1 -1
- metadata/ingestion/source/database/athena/query_parser.py +6 -1
- metadata/ingestion/source/database/athena/usage.py +2 -0
- metadata/ingestion/source/database/azuresql/metadata.py +4 -2
- metadata/ingestion/source/database/azuresql/query_parser.py +4 -1
- metadata/ingestion/source/database/bigquery/helper.py +23 -12
- metadata/ingestion/source/database/bigquery/incremental_table_processor.py +86 -0
- metadata/ingestion/source/database/bigquery/metadata.py +224 -52
- metadata/ingestion/source/database/bigquery/models.py +35 -1
- metadata/ingestion/source/database/bigquery/queries.py +25 -12
- metadata/ingestion/source/database/bigquery/query_parser.py +3 -1
- metadata/ingestion/source/database/bigtable/metadata.py +6 -4
- metadata/ingestion/source/database/clickhouse/metadata.py +27 -17
- metadata/ingestion/source/database/clickhouse/query_parser.py +4 -2
- metadata/ingestion/source/database/common_db_source.py +117 -65
- metadata/ingestion/source/database/common_nosql_source.py +15 -15
- metadata/ingestion/source/database/couchbase/metadata.py +8 -6
- metadata/ingestion/source/database/database_service.py +43 -27
- metadata/ingestion/source/database/databricks/metadata.py +80 -34
- metadata/ingestion/source/database/databricks/queries.py +0 -1
- metadata/ingestion/source/database/databricks/query_parser.py +9 -2
- metadata/ingestion/source/database/datalake/connection.py +1 -2
- metadata/ingestion/source/database/datalake/metadata.py +21 -19
- metadata/ingestion/source/database/db2/metadata.py +4 -1
- metadata/ingestion/source/database/dbt/dbt_service.py +13 -11
- metadata/ingestion/source/database/dbt/metadata.py +97 -33
- metadata/ingestion/source/database/dbt/models.py +10 -1
- metadata/ingestion/source/database/deltalake/connection.py +2 -2
- metadata/ingestion/source/database/deltalake/metadata.py +19 -17
- metadata/ingestion/source/database/domodatabase/metadata.py +16 -11
- metadata/ingestion/source/database/doris/connection.py +0 -10
- metadata/ingestion/source/database/doris/metadata.py +23 -4
- metadata/ingestion/source/database/druid/metadata.py +5 -1
- metadata/ingestion/source/database/dynamodb/metadata.py +3 -1
- metadata/ingestion/source/database/extended_sample_data.py +4 -2
- metadata/ingestion/source/database/external_table_lineage_mixin.py +82 -0
- metadata/ingestion/source/database/glue/metadata.py +23 -21
- metadata/ingestion/source/database/greenplum/connection.py +0 -10
- metadata/ingestion/source/database/greenplum/metadata.py +26 -11
- metadata/ingestion/source/database/hive/metadata.py +29 -4
- metadata/ingestion/source/database/iceberg/helper.py +42 -5
- metadata/ingestion/source/database/iceberg/metadata.py +18 -16
- metadata/ingestion/source/database/iceberg/models.py +12 -4
- metadata/ingestion/source/database/impala/metadata.py +4 -1
- metadata/ingestion/source/database/incremental_metadata_extraction.py +144 -0
- metadata/ingestion/source/database/life_cycle_query_mixin.py +39 -36
- metadata/ingestion/source/database/mariadb/metadata.py +5 -1
- metadata/ingestion/source/database/mongodb/metadata.py +4 -2
- metadata/ingestion/source/database/mssql/metadata.py +15 -7
- metadata/ingestion/source/database/mssql/queries.py +18 -16
- metadata/ingestion/source/database/mssql/query_parser.py +4 -1
- metadata/ingestion/source/database/mssql/utils.py +3 -0
- metadata/ingestion/source/database/mysql/connection.py +0 -11
- metadata/ingestion/source/database/mysql/metadata.py +9 -2
- metadata/ingestion/source/database/oracle/connection.py +2 -2
- metadata/ingestion/source/database/oracle/metadata.py +33 -17
- metadata/ingestion/source/database/oracle/queries.py +13 -13
- metadata/ingestion/source/database/oracle/query_parser.py +4 -1
- metadata/ingestion/source/database/pinotdb/metadata.py +4 -1
- metadata/ingestion/source/database/postgres/connection.py +0 -10
- metadata/ingestion/source/database/postgres/metadata.py +38 -15
- metadata/ingestion/source/database/postgres/queries.py +17 -1
- metadata/ingestion/source/database/postgres/query_parser.py +4 -2
- metadata/ingestion/source/database/postgres/utils.py +98 -0
- metadata/ingestion/source/database/presto/connection.py +14 -0
- metadata/ingestion/source/database/presto/metadata.py +8 -5
- metadata/ingestion/source/database/query/lineage.py +5 -1
- metadata/ingestion/source/database/query/usage.py +4 -1
- metadata/ingestion/source/database/redshift/connection.py +0 -10
- metadata/ingestion/source/database/redshift/incremental_table_processor.py +192 -0
- metadata/ingestion/source/database/redshift/metadata.py +175 -26
- metadata/ingestion/source/database/redshift/models.py +74 -1
- metadata/ingestion/source/database/redshift/queries.py +17 -2
- metadata/ingestion/source/database/redshift/query_parser.py +3 -1
- metadata/ingestion/source/database/redshift/utils.py +13 -7
- metadata/ingestion/source/database/salesforce/metadata.py +13 -11
- metadata/ingestion/source/database/sample_data.py +56 -13
- metadata/ingestion/source/database/sample_usage.py +3 -1
- metadata/ingestion/source/database/saphana/metadata.py +6 -5
- metadata/ingestion/source/database/sas/metadata.py +8 -3
- metadata/ingestion/source/database/singlestore/metadata.py +5 -1
- metadata/ingestion/source/database/snowflake/metadata.py +193 -59
- metadata/ingestion/source/database/snowflake/models.py +24 -1
- metadata/ingestion/source/database/snowflake/queries.py +147 -25
- metadata/ingestion/source/database/snowflake/query_parser.py +3 -1
- metadata/ingestion/source/database/snowflake/utils.py +187 -11
- metadata/ingestion/source/database/sql_column_handler.py +2 -0
- metadata/ingestion/source/database/sqlalchemy_source.py +4 -4
- metadata/ingestion/source/database/sqlite/metadata.py +5 -1
- metadata/ingestion/source/database/stored_procedures_mixin.py +11 -9
- metadata/ingestion/source/database/trino/connection.py +20 -0
- metadata/ingestion/source/database/trino/metadata.py +7 -4
- metadata/ingestion/source/database/trino/query_parser.py +4 -1
- metadata/ingestion/source/database/unitycatalog/lineage.py +3 -1
- metadata/ingestion/source/database/unitycatalog/metadata.py +43 -32
- metadata/ingestion/source/database/unitycatalog/query_parser.py +4 -1
- metadata/ingestion/source/database/vertica/metadata.py +4 -2
- metadata/ingestion/source/database/vertica/query_parser.py +4 -2
- metadata/ingestion/source/messaging/common_broker_source.py +45 -6
- metadata/ingestion/source/messaging/kafka/metadata.py +21 -1
- metadata/ingestion/source/messaging/kinesis/metadata.py +11 -5
- metadata/ingestion/source/messaging/messaging_service.py +3 -3
- metadata/ingestion/source/messaging/redpanda/metadata.py +5 -1
- metadata/ingestion/source/metadata/amundsen/metadata.py +3 -1
- metadata/ingestion/source/metadata/atlas/metadata.py +3 -1
- metadata/ingestion/source/mlmodel/mlflow/metadata.py +4 -2
- metadata/ingestion/source/mlmodel/mlmodel_service.py +3 -3
- metadata/ingestion/source/mlmodel/sagemaker/metadata.py +8 -3
- metadata/ingestion/source/pipeline/airbyte/metadata.py +9 -7
- metadata/ingestion/source/pipeline/airflow/metadata.py +30 -14
- metadata/ingestion/source/pipeline/dagster/metadata.py +17 -15
- metadata/ingestion/source/pipeline/dagster/queries.py +53 -82
- metadata/ingestion/source/pipeline/databrickspipeline/metadata.py +10 -8
- metadata/ingestion/source/pipeline/domopipeline/metadata.py +6 -4
- metadata/ingestion/source/pipeline/fivetran/metadata.py +6 -4
- metadata/ingestion/source/pipeline/gluepipeline/metadata.py +7 -5
- metadata/ingestion/source/pipeline/kafkaconnect/__init__.py +0 -0
- metadata/ingestion/source/pipeline/kafkaconnect/client.py +278 -0
- metadata/ingestion/source/pipeline/kafkaconnect/connection.py +58 -0
- metadata/ingestion/source/pipeline/kafkaconnect/metadata.py +319 -0
- metadata/ingestion/source/pipeline/kafkaconnect/models.py +62 -0
- metadata/ingestion/source/pipeline/nifi/metadata.py +4 -2
- metadata/ingestion/source/pipeline/openlineage/__init__.py +0 -0
- metadata/ingestion/source/pipeline/openlineage/connection.py +88 -0
- metadata/ingestion/source/pipeline/openlineage/metadata.py +520 -0
- metadata/ingestion/source/pipeline/openlineage/models.py +88 -0
- metadata/ingestion/source/pipeline/openlineage/utils.py +59 -0
- metadata/ingestion/source/pipeline/pipeline_service.py +13 -3
- metadata/ingestion/source/pipeline/spline/metadata.py +8 -6
- metadata/ingestion/source/search/elasticsearch/metadata.py +8 -6
- metadata/ingestion/source/search/search_service.py +3 -3
- metadata/ingestion/source/sqa_types.py +20 -1
- metadata/ingestion/source/storage/s3/connection.py +10 -1
- metadata/ingestion/source/storage/s3/metadata.py +45 -30
- metadata/ingestion/source/storage/s3/models.py +8 -4
- metadata/ingestion/source/storage/storage_service.py +4 -4
- metadata/ingestion/stage/table_usage.py +6 -1
- metadata/mixins/pandas/pandas_mixin.py +3 -3
- metadata/pii/processor.py +6 -1
- metadata/profiler/__init__.py +0 -0
- metadata/profiler/adaptors/__init__.py +0 -0
- metadata/profiler/adaptors/adaptor_factory.py +43 -0
- metadata/profiler/adaptors/dynamodb.py +40 -0
- metadata/profiler/adaptors/factory.py +76 -0
- metadata/profiler/adaptors/mongodb.py +178 -0
- metadata/profiler/adaptors/nosql_adaptor.py +65 -0
- metadata/profiler/api/models.py +1 -1
- metadata/profiler/factory.py +41 -0
- metadata/profiler/interface/nosql/profiler_interface.py +236 -0
- metadata/profiler/interface/pandas/profiler_interface.py +51 -30
- metadata/profiler/interface/profiler_interface.py +6 -2
- metadata/profiler/interface/profiler_interface_factory.py +11 -22
- metadata/profiler/interface/sqlalchemy/databricks/profiler_interface.py +77 -0
- metadata/profiler/interface/sqlalchemy/profiler_interface.py +2 -1
- metadata/profiler/interface/sqlalchemy/unity_catalog/profiler_interface.py +3 -6
- metadata/profiler/metrics/composed/distinct_ratio.py +2 -1
- metadata/profiler/metrics/composed/duplicate_count.py +2 -1
- metadata/profiler/metrics/composed/ilike_ratio.py +2 -1
- metadata/profiler/metrics/composed/iqr.py +2 -1
- metadata/profiler/metrics/composed/like_ratio.py +2 -1
- metadata/profiler/metrics/composed/non_parametric_skew.py +2 -1
- metadata/profiler/metrics/composed/null_ratio.py +7 -4
- metadata/profiler/metrics/composed/unique_ratio.py +2 -1
- metadata/profiler/metrics/core.py +14 -1
- metadata/profiler/metrics/hybrid/histogram.py +2 -1
- metadata/profiler/metrics/registry.py +4 -0
- metadata/profiler/metrics/static/column_count.py +2 -1
- metadata/profiler/metrics/static/column_names.py +2 -1
- metadata/profiler/metrics/static/count.py +2 -1
- metadata/profiler/metrics/static/count_in_set.py +2 -1
- metadata/profiler/metrics/static/distinct_count.py +11 -2
- metadata/profiler/metrics/static/ilike_count.py +2 -1
- metadata/profiler/metrics/static/like_count.py +2 -1
- metadata/profiler/metrics/static/max.py +26 -7
- metadata/profiler/metrics/static/max_length.py +3 -2
- metadata/profiler/metrics/static/mean.py +30 -22
- metadata/profiler/metrics/static/min.py +25 -6
- metadata/profiler/metrics/static/min_length.py +3 -2
- metadata/profiler/metrics/static/not_like_count.py +2 -1
- metadata/profiler/metrics/static/not_regexp_match_count.py +2 -1
- metadata/profiler/metrics/static/null_count.py +2 -1
- metadata/profiler/metrics/static/null_missing_count.py +73 -0
- metadata/profiler/metrics/static/regexp_match_count.py +2 -1
- metadata/profiler/metrics/static/row_count.py +9 -3
- metadata/profiler/metrics/static/stddev.py +2 -1
- metadata/profiler/metrics/static/sum.py +22 -4
- metadata/profiler/metrics/static/unique_count.py +13 -4
- metadata/profiler/metrics/system/system.py +2 -1
- metadata/profiler/metrics/window/first_quartile.py +2 -1
- metadata/profiler/metrics/window/median.py +8 -2
- metadata/profiler/metrics/window/third_quartile.py +2 -1
- metadata/profiler/orm/converter/base.py +4 -1
- metadata/profiler/orm/converter/bigquery/converter.py +11 -0
- metadata/profiler/orm/converter/common.py +47 -0
- metadata/profiler/orm/converter/converter_registry.py +2 -0
- metadata/profiler/orm/converter/redshift/converter.py +48 -0
- metadata/profiler/orm/converter/snowflake/converter.py +13 -0
- metadata/profiler/orm/functions/conn_test.py +1 -1
- metadata/profiler/orm/functions/sum.py +4 -2
- metadata/profiler/orm/functions/table_metric_computer.py +1 -1
- metadata/profiler/orm/registry.py +6 -3
- metadata/profiler/processor/core.py +58 -97
- metadata/profiler/processor/default.py +5 -0
- metadata/profiler/processor/handle_partition.py +3 -3
- metadata/profiler/processor/metric_filter.py +267 -0
- metadata/profiler/processor/processor.py +4 -2
- metadata/profiler/processor/sampler/nosql/sampler.py +72 -0
- metadata/profiler/processor/sampler/pandas/sampler.py +5 -6
- metadata/profiler/processor/sampler/sampler_factory.py +9 -0
- metadata/profiler/processor/sampler/sampler_interface.py +2 -2
- metadata/profiler/processor/sampler/sqlalchemy/sampler.py +3 -3
- metadata/profiler/source/base/profiler_source.py +11 -3
- metadata/profiler/source/databricks/profiler_source.py +5 -1
- metadata/profiler/source/metadata.py +8 -1
- metadata/profiler/source/metadata_ext.py +2 -0
- metadata/readers/dataframe/avro.py +5 -5
- metadata/readers/dataframe/json.py +1 -1
- metadata/readers/file/adls.py +20 -0
- metadata/readers/file/base.py +6 -0
- metadata/readers/file/config_source_factory.py +12 -0
- metadata/readers/file/gcs.py +18 -0
- metadata/readers/file/local.py +12 -0
- metadata/readers/file/s3.py +16 -0
- metadata/utils/constants.py +32 -24
- metadata/utils/datalake/datalake_utils.py +40 -4
- metadata/utils/elasticsearch.py +8 -0
- metadata/utils/execution_time_tracker.py +69 -28
- metadata/utils/fqn.py +61 -7
- metadata/utils/helpers.py +2 -0
- metadata/utils/importer.py +15 -6
- metadata/utils/logger.py +1 -1
- metadata/utils/lru_cache.py +2 -0
- metadata/utils/messaging_utils.py +43 -0
- metadata/utils/partition.py +93 -28
- metadata/utils/sqlalchemy_utils.py +60 -1
- metadata/utils/ssl_manager.py +181 -0
- metadata/utils/tag_utils.py +30 -13
- metadata/utils/test_utils.py +65 -0
- metadata/workflow/application.py +6 -1
- metadata/workflow/base.py +1 -1
- metadata/workflow/ingestion.py +19 -0
- metadata/workflow/metadata.py +9 -1
- metadata/workflow/output_handler.py +24 -2
- metadata/workflow/workflow_output_handler.py +2 -0
- {openmetadata_ingestion-1.3.4.0.dist-info → openmetadata_ingestion-1.4.0.0rc2.dist-info}/METADATA +325 -326
- openmetadata_ingestion-1.4.0.0rc2.dist-info/RECORD +1501 -0
- metadata/applications/auto_tagger.py +0 -212
- metadata/cli/backup.py +0 -202
- metadata/cli/db_dump.py +0 -239
- metadata/cli/docker.py +0 -382
- metadata/cli/openmetadata_dag_config_migration.py +0 -109
- metadata/cli/openmetadata_imports_migration.py +0 -71
- metadata/cli/utils.py +0 -56
- metadata/generated/schema/entity/applications/configuration/external/autoTaggerAppConfig.py +0 -28
- openmetadata_ingestion-1.3.4.0.dist-info/RECORD +0 -1435
- {openmetadata_ingestion-1.3.4.0.dist-info → openmetadata_ingestion-1.4.0.0rc2.dist-info}/LICENSE +0 -0
- {openmetadata_ingestion-1.3.4.0.dist-info → openmetadata_ingestion-1.4.0.0rc2.dist-info}/WHEEL +0 -0
- {openmetadata_ingestion-1.3.4.0.dist-info → openmetadata_ingestion-1.4.0.0rc2.dist-info}/entry_points.txt +0 -0
- {openmetadata_ingestion-1.3.4.0.dist-info → openmetadata_ingestion-1.4.0.0rc2.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# Copyright 2021 Collate
|
|
2
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
|
+
# you may not use this file except in compliance with the License.
|
|
4
|
+
# You may obtain a copy of the License at
|
|
5
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
6
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
7
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
8
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
9
|
+
# See the License for the specific language governing permissions and
|
|
10
|
+
# limitations under the License.
|
|
11
|
+
|
|
12
|
+
"""
|
|
13
|
+
KafkaConnect Source Model module
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from typing import List, Optional
|
|
17
|
+
|
|
18
|
+
from pydantic import BaseModel, Field
|
|
19
|
+
|
|
20
|
+
from metadata.generated.schema.entity.data.container import Container
|
|
21
|
+
from metadata.generated.schema.entity.data.table import Table
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class KafkaConnectTasks(BaseModel):
|
|
25
|
+
id: int = Field(..., description="ID of the task")
|
|
26
|
+
state: Optional[str] = Field(
|
|
27
|
+
default="UNASSIGNED", description="State of the task (e.g., RUNNING, STOPPED)"
|
|
28
|
+
)
|
|
29
|
+
worker_id: Optional[str] = Field(
|
|
30
|
+
..., description="ID of the worker running the task"
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class KafkaConnectTopics(BaseModel):
|
|
35
|
+
name: str = Field(..., description="Name of the topic (e.g., random-source-avro)")
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class KafkaConnectPipelineDetails(BaseModel):
|
|
39
|
+
name: str = Field(
|
|
40
|
+
..., description="Name of the status source (e.g., random-source-json)"
|
|
41
|
+
)
|
|
42
|
+
status: Optional[str] = Field(
|
|
43
|
+
default="UNASSIGNED",
|
|
44
|
+
description="State of the connector (e.g., RUNNING, STOPPED)",
|
|
45
|
+
)
|
|
46
|
+
tasks: Optional[List[KafkaConnectTasks]]
|
|
47
|
+
topics: Optional[List[KafkaConnectTopics]]
|
|
48
|
+
conn_type: Optional[str] = Field(..., alias="type")
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class KafkaConnectDatasetDetails(BaseModel):
|
|
52
|
+
table: Optional[str]
|
|
53
|
+
database: Optional[str]
|
|
54
|
+
container_name: Optional[str]
|
|
55
|
+
|
|
56
|
+
@property
|
|
57
|
+
def dataset_type(self):
|
|
58
|
+
if self.table or self.database:
|
|
59
|
+
return Table
|
|
60
|
+
if self.container_name:
|
|
61
|
+
return Container
|
|
62
|
+
return None
|
|
@@ -81,7 +81,9 @@ class NifiSource(PipelineServiceSource):
|
|
|
81
81
|
"""
|
|
82
82
|
|
|
83
83
|
@classmethod
|
|
84
|
-
def create(
|
|
84
|
+
def create(
|
|
85
|
+
cls, config_dict, metadata: OpenMetadata, pipeline_name: Optional[str] = None
|
|
86
|
+
):
|
|
85
87
|
config: WorkflowSource = WorkflowSource.parse_obj(config_dict)
|
|
86
88
|
connection: NifiConnection = config.serviceConnection.__root__.config
|
|
87
89
|
if not isinstance(connection, NifiConnection):
|
|
@@ -142,7 +144,7 @@ class NifiSource(PipelineServiceSource):
|
|
|
142
144
|
displayName=pipeline_details.name,
|
|
143
145
|
sourceUrl=f"{clean_uri(self.service_connection.hostPort)}{pipeline_details.uri}",
|
|
144
146
|
tasks=self._get_tasks_from_details(pipeline_details),
|
|
145
|
-
service=self.context.pipeline_service,
|
|
147
|
+
service=self.context.get().pipeline_service,
|
|
146
148
|
)
|
|
147
149
|
yield Either(right=pipeline_request)
|
|
148
150
|
self.register_record(pipeline_request=pipeline_request)
|
|
File without changes
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# Copyright 2021 Collate
|
|
2
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
|
+
# you may not use this file except in compliance with the License.
|
|
4
|
+
# You may obtain a copy of the License at
|
|
5
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
6
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
7
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
8
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
9
|
+
# See the License for the specific language governing permissions and
|
|
10
|
+
# limitations under the License.
|
|
11
|
+
|
|
12
|
+
"""
|
|
13
|
+
Source connection handler
|
|
14
|
+
"""
|
|
15
|
+
from typing import Optional
|
|
16
|
+
|
|
17
|
+
from confluent_kafka import Consumer as KafkaConsumer
|
|
18
|
+
from confluent_kafka import TopicPartition
|
|
19
|
+
|
|
20
|
+
from metadata.generated.schema.entity.automations.workflow import (
|
|
21
|
+
Workflow as AutomationWorkflow,
|
|
22
|
+
)
|
|
23
|
+
from metadata.generated.schema.entity.services.connections.pipeline.openLineageConnection import (
|
|
24
|
+
OpenLineageConnection,
|
|
25
|
+
)
|
|
26
|
+
from metadata.generated.schema.entity.services.connections.pipeline.openLineageConnection import (
|
|
27
|
+
SecurityProtocol as KafkaSecProtocol,
|
|
28
|
+
)
|
|
29
|
+
from metadata.ingestion.connections.test_connections import (
|
|
30
|
+
SourceConnectionException,
|
|
31
|
+
test_connection_steps,
|
|
32
|
+
)
|
|
33
|
+
from metadata.ingestion.ometa.ometa_api import OpenMetadata
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def get_connection(connection: OpenLineageConnection) -> KafkaConsumer:
|
|
37
|
+
"""
|
|
38
|
+
Create connection
|
|
39
|
+
"""
|
|
40
|
+
try:
|
|
41
|
+
config = {
|
|
42
|
+
"bootstrap.servers": connection.brokersUrl,
|
|
43
|
+
"group.id": connection.consumerGroupName,
|
|
44
|
+
"auto.offset.reset": connection.consumerOffsets.value,
|
|
45
|
+
}
|
|
46
|
+
if connection.securityProtocol.value == KafkaSecProtocol.SSL.value:
|
|
47
|
+
config.update(
|
|
48
|
+
{
|
|
49
|
+
"security.protocol": connection.securityProtocol.value,
|
|
50
|
+
"ssl.ca.location": connection.sslConfig.__root__.caCertificate,
|
|
51
|
+
"ssl.certificate.location": connection.sslConfig.__root__.sslCertificate,
|
|
52
|
+
"ssl.key.location": connection.sslConfig.__root__.sslKey,
|
|
53
|
+
}
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
kafka_consumer = KafkaConsumer(config)
|
|
57
|
+
kafka_consumer.subscribe([connection.topicName])
|
|
58
|
+
|
|
59
|
+
return kafka_consumer
|
|
60
|
+
except Exception as exc:
|
|
61
|
+
msg = f"Unknown error connecting with {connection}: {exc}."
|
|
62
|
+
raise SourceConnectionException(msg)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def test_connection(
|
|
66
|
+
metadata: OpenMetadata,
|
|
67
|
+
client: KafkaConsumer,
|
|
68
|
+
service_connection: OpenLineageConnection,
|
|
69
|
+
automation_workflow: Optional[AutomationWorkflow] = None,
|
|
70
|
+
) -> None:
|
|
71
|
+
"""
|
|
72
|
+
Test connection. This can be executed either as part
|
|
73
|
+
of a metadata workflow or during an Automation Workflow
|
|
74
|
+
"""
|
|
75
|
+
|
|
76
|
+
def custom_executor():
|
|
77
|
+
_ = client.get_watermark_offsets(
|
|
78
|
+
TopicPartition(service_connection.topicName, 0)
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
test_fn = {"GetWatermarkOffsets": custom_executor}
|
|
82
|
+
|
|
83
|
+
test_connection_steps(
|
|
84
|
+
metadata=metadata,
|
|
85
|
+
test_fn=test_fn,
|
|
86
|
+
service_type=service_connection.type.value,
|
|
87
|
+
automation_workflow=automation_workflow,
|
|
88
|
+
)
|
|
@@ -0,0 +1,520 @@
|
|
|
1
|
+
# Copyright 2021 Collate
|
|
2
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
|
+
# you may not use this file except in compliance with the License.
|
|
4
|
+
# You may obtain a copy of the License at
|
|
5
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
6
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
7
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
8
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
9
|
+
# See the License for the specific language governing permissions and
|
|
10
|
+
# limitations under the License.
|
|
11
|
+
|
|
12
|
+
"""
|
|
13
|
+
OpenLineage source to extract metadata from Kafka events
|
|
14
|
+
"""
|
|
15
|
+
import json
|
|
16
|
+
import traceback
|
|
17
|
+
from collections import defaultdict
|
|
18
|
+
from itertools import groupby, product
|
|
19
|
+
from typing import Any, Dict, Iterable, List, Optional, Tuple
|
|
20
|
+
|
|
21
|
+
from metadata.generated.schema.api.data.createPipeline import CreatePipelineRequest
|
|
22
|
+
from metadata.generated.schema.api.data.createTable import CreateTableRequest
|
|
23
|
+
from metadata.generated.schema.api.lineage.addLineage import AddLineageRequest
|
|
24
|
+
from metadata.generated.schema.entity.data.databaseSchema import DatabaseSchema
|
|
25
|
+
from metadata.generated.schema.entity.data.pipeline import Pipeline
|
|
26
|
+
from metadata.generated.schema.entity.data.table import Column, Table
|
|
27
|
+
from metadata.generated.schema.entity.services.connections.pipeline.openLineageConnection import (
|
|
28
|
+
OpenLineageConnection,
|
|
29
|
+
)
|
|
30
|
+
from metadata.generated.schema.entity.services.ingestionPipelines.status import (
|
|
31
|
+
StackTraceError,
|
|
32
|
+
)
|
|
33
|
+
from metadata.generated.schema.metadataIngestion.workflow import (
|
|
34
|
+
Source as WorkflowSource,
|
|
35
|
+
)
|
|
36
|
+
from metadata.generated.schema.type.entityLineage import (
|
|
37
|
+
ColumnLineage,
|
|
38
|
+
EntitiesEdge,
|
|
39
|
+
LineageDetails,
|
|
40
|
+
Source,
|
|
41
|
+
)
|
|
42
|
+
from metadata.generated.schema.type.entityReference import EntityReference
|
|
43
|
+
from metadata.ingestion.api.models import Either
|
|
44
|
+
from metadata.ingestion.api.steps import InvalidSourceException
|
|
45
|
+
from metadata.ingestion.models.pipeline_status import OMetaPipelineStatus
|
|
46
|
+
from metadata.ingestion.ometa.ometa_api import OpenMetadata
|
|
47
|
+
from metadata.ingestion.source.pipeline.openlineage.models import (
|
|
48
|
+
EventType,
|
|
49
|
+
LineageEdge,
|
|
50
|
+
LineageNode,
|
|
51
|
+
OpenLineageEvent,
|
|
52
|
+
TableDetails,
|
|
53
|
+
TableFQN,
|
|
54
|
+
)
|
|
55
|
+
from metadata.ingestion.source.pipeline.openlineage.utils import (
|
|
56
|
+
FQNNotFoundException,
|
|
57
|
+
message_to_open_lineage_event,
|
|
58
|
+
)
|
|
59
|
+
from metadata.ingestion.source.pipeline.pipeline_service import PipelineServiceSource
|
|
60
|
+
from metadata.utils import fqn
|
|
61
|
+
from metadata.utils.logger import ingestion_logger
|
|
62
|
+
|
|
63
|
+
logger = ingestion_logger()
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class OpenlineageSource(PipelineServiceSource):
|
|
67
|
+
"""
|
|
68
|
+
Implements the necessary methods of PipelineServiceSource to facilitate registering OpenLineage pipelines with
|
|
69
|
+
metadata into Open Metadata.
|
|
70
|
+
|
|
71
|
+
Works under the assumption that OpenLineage integrations produce events to Kafka topic, which is a source of events
|
|
72
|
+
for this connector.
|
|
73
|
+
|
|
74
|
+
Only 'SUCCESS' OpenLineage events are taken into account in this connector.
|
|
75
|
+
|
|
76
|
+
Configuring OpenLineage integrations: https://openlineage.io/docs/integrations/about
|
|
77
|
+
"""
|
|
78
|
+
|
|
79
|
+
@classmethod
|
|
80
|
+
def create(cls, config_dict, metadata: OpenMetadata):
|
|
81
|
+
"""Create class instance"""
|
|
82
|
+
config: WorkflowSource = WorkflowSource.parse_obj(config_dict)
|
|
83
|
+
connection: OpenLineageConnection = config.serviceConnection.__root__.config
|
|
84
|
+
if not isinstance(connection, OpenLineageConnection):
|
|
85
|
+
raise InvalidSourceException(
|
|
86
|
+
f"Expected OpenLineageConnection, but got {connection}"
|
|
87
|
+
)
|
|
88
|
+
return cls(config, metadata)
|
|
89
|
+
|
|
90
|
+
def prepare(self):
|
|
91
|
+
"""Nothing to prepare"""
|
|
92
|
+
|
|
93
|
+
def close(self) -> None:
|
|
94
|
+
self.metadata.close()
|
|
95
|
+
|
|
96
|
+
@classmethod
|
|
97
|
+
def _get_table_details(cls, data: Dict) -> TableDetails:
|
|
98
|
+
"""
|
|
99
|
+
extracts table entity schema and name from input/output entry collected from Open Lineage.
|
|
100
|
+
|
|
101
|
+
:param data: single entry from inputs/outputs objects
|
|
102
|
+
:return: TableDetails object with schema and name
|
|
103
|
+
"""
|
|
104
|
+
symlinks = data.get("facets", {}).get("symlinks", {}).get("identifiers", [])
|
|
105
|
+
|
|
106
|
+
# for some OL events name can be extracted from dataset facet but symlinks is preferred so - if present - we
|
|
107
|
+
# use it instead
|
|
108
|
+
if len(symlinks) > 0:
|
|
109
|
+
try:
|
|
110
|
+
# @todo verify if table can have multiple identifiers pointing at it
|
|
111
|
+
name = symlinks[0]["name"]
|
|
112
|
+
except (KeyError, IndexError):
|
|
113
|
+
raise ValueError(
|
|
114
|
+
"input table name cannot be retrieved from symlinks.identifiers facet."
|
|
115
|
+
)
|
|
116
|
+
else:
|
|
117
|
+
try:
|
|
118
|
+
name = data["name"]
|
|
119
|
+
except KeyError:
|
|
120
|
+
raise ValueError(
|
|
121
|
+
"input table name cannot be retrieved from name attribute."
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
name_parts = name.split(".")
|
|
125
|
+
|
|
126
|
+
if len(name_parts) < 2:
|
|
127
|
+
raise ValueError(
|
|
128
|
+
f"input table name should be of 'schema.table' format! Received: {name}"
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
# we take last two elements to explicitly collect schema and table names
|
|
132
|
+
# in BigQuery Open Lineage events name_parts would be list of 3 elements as first one is GCP Project ID
|
|
133
|
+
# however, concept of GCP Project ID is not represented in Open Metadata and hence - we need to skip this part
|
|
134
|
+
return TableDetails(name=name_parts[-1], schema=name_parts[-2])
|
|
135
|
+
|
|
136
|
+
def _get_table_fqn(self, table_details: TableDetails) -> Optional[str]:
|
|
137
|
+
try:
|
|
138
|
+
return self._get_table_fqn_from_om(table_details)
|
|
139
|
+
except FQNNotFoundException:
|
|
140
|
+
try:
|
|
141
|
+
schema_fqn = self._get_schema_fqn_from_om(table_details.schema)
|
|
142
|
+
|
|
143
|
+
return f"{schema_fqn}.{table_details.name}"
|
|
144
|
+
except FQNNotFoundException:
|
|
145
|
+
return None
|
|
146
|
+
|
|
147
|
+
def _get_table_fqn_from_om(self, table_details: TableDetails) -> Optional[str]:
|
|
148
|
+
"""
|
|
149
|
+
Based on partial schema and table names look for matching table object in open metadata.
|
|
150
|
+
:param schema: schema name
|
|
151
|
+
:param table: table name
|
|
152
|
+
:return: fully qualified name of a Table in Open Metadata
|
|
153
|
+
"""
|
|
154
|
+
result = None
|
|
155
|
+
services = self.get_db_service_names()
|
|
156
|
+
for db_service in services:
|
|
157
|
+
result = fqn.build(
|
|
158
|
+
metadata=self.metadata,
|
|
159
|
+
entity_type=Table,
|
|
160
|
+
service_name=db_service,
|
|
161
|
+
database_name=None,
|
|
162
|
+
schema_name=table_details.schema,
|
|
163
|
+
table_name=table_details.name,
|
|
164
|
+
)
|
|
165
|
+
if not result:
|
|
166
|
+
raise FQNNotFoundException(
|
|
167
|
+
f"Table FQN not found for table: {table_details} within services: {services}"
|
|
168
|
+
)
|
|
169
|
+
return result
|
|
170
|
+
|
|
171
|
+
def _get_schema_fqn_from_om(self, schema: str) -> Optional[str]:
|
|
172
|
+
"""
|
|
173
|
+
Based on partial schema name look for any matching DatabaseSchema object in open metadata.
|
|
174
|
+
|
|
175
|
+
:param schema: schema name
|
|
176
|
+
:return: fully qualified name of a DatabaseSchema in Open Metadata
|
|
177
|
+
"""
|
|
178
|
+
result = None
|
|
179
|
+
services = self.get_db_service_names()
|
|
180
|
+
|
|
181
|
+
for db_service in services:
|
|
182
|
+
result = fqn.build(
|
|
183
|
+
metadata=self.metadata,
|
|
184
|
+
entity_type=DatabaseSchema,
|
|
185
|
+
service_name=db_service,
|
|
186
|
+
database_name=None,
|
|
187
|
+
schema_name=schema,
|
|
188
|
+
skip_es_search=False,
|
|
189
|
+
)
|
|
190
|
+
|
|
191
|
+
if result:
|
|
192
|
+
return result
|
|
193
|
+
|
|
194
|
+
if not result:
|
|
195
|
+
raise FQNNotFoundException(
|
|
196
|
+
f"Schema FQN not found within services: {services}"
|
|
197
|
+
)
|
|
198
|
+
|
|
199
|
+
return result
|
|
200
|
+
|
|
201
|
+
@classmethod
|
|
202
|
+
def _render_pipeline_name(cls, pipeline_details: OpenLineageEvent) -> str:
|
|
203
|
+
"""
|
|
204
|
+
Renders pipeline name from parent facet of run facet. It is our expectation that every OL event contains parent
|
|
205
|
+
run facet so we can always create pipeline entities and link them to lineage events.
|
|
206
|
+
|
|
207
|
+
:param run_facet: Open Lineage run facet
|
|
208
|
+
:return: pipeline name (not fully qualified name)
|
|
209
|
+
"""
|
|
210
|
+
run_facet = pipeline_details.run_facet
|
|
211
|
+
|
|
212
|
+
namespace = run_facet["facets"]["parent"]["job"]["namespace"]
|
|
213
|
+
name = run_facet["facets"]["parent"]["job"]["name"]
|
|
214
|
+
|
|
215
|
+
return f"{namespace}-{name}"
|
|
216
|
+
|
|
217
|
+
@classmethod
|
|
218
|
+
def _filter_event_by_type(
|
|
219
|
+
cls, event: OpenLineageEvent, event_type: EventType
|
|
220
|
+
) -> Optional[Dict]:
|
|
221
|
+
"""
|
|
222
|
+
returns event if it's of particular event_type.
|
|
223
|
+
for example - for lineage events we will be only looking for EventType.COMPLETE event type.
|
|
224
|
+
|
|
225
|
+
:param event: Open Lineage raw event.
|
|
226
|
+
:param event_type: type of event we are looking for.
|
|
227
|
+
:return: Open Lineage event if matches event_type, otherwise None
|
|
228
|
+
"""
|
|
229
|
+
return event if event.event_type == event_type else {}
|
|
230
|
+
|
|
231
|
+
@classmethod
|
|
232
|
+
def _get_om_table_columns(cls, table_input: Dict) -> Optional[List]:
|
|
233
|
+
"""
|
|
234
|
+
|
|
235
|
+
:param table_input:
|
|
236
|
+
:return:
|
|
237
|
+
"""
|
|
238
|
+
try:
|
|
239
|
+
fields = table_input["facets"]["schema"]["fields"]
|
|
240
|
+
|
|
241
|
+
# @todo check if this way of passing type is ok
|
|
242
|
+
columns = [
|
|
243
|
+
Column(name=f.get("name"), dataType=f.get("type").upper())
|
|
244
|
+
for f in fields
|
|
245
|
+
]
|
|
246
|
+
return columns
|
|
247
|
+
except KeyError:
|
|
248
|
+
return None
|
|
249
|
+
|
|
250
|
+
def get_create_table_request(self, table: Dict) -> Optional[Either]:
|
|
251
|
+
"""
|
|
252
|
+
If certain table from Open Lineage events doesn't already exist in Open Metadata, register appropriate entity.
|
|
253
|
+
This makes sense especially for output facet of OpenLineage event - as database service ingestion is a scheduled
|
|
254
|
+
process we might fall into situation where we received Open Lineage event about creation of a table that is yet
|
|
255
|
+
to be ingested by database service ingestion process. To avoid missing on such lineage scenarios, we will create
|
|
256
|
+
table entity beforehand.
|
|
257
|
+
|
|
258
|
+
:param table: single object from inputs/outputs facet
|
|
259
|
+
:return: request to create the entity (if needed)
|
|
260
|
+
"""
|
|
261
|
+
om_table_fqn = None
|
|
262
|
+
|
|
263
|
+
try:
|
|
264
|
+
table_details = OpenlineageSource._get_table_details(table)
|
|
265
|
+
except ValueError as e:
|
|
266
|
+
return Either(
|
|
267
|
+
left=StackTraceError(
|
|
268
|
+
name="",
|
|
269
|
+
error=f"Failed to get partial table name: {e}",
|
|
270
|
+
stackTrace=traceback.format_exc(),
|
|
271
|
+
)
|
|
272
|
+
)
|
|
273
|
+
try:
|
|
274
|
+
om_table_fqn = self._get_table_fqn_from_om(table_details)
|
|
275
|
+
|
|
276
|
+
# if fqn found then it means table is already registered and we don't need to render create table request
|
|
277
|
+
return None
|
|
278
|
+
except FQNNotFoundException:
|
|
279
|
+
pass
|
|
280
|
+
|
|
281
|
+
# If OM Table FQN was not found based on OL Partial Name - we need to register it.
|
|
282
|
+
if not om_table_fqn:
|
|
283
|
+
try:
|
|
284
|
+
om_schema_fqn = self._get_schema_fqn_from_om(table_details.schema)
|
|
285
|
+
except FQNNotFoundException as e:
|
|
286
|
+
return Either(
|
|
287
|
+
left=StackTraceError(
|
|
288
|
+
name="",
|
|
289
|
+
error=f"Failed to get fully qualified schema name: {e}",
|
|
290
|
+
stackTrace=traceback.format_exc(),
|
|
291
|
+
)
|
|
292
|
+
)
|
|
293
|
+
|
|
294
|
+
# After finding schema fqn (based on partial schema name) we know where we can create table
|
|
295
|
+
# and we move forward with creating request.
|
|
296
|
+
if om_schema_fqn:
|
|
297
|
+
columns = OpenlineageSource._get_om_table_columns(table) or []
|
|
298
|
+
|
|
299
|
+
request = CreateTableRequest(
|
|
300
|
+
name=table_details.name,
|
|
301
|
+
columns=columns,
|
|
302
|
+
databaseSchema=om_schema_fqn,
|
|
303
|
+
)
|
|
304
|
+
|
|
305
|
+
return Either(right=request)
|
|
306
|
+
|
|
307
|
+
return None
|
|
308
|
+
|
|
309
|
+
@classmethod
|
|
310
|
+
def _get_ol_table_name(cls, table: Dict) -> str:
|
|
311
|
+
return "/".join(table.get(f) for f in ["namespace", "name"]).replace("//", "/")
|
|
312
|
+
|
|
313
|
+
def _build_ol_name_to_fqn_map(self, tables: List):
|
|
314
|
+
result = {}
|
|
315
|
+
|
|
316
|
+
for table in tables:
|
|
317
|
+
table_fqn = self._get_table_fqn(OpenlineageSource._get_table_details(table))
|
|
318
|
+
|
|
319
|
+
if table_fqn:
|
|
320
|
+
result[OpenlineageSource._get_ol_table_name(table)] = table_fqn
|
|
321
|
+
|
|
322
|
+
return result
|
|
323
|
+
|
|
324
|
+
@classmethod
|
|
325
|
+
def _create_output_lineage_dict(
|
|
326
|
+
cls, lineage_info: List[Tuple[str, str, str, str]]
|
|
327
|
+
) -> Dict[str, Dict[str, List[ColumnLineage]]]:
|
|
328
|
+
result = defaultdict(lambda: defaultdict(list))
|
|
329
|
+
for (output_table, input_table, output_column), group in groupby(
|
|
330
|
+
lineage_info, lambda x: x[:3]
|
|
331
|
+
):
|
|
332
|
+
input_columns = [input_col for _, _, _, input_col in group]
|
|
333
|
+
|
|
334
|
+
result[output_table][input_table] += [
|
|
335
|
+
ColumnLineage(toColumn=output_column, fromColumns=input_columns)
|
|
336
|
+
]
|
|
337
|
+
|
|
338
|
+
return result
|
|
339
|
+
|
|
340
|
+
def _get_column_lineage(
|
|
341
|
+
self, inputs: List, outputs: List
|
|
342
|
+
) -> Dict[str, Dict[str, List[ColumnLineage]]]:
|
|
343
|
+
_result: List = []
|
|
344
|
+
|
|
345
|
+
ol_name_to_fqn_map = self._build_ol_name_to_fqn_map(inputs + outputs)
|
|
346
|
+
|
|
347
|
+
for table in outputs:
|
|
348
|
+
output_table_fqn = self._get_table_fqn(
|
|
349
|
+
OpenlineageSource._get_table_details(table)
|
|
350
|
+
)
|
|
351
|
+
for field_name, field_spec in (
|
|
352
|
+
table.get("facets", {})
|
|
353
|
+
.get("columnLineage", {})
|
|
354
|
+
.get("fields", {})
|
|
355
|
+
.items()
|
|
356
|
+
):
|
|
357
|
+
for input_field in field_spec.get("inputFields", []):
|
|
358
|
+
input_table_ol_name = OpenlineageSource._get_ol_table_name(
|
|
359
|
+
input_field
|
|
360
|
+
)
|
|
361
|
+
|
|
362
|
+
_result.append( # output table, input table, output column, input column
|
|
363
|
+
(
|
|
364
|
+
output_table_fqn,
|
|
365
|
+
ol_name_to_fqn_map.get(input_table_ol_name),
|
|
366
|
+
f"{output_table_fqn}.{field_name}",
|
|
367
|
+
f'{ol_name_to_fqn_map.get(input_table_ol_name)}.{input_field.get("field")}',
|
|
368
|
+
)
|
|
369
|
+
)
|
|
370
|
+
|
|
371
|
+
return OpenlineageSource._create_output_lineage_dict(_result)
|
|
372
|
+
|
|
373
|
+
def yield_pipeline(
|
|
374
|
+
self, pipeline_details: OpenLineageEvent
|
|
375
|
+
) -> Iterable[Either[CreatePipelineRequest]]:
|
|
376
|
+
pipeline_name = self.get_pipeline_name(pipeline_details)
|
|
377
|
+
try:
|
|
378
|
+
description = f"""```json
|
|
379
|
+
{json.dumps(pipeline_details.run_facet, indent=4).strip()}```"""
|
|
380
|
+
request = CreatePipelineRequest(
|
|
381
|
+
name=pipeline_name,
|
|
382
|
+
service=self.context.pipeline_service,
|
|
383
|
+
description=description,
|
|
384
|
+
)
|
|
385
|
+
|
|
386
|
+
yield Either(right=request)
|
|
387
|
+
self.register_record(pipeline_request=request)
|
|
388
|
+
except ValueError:
|
|
389
|
+
yield Either(
|
|
390
|
+
left=StackTraceError(
|
|
391
|
+
name=pipeline_name,
|
|
392
|
+
message="Failed to collect metadata required for pipeline creation.",
|
|
393
|
+
),
|
|
394
|
+
stackTrace=traceback.format_exc(),
|
|
395
|
+
)
|
|
396
|
+
|
|
397
|
+
def yield_pipeline_lineage_details(
|
|
398
|
+
self, pipeline_details: OpenLineageEvent
|
|
399
|
+
) -> Iterable[Either[AddLineageRequest]]:
|
|
400
|
+
inputs, outputs = pipeline_details.inputs, pipeline_details.outputs
|
|
401
|
+
|
|
402
|
+
input_edges: List[LineageNode] = []
|
|
403
|
+
output_edges: List[LineageNode] = []
|
|
404
|
+
|
|
405
|
+
for spec in [(inputs, input_edges), (outputs, output_edges)]:
|
|
406
|
+
tables, tables_list = spec
|
|
407
|
+
|
|
408
|
+
for table in tables:
|
|
409
|
+
create_table_request = self.get_create_table_request(table)
|
|
410
|
+
|
|
411
|
+
if create_table_request:
|
|
412
|
+
yield create_table_request
|
|
413
|
+
|
|
414
|
+
table_fqn = self._get_table_fqn(
|
|
415
|
+
OpenlineageSource._get_table_details(table)
|
|
416
|
+
)
|
|
417
|
+
|
|
418
|
+
if table_fqn:
|
|
419
|
+
tables_list.append(
|
|
420
|
+
LineageNode(
|
|
421
|
+
fqn=TableFQN(value=table_fqn),
|
|
422
|
+
uuid=self.metadata.get_by_name(Table, table_fqn).id,
|
|
423
|
+
)
|
|
424
|
+
)
|
|
425
|
+
|
|
426
|
+
edges = [
|
|
427
|
+
LineageEdge(from_node=n[0], to_node=n[1])
|
|
428
|
+
for n in product(input_edges, output_edges)
|
|
429
|
+
]
|
|
430
|
+
|
|
431
|
+
column_lineage = self._get_column_lineage(inputs, outputs)
|
|
432
|
+
|
|
433
|
+
pipeline_fqn = fqn.build(
|
|
434
|
+
metadata=self.metadata,
|
|
435
|
+
entity_type=Pipeline,
|
|
436
|
+
service_name=self.context.pipeline_service,
|
|
437
|
+
pipeline_name=self.context.pipeline,
|
|
438
|
+
)
|
|
439
|
+
|
|
440
|
+
pipeline_entity = self.metadata.get_by_name(entity=Pipeline, fqn=pipeline_fqn)
|
|
441
|
+
for edge in edges:
|
|
442
|
+
yield Either(
|
|
443
|
+
right=AddLineageRequest(
|
|
444
|
+
edge=EntitiesEdge(
|
|
445
|
+
fromEntity=EntityReference(
|
|
446
|
+
id=edge.from_node.uuid, type=edge.from_node.node_type
|
|
447
|
+
),
|
|
448
|
+
toEntity=EntityReference(
|
|
449
|
+
id=edge.to_node.uuid, type=edge.to_node.node_type
|
|
450
|
+
),
|
|
451
|
+
lineageDetails=LineageDetails(
|
|
452
|
+
pipeline=EntityReference(
|
|
453
|
+
id=pipeline_entity.id.__root__,
|
|
454
|
+
type="pipeline",
|
|
455
|
+
),
|
|
456
|
+
description=f"Lineage extracted from OpenLineage job: {pipeline_details.job['name']}",
|
|
457
|
+
source=Source.OpenLineage,
|
|
458
|
+
columnsLineage=column_lineage.get(
|
|
459
|
+
edge.to_node.fqn.value, {}
|
|
460
|
+
).get(edge.from_node.fqn.value, []),
|
|
461
|
+
),
|
|
462
|
+
),
|
|
463
|
+
)
|
|
464
|
+
)
|
|
465
|
+
|
|
466
|
+
def get_pipelines_list(self) -> Optional[List[Any]]:
|
|
467
|
+
"""Get List of all pipelines"""
|
|
468
|
+
try:
|
|
469
|
+
consumer = self.client
|
|
470
|
+
session_active = True
|
|
471
|
+
empty_msg_cnt = 0
|
|
472
|
+
pool_timeout = self.service_connection.poolTimeout
|
|
473
|
+
while session_active:
|
|
474
|
+
message = consumer.poll(timeout=pool_timeout)
|
|
475
|
+
if message is None:
|
|
476
|
+
logger.debug("no new messages")
|
|
477
|
+
empty_msg_cnt += 1
|
|
478
|
+
if (
|
|
479
|
+
empty_msg_cnt * pool_timeout
|
|
480
|
+
> self.service_connection.sessionTimeout
|
|
481
|
+
):
|
|
482
|
+
# There is no new messages, timeout is passed
|
|
483
|
+
session_active = False
|
|
484
|
+
else:
|
|
485
|
+
logger.debug(f"new message {message.value()}")
|
|
486
|
+
empty_msg_cnt = 0
|
|
487
|
+
try:
|
|
488
|
+
_result = message_to_open_lineage_event(
|
|
489
|
+
json.loads(message.value())
|
|
490
|
+
)
|
|
491
|
+
result = self._filter_event_by_type(_result, EventType.COMPLETE)
|
|
492
|
+
if result:
|
|
493
|
+
yield result
|
|
494
|
+
except Exception as e:
|
|
495
|
+
logger.debug(e)
|
|
496
|
+
|
|
497
|
+
except Exception as e:
|
|
498
|
+
traceback.print_exc()
|
|
499
|
+
|
|
500
|
+
raise InvalidSourceException(f"Failed to read from Kafka: {str(e)}")
|
|
501
|
+
|
|
502
|
+
finally:
|
|
503
|
+
# Close down consumer to commit final offsets.
|
|
504
|
+
# @todo address this
|
|
505
|
+
consumer.close()
|
|
506
|
+
|
|
507
|
+
def get_pipeline_name(self, pipeline_details: OpenLineageEvent) -> str:
|
|
508
|
+
return OpenlineageSource._render_pipeline_name(pipeline_details)
|
|
509
|
+
|
|
510
|
+
def yield_pipeline_status(
|
|
511
|
+
self, pipeline_details: OpenLineageEvent
|
|
512
|
+
) -> Iterable[Either[OMetaPipelineStatus]]:
|
|
513
|
+
pass
|
|
514
|
+
|
|
515
|
+
def mark_pipelines_as_deleted(self):
|
|
516
|
+
"""
|
|
517
|
+
OpenLineage pipelines are coming from streaming data and hence subsequent executions of ingestion processes
|
|
518
|
+
can cause deletion of a pipeline. Because of this we turn off pipeline deletion by overwriting this method
|
|
519
|
+
and leaving it blank. Setting 'Mark Deleted Pipelines' in ingestion process will have no effect!
|
|
520
|
+
"""
|