openmetadata-ingestion 1.5.0.0rc1__py3-none-any.whl → 1.5.1.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.
- _openmetadata_testutils/kafka/__init__.py +0 -0
- _openmetadata_testutils/kafka/load_csv_data.py +133 -0
- _openmetadata_testutils/kafka/schema_registry_container.py +31 -0
- _openmetadata_testutils/postgres/conftest.py +5 -0
- _openmetadata_testutils/pydantic/test_utils.py +5 -4
- metadata/cli/app.py +0 -1
- metadata/cli/dataquality.py +0 -1
- metadata/cli/ingest.py +0 -1
- metadata/cli/profile.py +0 -1
- metadata/cli/usage.py +0 -1
- metadata/clients/domo_client.py +1 -1
- metadata/data_quality/validations/column/sqlalchemy/columnValueLengthsToBeBetween.py +7 -6
- metadata/data_quality/validations/column/sqlalchemy/columnValuesToBeBetween.py +7 -2
- metadata/data_quality/validations/table/sqlalchemy/tableDiff.py +44 -12
- metadata/generated/antlr/EntityLinkLexer.py +377 -379
- 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 +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/createAPICollection.py +1 -1
- metadata/generated/schema/api/data/createAPIEndpoint.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/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 +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/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/custom/__init__.py +1 -1
- metadata/generated/schema/api/dataInsight/custom/createDataInsightCustomChart.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/createApiService.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 +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/createTestCaseResolutionStatus.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/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 +1 -1
- metadata/generated/schema/configuration/changeEventConfiguration.py +1 -1
- metadata/generated/schema/configuration/dataQualityConfiguration.py +1 -1
- metadata/generated/schema/configuration/elasticSearchConfiguration.py +1 -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/limitsConfiguration.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 +1 -1
- metadata/generated/schema/configuration/slackAppConfiguration.py +18 -7
- metadata/generated/schema/configuration/taskNotificationConfiguration.py +1 -1
- metadata/generated/schema/configuration/testResultNotificationConfiguration.py +1 -1
- metadata/generated/schema/configuration/themeConfiguration.py +1 -1
- metadata/generated/schema/configuration/uiThemePreference.py +1 -1
- metadata/generated/schema/dataInsight/__init__.py +1 -1
- metadata/generated/schema/dataInsight/custom/__init__.py +1 -1
- metadata/generated/schema/dataInsight/custom/dataInsightCustomChart.py +2 -1
- metadata/generated/schema/dataInsight/custom/dataInsightCustomChartResult.py +1 -1
- metadata/generated/schema/dataInsight/custom/dataInsightCustomChartResultList.py +1 -1
- metadata/generated/schema/dataInsight/custom/formulaHolder.py +1 -1
- metadata/generated/schema/dataInsight/custom/lineChart.py +23 -2
- metadata/generated/schema/dataInsight/custom/summaryCard.py +8 -1
- metadata/generated/schema/dataInsight/dataInsightChart.py +1 -1
- metadata/generated/schema/dataInsight/dataInsightChartResult.py +1 -21
- 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/unusedAssets.py +1 -1
- metadata/generated/schema/email/__init__.py +1 -1
- metadata/generated/schema/email/emailRequest.py +1 -1
- metadata/generated/schema/email/emailTemplate.py +1 -1
- metadata/generated/schema/email/emailTemplatePlaceholder.py +1 -1
- metadata/generated/schema/email/smtpSettings.py +1 -1
- metadata/generated/schema/email/templateValidationReponse.py +1 -1
- 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 +1 -1
- metadata/generated/schema/entity/applications/configuration/external/__init__.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/automator/__init__.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/automator/addDescriptionAction.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/automator/addDomainAction.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/automator/addOwnerAction.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/automator/addTagsAction.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/automator/addTierAction.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/automator/lineagePropagationAction.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/automator/mlTaggingAction.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/automator/removeDescriptionAction.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/automator/removeDomainAction.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/automator/removeOwnerAction.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/automator/removeTagsAction.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/automator/removeTierAction.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/automatorAppConfig.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/metaPilotAppConfig.py +10 -2
- metadata/generated/schema/entity/applications/configuration/internal/__init__.py +1 -1
- metadata/generated/schema/entity/applications/configuration/internal/dataInsightsAppConfig.py +9 -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 +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/apiCollection.py +1 -1
- metadata/generated/schema/entity/data/apiEndpoint.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 +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 +2 -1
- 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 +1 -1
- metadata/generated/schema/entity/feed/customProperty.py +1 -1
- metadata/generated/schema/entity/feed/description.py +1 -1
- metadata/generated/schema/entity/feed/domain.py +1 -1
- metadata/generated/schema/entity/feed/entityInfo.py +1 -1
- metadata/generated/schema/entity/feed/owner.py +1 -1
- metadata/generated/schema/entity/feed/suggestion.py +1 -1
- metadata/generated/schema/entity/feed/tag.py +1 -1
- metadata/generated/schema/entity/feed/testCaseResult.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/apiService.py +1 -1
- metadata/generated/schema/entity/services/connections/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/apiService/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/apiService/restConnection.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 +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/lightdashConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/lookerConnection.py +7 -2
- 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 +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/powerbi/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/powerbi/azureConfig.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/powerbi/bucketDetails.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/powerbi/gcsConfig.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/powerbi/s3Config.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/qlikCloudConnection.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/bigTableConnection.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/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 +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/deltalake/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/database/deltalake/metastoreConfig.py +1 -1
- metadata/generated/schema/entity/services/connections/database/deltalake/storageConfig.py +1 -1
- metadata/generated/schema/entity/services/connections/database/domoDatabaseConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/dorisConnection.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/greenplumConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/hiveConnection.py +1 -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 +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/sapErpConnection.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 +2 -2
- metadata/generated/schema/entity/services/connections/database/sqliteConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/synapseConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/teradataConnection.py +2 -1
- metadata/generated/schema/entity/services/connections/database/trinoConnection.py +1 -1
- 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 +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/alationConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/metadata/alationSinkConnection.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/dbtCloudConnection.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/flinkConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/pipeline/gluePipelineConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/pipeline/kafkaConnectConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/pipeline/nifiConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/pipeline/openLineageConnection.py +1 -1
- 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 +1 -1
- metadata/generated/schema/entity/services/connections/testConnectionDefinition.py +2 -2
- 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/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 +1 -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 +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/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/api/testEventSubscriptionDestination.py +1 -1
- metadata/generated/schema/events/emailAlertConfig.py +1 -1
- metadata/generated/schema/events/eventFilterRule.py +1 -1
- metadata/generated/schema/events/eventSubscription.py +1 -1
- 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 +1 -1
- metadata/generated/schema/metadataIngestion/dataInsightPipeline.py +1 -1
- metadata/generated/schema/metadataIngestion/databaseServiceMetadataPipeline.py +2 -2
- 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/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 +7 -5
- 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/credentials/gitlabCredentials.py +34 -0
- metadata/generated/schema/security/sasl/__init__.py +1 -1
- metadata/generated/schema/security/sasl/saslClientConfig.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 +2 -1
- metadata/generated/schema/system/__init__.py +1 -1
- metadata/generated/schema/system/entityError.py +1 -1
- metadata/generated/schema/system/eventPublisherJob.py +5 -1
- metadata/generated/schema/system/indexingError.py +1 -1
- metadata/generated/schema/system/limitsResponse.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 +20 -20
- metadata/generated/schema/tests/customMetric.py +1 -1
- metadata/generated/schema/tests/dataQualityReport.py +1 -1
- metadata/generated/schema/tests/resolved.py +1 -1
- metadata/generated/schema/tests/testCase.py +1 -1
- metadata/generated/schema/tests/testCaseResolutionStatus.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/apiSchema.py +1 -1
- metadata/generated/schema/type/auditLog.py +1 -1
- metadata/generated/schema/type/basic.py +1 -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 +1 -1
- metadata/generated/schema/type/customProperties/enumConfig.py +1 -1
- metadata/generated/schema/type/customProperty.py +1 -1
- metadata/generated/schema/type/dailyCount.py +1 -1
- metadata/generated/schema/type/databaseConnectionConfig.py +1 -1
- metadata/generated/schema/type/entityHierarchy.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/lifeCycle.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/great_expectations/action.py +1 -1
- metadata/ingestion/connections/builders.py +6 -0
- metadata/ingestion/connections/test_connections.py +5 -0
- metadata/ingestion/lineage/models.py +4 -0
- metadata/ingestion/ometa/mixins/ingestion_pipeline_mixin.py +1 -1
- metadata/ingestion/source/connections.py +19 -0
- metadata/ingestion/source/dashboard/domodashboard/metadata.py +3 -3
- metadata/ingestion/source/dashboard/looker/metadata.py +8 -3
- metadata/ingestion/source/dashboard/looker/utils.py +6 -3
- metadata/ingestion/source/dashboard/metabase/client.py +2 -1
- metadata/ingestion/source/dashboard/powerbi/metadata.py +2 -1
- metadata/ingestion/source/dashboard/qlikcloud/client.py +1 -1
- metadata/ingestion/source/dashboard/superset/mixin.py +5 -0
- metadata/ingestion/source/dashboard/tableau/metadata.py +10 -7
- metadata/ingestion/source/database/bigquery/metadata.py +5 -1
- metadata/ingestion/source/database/column_type_parser.py +3 -2
- metadata/ingestion/source/database/common_db_source.py +9 -4
- metadata/ingestion/source/database/database_service.py +1 -1
- metadata/ingestion/source/database/databricks/lineage.py +2 -2
- metadata/ingestion/source/database/databricks/metadata.py +100 -18
- metadata/ingestion/source/database/databricks/queries.py +3 -1
- metadata/ingestion/source/database/databricks/usage.py +2 -2
- metadata/ingestion/source/database/datalake/clients/gcs.py +4 -0
- metadata/ingestion/source/database/db2/metadata.py +8 -1
- metadata/ingestion/source/database/dbt/constants.py +1 -7
- metadata/ingestion/source/database/dbt/dbt_config.py +18 -19
- metadata/ingestion/source/database/dbt/dbt_service.py +4 -3
- metadata/ingestion/source/database/dbt/metadata.py +14 -3
- metadata/ingestion/source/database/dbt/models.py +2 -2
- metadata/ingestion/source/database/mssql/lineage.py +0 -4
- metadata/ingestion/source/database/mssql/metadata.py +1 -1
- metadata/ingestion/source/database/mssql/usage.py +42 -0
- metadata/ingestion/source/database/oracle/metadata.py +7 -0
- metadata/ingestion/source/database/oracle/queries.py +45 -11
- metadata/ingestion/source/database/oracle/utils.py +33 -0
- metadata/ingestion/source/database/postgres/converter_orm.py +52 -0
- metadata/ingestion/source/database/postgres/metadata.py +6 -0
- metadata/ingestion/source/database/postgres/metrics.py +42 -0
- metadata/ingestion/source/database/postgres/types/money.py +37 -0
- metadata/ingestion/source/database/postgres/usage.py +6 -0
- metadata/ingestion/source/database/redshift/connection.py +37 -9
- metadata/ingestion/source/database/redshift/queries.py +4 -5
- metadata/ingestion/source/database/unitycatalog/client.py +21 -0
- metadata/ingestion/source/database/unitycatalog/metadata.py +58 -22
- metadata/ingestion/source/pipeline/dagster/metadata.py +17 -14
- metadata/ingestion/source/pipeline/dbtcloud/client.py +29 -4
- metadata/ingestion/source/pipeline/dbtcloud/metadata.py +94 -71
- metadata/ingestion/source/pipeline/dbtcloud/models.py +6 -6
- metadata/ingestion/source/pipeline/dbtcloud/queries.py +22 -11
- metadata/ingestion/source/pipeline/domopipeline/metadata.py +1 -1
- metadata/ingestion/source/pipeline/fivetran/client.py +2 -1
- metadata/ingestion/source/storage/gcs/client.py +4 -9
- metadata/ingestion/source/storage/gcs/metadata.py +4 -0
- metadata/profiler/interface/sqlalchemy/profiler_interface.py +23 -1
- metadata/profiler/metrics/composed/null_ratio.py +5 -8
- metadata/profiler/metrics/hybrid/histogram.py +9 -3
- metadata/profiler/metrics/static/mean.py +8 -9
- metadata/profiler/metrics/static/null_count.py +4 -2
- metadata/profiler/orm/functions/median.py +11 -4
- metadata/profiler/orm/functions/sum.py +1 -1
- metadata/profiler/orm/functions/table_metric_computer.py +2 -2
- metadata/profiler/orm/registry.py +14 -1
- metadata/profiler/processor/default.py +4 -1
- metadata/profiler/processor/sampler/sampler_factory.py +9 -0
- metadata/profiler/processor/sampler/sqlalchemy/azuresql/sampler.py +40 -0
- metadata/profiler/source/base/profiler_source.py +1 -0
- metadata/readers/file/api_reader.py +4 -1
- metadata/readers/file/gitlab.py +172 -0
- metadata/utils/helpers.py +4 -1
- metadata/utils/importer.py +26 -0
- {openmetadata_ingestion-1.5.0.0rc1.dist-info → openmetadata_ingestion-1.5.1.0.dist-info}/METADATA +353 -346
- {openmetadata_ingestion-1.5.0.0rc1.dist-info → openmetadata_ingestion-1.5.1.0.dist-info}/RECORD +670 -667
- metadata/generated/schema/dataInsight/type/percentageOfEntitiesWithDescriptionByType.py +0 -48
- metadata/generated/schema/dataInsight/type/percentageOfEntitiesWithOwnerByType.py +0 -44
- metadata/generated/schema/dataInsight/type/percentageOfServicesWithDescription.py +0 -46
- metadata/generated/schema/dataInsight/type/percentageOfServicesWithOwner.py +0 -44
- metadata/generated/schema/dataInsight/type/totalEntitiesByTier.py +0 -39
- metadata/generated/schema/dataInsight/type/totalEntitiesByType.py +0 -40
- {openmetadata_ingestion-1.5.0.0rc1.dist-info → openmetadata_ingestion-1.5.1.0.dist-info}/LICENSE +0 -0
- {openmetadata_ingestion-1.5.0.0rc1.dist-info → openmetadata_ingestion-1.5.1.0.dist-info}/WHEEL +0 -0
- {openmetadata_ingestion-1.5.0.0rc1.dist-info → openmetadata_ingestion-1.5.1.0.dist-info}/entry_points.txt +0 -0
- {openmetadata_ingestion-1.5.0.0rc1.dist-info → openmetadata_ingestion-1.5.1.0.dist-info}/top_level.txt +0 -0
|
@@ -16,11 +16,12 @@ supporting sqlalchemy abstraction layer
|
|
|
16
16
|
"""
|
|
17
17
|
|
|
18
18
|
import concurrent.futures
|
|
19
|
+
import math
|
|
19
20
|
import threading
|
|
20
21
|
import traceback
|
|
21
22
|
from collections import defaultdict
|
|
22
23
|
from datetime import datetime
|
|
23
|
-
from typing import Dict, List, Optional
|
|
24
|
+
from typing import Any, Dict, List, Optional
|
|
24
25
|
|
|
25
26
|
from sqlalchemy import Column, inspect, text
|
|
26
27
|
from sqlalchemy.exc import DBAPIError, ProgrammingError, ResourceClosedError
|
|
@@ -450,6 +451,16 @@ class SQAProfilerInterface(ProfilerInterface, SQAInterfaceMixin):
|
|
|
450
451
|
column=metric_func.column,
|
|
451
452
|
sample=sample,
|
|
452
453
|
)
|
|
454
|
+
if row and isinstance(row, dict):
|
|
455
|
+
row = self._validate_nulls(row)
|
|
456
|
+
|
|
457
|
+
# System metrics return a list of dictionaries, with UPDATE, INSERT or DELETE ops results
|
|
458
|
+
if row and metric_func.metric_type == MetricTypes.System:
|
|
459
|
+
row = [
|
|
460
|
+
self._validate_nulls(r) if isinstance(r, dict) else r
|
|
461
|
+
for r in row
|
|
462
|
+
]
|
|
463
|
+
|
|
453
464
|
except Exception as exc:
|
|
454
465
|
error = (
|
|
455
466
|
f"{metric_func.column if metric_func.column is not None else metric_func.table.__tablename__} "
|
|
@@ -467,6 +478,17 @@ class SQAProfilerInterface(ProfilerInterface, SQAInterfaceMixin):
|
|
|
467
478
|
|
|
468
479
|
return row, column, metric_func.metric_type.value
|
|
469
480
|
|
|
481
|
+
@staticmethod
|
|
482
|
+
def _validate_nulls(row: Dict[str, Any]) -> Dict[str, Any]:
|
|
483
|
+
"""Detect if we are computing NaNs and replace them with None"""
|
|
484
|
+
for k, v in row.items():
|
|
485
|
+
if isinstance(v, float) and math.isnan(v):
|
|
486
|
+
logger.warning(
|
|
487
|
+
"NaN data detected and will be cast to null in OpenMetadata to maintain database parity"
|
|
488
|
+
)
|
|
489
|
+
row[k] = None
|
|
490
|
+
return row
|
|
491
|
+
|
|
470
492
|
# pylint: disable=use-dict-literal
|
|
471
493
|
def get_all_metrics(
|
|
472
494
|
self,
|
|
@@ -49,12 +49,9 @@ class NullRatio(ComposedMetric):
|
|
|
49
49
|
Safely compute null ratio based on the profiler
|
|
50
50
|
results of other Metrics
|
|
51
51
|
"""
|
|
52
|
-
import pandas as pd
|
|
53
52
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
return None if pd.isnull(result) else result
|
|
60
|
-
return None
|
|
53
|
+
count = res.get(Count.name())
|
|
54
|
+
null_count = res.get(NullCount.name())
|
|
55
|
+
if count + null_count == 0:
|
|
56
|
+
return None
|
|
57
|
+
return null_count / (null_count + count)
|
|
@@ -25,7 +25,11 @@ from metadata.profiler.metrics.static.count import Count
|
|
|
25
25
|
from metadata.profiler.metrics.static.max import Max
|
|
26
26
|
from metadata.profiler.metrics.static.min import Min
|
|
27
27
|
from metadata.profiler.orm.functions.length import LenFn
|
|
28
|
-
from metadata.profiler.orm.registry import
|
|
28
|
+
from metadata.profiler.orm.registry import (
|
|
29
|
+
is_concatenable,
|
|
30
|
+
is_quantifiable,
|
|
31
|
+
is_value_non_numeric,
|
|
32
|
+
)
|
|
29
33
|
from metadata.utils.helpers import format_large_string_numbers
|
|
30
34
|
from metadata.utils.logger import profiler_logger
|
|
31
35
|
|
|
@@ -120,7 +124,6 @@ class Histogram(HybridMetric):
|
|
|
120
124
|
# freedman-diaconis rule
|
|
121
125
|
bin_width = self._get_bin_width(float(res_iqr), res_row_count) # type: ignore
|
|
122
126
|
num_bins = math.ceil((res_max - res_min) / bin_width) # type: ignore
|
|
123
|
-
|
|
124
127
|
# sturge's rule
|
|
125
128
|
if res_iqr is None or num_bins > max_bin_count:
|
|
126
129
|
num_bins = int(math.ceil(math.log2(res_row_count) + 1))
|
|
@@ -148,7 +151,10 @@ class Histogram(HybridMetric):
|
|
|
148
151
|
"We are missing the session attribute to compute the Histogram."
|
|
149
152
|
)
|
|
150
153
|
|
|
151
|
-
if not (is_quantifiable(self.col.type) or is_concatenable(self.col.type))
|
|
154
|
+
if not (is_quantifiable(self.col.type) or is_concatenable(self.col.type)) or (
|
|
155
|
+
is_value_non_numeric(res.get(Min.name()))
|
|
156
|
+
or is_value_non_numeric(res.get(Max.name()))
|
|
157
|
+
):
|
|
152
158
|
return None
|
|
153
159
|
|
|
154
160
|
# get the metric need for the freedman-diaconis rule
|
|
@@ -15,7 +15,7 @@ AVG Metric definition
|
|
|
15
15
|
from functools import partial
|
|
16
16
|
from typing import Callable, List, Optional, cast
|
|
17
17
|
|
|
18
|
-
from sqlalchemy import column
|
|
18
|
+
from sqlalchemy import column
|
|
19
19
|
from sqlalchemy.ext.compiler import compiles
|
|
20
20
|
from sqlalchemy.sql.functions import GenericFunction
|
|
21
21
|
|
|
@@ -39,20 +39,19 @@ from metadata.utils.logger import profiler_logger
|
|
|
39
39
|
logger = profiler_logger()
|
|
40
40
|
|
|
41
41
|
|
|
42
|
-
|
|
43
|
-
class avg(GenericFunction):
|
|
42
|
+
class AvgFn(GenericFunction):
|
|
44
43
|
name = "avg"
|
|
45
44
|
inherit_cache = CACHE
|
|
46
45
|
|
|
47
46
|
|
|
48
|
-
@compiles(
|
|
47
|
+
@compiles(AvgFn, Dialects.ClickHouse)
|
|
49
48
|
def _(element, compiler, **kw):
|
|
50
49
|
"""Handle case for empty table. If empty, clickhouse returns NaN"""
|
|
51
50
|
proc = compiler.process(element.clauses, **kw)
|
|
52
51
|
return f"if(isNaN(avg({proc})), null, avg({proc}))"
|
|
53
52
|
|
|
54
53
|
|
|
55
|
-
@compiles(
|
|
54
|
+
@compiles(AvgFn, Dialects.Redshift)
|
|
56
55
|
def _(element, compiler, **kw):
|
|
57
56
|
"""
|
|
58
57
|
Cast to decimal to get around potential integer overflow error
|
|
@@ -61,7 +60,7 @@ def _(element, compiler, **kw):
|
|
|
61
60
|
return f"avg(CAST({proc} AS DECIMAL(38,0)))"
|
|
62
61
|
|
|
63
62
|
|
|
64
|
-
@compiles(
|
|
63
|
+
@compiles(AvgFn, Dialects.MSSQL)
|
|
65
64
|
def _(element, compiler, **kw):
|
|
66
65
|
"""
|
|
67
66
|
Cast to decimal to get around potential integer overflow error -
|
|
@@ -71,7 +70,7 @@ def _(element, compiler, **kw):
|
|
|
71
70
|
return f"avg(cast({proc} as decimal))"
|
|
72
71
|
|
|
73
72
|
|
|
74
|
-
@compiles(
|
|
73
|
+
@compiles(AvgFn, Dialects.Trino)
|
|
75
74
|
def _(element, compiler, **kw):
|
|
76
75
|
proc = compiler.process(element.clauses, **kw)
|
|
77
76
|
first_clause = element.clauses.clauses[0]
|
|
@@ -108,10 +107,10 @@ class Mean(StaticMetric):
|
|
|
108
107
|
def fn(self):
|
|
109
108
|
"""sqlalchemy function"""
|
|
110
109
|
if is_quantifiable(self.col.type):
|
|
111
|
-
return
|
|
110
|
+
return AvgFn(column(self.col.name, self.col.type))
|
|
112
111
|
|
|
113
112
|
if is_concatenable(self.col.type):
|
|
114
|
-
return
|
|
113
|
+
return AvgFn(LenFn(column(self.col.name, self.col.type)))
|
|
115
114
|
|
|
116
115
|
logger.debug(
|
|
117
116
|
f"Don't know how to process type {self.col.type} when computing MEAN"
|
|
@@ -16,6 +16,7 @@ Null Count Metric definition
|
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
from sqlalchemy import case, column
|
|
19
|
+
from sqlalchemy.sql.functions import coalesce
|
|
19
20
|
|
|
20
21
|
from metadata.generated.schema.configuration.profilerConfiguration import MetricType
|
|
21
22
|
from metadata.profiler.metrics.core import StaticMetric, _label
|
|
@@ -48,8 +49,9 @@ class NullCount(StaticMetric):
|
|
|
48
49
|
@_label
|
|
49
50
|
def fn(self):
|
|
50
51
|
"""sqlalchemy function"""
|
|
51
|
-
return
|
|
52
|
-
case([(column(self.col.name, self.col.type).is_(None), 1)], else_=0)
|
|
52
|
+
return coalesce(
|
|
53
|
+
SumFn(case([(column(self.col.name, self.col.type).is_(None), 1)], else_=0)),
|
|
54
|
+
0,
|
|
53
55
|
)
|
|
54
56
|
|
|
55
57
|
def df_fn(self, dfs=None):
|
|
@@ -28,12 +28,19 @@ logger = profiler_logger()
|
|
|
28
28
|
class MedianFn(FunctionElement):
|
|
29
29
|
inherit_cache = CACHE
|
|
30
30
|
|
|
31
|
+
@staticmethod
|
|
32
|
+
def default_fn(elements, compiler, **kwargs): # pylint: disable=unused-argument
|
|
33
|
+
col = compiler.process(elements.clauses.clauses[0])
|
|
34
|
+
percentile = elements.clauses.clauses[2].value
|
|
35
|
+
return "percentile_cont(%.2f) WITHIN GROUP (ORDER BY %s ASC)" % (
|
|
36
|
+
percentile,
|
|
37
|
+
col,
|
|
38
|
+
)
|
|
39
|
+
|
|
31
40
|
|
|
32
41
|
@compiles(MedianFn)
|
|
33
|
-
def _(elements, compiler, **kwargs):
|
|
34
|
-
|
|
35
|
-
percentile = elements.clauses.clauses[2].value
|
|
36
|
-
return "percentile_cont(%.2f) WITHIN GROUP (ORDER BY %s ASC)" % (percentile, col)
|
|
42
|
+
def _(elements, compiler, **kwargs):
|
|
43
|
+
return MedianFn.default_fn(elements, compiler, **kwargs)
|
|
37
44
|
|
|
38
45
|
|
|
39
46
|
@compiles(MedianFn, Dialects.BigQuery)
|
|
@@ -45,7 +45,7 @@ def _(element, compiler, **kw):
|
|
|
45
45
|
def _(element, compiler, **kw):
|
|
46
46
|
"""Cast to DECIMAL to address cannot cast nan to bigint"""
|
|
47
47
|
proc = compiler.process(element.clauses, **kw)
|
|
48
|
-
return f"SUM(
|
|
48
|
+
return f"COALESCE(SUM(CAST({proc} AS DECIMAL)),0)"
|
|
49
49
|
|
|
50
50
|
|
|
51
51
|
@compiles(SumFn, Dialects.BigQuery)
|
|
@@ -194,7 +194,7 @@ class OracleTableMetricComputer(BaseTableMetricComputer):
|
|
|
194
194
|
Column("object_name").label("table_name"),
|
|
195
195
|
Column("created"),
|
|
196
196
|
],
|
|
197
|
-
self._build_table("
|
|
197
|
+
self._build_table("DBA_OBJECTS", None),
|
|
198
198
|
[
|
|
199
199
|
func.lower(Column("owner")) == self.schema_name.lower(),
|
|
200
200
|
func.lower(Column("object_name")) == self.table_name.lower(),
|
|
@@ -209,7 +209,7 @@ class OracleTableMetricComputer(BaseTableMetricComputer):
|
|
|
209
209
|
Column("table_name"),
|
|
210
210
|
Column("NUM_ROWS"),
|
|
211
211
|
],
|
|
212
|
-
self._build_table("
|
|
212
|
+
self._build_table("DBA_TABLES", None),
|
|
213
213
|
[
|
|
214
214
|
func.lower(Column("owner")) == self.schema_name.lower(),
|
|
215
215
|
func.lower(Column("table_name")) == self.table_name.lower(),
|
|
@@ -13,6 +13,8 @@
|
|
|
13
13
|
Custom types' registry for easy access
|
|
14
14
|
without having an import mess
|
|
15
15
|
"""
|
|
16
|
+
import math
|
|
17
|
+
|
|
16
18
|
import sqlalchemy
|
|
17
19
|
from sqlalchemy import Date, DateTime, Integer, Numeric, Time
|
|
18
20
|
from sqlalchemy.sql.sqltypes import Concatenable, Enum
|
|
@@ -160,7 +162,9 @@ def is_quantifiable(_type) -> bool:
|
|
|
160
162
|
"""
|
|
161
163
|
if isinstance(_type, DataType):
|
|
162
164
|
return _type.value in QUANTIFIABLE_SET
|
|
163
|
-
return
|
|
165
|
+
return (
|
|
166
|
+
is_numeric(_type) or is_integer(_type) or getattr(_type, "quantifiable", False)
|
|
167
|
+
)
|
|
164
168
|
|
|
165
169
|
|
|
166
170
|
def is_concatenable(_type) -> bool:
|
|
@@ -171,3 +175,12 @@ def is_concatenable(_type) -> bool:
|
|
|
171
175
|
if isinstance(_type, DataType):
|
|
172
176
|
return _type.value in CONCATENABLE_SET
|
|
173
177
|
return issubclass(_type.__class__, Concatenable)
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
def is_value_non_numeric(value) -> bool:
|
|
181
|
+
try:
|
|
182
|
+
if isinstance(value, float) and (math.isnan(value) or math.isinf(value)):
|
|
183
|
+
return True
|
|
184
|
+
return False
|
|
185
|
+
except Exception:
|
|
186
|
+
return False
|
|
@@ -77,9 +77,12 @@ class DefaultProfiler(Profiler):
|
|
|
77
77
|
include_columns: Optional[List[ColumnProfilerConfig]] = None,
|
|
78
78
|
exclude_columns: Optional[List[str]] = None,
|
|
79
79
|
global_profiler_configuration: Optional[ProfilerConfiguration] = None,
|
|
80
|
+
db_service=None,
|
|
80
81
|
):
|
|
81
82
|
_metrics = get_default_metrics(
|
|
82
|
-
table=profiler_interface.table,
|
|
83
|
+
table=profiler_interface.table,
|
|
84
|
+
ometa_client=profiler_interface.ometa_client,
|
|
85
|
+
db_service=db_service,
|
|
83
86
|
)
|
|
84
87
|
|
|
85
88
|
super().__init__(
|
|
@@ -15,6 +15,9 @@ Factory class for creating sampler objects
|
|
|
15
15
|
|
|
16
16
|
from typing import Union
|
|
17
17
|
|
|
18
|
+
from metadata.generated.schema.entity.services.connections.database.azureSQLConnection import (
|
|
19
|
+
AzureSQLConnection,
|
|
20
|
+
)
|
|
18
21
|
from metadata.generated.schema.entity.services.connections.database.bigQueryConnection import (
|
|
19
22
|
BigQueryConnection,
|
|
20
23
|
)
|
|
@@ -36,6 +39,9 @@ from metadata.generated.schema.entity.services.connections.database.trinoConnect
|
|
|
36
39
|
from metadata.generated.schema.entity.services.databaseService import DatabaseConnection
|
|
37
40
|
from metadata.profiler.processor.sampler.nosql.sampler import NoSQLSampler
|
|
38
41
|
from metadata.profiler.processor.sampler.pandas.sampler import DatalakeSampler
|
|
42
|
+
from metadata.profiler.processor.sampler.sqlalchemy.azuresql.sampler import (
|
|
43
|
+
AzureSQLSampler,
|
|
44
|
+
)
|
|
39
45
|
from metadata.profiler.processor.sampler.sqlalchemy.bigquery.sampler import (
|
|
40
46
|
BigQuerySampler,
|
|
41
47
|
)
|
|
@@ -89,3 +95,6 @@ sampler_factory_.register(
|
|
|
89
95
|
sampler_factory_.register(
|
|
90
96
|
source_type=DynamoDBConnection.__name__, sampler_class=NoSQLSampler
|
|
91
97
|
)
|
|
98
|
+
sampler_factory_.register(
|
|
99
|
+
source_type=AzureSQLConnection.__name__, sampler_class=AzureSQLSampler
|
|
100
|
+
)
|
|
@@ -0,0 +1,40 @@
|
|
|
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
|
+
Helper module to handle data sampling
|
|
13
|
+
for the profiler
|
|
14
|
+
"""
|
|
15
|
+
from typing import List, Optional
|
|
16
|
+
|
|
17
|
+
from sqlalchemy import Column
|
|
18
|
+
|
|
19
|
+
from metadata.generated.schema.entity.data.table import TableData
|
|
20
|
+
from metadata.profiler.processor.sampler.sqlalchemy.sampler import SQASampler
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class AzureSQLSampler(SQASampler):
|
|
24
|
+
"""
|
|
25
|
+
Generates a sample of the data to not
|
|
26
|
+
run the query in the whole table.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
# These types are not supported by pyodbc - it throws
|
|
30
|
+
# an error when trying to fetch data from these columns
|
|
31
|
+
# pyodbc.ProgrammingError: ('ODBC SQL type -151 is not yet supported. column-index=x type=-151', 'HY106')
|
|
32
|
+
NOT_COMPUTE_PYODBC = {"SQASGeography", "UndeterminedType"}
|
|
33
|
+
|
|
34
|
+
def fetch_sample_data(self, columns: Optional[List[Column]] = None) -> TableData:
|
|
35
|
+
sqa_columns = []
|
|
36
|
+
if columns:
|
|
37
|
+
for col in columns:
|
|
38
|
+
if col.type.__class__.__name__ not in self.NOT_COMPUTE_PYODBC:
|
|
39
|
+
sqa_columns.append(col)
|
|
40
|
+
return super().fetch_sample_data(sqa_columns or columns)
|
|
@@ -277,6 +277,7 @@ class ProfilerSource(ProfilerSourceInterface):
|
|
|
277
277
|
include_columns=self._get_include_columns(entity, table_config),
|
|
278
278
|
exclude_columns=self._get_exclude_columns(entity, table_config),
|
|
279
279
|
global_profiler_configuration=self.global_profiler_configuration,
|
|
280
|
+
db_service=db_service,
|
|
280
281
|
)
|
|
281
282
|
|
|
282
283
|
metrics = (
|
|
@@ -21,12 +21,15 @@ from metadata.generated.schema.security.credentials.bitbucketCredentials import
|
|
|
21
21
|
from metadata.generated.schema.security.credentials.githubCredentials import (
|
|
22
22
|
GitHubCredentials,
|
|
23
23
|
)
|
|
24
|
+
from metadata.generated.schema.security.credentials.gitlabCredentials import (
|
|
25
|
+
GitlabCredentials,
|
|
26
|
+
)
|
|
24
27
|
from metadata.readers.file.base import Reader
|
|
25
28
|
from metadata.utils.logger import ingestion_logger
|
|
26
29
|
|
|
27
30
|
logger = ingestion_logger()
|
|
28
31
|
|
|
29
|
-
ReadersCredentials = Union[GitHubCredentials, BitBucketCredentials]
|
|
32
|
+
ReadersCredentials = Union[GitHubCredentials, BitBucketCredentials, GitlabCredentials]
|
|
30
33
|
|
|
31
34
|
|
|
32
35
|
class ApiReader(Reader, ABC):
|
|
@@ -0,0 +1,172 @@
|
|
|
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
|
+
Gitlab client to read files with token auth
|
|
13
|
+
"""
|
|
14
|
+
import base64
|
|
15
|
+
import traceback
|
|
16
|
+
from enum import Enum
|
|
17
|
+
from typing import Any, Dict, List, Optional
|
|
18
|
+
from urllib.parse import quote_plus
|
|
19
|
+
|
|
20
|
+
import requests
|
|
21
|
+
|
|
22
|
+
from metadata.generated.schema.security.credentials.gitlabCredentials import (
|
|
23
|
+
GitlabCredentials,
|
|
24
|
+
)
|
|
25
|
+
from metadata.readers.file.api_reader import ApiReader
|
|
26
|
+
from metadata.readers.file.base import ReadException
|
|
27
|
+
from metadata.utils.constants import UTF_8
|
|
28
|
+
from metadata.utils.logger import ingestion_logger
|
|
29
|
+
|
|
30
|
+
logger = ingestion_logger()
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
HOST = "https://gitlab.com/api/v4"
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class UrlParts(Enum):
|
|
37
|
+
FILES = "files"
|
|
38
|
+
PROJECTS = "projects"
|
|
39
|
+
REPOSITORY = "repository"
|
|
40
|
+
TREE = "tree"
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class GitlabReader(ApiReader):
|
|
44
|
+
"""
|
|
45
|
+
Handle calls to the Gitlab API against a repo
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
credentials: GitlabCredentials
|
|
49
|
+
|
|
50
|
+
def __init__(self, credentials):
|
|
51
|
+
super().__init__(credentials)
|
|
52
|
+
self._encoded_project_path = None
|
|
53
|
+
|
|
54
|
+
@property
|
|
55
|
+
def auth_headers(self) -> Dict[str, str]:
|
|
56
|
+
"""
|
|
57
|
+
Build the headers to authenticate
|
|
58
|
+
to the API
|
|
59
|
+
"""
|
|
60
|
+
if self._auth_headers is None and self.credentials.token:
|
|
61
|
+
self._auth_headers = {
|
|
62
|
+
"PRIVATE-TOKEN": self.credentials.token.root.get_secret_value()
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return self._auth_headers
|
|
66
|
+
|
|
67
|
+
@property
|
|
68
|
+
def encoded_project_path(self) -> str:
|
|
69
|
+
"""
|
|
70
|
+
Build the URL-encoded project path for the Gitlab API
|
|
71
|
+
"""
|
|
72
|
+
if (
|
|
73
|
+
self._encoded_project_path is None
|
|
74
|
+
and self.credentials.repositoryOwner.root
|
|
75
|
+
and self.credentials.repositoryName.root
|
|
76
|
+
):
|
|
77
|
+
self._encoded_project_path = quote_plus(
|
|
78
|
+
"/".join(
|
|
79
|
+
[
|
|
80
|
+
self.credentials.repositoryOwner.root,
|
|
81
|
+
self.credentials.repositoryName.root,
|
|
82
|
+
]
|
|
83
|
+
)
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
return self._encoded_project_path
|
|
87
|
+
|
|
88
|
+
@staticmethod
|
|
89
|
+
def _decode_content(json_response: Dict[str, Any]) -> str:
|
|
90
|
+
"""
|
|
91
|
+
Return the content of the response
|
|
92
|
+
|
|
93
|
+
If no `content` there, throw the KeyError
|
|
94
|
+
"""
|
|
95
|
+
return base64.b64decode(json_response["content"]).decode(UTF_8)
|
|
96
|
+
|
|
97
|
+
def read(self, path: str, **__) -> str:
|
|
98
|
+
"""
|
|
99
|
+
Read a file from a Gitlab Repo and return its
|
|
100
|
+
contents as a string
|
|
101
|
+
https://docs.gitlab.com/ee/api/repository_files.html
|
|
102
|
+
"""
|
|
103
|
+
encoded_file_path = quote_plus(path)
|
|
104
|
+
branch = self._get_default_branch()
|
|
105
|
+
try:
|
|
106
|
+
res = requests.get(
|
|
107
|
+
self._build_url(
|
|
108
|
+
HOST,
|
|
109
|
+
UrlParts.PROJECTS.value,
|
|
110
|
+
self.encoded_project_path,
|
|
111
|
+
UrlParts.REPOSITORY.value,
|
|
112
|
+
UrlParts.FILES.value,
|
|
113
|
+
f"{encoded_file_path}?ref={branch}",
|
|
114
|
+
),
|
|
115
|
+
headers=self.auth_headers,
|
|
116
|
+
timeout=30,
|
|
117
|
+
)
|
|
118
|
+
if res.status_code == 200:
|
|
119
|
+
return self._decode_content(res.json())
|
|
120
|
+
|
|
121
|
+
# If we don't get a 200, raise
|
|
122
|
+
res.raise_for_status()
|
|
123
|
+
|
|
124
|
+
except Exception as err:
|
|
125
|
+
logger.debug(traceback.format_exc())
|
|
126
|
+
raise ReadException(f"Error fetching file [{path}] from repo: {err}")
|
|
127
|
+
|
|
128
|
+
raise ReadException(f"Could not fetch file [{path}] from repo")
|
|
129
|
+
|
|
130
|
+
def _get_default_branch(self) -> str:
|
|
131
|
+
"""
|
|
132
|
+
Get repo default branch
|
|
133
|
+
"""
|
|
134
|
+
res = requests.get(
|
|
135
|
+
self._build_url(HOST, UrlParts.PROJECTS.value, self.encoded_project_path),
|
|
136
|
+
headers=self.auth_headers,
|
|
137
|
+
timeout=30,
|
|
138
|
+
)
|
|
139
|
+
if res.status_code == 200:
|
|
140
|
+
return res.json().get("default_branch")
|
|
141
|
+
|
|
142
|
+
# If we don't get a 200, raise
|
|
143
|
+
res.raise_for_status()
|
|
144
|
+
raise RuntimeError("Could not fetch the default branch")
|
|
145
|
+
|
|
146
|
+
def _get_tree(self, url: str = None) -> Optional[List[str]]:
|
|
147
|
+
"""
|
|
148
|
+
Use the Gitlab Repository Tree API to iterate over tree pages recursively
|
|
149
|
+
"""
|
|
150
|
+
if url is None:
|
|
151
|
+
url = self._build_url(
|
|
152
|
+
HOST,
|
|
153
|
+
UrlParts.PROJECTS.value,
|
|
154
|
+
self.encoded_project_path,
|
|
155
|
+
UrlParts.REPOSITORY.value,
|
|
156
|
+
f"{UrlParts.TREE.value}?recursive=true&pagination=keyset&per_page=100&order_by=path&sort=desc",
|
|
157
|
+
)
|
|
158
|
+
res = requests.get(
|
|
159
|
+
url,
|
|
160
|
+
headers=self.auth_headers,
|
|
161
|
+
timeout=30,
|
|
162
|
+
)
|
|
163
|
+
if res.status_code == 200:
|
|
164
|
+
paths = [elem.get("path") for elem in res.json()]
|
|
165
|
+
if res.links.get("next"):
|
|
166
|
+
paths.extend(self._get_tree(res.links["next"]["url"]))
|
|
167
|
+
return paths
|
|
168
|
+
|
|
169
|
+
# If we don't get a 200, raise
|
|
170
|
+
res.raise_for_status()
|
|
171
|
+
|
|
172
|
+
return None
|
metadata/utils/helpers.py
CHANGED
|
@@ -106,8 +106,11 @@ def pretty_print_time_duration(duration: Union[int, float]) -> str:
|
|
|
106
106
|
"""
|
|
107
107
|
|
|
108
108
|
days = divmod(duration, 86400)[0]
|
|
109
|
+
duration = duration - days * 86400
|
|
109
110
|
hours = divmod(duration, 3600)[0]
|
|
111
|
+
duration = duration - hours * 3600
|
|
110
112
|
minutes = divmod(duration, 60)[0]
|
|
113
|
+
duration = duration - minutes * 60
|
|
111
114
|
seconds = round(divmod(duration, 60)[1], 2)
|
|
112
115
|
if days:
|
|
113
116
|
return f"{days}day(s) {hours}h {minutes}m {seconds}s"
|
|
@@ -123,7 +126,7 @@ def get_start_and_end(duration: int = 0) -> Tuple[datetime, datetime]:
|
|
|
123
126
|
Method to return start and end time based on duration
|
|
124
127
|
"""
|
|
125
128
|
|
|
126
|
-
today = datetime.now(timezone.utc)
|
|
129
|
+
today = datetime.now(timezone.utc).replace(tzinfo=None)
|
|
127
130
|
start = (today + timedelta(0 - duration)).replace(
|
|
128
131
|
hour=0, minute=0, second=0, microsecond=0
|
|
129
132
|
)
|
metadata/utils/importer.py
CHANGED
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
Helpers to import python classes and modules dynamically
|
|
13
13
|
"""
|
|
14
14
|
import importlib
|
|
15
|
+
import sys
|
|
15
16
|
import traceback
|
|
16
17
|
from enum import Enum
|
|
17
18
|
from typing import Any, Callable, Optional, Type, TypeVar
|
|
@@ -27,6 +28,7 @@ from metadata.generated.schema.metadataIngestion.workflow import Sink as Workflo
|
|
|
27
28
|
from metadata.ingestion.api.steps import BulkSink, Processor, Sink, Source, Stage
|
|
28
29
|
from metadata.utils.class_helper import get_service_type_from_source_type
|
|
29
30
|
from metadata.utils.logger import utils_logger
|
|
31
|
+
from metadata.utils.singleton import Singleton
|
|
30
32
|
|
|
31
33
|
logger = utils_logger()
|
|
32
34
|
|
|
@@ -244,3 +246,27 @@ def import_test_case_class(
|
|
|
244
246
|
test_definition_class,
|
|
245
247
|
)
|
|
246
248
|
)
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
class SideEffectsLoader(metaclass=Singleton):
|
|
252
|
+
modules = set(sys.modules.keys())
|
|
253
|
+
|
|
254
|
+
def import_side_effects(self, *modules):
|
|
255
|
+
"""Handles loading of side effects and caches modules that have already been imported.
|
|
256
|
+
Requires full module name."""
|
|
257
|
+
for module in modules:
|
|
258
|
+
if module not in self.modules:
|
|
259
|
+
try:
|
|
260
|
+
module = importlib.import_module(module)
|
|
261
|
+
SideEffectsLoader.modules.add(module.__name__)
|
|
262
|
+
except Exception as err:
|
|
263
|
+
logger.debug(traceback.format_exc())
|
|
264
|
+
raise DynamicImportException(
|
|
265
|
+
f"Cannot load object from {module} due to {err}"
|
|
266
|
+
)
|
|
267
|
+
else:
|
|
268
|
+
logger.debug(f"Module {module} already imported")
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
def import_side_effects(*modules):
|
|
272
|
+
SideEffectsLoader().import_side_effects(*modules)
|