openmetadata-ingestion 1.3.0.1__py3-none-any.whl → 1.3.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.
- metadata/cli/db_dump.py +1 -0
- metadata/data_insight/processor/reports/cost_analysis_report_data_processor.py +39 -47
- metadata/data_insight/processor/reports/data_processor.py +1 -0
- metadata/data_insight/producer/cost_analysis_producer.py +78 -14
- metadata/data_insight/producer/entity_producer.py +1 -1
- metadata/data_insight/producer/producer_interface.py +1 -1
- metadata/data_insight/producer/web_analytics_producer.py +1 -1
- metadata/data_insight/source/metadata.py +10 -1
- metadata/data_quality/validations/table/base/tableColumnToMatchSet.py +2 -1
- metadata/data_quality/validations/table/pandas/tableColumnToMatchSet.py +2 -1
- metadata/data_quality/validations/table/sqlalchemy/tableColumnToMatchSet.py +7 -2
- metadata/examples/workflows/bigtable.yaml +32 -0
- metadata/generated/antlr/EntityLinkLexer.py +353 -319
- 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 +2 -2
- 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/createCustomProperty.py +6 -10
- 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/kpi/__init__.py +1 -1
- metadata/generated/schema/api/dataInsight/kpi/createKpiRequest.py +1 -1
- metadata/generated/schema/api/docStore/__init__.py +1 -1
- metadata/generated/schema/api/docStore/createDocument.py +1 -1
- metadata/generated/schema/api/domains/__init__.py +1 -1
- metadata/generated/schema/api/domains/createDataProduct.py +1 -1
- metadata/generated/schema/api/domains/createDomain.py +1 -1
- metadata/generated/schema/api/feed/__init__.py +1 -1
- metadata/generated/schema/api/feed/closeTask.py +1 -1
- metadata/generated/schema/api/feed/createPost.py +1 -1
- metadata/generated/schema/api/feed/createSuggestion.py +1 -1
- metadata/generated/schema/api/feed/createThread.py +1 -1
- metadata/generated/schema/api/feed/resolveTask.py +1 -1
- metadata/generated/schema/api/feed/threadCount.py +1 -1
- metadata/generated/schema/api/lineage/__init__.py +1 -1
- metadata/generated/schema/api/lineage/addLineage.py +1 -1
- metadata/generated/schema/api/openMetadataServerVersion.py +1 -1
- metadata/generated/schema/api/policies/__init__.py +1 -1
- metadata/generated/schema/api/policies/createPolicy.py +1 -1
- metadata/generated/schema/api/services/__init__.py +1 -1
- metadata/generated/schema/api/services/createDashboardService.py +1 -1
- metadata/generated/schema/api/services/createDatabaseService.py +1 -1
- metadata/generated/schema/api/services/createMessagingService.py +1 -1
- metadata/generated/schema/api/services/createMetadataService.py +1 -1
- metadata/generated/schema/api/services/createMlModelService.py +1 -1
- metadata/generated/schema/api/services/createPipelineService.py +1 -1
- metadata/generated/schema/api/services/createSearchService.py +1 -1
- metadata/generated/schema/api/services/createStorageService.py +1 -1
- metadata/generated/schema/api/services/ingestionPipelines/__init__.py +1 -1
- metadata/generated/schema/api/services/ingestionPipelines/createIngestionPipeline.py +1 -1
- metadata/generated/schema/api/setOwner.py +1 -1
- metadata/generated/schema/api/teams/__init__.py +1 -1
- metadata/generated/schema/api/teams/createPersona.py +1 -1
- metadata/generated/schema/api/teams/createRole.py +1 -1
- metadata/generated/schema/api/teams/createTeam.py +1 -1
- metadata/generated/schema/api/teams/createUser.py +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 +2 -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 +16 -0
- 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/loginConfiguration.py +1 -1
- metadata/generated/schema/configuration/logoConfiguration.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/aggregatedUnusedAssetsCount.py +1 -1
- metadata/generated/schema/dataInsight/type/aggregatedUnusedAssetsSize.py +1 -1
- metadata/generated/schema/dataInsight/type/aggregatedUsedVsUnusedAssetsCount.py +1 -1
- metadata/generated/schema/dataInsight/type/aggregatedUsedVsUnusedAssetsSize.py +1 -1
- metadata/generated/schema/dataInsight/type/dailyActiveUsers.py +1 -1
- metadata/generated/schema/dataInsight/type/mostActiveUsers.py +1 -1
- metadata/generated/schema/dataInsight/type/mostViewedEntities.py +1 -1
- metadata/generated/schema/dataInsight/type/pageViewsByEntities.py +1 -1
- metadata/generated/schema/dataInsight/type/percentageOfEntitiesWithDescriptionByType.py +1 -1
- metadata/generated/schema/dataInsight/type/percentageOfEntitiesWithOwnerByType.py +1 -1
- metadata/generated/schema/dataInsight/type/percentageOfServicesWithDescription.py +1 -1
- metadata/generated/schema/dataInsight/type/percentageOfServicesWithOwner.py +1 -1
- metadata/generated/schema/dataInsight/type/totalEntitiesByTier.py +1 -1
- metadata/generated/schema/dataInsight/type/totalEntitiesByType.py +1 -1
- metadata/generated/schema/dataInsight/type/unusedAssets.py +1 -1
- metadata/generated/schema/email/__init__.py +1 -1
- metadata/generated/schema/email/emailRequest.py +1 -1
- metadata/generated/schema/email/smtpSettings.py +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/autoTaggerAppConfig.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/metaPilotAppConfig.py +1 -1
- metadata/generated/schema/entity/applications/configuration/internal/__init__.py +1 -1
- metadata/generated/schema/entity/applications/configuration/internal/dataInsightsAppConfig.py +1 -1
- metadata/generated/schema/entity/applications/configuration/internal/dataInsightsReportAppConfig.py +1 -1
- metadata/generated/schema/entity/applications/configuration/internal/searchIndexingAppConfig.py +2 -2
- 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/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 +2 -2
- metadata/generated/schema/entity/data/pipeline.py +1 -1
- metadata/generated/schema/entity/data/query.py +1 -1
- metadata/generated/schema/entity/data/report.py +1 -1
- metadata/generated/schema/entity/data/searchIndex.py +1 -1
- metadata/generated/schema/entity/data/storedProcedure.py +1 -1
- metadata/generated/schema/entity/data/table.py +1 -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/suggestion.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/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 +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/metabaseConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/modeConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/mstrConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/powerBIConnection.py +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 +41 -0
- 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/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/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 +8 -6
- 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/sasConnection.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/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 +14 -2
- 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 +14 -2
- 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/amundsenConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/metadata/atlasConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/metadata/metadataESConnection.py +2 -2
- 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/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 +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 +4 -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 +3 -18
- metadata/generated/schema/entity/utils/__init__.py +1 -1
- metadata/generated/schema/entity/utils/entitiesCount.py +1 -1
- metadata/generated/schema/entity/utils/servicesCount.py +1 -1
- metadata/generated/schema/entity/utils/supersetApiConnection.py +1 -1
- metadata/generated/schema/events/__init__.py +1 -1
- metadata/generated/schema/events/alertMetrics.py +1 -1
- metadata/generated/schema/events/api/__init__.py +1 -1
- metadata/generated/schema/events/api/createEventSubscription.py +1 -1
- metadata/generated/schema/events/emailAlertConfig.py +1 -1
- metadata/generated/schema/events/eventFilterRule.py +1 -1
- metadata/generated/schema/events/eventSubscription.py +3 -2
- metadata/generated/schema/events/eventSubscriptionOffset.py +1 -1
- metadata/generated/schema/events/failedEvent.py +1 -1
- metadata/generated/schema/events/filterResourceDescriptor.py +1 -1
- metadata/generated/schema/events/subscriptionResourceDescriptor.py +1 -1
- metadata/generated/schema/metadataIngestion/__init__.py +1 -1
- metadata/generated/schema/metadataIngestion/application.py +1 -1
- metadata/generated/schema/metadataIngestion/applicationPipeline.py +1 -1
- metadata/generated/schema/metadataIngestion/dashboardServiceMetadataPipeline.py +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/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/oktaSSOClientConfig.py +1 -1
- metadata/generated/schema/security/client/openMetadataJWTClientConfig.py +1 -1
- metadata/generated/schema/security/client/samlSSOClientConfig.py +1 -1
- metadata/generated/schema/security/credentials/__init__.py +1 -1
- metadata/generated/schema/security/credentials/accessTokenAuth.py +1 -1
- metadata/generated/schema/security/credentials/apiAccessTokenAuth.py +1 -1
- metadata/generated/schema/security/credentials/awsCredentials.py +1 -1
- metadata/generated/schema/security/credentials/azureCredentials.py +16 -9
- 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 +3 -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/entityError.py +1 -1
- metadata/generated/schema/system/eventPublisherJob.py +1 -1
- metadata/generated/schema/system/indexingError.py +1 -1
- metadata/generated/schema/system/ui/__init__.py +1 -1
- metadata/generated/schema/system/ui/knowledgePanel.py +1 -1
- metadata/generated/schema/system/ui/page.py +1 -1
- metadata/generated/schema/tests/__init__.py +1 -1
- metadata/generated/schema/tests/assigned.py +1 -1
- metadata/generated/schema/tests/basic.py +1 -1
- metadata/generated/schema/tests/customMetric.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 +2 -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 +6 -2
- 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 +3 -0
- metadata/generated/schema/type/customProperties/enumConfig.py +17 -0
- metadata/generated/schema/type/customProperty.py +52 -0
- 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/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 +4 -15
- metadata/ingestion/api/steps.py +14 -1
- metadata/ingestion/api/topology_runner.py +4 -1
- metadata/ingestion/models/custom_properties.py +0 -1
- metadata/ingestion/ometa/client.py +6 -0
- metadata/ingestion/ometa/mixins/custom_property_mixin.py +11 -11
- metadata/ingestion/ometa/ometa_api.py +1 -1
- metadata/ingestion/sink/metadata_rest.py +2 -2
- metadata/ingestion/source/dashboard/looker/metadata.py +3 -4
- metadata/ingestion/source/dashboard/metabase/client.py +4 -0
- metadata/ingestion/source/dashboard/metabase/metadata.py +5 -4
- metadata/ingestion/source/dashboard/metabase/models.py +2 -2
- metadata/ingestion/source/dashboard/tableau/metadata.py +18 -0
- metadata/ingestion/source/database/bigquery/helper.py +68 -1
- metadata/ingestion/source/database/bigquery/metadata.py +12 -3
- metadata/ingestion/source/database/bigquery/queries.py +22 -0
- metadata/ingestion/source/database/bigtable/client.py +62 -0
- metadata/ingestion/source/database/bigtable/connection.py +116 -0
- metadata/ingestion/source/database/bigtable/metadata.py +224 -0
- metadata/ingestion/source/database/bigtable/models.py +60 -0
- metadata/ingestion/source/database/common_db_source.py +2 -2
- metadata/ingestion/source/database/common_nosql_source.py +19 -2
- metadata/ingestion/source/database/databricks/metadata.py +132 -46
- metadata/ingestion/source/database/databricks/queries.py +3 -4
- metadata/ingestion/source/database/dbt/metadata.py +16 -28
- metadata/ingestion/source/database/oracle/queries.py +2 -2
- metadata/ingestion/source/messaging/common_broker_source.py +9 -7
- metadata/ingestion/source/messaging/kafka/connection.py +45 -4
- metadata/ingestion/source/mlmodel/sagemaker/metadata.py +20 -8
- metadata/profiler/orm/functions/conn_test.py +1 -0
- metadata/profiler/orm/functions/sum.py +1 -0
- metadata/profiler/orm/registry.py +1 -0
- metadata/profiler/processor/core.py +2 -2
- metadata/utils/datalake/datalake_utils.py +7 -1
- metadata/utils/execution_time_tracker.py +199 -0
- metadata/utils/filters.py +4 -0
- metadata/utils/helpers.py +0 -51
- metadata/utils/secrets/aws_based_secrets_manager.py +67 -4
- metadata/utils/secrets/aws_secrets_manager.py +7 -2
- metadata/utils/secrets/aws_ssm_secrets_manager.py +7 -2
- metadata/utils/secrets/azure_kv_secrets_manager.py +148 -0
- metadata/utils/secrets/external_secrets_manager.py +25 -3
- metadata/utils/secrets/secrets_manager_factory.py +13 -30
- metadata/workflow/base.py +4 -0
- metadata/workflow/output_handler.py +22 -0
- {openmetadata_ingestion-1.3.0.1.dist-info → openmetadata_ingestion-1.3.1.0.dist-info}/METADATA +297 -288
- {openmetadata_ingestion-1.3.0.1.dist-info → openmetadata_ingestion-1.3.1.0.dist-info}/RECORD +573 -562
- metadata/utils/secrets/client/loader.py +0 -77
- /metadata/{utils/secrets/client → ingestion/source/database/bigtable}/__init__.py +0 -0
- /metadata/utils/secrets/{noop_secrets_manager.py → db_secrets_manager.py} +0 -0
- {openmetadata_ingestion-1.3.0.1.dist-info → openmetadata_ingestion-1.3.1.0.dist-info}/LICENSE +0 -0
- {openmetadata_ingestion-1.3.0.1.dist-info → openmetadata_ingestion-1.3.1.0.dist-info}/WHEEL +0 -0
- {openmetadata_ingestion-1.3.0.1.dist-info → openmetadata_ingestion-1.3.1.0.dist-info}/entry_points.txt +0 -0
- {openmetadata_ingestion-1.3.0.1.dist-info → openmetadata_ingestion-1.3.1.0.dist-info}/top_level.txt +0 -0
|
@@ -31,8 +31,6 @@ from metadata.generated.schema.entity.services.databaseService import DatabaseSe
|
|
|
31
31
|
from metadata.generated.schema.entity.services.ingestionPipelines.status import (
|
|
32
32
|
StackTraceError,
|
|
33
33
|
)
|
|
34
|
-
from metadata.generated.schema.entity.teams.team import Team
|
|
35
|
-
from metadata.generated.schema.entity.teams.user import User
|
|
36
34
|
from metadata.generated.schema.metadataIngestion.workflow import (
|
|
37
35
|
Source as WorkflowSource,
|
|
38
36
|
)
|
|
@@ -140,39 +138,29 @@ class DbtSource(DbtServiceSource):
|
|
|
140
138
|
|
|
141
139
|
def get_dbt_owner(
|
|
142
140
|
self, manifest_node: dict, catalog_node: Optional[dict]
|
|
143
|
-
) -> Optional[
|
|
141
|
+
) -> Optional[EntityReference]:
|
|
144
142
|
"""
|
|
145
143
|
Returns dbt owner
|
|
146
144
|
"""
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
)
|
|
158
|
-
if user_owner_fqn:
|
|
159
|
-
owner = self.metadata.get_entity_reference(
|
|
160
|
-
entity=User, fqn=user_owner_fqn
|
|
161
|
-
)
|
|
162
|
-
else:
|
|
163
|
-
team_owner_fqn = fqn.build(
|
|
164
|
-
self.metadata, entity_type=Team, team_name=owner_name
|
|
165
|
-
)
|
|
166
|
-
if team_owner_fqn:
|
|
167
|
-
owner = self.metadata.get_entity_reference(
|
|
168
|
-
entity=Team, fqn=team_owner_fqn
|
|
169
|
-
)
|
|
170
|
-
else:
|
|
145
|
+
try:
|
|
146
|
+
owner = None
|
|
147
|
+
dbt_owner = None
|
|
148
|
+
if catalog_node:
|
|
149
|
+
dbt_owner = catalog_node.metadata.owner
|
|
150
|
+
if manifest_node:
|
|
151
|
+
dbt_owner = manifest_node.meta.get(DbtCommonEnum.OWNER.value)
|
|
152
|
+
if dbt_owner:
|
|
153
|
+
owner = self.metadata.get_reference_by_name(name=dbt_owner)
|
|
154
|
+
if not owner:
|
|
171
155
|
logger.warning(
|
|
172
156
|
"Unable to ingest owner from DBT since no user or"
|
|
173
157
|
f" team was found with name {dbt_owner}"
|
|
174
158
|
)
|
|
175
|
-
|
|
159
|
+
return owner
|
|
160
|
+
except Exception as exc:
|
|
161
|
+
logger.debug(traceback.format_exc())
|
|
162
|
+
logger.warning(f"Unable to ingest owner from DBT due to: {exc}")
|
|
163
|
+
return None
|
|
176
164
|
|
|
177
165
|
def check_columns(self, catalog_node):
|
|
178
166
|
for catalog_key, catalog_column in catalog_node.get("columns").items():
|
|
@@ -172,14 +172,14 @@ SELECT
|
|
|
172
172
|
SQL_FULLTEXT AS query_text,
|
|
173
173
|
TO_TIMESTAMP(FIRST_LOAD_TIME, 'yy-MM-dd/HH24:MI:SS') AS start_time,
|
|
174
174
|
ELAPSED_TIME / 1000 AS duration,
|
|
175
|
-
TO_TIMESTAMP(FIRST_LOAD_TIME, 'yy-MM-dd/HH24:MI:SS') + NUMTODSINTERVAL(ELAPSED_TIME /
|
|
175
|
+
TO_TIMESTAMP(FIRST_LOAD_TIME, 'yy-MM-dd/HH24:MI:SS') + NUMTODSINTERVAL(ELAPSED_TIME / 1000000, 'SECOND') AS end_time
|
|
176
176
|
FROM gv$sql
|
|
177
177
|
WHERE OBJECT_STATUS = 'VALID'
|
|
178
178
|
{filters}
|
|
179
179
|
AND SQL_FULLTEXT NOT LIKE '/* {{"app": "OpenMetadata", %%}} */%%'
|
|
180
180
|
AND SQL_FULLTEXT NOT LIKE '/* {{"app": "dbt", %%}} */%%'
|
|
181
181
|
AND TO_TIMESTAMP(FIRST_LOAD_TIME, 'yy-MM-dd/HH24:MI:SS') >= TO_TIMESTAMP('{start_time}', 'yy-MM-dd HH24:MI:SS')
|
|
182
|
-
AND TO_TIMESTAMP(FIRST_LOAD_TIME, 'yy-MM-dd/HH24:MI:SS') + NUMTODSINTERVAL(ELAPSED_TIME /
|
|
182
|
+
AND TO_TIMESTAMP(FIRST_LOAD_TIME, 'yy-MM-dd/HH24:MI:SS') + NUMTODSINTERVAL(ELAPSED_TIME / 1000000, 'SECOND')
|
|
183
183
|
< TO_TIMESTAMP('{end_time}', 'yy-MM-dd HH24:MI:SS')
|
|
184
184
|
ORDER BY FIRST_LOAD_TIME DESC
|
|
185
185
|
OFFSET 0 ROWS FETCH NEXT {result_limit} ROWS ONLY
|
|
@@ -226,14 +226,16 @@ class CommonBrokerSource(MessagingServiceSource, ABC):
|
|
|
226
226
|
if topic_entity and self.generate_sample_data:
|
|
227
227
|
topic_name = topic_details.topic_name
|
|
228
228
|
sample_data = []
|
|
229
|
+
messages = None
|
|
229
230
|
try:
|
|
230
|
-
self.consumer_client
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
231
|
+
if self.consumer_client:
|
|
232
|
+
self.consumer_client.subscribe(
|
|
233
|
+
[topic_name], on_assign=on_partitions_assignment_to_consumer
|
|
234
|
+
)
|
|
235
|
+
logger.info(
|
|
236
|
+
f"Broker consumer polling for sample messages in topic {topic_name}"
|
|
237
|
+
)
|
|
238
|
+
messages = self.consumer_client.consume(num_messages=10, timeout=10)
|
|
237
239
|
except Exception as exc:
|
|
238
240
|
yield Either(
|
|
239
241
|
left=StackTraceError(
|
|
@@ -15,7 +15,7 @@ Source connection handler
|
|
|
15
15
|
from dataclasses import dataclass
|
|
16
16
|
from typing import Optional, Union
|
|
17
17
|
|
|
18
|
-
from confluent_kafka.admin import AdminClient
|
|
18
|
+
from confluent_kafka.admin import AdminClient, KafkaException
|
|
19
19
|
from confluent_kafka.avro import AvroConsumer
|
|
20
20
|
from confluent_kafka.schema_registry.schema_registry_client import SchemaRegistryClient
|
|
21
21
|
|
|
@@ -35,6 +35,21 @@ from metadata.utils.logger import ingestion_logger
|
|
|
35
35
|
logger = ingestion_logger()
|
|
36
36
|
|
|
37
37
|
|
|
38
|
+
class InvalidKafkaCreds(Exception):
|
|
39
|
+
"""
|
|
40
|
+
Class to indicate invalid kafka credentials exception
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class SchemaRegistryException(Exception):
|
|
45
|
+
"""
|
|
46
|
+
Class to indicate invalid schema registry not initialized
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
TIMEOUT_SECONDS = 10
|
|
51
|
+
|
|
52
|
+
|
|
38
53
|
@dataclass
|
|
39
54
|
class KafkaClient:
|
|
40
55
|
def __init__(self, admin_client, schema_registry_client, consumer_client) -> None:
|
|
@@ -60,6 +75,14 @@ def get_connection(
|
|
|
60
75
|
if connection.saslMechanism:
|
|
61
76
|
connection.consumerConfig["sasl.mechanism"] = connection.saslMechanism.value
|
|
62
77
|
|
|
78
|
+
if (
|
|
79
|
+
connection.consumerConfig.get("security.protocol") is None
|
|
80
|
+
and connection.securityProtocol
|
|
81
|
+
):
|
|
82
|
+
connection.consumerConfig[
|
|
83
|
+
"security.protocol"
|
|
84
|
+
] = connection.securityProtocol.value
|
|
85
|
+
|
|
63
86
|
if connection.basicAuthUserInfo:
|
|
64
87
|
connection.schemaRegistryConfig = connection.schemaRegistryConfig or {}
|
|
65
88
|
connection.schemaRegistryConfig[
|
|
@@ -109,9 +132,27 @@ def test_connection(
|
|
|
109
132
|
"""
|
|
110
133
|
|
|
111
134
|
def custom_executor():
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
135
|
+
try:
|
|
136
|
+
client.admin_client.list_topics(timeout=TIMEOUT_SECONDS).topics
|
|
137
|
+
except KafkaException as err:
|
|
138
|
+
raise InvalidKafkaCreds(
|
|
139
|
+
f"Failed to fetch topics due to: {err}. "
|
|
140
|
+
"Please validate credentials and check if you are using correct security protocol"
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
def schema_registry_test():
|
|
144
|
+
if client.schema_registry_client:
|
|
145
|
+
client.schema_registry_client.get_subjects()
|
|
146
|
+
else:
|
|
147
|
+
raise SchemaRegistryException(
|
|
148
|
+
"Schema Registry not initialized, please provide schema registry "
|
|
149
|
+
"credentials in case you want topic schema and sample data to be ingested"
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
test_fn = {
|
|
153
|
+
"GetTopics": custom_executor,
|
|
154
|
+
"CheckSchemaRegistry": schema_registry_test,
|
|
155
|
+
}
|
|
115
156
|
|
|
116
157
|
test_connection_steps(
|
|
117
158
|
metadata=metadata,
|
|
@@ -24,6 +24,9 @@ from metadata.generated.schema.entity.data.mlmodel import (
|
|
|
24
24
|
from metadata.generated.schema.entity.services.connections.mlmodel.sageMakerConnection import (
|
|
25
25
|
SageMakerConnection,
|
|
26
26
|
)
|
|
27
|
+
from metadata.generated.schema.entity.services.ingestionPipelines.status import (
|
|
28
|
+
StackTraceError,
|
|
29
|
+
)
|
|
27
30
|
from metadata.generated.schema.metadataIngestion.workflow import (
|
|
28
31
|
Source as WorkflowSource,
|
|
29
32
|
)
|
|
@@ -128,14 +131,23 @@ class SagemakerSource(MlModelServiceSource):
|
|
|
128
131
|
"""
|
|
129
132
|
Prepare the Request model
|
|
130
133
|
"""
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
134
|
+
try:
|
|
135
|
+
mlmodel_request = CreateMlModelRequest(
|
|
136
|
+
name=model.name,
|
|
137
|
+
algorithm=self._get_algorithm(), # Setting this to a constant
|
|
138
|
+
mlStore=self._get_ml_store(model.name),
|
|
139
|
+
service=self.context.mlmodel_service,
|
|
140
|
+
)
|
|
141
|
+
yield Either(right=mlmodel_request)
|
|
142
|
+
self.register_record(mlmodel_request=mlmodel_request)
|
|
143
|
+
except Exception as exc: # pylint: disable=broad-except
|
|
144
|
+
yield Either(
|
|
145
|
+
left=StackTraceError(
|
|
146
|
+
name=model.name,
|
|
147
|
+
error=f"Error creating mlmodel: {exc}",
|
|
148
|
+
stackTrace=traceback.format_exc(),
|
|
149
|
+
)
|
|
150
|
+
)
|
|
139
151
|
|
|
140
152
|
def _get_ml_store( # pylint: disable=arguments-differ
|
|
141
153
|
self,
|
|
@@ -40,6 +40,7 @@ def _(element, compiler, **kw):
|
|
|
40
40
|
|
|
41
41
|
|
|
42
42
|
@compiles(SumFn, Dialects.BigQuery)
|
|
43
|
+
@compiles(SumFn, Dialects.Postgres)
|
|
43
44
|
def _(element, compiler, **kw):
|
|
44
45
|
"""Handle case where column type is INTEGER but SUM returns a NUMBER"""
|
|
45
46
|
proc = compiler.process(element.clauses, **kw)
|
|
@@ -53,7 +53,7 @@ from metadata.profiler.metrics.static.row_count import RowCount
|
|
|
53
53
|
from metadata.profiler.orm.registry import NOT_COMPUTE
|
|
54
54
|
from metadata.profiler.processor.sample_data_handler import upload_sample_data
|
|
55
55
|
from metadata.utils.constants import SAMPLE_DATA_DEFAULT_COUNT
|
|
56
|
-
from metadata.utils.
|
|
56
|
+
from metadata.utils.execution_time_tracker import calculate_execution_time
|
|
57
57
|
from metadata.utils.logger import profiler_logger
|
|
58
58
|
|
|
59
59
|
logger = profiler_logger()
|
|
@@ -550,7 +550,7 @@ class Profiler(Generic[TMetric]):
|
|
|
550
550
|
|
|
551
551
|
return table_profile
|
|
552
552
|
|
|
553
|
-
@calculate_execution_time
|
|
553
|
+
@calculate_execution_time(store=False)
|
|
554
554
|
def generate_sample_data(self) -> Optional[TableData]:
|
|
555
555
|
"""Fetch and ingest sample data
|
|
556
556
|
|
|
@@ -169,6 +169,7 @@ class GenericDataFrameColumnParser:
|
|
|
169
169
|
["datetime64", "timedelta[ns]", "datetime64[ns]"], DataType.DATETIME
|
|
170
170
|
),
|
|
171
171
|
"str": DataType.STRING,
|
|
172
|
+
"bytes": DataType.BYTES,
|
|
172
173
|
}
|
|
173
174
|
|
|
174
175
|
def __init__(self, data_frame: "DataFrame"):
|
|
@@ -247,8 +248,13 @@ class GenericDataFrameColumnParser:
|
|
|
247
248
|
data_type = "string"
|
|
248
249
|
|
|
249
250
|
data_type = cls._data_formats.get(
|
|
250
|
-
data_type or data_frame[column_name].dtypes.name,
|
|
251
|
+
data_type or data_frame[column_name].dtypes.name,
|
|
251
252
|
)
|
|
253
|
+
if not data_type:
|
|
254
|
+
logger.debug(
|
|
255
|
+
f"unknown data type {data_frame[column_name].dtypes.name}. resolving to string."
|
|
256
|
+
)
|
|
257
|
+
data_type = data_type or DataType.STRING
|
|
252
258
|
except Exception as err:
|
|
253
259
|
logger.warning(
|
|
254
260
|
f"Failed to distinguish data type for column {column_name}, Falling back to {data_type}, exc: {err}"
|
|
@@ -0,0 +1,199 @@
|
|
|
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
|
+
ExecutionTimeTracker implementation to help track the execution time of different parts
|
|
14
|
+
of the code.
|
|
15
|
+
"""
|
|
16
|
+
from functools import wraps
|
|
17
|
+
from time import perf_counter
|
|
18
|
+
from typing import Dict, List, Optional
|
|
19
|
+
|
|
20
|
+
from pydantic import BaseModel
|
|
21
|
+
|
|
22
|
+
from metadata.utils.helpers import pretty_print_time_duration
|
|
23
|
+
from metadata.utils.logger import utils_logger
|
|
24
|
+
from metadata.utils.singleton import Singleton
|
|
25
|
+
|
|
26
|
+
logger = utils_logger()
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class ExecutionTimeTrackerContext(BaseModel):
|
|
30
|
+
"""Small Model to hold the ExecutionTimeTracker context."""
|
|
31
|
+
|
|
32
|
+
name: str
|
|
33
|
+
start: float
|
|
34
|
+
stored: bool
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class ExecutionTimeTracker(metaclass=Singleton):
|
|
38
|
+
"""ExecutionTimeTracker is implemented as a Singleton in order to hold state globally.
|
|
39
|
+
|
|
40
|
+
It works as a Context Manager in order to track and log execution times.
|
|
41
|
+
|
|
42
|
+
Example:
|
|
43
|
+
|
|
44
|
+
def my_function():
|
|
45
|
+
tracker = ExecutionTimeTracker()
|
|
46
|
+
|
|
47
|
+
with tracker(context="MyFunction", store=True):
|
|
48
|
+
other_opeartion()
|
|
49
|
+
|
|
50
|
+
"""
|
|
51
|
+
|
|
52
|
+
def __init__(self, enabled: bool = False):
|
|
53
|
+
"""When instantiated we can pass if we want it enabled or disabled in order to
|
|
54
|
+
avoid overhead when not needed.
|
|
55
|
+
|
|
56
|
+
Attrs
|
|
57
|
+
------
|
|
58
|
+
enabled: Defines if it will be enabled or not.
|
|
59
|
+
context: Keeps track of the context levels and their state.
|
|
60
|
+
state: Keeps track of the global state for the Execution Time Tracker.
|
|
61
|
+
"""
|
|
62
|
+
self.enabled: bool = enabled
|
|
63
|
+
self.context: List[ExecutionTimeTrackerContext] = []
|
|
64
|
+
self.state: Dict[str, float] = {}
|
|
65
|
+
self.new_context = None
|
|
66
|
+
self.store = True
|
|
67
|
+
|
|
68
|
+
@property
|
|
69
|
+
def last_stored_context_level(self) -> Optional[str]:
|
|
70
|
+
"""Returns the last stored context level.
|
|
71
|
+
|
|
72
|
+
In order to provide better logs and keep track where in the code the time is being
|
|
73
|
+
measured we keep track of nested contexts.
|
|
74
|
+
|
|
75
|
+
If a given context is not stored it will only log to debug but won't be part of the
|
|
76
|
+
global state.
|
|
77
|
+
"""
|
|
78
|
+
stored_context = [context for context in self.context if context.stored]
|
|
79
|
+
|
|
80
|
+
if stored_context:
|
|
81
|
+
return stored_context[-1].name
|
|
82
|
+
|
|
83
|
+
return None
|
|
84
|
+
|
|
85
|
+
def __call__(self, context: str, store: bool = True):
|
|
86
|
+
"""At every point we open a new Context Manager we can pass the current 'context' and
|
|
87
|
+
if we want to 'store' it.
|
|
88
|
+
|
|
89
|
+
Sets the temporary attributes used within the context:
|
|
90
|
+
|
|
91
|
+
new_context: Full Context name, appending the given context to the last stored context level.
|
|
92
|
+
store: If True, it will take part of the global state. Otherwise it will only log to debug.
|
|
93
|
+
"""
|
|
94
|
+
self.new_context = ".".join(
|
|
95
|
+
[part for part in [self.last_stored_context_level, context] if part]
|
|
96
|
+
)
|
|
97
|
+
self.store = store
|
|
98
|
+
|
|
99
|
+
return self
|
|
100
|
+
|
|
101
|
+
def __enter__(self):
|
|
102
|
+
"""If enabled, when entering the context, we append a new
|
|
103
|
+
ExecutionTimeTrackerContext to the list.
|
|
104
|
+
"""
|
|
105
|
+
if self.enabled:
|
|
106
|
+
self.context.append(
|
|
107
|
+
ExecutionTimeTrackerContext(
|
|
108
|
+
name=self.new_context, start=perf_counter(), stored=self.store
|
|
109
|
+
)
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
113
|
+
"""If enabled, when exiting the context, we calculate the elapsed time and log to debug.
|
|
114
|
+
If the context.stored is True, we also save it to the global state."""
|
|
115
|
+
if self.enabled:
|
|
116
|
+
stop = perf_counter()
|
|
117
|
+
context = self.context.pop(-1)
|
|
118
|
+
|
|
119
|
+
if not context:
|
|
120
|
+
return
|
|
121
|
+
|
|
122
|
+
elapsed = stop - context.start
|
|
123
|
+
|
|
124
|
+
logger.debug(
|
|
125
|
+
"%s executed in %s", context.name, pretty_print_time_duration(elapsed)
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
if context.stored:
|
|
129
|
+
self._save(context, elapsed)
|
|
130
|
+
|
|
131
|
+
def _save(self, context: ExecutionTimeTrackerContext, elapsed: float):
|
|
132
|
+
"""Small utility to save the new measure to the global accumulator."""
|
|
133
|
+
self.state[context.name] = self.state.get(context.name, 0) + elapsed
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def calculate_execution_time(context: Optional[str] = None, store: bool = True):
|
|
137
|
+
"""Utility decorator to be able to use the ExecutionTimeTracker on a function.
|
|
138
|
+
|
|
139
|
+
It receives the context and if it should store it.
|
|
140
|
+
|
|
141
|
+
Example:
|
|
142
|
+
|
|
143
|
+
@calculate_execution_time(context="MyContext")
|
|
144
|
+
def my_function():
|
|
145
|
+
...
|
|
146
|
+
"""
|
|
147
|
+
|
|
148
|
+
def decorator(func):
|
|
149
|
+
@wraps(func)
|
|
150
|
+
def inner(*args, **kwargs):
|
|
151
|
+
execution_time = ExecutionTimeTracker()
|
|
152
|
+
|
|
153
|
+
with execution_time(context or func.__name__, store):
|
|
154
|
+
result = func(*args, **kwargs)
|
|
155
|
+
|
|
156
|
+
return result
|
|
157
|
+
|
|
158
|
+
return inner
|
|
159
|
+
|
|
160
|
+
return decorator
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def calculate_execution_time_generator(
|
|
164
|
+
context: Optional[str] = None, store: bool = True
|
|
165
|
+
):
|
|
166
|
+
"""Utility decorator to be able to use the ExecutionTimeTracker on a generator function.
|
|
167
|
+
|
|
168
|
+
It receives the context and if it should store it.
|
|
169
|
+
|
|
170
|
+
Example:
|
|
171
|
+
|
|
172
|
+
@calculate_execution_time_generator(context="MyContext")
|
|
173
|
+
def my_generator():
|
|
174
|
+
...
|
|
175
|
+
"""
|
|
176
|
+
|
|
177
|
+
def decorator(func):
|
|
178
|
+
@wraps(func)
|
|
179
|
+
def inner(*args, **kwargs):
|
|
180
|
+
# NOTE: We are basically implementing by hand a simplified version of 'yield from'
|
|
181
|
+
# in order to be able to calculate the time difference correctly.
|
|
182
|
+
# The 'while True' loop allows us to guarantee we are iterating over all thje values
|
|
183
|
+
# from func(*args, **kwargs).
|
|
184
|
+
execution_time = ExecutionTimeTracker()
|
|
185
|
+
|
|
186
|
+
generator = func(*args, **kwargs)
|
|
187
|
+
|
|
188
|
+
while True:
|
|
189
|
+
with execution_time(context or func.__name__, store):
|
|
190
|
+
try:
|
|
191
|
+
element = next(generator)
|
|
192
|
+
except StopIteration:
|
|
193
|
+
return
|
|
194
|
+
|
|
195
|
+
yield element
|
|
196
|
+
|
|
197
|
+
return inner
|
|
198
|
+
|
|
199
|
+
return decorator
|
metadata/utils/filters.py
CHANGED
|
@@ -54,6 +54,10 @@ def _filter(filter_pattern: Optional[FilterPattern], name: str) -> bool:
|
|
|
54
54
|
# No filter pattern, nothing to filter
|
|
55
55
|
return False
|
|
56
56
|
|
|
57
|
+
if filter_pattern and not name:
|
|
58
|
+
# Filter pattern is present but not the name so we'll filter it out
|
|
59
|
+
return True
|
|
60
|
+
|
|
57
61
|
if filter_pattern.includes:
|
|
58
62
|
validate_regex(filter_pattern.includes)
|
|
59
63
|
return not any( # pylint: disable=use-a-generator
|
metadata/utils/helpers.py
CHANGED
|
@@ -20,10 +20,8 @@ import re
|
|
|
20
20
|
import shutil
|
|
21
21
|
import sys
|
|
22
22
|
from datetime import datetime, timedelta
|
|
23
|
-
from functools import wraps
|
|
24
23
|
from math import floor, log
|
|
25
24
|
from pathlib import Path
|
|
26
|
-
from time import perf_counter
|
|
27
25
|
from typing import Any, Dict, Iterable, List, Optional, Tuple, Union
|
|
28
26
|
|
|
29
27
|
import sqlparse
|
|
@@ -101,55 +99,6 @@ om_chart_type_dict = {
|
|
|
101
99
|
}
|
|
102
100
|
|
|
103
101
|
|
|
104
|
-
def calculate_execution_time(func):
|
|
105
|
-
"""
|
|
106
|
-
Method to calculate workflow execution time
|
|
107
|
-
"""
|
|
108
|
-
|
|
109
|
-
@wraps(func)
|
|
110
|
-
def calculate_debug_time(*args, **kwargs):
|
|
111
|
-
start = perf_counter()
|
|
112
|
-
result = func(*args, **kwargs)
|
|
113
|
-
end = perf_counter()
|
|
114
|
-
logger.debug(
|
|
115
|
-
f"{func.__name__} executed in { pretty_print_time_duration(end - start)}"
|
|
116
|
-
)
|
|
117
|
-
return result
|
|
118
|
-
|
|
119
|
-
return calculate_debug_time
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
def calculate_execution_time_generator(func):
|
|
123
|
-
"""
|
|
124
|
-
Generator method to calculate workflow execution time
|
|
125
|
-
"""
|
|
126
|
-
|
|
127
|
-
def calculate_debug_time(*args, **kwargs):
|
|
128
|
-
# NOTE: We are basically implementing by hand a simplified version of 'yield from'
|
|
129
|
-
# in order to be able to calculate the time difference correctly.
|
|
130
|
-
# The 'while True' loop allows us to guarantee we are iterating over all thje values
|
|
131
|
-
# from func(*args, **kwargs).
|
|
132
|
-
generator = func(*args, **kwargs)
|
|
133
|
-
|
|
134
|
-
while True:
|
|
135
|
-
start = perf_counter()
|
|
136
|
-
|
|
137
|
-
try:
|
|
138
|
-
element = next(generator)
|
|
139
|
-
except StopIteration:
|
|
140
|
-
return
|
|
141
|
-
|
|
142
|
-
end = perf_counter()
|
|
143
|
-
|
|
144
|
-
logger.debug(
|
|
145
|
-
f"{func.__name__} executed in { pretty_print_time_duration(end - start)}"
|
|
146
|
-
)
|
|
147
|
-
|
|
148
|
-
yield element
|
|
149
|
-
|
|
150
|
-
return calculate_debug_time
|
|
151
|
-
|
|
152
|
-
|
|
153
102
|
def pretty_print_time_duration(duration: Union[int, float]) -> str:
|
|
154
103
|
"""
|
|
155
104
|
Method to format and display the time
|
|
@@ -12,20 +12,75 @@
|
|
|
12
12
|
"""
|
|
13
13
|
Abstract class for AWS based secrets manager implementations
|
|
14
14
|
"""
|
|
15
|
+
import os
|
|
15
16
|
from abc import ABC, abstractmethod
|
|
16
17
|
from typing import Optional
|
|
17
18
|
|
|
18
19
|
from metadata.clients.aws_client import AWSClient
|
|
20
|
+
from metadata.generated.schema.security.secrets.secretsManagerClientLoader import (
|
|
21
|
+
SecretsManagerClientLoader,
|
|
22
|
+
)
|
|
19
23
|
from metadata.generated.schema.security.secrets.secretsManagerProvider import (
|
|
20
24
|
SecretsManagerProvider,
|
|
21
25
|
)
|
|
26
|
+
from metadata.ingestion.models.custom_pydantic import CustomSecretStr
|
|
27
|
+
from metadata.utils.dispatch import enum_register
|
|
22
28
|
from metadata.utils.logger import utils_logger
|
|
23
|
-
from metadata.utils.secrets.external_secrets_manager import
|
|
29
|
+
from metadata.utils.secrets.external_secrets_manager import (
|
|
30
|
+
SECRET_MANAGER_AIRFLOW_CONF,
|
|
31
|
+
ExternalSecretsManager,
|
|
32
|
+
SecretsManagerConfigException,
|
|
33
|
+
)
|
|
24
34
|
|
|
25
35
|
logger = utils_logger()
|
|
26
36
|
|
|
27
37
|
NULL_VALUE = "null"
|
|
28
38
|
|
|
39
|
+
secrets_manager_client_loader = enum_register()
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
# pylint: disable=import-outside-toplevel
|
|
43
|
+
@secrets_manager_client_loader.add(SecretsManagerClientLoader.noop.value)
|
|
44
|
+
def _() -> None:
|
|
45
|
+
return None
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
@secrets_manager_client_loader.add(SecretsManagerClientLoader.airflow.value)
|
|
49
|
+
def _() -> Optional["AWSCredentials"]:
|
|
50
|
+
from airflow.configuration import conf
|
|
51
|
+
|
|
52
|
+
from metadata.generated.schema.security.credentials.awsCredentials import (
|
|
53
|
+
AWSCredentials,
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
aws_region = conf.get(SECRET_MANAGER_AIRFLOW_CONF, "aws_region", fallback=None)
|
|
57
|
+
if aws_region:
|
|
58
|
+
credentials = AWSCredentials(awsRegion=aws_region)
|
|
59
|
+
credentials.awsAccessKeyId = conf.get(
|
|
60
|
+
SECRET_MANAGER_AIRFLOW_CONF, "aws_access_key_id", fallback=""
|
|
61
|
+
)
|
|
62
|
+
credentials.awsSecretAccessKey = CustomSecretStr(
|
|
63
|
+
conf.get(SECRET_MANAGER_AIRFLOW_CONF, "aws_secret_access_key", fallback="")
|
|
64
|
+
)
|
|
65
|
+
return credentials
|
|
66
|
+
|
|
67
|
+
return None
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
@secrets_manager_client_loader.add(SecretsManagerClientLoader.env.value)
|
|
71
|
+
def _() -> Optional["AWSCredentials"]:
|
|
72
|
+
from metadata.generated.schema.security.credentials.awsCredentials import (
|
|
73
|
+
AWSCredentials,
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
# Loading the env vars required by boto3
|
|
77
|
+
# https://boto3.amazonaws.com/v1/documentation/api/latest/guide/configuration.html
|
|
78
|
+
aws_region = os.getenv("AWS_DEFAULT_REGION")
|
|
79
|
+
if aws_region:
|
|
80
|
+
return AWSCredentials(awsRegion=aws_region)
|
|
81
|
+
|
|
82
|
+
return None
|
|
83
|
+
|
|
29
84
|
|
|
30
85
|
class AWSBasedSecretsManager(ExternalSecretsManager, ABC):
|
|
31
86
|
"""
|
|
@@ -34,12 +89,12 @@ class AWSBasedSecretsManager(ExternalSecretsManager, ABC):
|
|
|
34
89
|
|
|
35
90
|
def __init__(
|
|
36
91
|
self,
|
|
37
|
-
credentials: Optional["AWSCredentials"],
|
|
38
92
|
client: str,
|
|
39
93
|
provider: SecretsManagerProvider,
|
|
94
|
+
loader: SecretsManagerClientLoader,
|
|
40
95
|
):
|
|
41
|
-
super().__init__(provider)
|
|
42
|
-
self.client = AWSClient(credentials).get_client(client)
|
|
96
|
+
super().__init__(provider=provider, loader=loader)
|
|
97
|
+
self.client = AWSClient(self.credentials).get_client(client)
|
|
43
98
|
|
|
44
99
|
@abstractmethod
|
|
45
100
|
def get_string_value(self, secret_id: str) -> str:
|
|
@@ -47,3 +102,11 @@ class AWSBasedSecretsManager(ExternalSecretsManager, ABC):
|
|
|
47
102
|
:param secret_id: The secret id to retrieve
|
|
48
103
|
:return: The value of the secret
|
|
49
104
|
"""
|
|
105
|
+
|
|
106
|
+
def load_credentials(self) -> Optional["AWSCredentials"]:
|
|
107
|
+
"""Load the provider credentials based on the loader type"""
|
|
108
|
+
try:
|
|
109
|
+
loader_fn = secrets_manager_client_loader.registry.get(self.loader.value)
|
|
110
|
+
return loader_fn()
|
|
111
|
+
except Exception as err:
|
|
112
|
+
raise SecretsManagerConfigException(f"Error loading credentials - [{err}]")
|