openmetadata-ingestion 1.1.4.0__py3-none-any.whl → 1.1.6.0__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/data_insight/api/workflow.py +57 -1
- metadata/data_quality/interface/pandas/pandas_test_suite_interface.py +1 -1
- metadata/data_quality/interface/sqlalchemy/sqa_test_suite_interface.py +1 -1
- 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/entityReportData.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/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/classification/__init__.py +1 -1
- metadata/generated/schema/api/classification/createClassification.py +1 -1
- metadata/generated/schema/api/classification/createTag.py +1 -1
- 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 +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 +6 -1
- metadata/generated/schema/api/data/createTable.py +1 -1
- metadata/generated/schema/api/data/createTableProfile.py +1 -1
- metadata/generated/schema/api/data/createTopic.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/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/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/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/createRole.py +1 -1
- metadata/generated/schema/api/teams/createTeam.py +1 -1
- metadata/generated/schema/api/teams/createUser.py +1 -1
- 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 +1 -1
- metadata/generated/schema/api/tests/createTestDefinition.py +1 -1
- 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/applicationConfiguration.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 +1 -1
- metadata/generated/schema/configuration/changeEventConfiguration.py +1 -1
- metadata/generated/schema/configuration/elasticSearchConfiguration.py +1 -1
- metadata/generated/schema/configuration/eventHandlerConfiguration.py +1 -1
- metadata/generated/schema/configuration/extensionConfiguration.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/pipelineServiceClientConfiguration.py +1 -1
- 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/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/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/email/__init__.py +1 -1
- metadata/generated/schema/email/emailRequest.py +1 -1
- metadata/generated/schema/email/smtpSettings.py +1 -1
- metadata/generated/schema/entity/__init__.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 +1 -1
- metadata/generated/schema/entity/classification/tag.py +1 -1
- 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 +1 -1
- metadata/generated/schema/entity/data/dashboard.py +1 -1
- metadata/generated/schema/entity/data/dashboardDataModel.py +1 -1
- 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 +1 -1
- metadata/generated/schema/entity/data/metrics.py +1 -1
- metadata/generated/schema/entity/data/mlmodel.py +1 -1
- metadata/generated/schema/entity/data/pipeline.py +1 -1
- metadata/generated/schema/entity/data/query.py +6 -1
- metadata/generated/schema/entity/data/report.py +1 -1
- metadata/generated/schema/entity/data/table.py +1 -1
- metadata/generated/schema/entity/data/topic.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/thread.py +1 -1
- 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 +1 -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 +1 -1
- 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/connectionBasicType.py +1 -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/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/powerBIConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/qlikSenseConnection.py +1 -1
- 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 +1 -1
- metadata/generated/schema/entity/services/connections/database/clickhouseConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/common/__init__.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/customDatabaseConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/databricksConnection.py +1 -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 +1 -1
- metadata/generated/schema/entity/services/connections/database/domoDatabaseConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/druidConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/dynamoDBConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/glueConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/hiveConnection.py +2 -2
- 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/mongoDB/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/database/mongoDB/mongoDBValues.py +1 -1
- metadata/generated/schema/entity/services/connections/database/mongoDBConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/mssqlConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/mysqlConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/oracleConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/pinotDBConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/postgresConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/prestoConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/redshiftConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/salesforceConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/sapHanaConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/singleStoreConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/snowflakeConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/sqliteConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/trinoConnection.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 +1 -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/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/nifiConnection.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/elasticSearchConnection.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/adlsConection.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 +1 -1
- 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 +1 -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/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 +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/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 +1 -1
- 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/api/__init__.py +1 -1
- metadata/generated/schema/events/api/createEventSubscription.py +1 -1
- metadata/generated/schema/events/dataInsightAlertConfig.py +1 -1
- metadata/generated/schema/events/emailAlertConfig.py +1 -1
- metadata/generated/schema/events/entitySpelFilters.py +1 -1
- metadata/generated/schema/events/eventFilterRule.py +1 -1
- metadata/generated/schema/events/eventSubscription.py +29 -29
- metadata/generated/schema/events/subscriptionResourceDescriptor.py +1 -1
- metadata/generated/schema/metadataIngestion/__init__.py +1 -1
- metadata/generated/schema/metadataIngestion/dashboardServiceMetadataPipeline.py +1 -1
- metadata/generated/schema/metadataIngestion/dataInsightPipeline.py +1 -1
- metadata/generated/schema/metadataIngestion/databaseServiceMetadataPipeline.py +1 -1
- metadata/generated/schema/metadataIngestion/databaseServiceProfilerPipeline.py +1 -1
- 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 +1 -1
- metadata/generated/schema/metadataIngestion/storage/__init__.py +1 -1
- metadata/generated/schema/metadataIngestion/storage/containerMetadataConfig.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/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/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/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 +1 -1
- metadata/generated/schema/security/ssl/verifySSLConfig.py +1 -1
- metadata/generated/schema/settings/__init__.py +1 -1
- metadata/generated/schema/settings/settings.py +1 -1
- metadata/generated/schema/system/__init__.py +1 -1
- metadata/generated/schema/system/eventPublisherJob.py +1 -1
- metadata/generated/schema/system/sqlMigrationScript.py +1 -1
- metadata/generated/schema/tests/__init__.py +1 -1
- metadata/generated/schema/tests/basic.py +7 -7
- metadata/generated/schema/tests/customMetric.py +1 -1
- metadata/generated/schema/tests/testCase.py +1 -1
- metadata/generated/schema/tests/testDefinition.py +1 -1
- 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 +1 -1
- metadata/generated/schema/type/changeEvent.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/dailyCount.py +1 -1
- metadata/generated/schema/type/databaseConnectionConfig.py +1 -1
- metadata/generated/schema/type/entityHistory.py +1 -1
- metadata/generated/schema/type/entityLineage.py +1 -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/paging.py +1 -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/ingestion/lineage/sql_lineage.py +30 -7
- metadata/ingestion/ometa/mixins/data_insight_mixin.py +12 -1
- metadata/ingestion/ometa/mixins/query_mixin.py +40 -4
- metadata/ingestion/ometa/mixins/table_mixin.py +0 -5
- metadata/ingestion/processor/query_parser.py +6 -6
- metadata/ingestion/source/dashboard/tableau/models.py +0 -1
- metadata/ingestion/source/dashboard/tableau/queries.py +0 -1
- metadata/ingestion/source/database/bigquery/connection.py +27 -38
- metadata/ingestion/source/database/bigquery/helper.py +66 -0
- metadata/ingestion/source/database/bigquery/metadata.py +69 -64
- metadata/ingestion/source/database/bigquery/queries.py +2 -2
- metadata/ingestion/source/database/bigquery/query_parser.py +19 -1
- metadata/ingestion/source/database/common_db_source.py +0 -3
- metadata/ingestion/source/database/database_service.py +27 -3
- metadata/ingestion/source/database/lineage_source.py +21 -18
- metadata/ingestion/source/database/query_parser_source.py +3 -0
- metadata/ingestion/source/database/sample_data.py +17 -9
- metadata/ingestion/source/database/usage_source.py +30 -29
- metadata/ingestion/stage/table_usage.py +42 -34
- metadata/profiler/interface/pandas/profiler_interface.py +24 -41
- metadata/profiler/interface/profiler_interface.py +62 -2
- metadata/profiler/interface/profiler_interface_factory.py +9 -0
- metadata/profiler/interface/sqlalchemy/profiler_interface.py +19 -36
- metadata/profiler/interface/sqlalchemy/single_store/__init__.py +0 -0
- metadata/profiler/interface/sqlalchemy/single_store/profiler_interface.py +86 -0
- metadata/profiler/metrics/system/queries/redshift.py +3 -5
- metadata/profiler/metrics/system/system.py +0 -4
- metadata/profiler/metrics/window/first_quartile.py +4 -4
- metadata/profiler/metrics/window/median.py +4 -4
- metadata/profiler/metrics/window/percentille_mixin.py +9 -0
- metadata/profiler/metrics/window/third_quartile.py +4 -4
- metadata/profiler/processor/core.py +1 -1
- metadata/profiler/source/single_store/functions/median.py +17 -0
- metadata/profiler/source/single_store/metrics/window/first_quartile.py +10 -0
- metadata/profiler/source/single_store/metrics/window/median.py +10 -0
- metadata/profiler/source/single_store/metrics/window/third_quartile.py +10 -0
- {openmetadata_ingestion-1.1.4.0.dist-info → openmetadata_ingestion-1.1.6.0.dist-info}/METADATA +176 -176
- {openmetadata_ingestion-1.1.4.0.dist-info → openmetadata_ingestion-1.1.6.0.dist-info}/RECORD +445 -437
- {openmetadata_ingestion-1.1.4.0.dist-info → openmetadata_ingestion-1.1.6.0.dist-info}/LICENSE +0 -0
- {openmetadata_ingestion-1.1.4.0.dist-info → openmetadata_ingestion-1.1.6.0.dist-info}/WHEEL +0 -0
- {openmetadata_ingestion-1.1.4.0.dist-info → openmetadata_ingestion-1.1.6.0.dist-info}/entry_points.txt +0 -0
- {openmetadata_ingestion-1.1.4.0.dist-info → openmetadata_ingestion-1.1.6.0.dist-info}/top_level.txt +0 -0
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
Helper functions to handle SQL lineage operations
|
|
13
13
|
"""
|
|
14
14
|
import traceback
|
|
15
|
-
from typing import Any, Iterable, Iterator, List, Optional
|
|
15
|
+
from typing import Any, Iterable, Iterator, List, Optional, Tuple
|
|
16
16
|
|
|
17
17
|
from metadata.generated.schema.api.lineage.addLineage import AddLineageRequest
|
|
18
18
|
from metadata.generated.schema.entity.data.table import Table
|
|
@@ -118,6 +118,34 @@ def search_table_entities(
|
|
|
118
118
|
return None
|
|
119
119
|
|
|
120
120
|
|
|
121
|
+
def get_table_fqn_from_query_name(
|
|
122
|
+
table_name: str,
|
|
123
|
+
) -> Tuple[Optional[str], Optional[str], Optional[str]]:
|
|
124
|
+
"""
|
|
125
|
+
Method to extract database, schema and table name
|
|
126
|
+
from raw table name used in query
|
|
127
|
+
"""
|
|
128
|
+
|
|
129
|
+
split_table = table_name.split(".")
|
|
130
|
+
empty_list: List[Any] = [None] # Otherwise, there's a typing error in the concat
|
|
131
|
+
|
|
132
|
+
if len(split_table) > 3:
|
|
133
|
+
# In case of bigquery, it is possible that tables within information schema when
|
|
134
|
+
# referred with their fully qualified name may look like this
|
|
135
|
+
# `project-id.dataset-id.information_schema.table-name` in such cases there
|
|
136
|
+
# will be 4 values to unpack vs the expected 3 values, hence in such case we
|
|
137
|
+
# just pick the table name and keep the database and schema name as none
|
|
138
|
+
|
|
139
|
+
table = split_table[-1]
|
|
140
|
+
database_query, schema_query = None, None
|
|
141
|
+
else:
|
|
142
|
+
database_query, schema_query, table = (
|
|
143
|
+
empty_list * (3 - len(split_table))
|
|
144
|
+
) + split_table
|
|
145
|
+
|
|
146
|
+
return database_query, schema_query, table
|
|
147
|
+
|
|
148
|
+
|
|
121
149
|
def get_table_entities_from_query(
|
|
122
150
|
metadata: OpenMetadata,
|
|
123
151
|
service_name: str,
|
|
@@ -141,12 +169,7 @@ def get_table_entities_from_query(
|
|
|
141
169
|
# First try to find the data from the given db and schema (with table name as given or uppercase)
|
|
142
170
|
# Otherwise, pick it up from the table_name str (with table name as given or uppercase)
|
|
143
171
|
|
|
144
|
-
|
|
145
|
-
empty_list: List[Any] = [None] # Otherwise, there's a typing error in the concat
|
|
146
|
-
|
|
147
|
-
database_query, schema_query, table = (
|
|
148
|
-
empty_list * (3 - len(split_table))
|
|
149
|
-
) + split_table
|
|
172
|
+
database_query, schema_query, table = get_table_fqn_from_query_name(table_name)
|
|
150
173
|
|
|
151
174
|
table_entities = search_table_entities(
|
|
152
175
|
metadata=metadata,
|
|
@@ -19,7 +19,7 @@ from __future__ import annotations
|
|
|
19
19
|
from typing import List, Optional
|
|
20
20
|
|
|
21
21
|
from metadata.generated.schema.analytics.basic import WebAnalyticEventType
|
|
22
|
-
from metadata.generated.schema.analytics.reportData import ReportData
|
|
22
|
+
from metadata.generated.schema.analytics.reportData import ReportData, ReportDataType
|
|
23
23
|
from metadata.generated.schema.analytics.webAnalyticEventData import (
|
|
24
24
|
WebAnalyticEventData,
|
|
25
25
|
)
|
|
@@ -174,3 +174,14 @@ class DataInsightMixin:
|
|
|
174
174
|
"""
|
|
175
175
|
event_type_value = event_type.value
|
|
176
176
|
self.client.delete(f"/analytics/web/events/{event_type_value}/{tmsp}/collect")
|
|
177
|
+
|
|
178
|
+
def delete_report_data(self, report_data_type: ReportDataType, date: str) -> None:
|
|
179
|
+
"""Delete report data at a specific date for a specific report data type
|
|
180
|
+
|
|
181
|
+
Args:
|
|
182
|
+
report_data_type (ReportDataType): report date type to delete
|
|
183
|
+
date (str): date for which to delete the report data
|
|
184
|
+
"""
|
|
185
|
+
self.client.delete(
|
|
186
|
+
f"/analytics/dataInsights/data/{report_data_type.value}/{date}"
|
|
187
|
+
)
|
|
@@ -13,7 +13,8 @@ Mixin class containing Query specific methods
|
|
|
13
13
|
|
|
14
14
|
To be used by OpenMetadata class
|
|
15
15
|
"""
|
|
16
|
-
|
|
16
|
+
import hashlib
|
|
17
|
+
import json
|
|
17
18
|
from typing import List, Optional, Union
|
|
18
19
|
|
|
19
20
|
from metadata.generated.schema.api.data.createQuery import CreateQueryRequest
|
|
@@ -22,6 +23,7 @@ from metadata.generated.schema.entity.data.query import Query
|
|
|
22
23
|
from metadata.generated.schema.entity.data.table import Table
|
|
23
24
|
from metadata.generated.schema.type.basic import Uuid
|
|
24
25
|
from metadata.generated.schema.type.entityReference import EntityReference
|
|
26
|
+
from metadata.ingestion.ometa.client import REST
|
|
25
27
|
from metadata.ingestion.ometa.utils import model_str
|
|
26
28
|
|
|
27
29
|
|
|
@@ -32,6 +34,21 @@ class OMetaQueryMixin:
|
|
|
32
34
|
To be inherited by OpenMetadata
|
|
33
35
|
"""
|
|
34
36
|
|
|
37
|
+
client: REST
|
|
38
|
+
|
|
39
|
+
def _get_query_hash(self, query: str) -> str:
|
|
40
|
+
result = hashlib.md5(query.encode())
|
|
41
|
+
return str(result.hexdigest())
|
|
42
|
+
|
|
43
|
+
def _get_or_create_query(self, query: CreateQueryRequest) -> Optional[Query]:
|
|
44
|
+
query_hash = self._get_query_hash(query=query.query.__root__)
|
|
45
|
+
query_entity = self.get_by_name(entity=Query, fqn=query_hash)
|
|
46
|
+
if query_entity is None:
|
|
47
|
+
resp = self.client.put(self.get_suffix(Query), data=query.json())
|
|
48
|
+
if resp and resp.get("id"):
|
|
49
|
+
query_entity = Query(**resp)
|
|
50
|
+
return query_entity
|
|
51
|
+
|
|
35
52
|
def ingest_entity_queries_data(
|
|
36
53
|
self, entity: Union[Table, Dashboard], queries: List[CreateQueryRequest]
|
|
37
54
|
) -> None:
|
|
@@ -42,16 +59,35 @@ class OMetaQueryMixin:
|
|
|
42
59
|
:param queries: CreateQueryRequest to add
|
|
43
60
|
"""
|
|
44
61
|
for create_query in queries:
|
|
45
|
-
query = self.
|
|
46
|
-
if query
|
|
62
|
+
query = self._get_or_create_query(create_query)
|
|
63
|
+
if query:
|
|
64
|
+
# Add Query Usage
|
|
47
65
|
table_ref = EntityReference(id=entity.id.__root__, type="table")
|
|
48
66
|
# convert object to json array string
|
|
49
67
|
table_ref_json = "[" + table_ref.json() + "]"
|
|
50
68
|
self.client.put(
|
|
51
|
-
f"{self.get_suffix(Query)}/{query.
|
|
69
|
+
f"{self.get_suffix(Query)}/{model_str(query.id)}/usage",
|
|
52
70
|
data=table_ref_json,
|
|
53
71
|
)
|
|
54
72
|
|
|
73
|
+
# Add Query Users
|
|
74
|
+
user_fqn_list = create_query.users
|
|
75
|
+
if user_fqn_list:
|
|
76
|
+
self.client.put(
|
|
77
|
+
f"{self.get_suffix(Query)}/{model_str(query.id)}/users",
|
|
78
|
+
data=json.dumps(
|
|
79
|
+
[model_str(user_fqn) for user_fqn in user_fqn_list]
|
|
80
|
+
),
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
# Add Query used by
|
|
84
|
+
user_list = create_query.usedBy
|
|
85
|
+
if user_list:
|
|
86
|
+
self.client.put(
|
|
87
|
+
f"{self.get_suffix(Query)}/{model_str(query.id)}/usedBy",
|
|
88
|
+
data=json.dumps(user_list),
|
|
89
|
+
)
|
|
90
|
+
|
|
55
91
|
def get_entity_queries(
|
|
56
92
|
self, entity_id: Union[Uuid, str], fields: Optional[List[str]] = None
|
|
57
93
|
) -> Optional[List[Query]]:
|
|
@@ -254,11 +254,6 @@ class OMetaTableMixin:
|
|
|
254
254
|
url_after = f"&after={after}" if after else ""
|
|
255
255
|
profile_type_url = profile_type.__name__[0].lower() + profile_type.__name__[1:]
|
|
256
256
|
|
|
257
|
-
# system profile uses milliseconds
|
|
258
|
-
if profile_type is not SystemProfile:
|
|
259
|
-
start_ts = start_ts // 1000
|
|
260
|
-
end_ts = end_ts // 1000
|
|
261
|
-
|
|
262
257
|
resp = self.client.get(
|
|
263
258
|
f"{self.get_suffix(Table)}/{fqn}/{profile_type_url}?limit={limit}{url_after}",
|
|
264
259
|
data={"startTs": start_ts, "endTs": end_ts},
|
|
@@ -20,6 +20,7 @@ from metadata.config.common import ConfigModel
|
|
|
20
20
|
from metadata.generated.schema.entity.services.connections.metadata.openMetadataConnection import (
|
|
21
21
|
OpenMetadataConnection,
|
|
22
22
|
)
|
|
23
|
+
from metadata.generated.schema.type.basic import DateTime
|
|
23
24
|
from metadata.generated.schema.type.queryParserData import ParsedData, QueryParserData
|
|
24
25
|
from metadata.generated.schema.type.tableQuery import TableQueries, TableQuery
|
|
25
26
|
from metadata.ingestion.api.processor import Processor
|
|
@@ -40,11 +41,10 @@ def parse_sql_statement(record: TableQuery, dialect: Dialect) -> Optional[Parsed
|
|
|
40
41
|
:return: QueryParserData
|
|
41
42
|
"""
|
|
42
43
|
|
|
43
|
-
|
|
44
|
-
if isinstance(
|
|
45
|
-
start_date =
|
|
46
|
-
|
|
47
|
-
).date()
|
|
44
|
+
start_time = record.analysisDate
|
|
45
|
+
if isinstance(start_time, DateTime):
|
|
46
|
+
start_date = start_time.__root__.date()
|
|
47
|
+
start_time = datetime.datetime.strptime(str(start_date.isoformat()), "%Y-%m-%d")
|
|
48
48
|
|
|
49
49
|
lineage_parser = LineageParser(record.query, dialect=dialect)
|
|
50
50
|
|
|
@@ -58,7 +58,7 @@ def parse_sql_statement(record: TableQuery, dialect: Dialect) -> Optional[Parsed
|
|
|
58
58
|
databaseSchema=record.databaseSchema,
|
|
59
59
|
sql=record.query,
|
|
60
60
|
userName=record.userName,
|
|
61
|
-
date=int(
|
|
61
|
+
date=int(start_time.timestamp()),
|
|
62
62
|
serviceName=record.serviceName,
|
|
63
63
|
duration=record.duration,
|
|
64
64
|
)
|
|
@@ -16,7 +16,6 @@ import os
|
|
|
16
16
|
from functools import partial
|
|
17
17
|
from typing import Optional
|
|
18
18
|
|
|
19
|
-
from google import auth
|
|
20
19
|
from google.cloud.datacatalog_v1 import PolicyTagManagerClient
|
|
21
20
|
from sqlalchemy.engine import Engine
|
|
22
21
|
|
|
@@ -107,42 +106,32 @@ def test_connection(
|
|
|
107
106
|
return policy_tags
|
|
108
107
|
|
|
109
108
|
def test_tags():
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
109
|
+
taxonomies = PolicyTagManagerClient().list_taxonomies(
|
|
110
|
+
parent=f"projects/{engine.url.host}/locations/{service_connection.taxonomyLocation}"
|
|
111
|
+
)
|
|
112
|
+
return get_tags(taxonomies)
|
|
113
|
+
|
|
114
|
+
def test_connection_inner(engine):
|
|
115
|
+
test_fn = {
|
|
116
|
+
"CheckAccess": partial(test_connection_engine_step, engine),
|
|
117
|
+
"GetSchemas": partial(execute_inspector_func, engine, "get_schema_names"),
|
|
118
|
+
"GetTables": partial(execute_inspector_func, engine, "get_table_names"),
|
|
119
|
+
"GetViews": partial(execute_inspector_func, engine, "get_view_names"),
|
|
120
|
+
"GetTags": test_tags,
|
|
121
|
+
"GetQueries": partial(
|
|
122
|
+
test_query,
|
|
123
|
+
engine=engine,
|
|
124
|
+
statement=BIGQUERY_TEST_STATEMENT.format(
|
|
125
|
+
region=service_connection.usageLocation
|
|
126
|
+
),
|
|
127
|
+
),
|
|
128
|
+
}
|
|
118
129
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
130
|
+
test_connection_steps(
|
|
131
|
+
metadata=metadata,
|
|
132
|
+
test_fn=test_fn,
|
|
133
|
+
service_type=service_connection.type.value,
|
|
134
|
+
automation_workflow=automation_workflow,
|
|
135
|
+
)
|
|
123
136
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
return None
|
|
127
|
-
|
|
128
|
-
test_fn = {
|
|
129
|
-
"CheckAccess": partial(test_connection_engine_step, engine),
|
|
130
|
-
"GetSchemas": partial(execute_inspector_func, engine, "get_schema_names"),
|
|
131
|
-
"GetTables": partial(execute_inspector_func, engine, "get_table_names"),
|
|
132
|
-
"GetViews": partial(execute_inspector_func, engine, "get_view_names"),
|
|
133
|
-
"GetTags": test_tags,
|
|
134
|
-
"GetQueries": partial(
|
|
135
|
-
test_query,
|
|
136
|
-
engine=engine,
|
|
137
|
-
statement=BIGQUERY_TEST_STATEMENT.format(
|
|
138
|
-
region=service_connection.usageLocation
|
|
139
|
-
),
|
|
140
|
-
),
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
test_connection_steps(
|
|
144
|
-
metadata=metadata,
|
|
145
|
-
test_fn=test_fn,
|
|
146
|
-
service_type=service_connection.type.value,
|
|
147
|
-
automation_workflow=automation_workflow,
|
|
148
|
-
)
|
|
137
|
+
test_connection_inner(engine)
|
|
@@ -0,0 +1,66 @@
|
|
|
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 helper
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from typing import Any
|
|
17
|
+
|
|
18
|
+
from pydantic import BaseModel
|
|
19
|
+
from sqlalchemy import inspect
|
|
20
|
+
|
|
21
|
+
from metadata.generated.schema.entity.services.connections.database.bigQueryConnection import (
|
|
22
|
+
BigQueryConnection,
|
|
23
|
+
)
|
|
24
|
+
from metadata.generated.schema.security.credentials.gcpValues import (
|
|
25
|
+
GcpCredentialsValues,
|
|
26
|
+
SingleProjectId,
|
|
27
|
+
)
|
|
28
|
+
from metadata.ingestion.source.connections import get_connection
|
|
29
|
+
from metadata.utils.bigquery_utils import get_bigquery_client
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class InspectorWrapper(BaseModel):
|
|
33
|
+
client: Any
|
|
34
|
+
engine: Any
|
|
35
|
+
inspector: Any
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def get_inspector_details(
|
|
39
|
+
database_name: str, service_connection: BigQueryConnection
|
|
40
|
+
) -> InspectorWrapper:
|
|
41
|
+
"""
|
|
42
|
+
Method to get the bigquery inspector details
|
|
43
|
+
"""
|
|
44
|
+
# TODO support location property in JSON Schema
|
|
45
|
+
# TODO support OAuth 2.0 scopes
|
|
46
|
+
kwargs = {}
|
|
47
|
+
if isinstance(service_connection.credentials.gcpConfig, GcpCredentialsValues):
|
|
48
|
+
service_connection.credentials.gcpConfig.projectId = SingleProjectId(
|
|
49
|
+
__root__=database_name
|
|
50
|
+
)
|
|
51
|
+
if service_connection.credentials.gcpImpersonateServiceAccount:
|
|
52
|
+
kwargs[
|
|
53
|
+
"impersonate_service_account"
|
|
54
|
+
] = (
|
|
55
|
+
service_connection.credentials.gcpImpersonateServiceAccount.impersonateServiceAccount
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
kwargs[
|
|
59
|
+
"lifetime"
|
|
60
|
+
] = service_connection.credentials.gcpImpersonateServiceAccount.lifetime
|
|
61
|
+
|
|
62
|
+
client = get_bigquery_client(project_id=database_name, **kwargs)
|
|
63
|
+
engine = get_connection(service_connection)
|
|
64
|
+
inspector = inspect(engine)
|
|
65
|
+
|
|
66
|
+
return InspectorWrapper(client=client, engine=engine, inspector=inspector)
|
|
@@ -17,7 +17,6 @@ from typing import Iterable, List, Optional, Tuple
|
|
|
17
17
|
|
|
18
18
|
from google import auth
|
|
19
19
|
from google.cloud.datacatalog_v1 import PolicyTagManagerClient
|
|
20
|
-
from sqlalchemy import inspect
|
|
21
20
|
from sqlalchemy.engine.reflection import Inspector
|
|
22
21
|
from sqlalchemy.sql.sqltypes import Interval
|
|
23
22
|
from sqlalchemy.types import String
|
|
@@ -44,12 +43,12 @@ from metadata.generated.schema.metadataIngestion.workflow import (
|
|
|
44
43
|
)
|
|
45
44
|
from metadata.generated.schema.security.credentials.gcpValues import (
|
|
46
45
|
GcpCredentialsValues,
|
|
47
|
-
MultipleProjectId,
|
|
48
|
-
SingleProjectId,
|
|
49
46
|
)
|
|
50
47
|
from metadata.generated.schema.type.tagLabel import TagLabel
|
|
51
48
|
from metadata.ingestion.api.source import InvalidSourceException
|
|
52
49
|
from metadata.ingestion.models.ometa_classification import OMetaTagAndClassification
|
|
50
|
+
from metadata.ingestion.source.connections import get_test_connection_fn
|
|
51
|
+
from metadata.ingestion.source.database.bigquery.helper import get_inspector_details
|
|
53
52
|
from metadata.ingestion.source.database.bigquery.queries import (
|
|
54
53
|
BIGQUERY_SCHEMA_DESCRIPTION,
|
|
55
54
|
BIGQUERY_TABLE_AND_TYPE,
|
|
@@ -60,7 +59,6 @@ from metadata.ingestion.source.database.common_db_source import (
|
|
|
60
59
|
TableNameAndType,
|
|
61
60
|
)
|
|
62
61
|
from metadata.utils import fqn
|
|
63
|
-
from metadata.utils.bigquery_utils import get_bigquery_client
|
|
64
62
|
from metadata.utils.credentials import GOOGLE_CREDENTIALS
|
|
65
63
|
from metadata.utils.filters import filter_by_database
|
|
66
64
|
from metadata.utils.logger import ingestion_logger
|
|
@@ -200,9 +198,15 @@ class BigquerySource(CommonDbSourceService):
|
|
|
200
198
|
return cls(config, metadata_config)
|
|
201
199
|
|
|
202
200
|
@staticmethod
|
|
203
|
-
def set_project_id():
|
|
201
|
+
def set_project_id() -> List[str]:
|
|
204
202
|
_, project_ids = auth.default()
|
|
205
|
-
return project_ids
|
|
203
|
+
return project_ids if isinstance(project_ids, list) else [project_ids]
|
|
204
|
+
|
|
205
|
+
def test_connection(self) -> None:
|
|
206
|
+
for project_id in self.set_project_id():
|
|
207
|
+
self.set_inspector(project_id)
|
|
208
|
+
test_connection_fn = get_test_connection_fn(self.service_connection)
|
|
209
|
+
test_connection_fn(self.metadata, self.engine, self.service_connection)
|
|
206
210
|
|
|
207
211
|
def query_table_names_and_types(
|
|
208
212
|
self, schema_name: str
|
|
@@ -222,7 +226,9 @@ class BigquerySource(CommonDbSourceService):
|
|
|
222
226
|
type_=_bigquery_table_types.get(table_type, TableType.Regular),
|
|
223
227
|
)
|
|
224
228
|
for table_name, table_type in self.engine.execute(
|
|
225
|
-
BIGQUERY_TABLE_AND_TYPE.format(
|
|
229
|
+
BIGQUERY_TABLE_AND_TYPE.format(
|
|
230
|
+
project_id=self.client.project, schema_name=schema_name
|
|
231
|
+
)
|
|
226
232
|
)
|
|
227
233
|
or []
|
|
228
234
|
]
|
|
@@ -319,12 +325,41 @@ class BigquerySource(CommonDbSourceService):
|
|
|
319
325
|
)
|
|
320
326
|
yield database_schema_request_obj
|
|
321
327
|
|
|
328
|
+
def get_table_obj(self, table_name: str):
|
|
329
|
+
schema_name = self.context.database_schema.name.__root__
|
|
330
|
+
database = self.context.database.name.__root__
|
|
331
|
+
bq_table_fqn = fqn._build(database, schema_name, table_name)
|
|
332
|
+
return self.client.get_table(bq_table_fqn)
|
|
333
|
+
|
|
334
|
+
def yield_table_tag_details(self, table_name_and_type: Tuple[str, str]):
|
|
335
|
+
table_name, _ = table_name_and_type
|
|
336
|
+
table_obj = self.get_table_obj(table_name=table_name)
|
|
337
|
+
if table_obj.labels:
|
|
338
|
+
for key, value in table_obj.labels.items():
|
|
339
|
+
yield from get_ometa_tag_and_classification(
|
|
340
|
+
tags=[value],
|
|
341
|
+
classification_name=key,
|
|
342
|
+
tag_description="Bigquery Table Label",
|
|
343
|
+
classification_desciption="",
|
|
344
|
+
)
|
|
345
|
+
|
|
322
346
|
def get_tag_labels(self, table_name: str) -> Optional[List[TagLabel]]:
|
|
323
347
|
"""
|
|
324
348
|
This will only get executed if the tags context
|
|
325
349
|
is properly informed
|
|
326
350
|
"""
|
|
327
|
-
|
|
351
|
+
table_tag_labels = super().get_tag_labels(table_name) or []
|
|
352
|
+
table_obj = self.get_table_obj(table_name=table_name)
|
|
353
|
+
if table_obj.labels:
|
|
354
|
+
for key, _ in table_obj.labels.items():
|
|
355
|
+
tag_label = get_tag_label(
|
|
356
|
+
metadata=self.metadata,
|
|
357
|
+
tag_name=key,
|
|
358
|
+
classification_name=key,
|
|
359
|
+
)
|
|
360
|
+
if tag_label:
|
|
361
|
+
table_tag_labels.append(tag_label)
|
|
362
|
+
return table_tag_labels
|
|
328
363
|
|
|
329
364
|
def get_column_tag_labels(
|
|
330
365
|
self, table_name: str, column: dict
|
|
@@ -343,68 +378,36 @@ class BigquerySource(CommonDbSourceService):
|
|
|
343
378
|
return None
|
|
344
379
|
|
|
345
380
|
def set_inspector(self, database_name: str):
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
if isinstance(
|
|
350
|
-
self.service_connection.credentials.gcpConfig, GcpCredentialsValues
|
|
351
|
-
):
|
|
352
|
-
self.service_connection.credentials.gcpConfig.projectId = SingleProjectId(
|
|
353
|
-
__root__=database_name
|
|
354
|
-
)
|
|
355
|
-
if self.service_connection.credentials.gcpImpersonateServiceAccount:
|
|
356
|
-
kwargs[
|
|
357
|
-
"impersonate_service_account"
|
|
358
|
-
] = (
|
|
359
|
-
self.service_connection.credentials.gcpImpersonateServiceAccount.impersonateServiceAccount
|
|
360
|
-
)
|
|
361
|
-
|
|
362
|
-
kwargs[
|
|
363
|
-
"lifetime"
|
|
364
|
-
] = (
|
|
365
|
-
self.service_connection.credentials.gcpImpersonateServiceAccount.lifetime
|
|
366
|
-
)
|
|
381
|
+
inspector_details = get_inspector_details(
|
|
382
|
+
database_name=database_name, service_connection=self.service_connection
|
|
383
|
+
)
|
|
367
384
|
|
|
368
|
-
self.client =
|
|
369
|
-
self.
|
|
385
|
+
self.client = inspector_details.client
|
|
386
|
+
self.engine = inspector_details.engine
|
|
387
|
+
self.inspector = inspector_details.inspector
|
|
370
388
|
|
|
371
389
|
def get_database_names(self) -> Iterable[str]:
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
if filter_by_database(
|
|
386
|
-
self.source_config.databaseFilterPattern,
|
|
387
|
-
database_fqn
|
|
388
|
-
if self.source_config.useFqnForFiltering
|
|
389
|
-
else database_name,
|
|
390
|
-
):
|
|
391
|
-
self.status.filter(database_fqn, "Database Filtered out")
|
|
392
|
-
continue
|
|
393
|
-
|
|
390
|
+
for project_id in self.project_ids:
|
|
391
|
+
database_fqn = fqn.build(
|
|
392
|
+
self.metadata,
|
|
393
|
+
entity_type=Database,
|
|
394
|
+
service_name=self.context.database_service.name.__root__,
|
|
395
|
+
database_name=project_id,
|
|
396
|
+
)
|
|
397
|
+
if filter_by_database(
|
|
398
|
+
self.source_config.databaseFilterPattern,
|
|
399
|
+
database_fqn if self.source_config.useFqnForFiltering else project_id,
|
|
400
|
+
):
|
|
401
|
+
self.status.filter(database_fqn, "Database Filtered out")
|
|
402
|
+
else:
|
|
394
403
|
try:
|
|
395
|
-
self.set_inspector(database_name=
|
|
396
|
-
|
|
397
|
-
database_name
|
|
398
|
-
)
|
|
399
|
-
yield database_name
|
|
404
|
+
self.set_inspector(database_name=project_id)
|
|
405
|
+
yield project_id
|
|
400
406
|
except Exception as exc:
|
|
401
407
|
logger.debug(traceback.format_exc())
|
|
402
408
|
logger.error(
|
|
403
|
-
f"Error trying to connect to database {
|
|
409
|
+
f"Error trying to connect to database {project_id}: {exc}"
|
|
404
410
|
)
|
|
405
|
-
else:
|
|
406
|
-
self.set_inspector(database_name=self.project_ids)
|
|
407
|
-
yield self.project_ids
|
|
408
411
|
|
|
409
412
|
def get_view_definition(
|
|
410
413
|
self, table_type: str, table_name: str, schema_name: str, inspector: Inspector
|
|
@@ -412,7 +415,9 @@ class BigquerySource(CommonDbSourceService):
|
|
|
412
415
|
if table_type == TableType.View:
|
|
413
416
|
try:
|
|
414
417
|
view_definition = inspector.get_view_definition(
|
|
415
|
-
|
|
418
|
+
fqn._build(
|
|
419
|
+
self.context.database.name.__root__, schema_name, table_name
|
|
420
|
+
)
|
|
416
421
|
)
|
|
417
422
|
view_definition = (
|
|
418
423
|
"" if view_definition is None else str(view_definition)
|
|
@@ -430,7 +435,7 @@ class BigquerySource(CommonDbSourceService):
|
|
|
430
435
|
check if the table is partitioned table and return the partition details
|
|
431
436
|
"""
|
|
432
437
|
database = self.context.database.name.__root__
|
|
433
|
-
table = self.client.get_table(
|
|
438
|
+
table = self.client.get_table(fqn._build(database, schema_name, table_name))
|
|
434
439
|
if table.time_partitioning is not None:
|
|
435
440
|
if table.time_partitioning.field:
|
|
436
441
|
table_partition = TablePartition(
|
|
@@ -45,7 +45,7 @@ BIGQUERY_TEST_STATEMENT = textwrap.dedent(
|
|
|
45
45
|
BIGQUERY_SCHEMA_DESCRIPTION = textwrap.dedent(
|
|
46
46
|
"""
|
|
47
47
|
SELECT option_value as schema_description FROM
|
|
48
|
-
{project_id}
|
|
48
|
+
`{project_id}`.`region-{region}`.INFORMATION_SCHEMA.SCHEMATA_OPTIONS
|
|
49
49
|
where schema_name = '{schema_name}' and option_name = 'description'
|
|
50
50
|
and option_value is not null
|
|
51
51
|
"""
|
|
@@ -53,6 +53,6 @@ BIGQUERY_SCHEMA_DESCRIPTION = textwrap.dedent(
|
|
|
53
53
|
|
|
54
54
|
BIGQUERY_TABLE_AND_TYPE = textwrap.dedent(
|
|
55
55
|
"""
|
|
56
|
-
select table_name, table_type from {}.INFORMATION_SCHEMA.TABLES where table_type != 'VIEW'
|
|
56
|
+
select table_name, table_type from `{project_id}`.{schema_name}.INFORMATION_SCHEMA.TABLES where table_type != 'VIEW'
|
|
57
57
|
"""
|
|
58
58
|
)
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
Handle big query usage extraction
|
|
13
13
|
"""
|
|
14
14
|
from abc import ABC
|
|
15
|
+
from copy import deepcopy
|
|
15
16
|
from datetime import datetime
|
|
16
17
|
|
|
17
18
|
from google import auth
|
|
@@ -25,7 +26,9 @@ from metadata.generated.schema.entity.services.connections.metadata.openMetadata
|
|
|
25
26
|
from metadata.generated.schema.metadataIngestion.workflow import (
|
|
26
27
|
Source as WorkflowSource,
|
|
27
28
|
)
|
|
28
|
-
from metadata.
|
|
29
|
+
from metadata.generated.schema.security.credentials.gcpValues import MultipleProjectId
|
|
30
|
+
from metadata.ingestion.api.steps import InvalidSourceException
|
|
31
|
+
from metadata.ingestion.source.database.bigquery.helper import get_inspector_details
|
|
29
32
|
from metadata.ingestion.source.database.query_parser_source import QueryParserSource
|
|
30
33
|
|
|
31
34
|
|
|
@@ -65,3 +68,18 @@ class BigqueryQueryParserSource(QueryParserSource, ABC):
|
|
|
65
68
|
def set_project_id():
|
|
66
69
|
_, project_id = auth.default()
|
|
67
70
|
return project_id
|
|
71
|
+
|
|
72
|
+
def get_engine(self):
|
|
73
|
+
if isinstance(
|
|
74
|
+
self.service_connection.credentials.gcpConfig.projectId, MultipleProjectId
|
|
75
|
+
):
|
|
76
|
+
project_ids = deepcopy(
|
|
77
|
+
self.service_connection.credentials.gcpConfig.projectId
|
|
78
|
+
)
|
|
79
|
+
for project_id in project_ids.__root__:
|
|
80
|
+
inspector_details = get_inspector_details(
|
|
81
|
+
project_id, self.service_connection
|
|
82
|
+
)
|
|
83
|
+
yield inspector_details.engine
|
|
84
|
+
else:
|
|
85
|
+
yield self.engine
|