openmetadata-ingestion 1.3.0.0.dev0__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/applications/auto_tagger.py +8 -3
- 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/processor/test_case_runner.py +7 -5
- metadata/data_quality/source/test_suite.py +0 -1
- metadata/data_quality/validations/mixins/pandas_validator_mixin.py +4 -2
- 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 +124 -58
- 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 +30 -0
- 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 +28 -0
- 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 +4 -1
- metadata/generated/schema/configuration/eventHandlerConfiguration.py +1 -1
- metadata/generated/schema/configuration/fernetConfiguration.py +1 -1
- metadata/generated/schema/configuration/jwtTokenConfiguration.py +1 -1
- metadata/generated/schema/configuration/kafkaEventConfiguration.py +1 -1
- metadata/generated/schema/configuration/ldapConfiguration.py +1 -1
- metadata/generated/schema/configuration/ldapTrustStoreConfig/__init__.py +1 -1
- metadata/generated/schema/configuration/ldapTrustStoreConfig/customTrustManagerConfig.py +1 -1
- metadata/generated/schema/configuration/ldapTrustStoreConfig/hostNameConfig.py +1 -1
- metadata/generated/schema/configuration/ldapTrustStoreConfig/jvmDefaultConfig.py +1 -1
- metadata/generated/schema/configuration/ldapTrustStoreConfig/trustAllConfig.py +1 -1
- metadata/generated/schema/configuration/ldapTrustStoreConfig/truststoreConfig.py +1 -1
- metadata/generated/schema/configuration/loginConfiguration.py +1 -1
- metadata/generated/schema/configuration/logoConfiguration.py +1 -1
- metadata/generated/schema/configuration/pipelineServiceClientConfiguration.py +1 -1
- metadata/generated/schema/configuration/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 +4 -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 +6 -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 -16
- 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 +3 -0
- metadata/generated/schema/entity/applications/configuration/private/external/metaPilotAppPrivateConfig.py +26 -0
- 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 +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 +4 -6
- metadata/generated/schema/entity/feed/__init__.py +1 -1
- metadata/generated/schema/entity/feed/suggestion.py +61 -0
- 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 -4
- 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 -6
- metadata/generated/schema/events/eventFilterRule.py +1 -1
- metadata/generated/schema/events/eventSubscription.py +5 -10
- 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 +4 -1
- metadata/generated/schema/metadataIngestion/applicationPipeline.py +4 -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 +6 -3
- 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 +6 -3
- 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 +6 -3
- 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 +6 -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 +7 -17
- metadata/ingestion/api/status.py +4 -0
- metadata/ingestion/api/steps.py +14 -1
- metadata/ingestion/api/topology_runner.py +4 -1
- metadata/ingestion/lineage/parser.py +4 -5
- metadata/ingestion/models/custom_properties.py +0 -1
- metadata/ingestion/models/patch_request.py +3 -2
- metadata/ingestion/ometa/client.py +6 -0
- metadata/ingestion/ometa/mixins/custom_property_mixin.py +11 -11
- metadata/ingestion/ometa/mixins/patch_mixin.py +0 -1
- metadata/ingestion/ometa/mixins/suggestions_mixin.py +41 -0
- metadata/ingestion/ometa/ometa_api.py +16 -8
- metadata/ingestion/ometa/routes.py +7 -0
- metadata/ingestion/sink/metadata_rest.py +2 -2
- metadata/ingestion/source/dashboard/dashboard_service.py +0 -1
- metadata/ingestion/source/dashboard/looker/metadata.py +3 -6
- 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/superset/api_source.py +0 -1
- metadata/ingestion/source/dashboard/superset/db_source.py +1 -3
- metadata/ingestion/source/dashboard/superset/queries.py +1 -1
- metadata/ingestion/source/dashboard/tableau/metadata.py +19 -1
- metadata/ingestion/source/database/athena/client.py +2 -4
- metadata/ingestion/source/database/azuresql/metadata.py +0 -1
- 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 +22 -4
- metadata/ingestion/source/database/databricks/client.py +0 -1
- metadata/ingestion/source/database/databricks/metadata.py +132 -46
- metadata/ingestion/source/database/databricks/queries.py +3 -4
- metadata/ingestion/source/database/datalake/metadata.py +9 -4
- metadata/ingestion/source/database/dbt/dbt_config.py +5 -0
- metadata/ingestion/source/database/dbt/dbt_service.py +3 -11
- metadata/ingestion/source/database/dbt/dbt_utils.py +3 -1
- metadata/ingestion/source/database/dbt/metadata.py +16 -29
- metadata/ingestion/source/database/extended_sample_data.py +202 -134
- metadata/ingestion/source/database/hive/connection.py +0 -2
- metadata/ingestion/source/database/mssql/metadata.py +0 -1
- metadata/ingestion/source/database/mssql/queries.py +1 -2
- metadata/ingestion/source/database/oracle/queries.py +2 -2
- metadata/ingestion/source/database/oracle/utils.py +0 -1
- metadata/ingestion/source/database/postgres/pgspider/lineage.py +0 -1
- metadata/ingestion/source/database/sample_data.py +0 -1
- metadata/ingestion/source/database/sas/metadata.py +2 -3
- metadata/ingestion/source/database/snowflake/utils.py +2 -6
- metadata/ingestion/source/database/stored_procedures_mixin.py +0 -1
- metadata/ingestion/source/database/unitycatalog/metadata.py +16 -31
- metadata/ingestion/source/messaging/common_broker_source.py +9 -8
- metadata/ingestion/source/messaging/kafka/connection.py +45 -4
- metadata/ingestion/source/mlmodel/sagemaker/metadata.py +20 -8
- metadata/ingestion/source/pipeline/spline/metadata.py +0 -1
- metadata/ingestion/source/search/elasticsearch/metadata.py +0 -1
- metadata/ingestion/source/storage/storage_service.py +8 -8
- metadata/profiler/interface/pandas/profiler_interface.py +7 -2
- metadata/profiler/interface/profiler_interface_factory.py +7 -0
- metadata/profiler/interface/sqlalchemy/db2/profiler_interface.py +38 -0
- metadata/profiler/interface/sqlalchemy/profiler_interface.py +3 -5
- metadata/profiler/metrics/hybrid/histogram.py +1 -0
- metadata/profiler/orm/functions/conn_test.py +1 -0
- metadata/profiler/orm/functions/sum.py +1 -0
- metadata/profiler/orm/functions/table_metric_computer.py +0 -1
- metadata/profiler/orm/registry.py +1 -0
- metadata/profiler/processor/core.py +2 -2
- metadata/profiler/processor/processor.py +0 -2
- metadata/profiler/processor/sample_data_handler.py +6 -2
- metadata/profiler/source/base/profiler_source.py +0 -1
- metadata/profiler/source/bigquery/type_mapper.py +0 -1
- metadata/readers/file/api_reader.py +0 -1
- metadata/utils/datalake/datalake_utils.py +369 -129
- metadata/utils/entity_link.py +26 -6
- metadata/utils/execution_time_tracker.py +199 -0
- metadata/utils/filters.py +4 -0
- metadata/utils/helpers.py +30 -38
- 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 -31
- metadata/workflow/application.py +10 -10
- metadata/workflow/base.py +4 -1
- metadata/workflow/metadata.py +0 -1
- metadata/workflow/output_handler.py +22 -0
- metadata/workflow/usage.py +0 -1
- {openmetadata_ingestion-1.3.0.0.dev0.dist-info → openmetadata_ingestion-1.3.1.0.dist-info}/METADATA +298 -289
- {openmetadata_ingestion-1.3.0.0.dev0.dist-info → openmetadata_ingestion-1.3.1.0.dist-info}/RECORD +624 -612
- metadata/generated/schema/entity/services/connections/database/duckdbConnection.py +0 -96
- metadata/generated/schema/events/userAlertConfig.py +0 -25
- metadata/ingestion/source/database/duckdb/connection.py +0 -76
- metadata/ingestion/source/database/duckdb/metadata.py +0 -204
- metadata/ingestion/source/database/duckdb/queries.py +0 -141
- metadata/ingestion/source/database/duckdb/utils.py +0 -349
- metadata/utils/secrets/client/loader.py +0 -78
- /metadata/ingestion/source/database/{duckdb → bigtable}/__init__.py +0 -0
- /metadata/{utils/secrets/client → profiler/interface/sqlalchemy/db2}/__init__.py +0 -0
- /metadata/utils/secrets/{noop_secrets_manager.py → db_secrets_manager.py} +0 -0
- {openmetadata_ingestion-1.3.0.0.dev0.dist-info → openmetadata_ingestion-1.3.1.0.dist-info}/LICENSE +0 -0
- {openmetadata_ingestion-1.3.0.0.dev0.dist-info → openmetadata_ingestion-1.3.1.0.dist-info}/WHEEL +0 -0
- {openmetadata_ingestion-1.3.0.0.dev0.dist-info → openmetadata_ingestion-1.3.1.0.dist-info}/entry_points.txt +0 -0
- {openmetadata_ingestion-1.3.0.0.dev0.dist-info → openmetadata_ingestion-1.3.1.0.dist-info}/top_level.txt +0 -0
|
@@ -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
|
|
@@ -31,7 +29,9 @@ from sqlparse.sql import Statement
|
|
|
31
29
|
|
|
32
30
|
from metadata.generated.schema.entity.data.chart import ChartType
|
|
33
31
|
from metadata.generated.schema.entity.data.table import Column, Table
|
|
32
|
+
from metadata.generated.schema.entity.feed.suggestion import Suggestion, SuggestionType
|
|
34
33
|
from metadata.generated.schema.entity.services.databaseService import DatabaseService
|
|
34
|
+
from metadata.generated.schema.type.basic import EntityLink
|
|
35
35
|
from metadata.generated.schema.type.tagLabel import TagLabel
|
|
36
36
|
from metadata.utils.constants import DEFAULT_DATABASE
|
|
37
37
|
from metadata.utils.logger import utils_logger
|
|
@@ -99,40 +99,6 @@ om_chart_type_dict = {
|
|
|
99
99
|
}
|
|
100
100
|
|
|
101
101
|
|
|
102
|
-
def calculate_execution_time(func):
|
|
103
|
-
"""
|
|
104
|
-
Method to calculate workflow execution time
|
|
105
|
-
"""
|
|
106
|
-
|
|
107
|
-
@wraps(func)
|
|
108
|
-
def calculate_debug_time(*args, **kwargs):
|
|
109
|
-
start = perf_counter()
|
|
110
|
-
result = func(*args, **kwargs)
|
|
111
|
-
end = perf_counter()
|
|
112
|
-
logger.debug(
|
|
113
|
-
f"{func.__name__} executed in { pretty_print_time_duration(end - start)}"
|
|
114
|
-
)
|
|
115
|
-
return result
|
|
116
|
-
|
|
117
|
-
return calculate_debug_time
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
def calculate_execution_time_generator(func):
|
|
121
|
-
"""
|
|
122
|
-
Generator method to calculate workflow execution time
|
|
123
|
-
"""
|
|
124
|
-
|
|
125
|
-
def calculate_debug_time(*args, **kwargs):
|
|
126
|
-
start = perf_counter()
|
|
127
|
-
yield from func(*args, **kwargs)
|
|
128
|
-
end = perf_counter()
|
|
129
|
-
logger.debug(
|
|
130
|
-
f"{func.__name__} executed in { pretty_print_time_duration(end - start)}"
|
|
131
|
-
)
|
|
132
|
-
|
|
133
|
-
return calculate_debug_time
|
|
134
|
-
|
|
135
|
-
|
|
136
102
|
def pretty_print_time_duration(duration: Union[int, float]) -> str:
|
|
137
103
|
"""
|
|
138
104
|
Method to format and display the time
|
|
@@ -227,12 +193,38 @@ def find_in_iter(element: Any, container: Iterable[Any]) -> Optional[Any]:
|
|
|
227
193
|
return next((elem for elem in container if elem == element), None)
|
|
228
194
|
|
|
229
195
|
|
|
230
|
-
def find_column_in_table(
|
|
196
|
+
def find_column_in_table(
|
|
197
|
+
column_name: str, table: Table, case_sensitive: bool = True
|
|
198
|
+
) -> Optional[Column]:
|
|
231
199
|
"""
|
|
232
200
|
If the column exists in the table, return it
|
|
233
201
|
"""
|
|
202
|
+
|
|
203
|
+
def equals(first: str, second: str) -> bool:
|
|
204
|
+
if case_sensitive:
|
|
205
|
+
return first == second
|
|
206
|
+
return first.lower() == second.lower()
|
|
207
|
+
|
|
234
208
|
return next(
|
|
235
|
-
(col for col in table.columns if col.name.__root__
|
|
209
|
+
(col for col in table.columns if equals(col.name.__root__, column_name)), None
|
|
210
|
+
)
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
def find_suggestion(
|
|
214
|
+
suggestions: List[Suggestion],
|
|
215
|
+
suggestion_type: SuggestionType,
|
|
216
|
+
entity_link: EntityLink,
|
|
217
|
+
) -> Optional[Suggestion]:
|
|
218
|
+
"""Given a list of suggestions, a suggestion type and an entity link, find
|
|
219
|
+
one suggestion in the list that matches the criteria
|
|
220
|
+
"""
|
|
221
|
+
return next(
|
|
222
|
+
(
|
|
223
|
+
sugg
|
|
224
|
+
for sugg in suggestions
|
|
225
|
+
if sugg.type == suggestion_type and sugg.entityLink == entity_link
|
|
226
|
+
),
|
|
227
|
+
None,
|
|
236
228
|
)
|
|
237
229
|
|
|
238
230
|
|
|
@@ -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}]")
|
|
@@ -17,6 +17,9 @@ from typing import Optional
|
|
|
17
17
|
|
|
18
18
|
from botocore.exceptions import ClientError
|
|
19
19
|
|
|
20
|
+
from metadata.generated.schema.security.secrets.secretsManagerClientLoader import (
|
|
21
|
+
SecretsManagerClientLoader,
|
|
22
|
+
)
|
|
20
23
|
from metadata.generated.schema.security.secrets.secretsManagerProvider import (
|
|
21
24
|
SecretsManagerProvider,
|
|
22
25
|
)
|
|
@@ -32,8 +35,10 @@ class AWSSecretsManager(AWSBasedSecretsManager):
|
|
|
32
35
|
Secrets Manager Implementation Class
|
|
33
36
|
"""
|
|
34
37
|
|
|
35
|
-
def __init__(self,
|
|
36
|
-
super().__init__(
|
|
38
|
+
def __init__(self, loader: SecretsManagerClientLoader):
|
|
39
|
+
super().__init__(
|
|
40
|
+
client="secretsmanager", provider=SecretsManagerProvider.aws, loader=loader
|
|
41
|
+
)
|
|
37
42
|
|
|
38
43
|
def get_string_value(self, secret_id: str) -> Optional[str]:
|
|
39
44
|
"""
|
|
@@ -17,6 +17,9 @@ from typing import Optional
|
|
|
17
17
|
|
|
18
18
|
from botocore.exceptions import ClientError
|
|
19
19
|
|
|
20
|
+
from metadata.generated.schema.security.secrets.secretsManagerClientLoader import (
|
|
21
|
+
SecretsManagerClientLoader,
|
|
22
|
+
)
|
|
20
23
|
from metadata.generated.schema.security.secrets.secretsManagerProvider import (
|
|
21
24
|
SecretsManagerProvider,
|
|
22
25
|
)
|
|
@@ -32,8 +35,10 @@ class AWSSSMSecretsManager(AWSBasedSecretsManager):
|
|
|
32
35
|
AWS SSM Parameter Store Secret Manager Class
|
|
33
36
|
"""
|
|
34
37
|
|
|
35
|
-
def __init__(self,
|
|
36
|
-
super().__init__(
|
|
38
|
+
def __init__(self, loader: SecretsManagerClientLoader):
|
|
39
|
+
super().__init__(
|
|
40
|
+
client="ssm", provider=SecretsManagerProvider.aws, loader=loader
|
|
41
|
+
)
|
|
37
42
|
|
|
38
43
|
def get_string_value(self, secret_id: str) -> Optional[str]:
|
|
39
44
|
"""
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
# Copyright 2022 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
|
+
Abstract class for AWS based secrets manager implementations
|
|
14
|
+
"""
|
|
15
|
+
import os
|
|
16
|
+
import traceback
|
|
17
|
+
from abc import ABC
|
|
18
|
+
from typing import Optional
|
|
19
|
+
|
|
20
|
+
from azure.identity import ClientSecretCredential, DefaultAzureCredential
|
|
21
|
+
from azure.keyvault.secrets import KeyVaultSecret, SecretClient
|
|
22
|
+
|
|
23
|
+
from metadata.generated.schema.security.secrets.secretsManagerClientLoader import (
|
|
24
|
+
SecretsManagerClientLoader,
|
|
25
|
+
)
|
|
26
|
+
from metadata.generated.schema.security.secrets.secretsManagerProvider import (
|
|
27
|
+
SecretsManagerProvider,
|
|
28
|
+
)
|
|
29
|
+
from metadata.utils.dispatch import enum_register
|
|
30
|
+
from metadata.utils.logger import utils_logger
|
|
31
|
+
from metadata.utils.secrets.external_secrets_manager import (
|
|
32
|
+
SECRET_MANAGER_AIRFLOW_CONF,
|
|
33
|
+
ExternalSecretsManager,
|
|
34
|
+
SecretsManagerConfigException,
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
logger = utils_logger()
|
|
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["AzureCredentials"]:
|
|
50
|
+
from airflow.configuration import conf
|
|
51
|
+
|
|
52
|
+
from metadata.generated.schema.security.credentials.azureCredentials import (
|
|
53
|
+
AzureCredentials,
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
key_vault_name = conf.get(
|
|
57
|
+
SECRET_MANAGER_AIRFLOW_CONF, "azure_key_vault_name", fallback=None
|
|
58
|
+
)
|
|
59
|
+
if not key_vault_name:
|
|
60
|
+
raise ValueError(
|
|
61
|
+
"Missing `azure_key_vault_name` config for Azure Key Vault Secrets Manager Provider."
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
tenant_id = conf.get(SECRET_MANAGER_AIRFLOW_CONF, "azure_tenant_id", fallback=None)
|
|
65
|
+
client_id = conf.get(SECRET_MANAGER_AIRFLOW_CONF, "azure_client_id", fallback=None)
|
|
66
|
+
client_secret = conf.get(
|
|
67
|
+
SECRET_MANAGER_AIRFLOW_CONF, "azure_client_secret", fallback=None
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
return AzureCredentials(
|
|
71
|
+
clientId=client_id,
|
|
72
|
+
clientSecret=client_secret,
|
|
73
|
+
tenantId=tenant_id,
|
|
74
|
+
vaultName=key_vault_name,
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
@secrets_manager_client_loader.add(SecretsManagerClientLoader.env.value)
|
|
79
|
+
def _() -> Optional["AzureCredentials"]:
|
|
80
|
+
from metadata.generated.schema.security.credentials.azureCredentials import (
|
|
81
|
+
AzureCredentials,
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
# Load only the AZURE_KEY_VAULT_NAME (required) variable and use the
|
|
85
|
+
# Default Auth chain
|
|
86
|
+
# https://learn.microsoft.com/en-us/python/api/overview/azure/identity-readme?view=azure-python#defaultazurecredential
|
|
87
|
+
key_vault_name = os.getenv("AZURE_KEY_VAULT_NAME")
|
|
88
|
+
|
|
89
|
+
if not key_vault_name:
|
|
90
|
+
raise ValueError(
|
|
91
|
+
"Missing `azure_key_vault_name` config for Azure Key Vault Secrets Manager Provider."
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
return AzureCredentials(vaultName=key_vault_name)
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
class AzureKVSecretsManager(ExternalSecretsManager, ABC):
|
|
98
|
+
"""
|
|
99
|
+
Azure Key Vault Secrets Manager class
|
|
100
|
+
"""
|
|
101
|
+
|
|
102
|
+
def __init__(
|
|
103
|
+
self,
|
|
104
|
+
loader: SecretsManagerClientLoader,
|
|
105
|
+
):
|
|
106
|
+
super().__init__(provider=SecretsManagerProvider.azure_kv, loader=loader)
|
|
107
|
+
|
|
108
|
+
if (
|
|
109
|
+
self.credentials.tenantId
|
|
110
|
+
and self.credentials.clientId
|
|
111
|
+
and self.credentials.clientSecret
|
|
112
|
+
):
|
|
113
|
+
azure_identity = ClientSecretCredential(
|
|
114
|
+
tenant_id=self.credentials.tenantId,
|
|
115
|
+
client_id=self.credentials.clientId,
|
|
116
|
+
client_secret=self.credentials.clientSecret.get_secret_value(),
|
|
117
|
+
)
|
|
118
|
+
else:
|
|
119
|
+
azure_identity = DefaultAzureCredential()
|
|
120
|
+
|
|
121
|
+
self.client = SecretClient(
|
|
122
|
+
vault_url=f"https://{self.credentials.vaultName}.vault.azure.net/",
|
|
123
|
+
credential=azure_identity,
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
def get_string_value(self, secret_id: str) -> str:
|
|
127
|
+
"""
|
|
128
|
+
:param secret_id: The secret id to retrieve
|
|
129
|
+
:return: The value of the secret
|
|
130
|
+
"""
|
|
131
|
+
try:
|
|
132
|
+
secret: KeyVaultSecret = self.client.get_secret(secret_id)
|
|
133
|
+
logger.debug(f"Got value for secret {secret_id}")
|
|
134
|
+
return secret.value
|
|
135
|
+
except Exception as exc:
|
|
136
|
+
logger.debug(traceback.format_exc())
|
|
137
|
+
logger.error(
|
|
138
|
+
f"Could not get the secret value of {secret_id} due to [{exc}]"
|
|
139
|
+
)
|
|
140
|
+
raise exc
|
|
141
|
+
|
|
142
|
+
def load_credentials(self) -> Optional["AzureCredentials"]:
|
|
143
|
+
"""Load the provider credentials based on the loader type"""
|
|
144
|
+
try:
|
|
145
|
+
loader_fn = secrets_manager_client_loader.registry.get(self.loader.value)
|
|
146
|
+
return loader_fn()
|
|
147
|
+
except Exception as err:
|
|
148
|
+
raise SecretsManagerConfigException(f"Error loading credentials - [{err}]")
|
|
@@ -12,18 +12,40 @@
|
|
|
12
12
|
"""
|
|
13
13
|
Abstract class for third party secrets' manager implementations
|
|
14
14
|
"""
|
|
15
|
-
from abc import ABC
|
|
15
|
+
from abc import ABC, abstractmethod
|
|
16
|
+
from typing import Any
|
|
16
17
|
|
|
18
|
+
from metadata.generated.schema.security.secrets.secretsManagerClientLoader import (
|
|
19
|
+
SecretsManagerClientLoader,
|
|
20
|
+
)
|
|
17
21
|
from metadata.generated.schema.security.secrets.secretsManagerProvider import (
|
|
18
22
|
SecretsManagerProvider,
|
|
19
23
|
)
|
|
20
24
|
from metadata.utils.secrets.secrets_manager import SecretsManager
|
|
21
25
|
|
|
26
|
+
SECRET_MANAGER_AIRFLOW_CONF = "openmetadata_secrets_manager"
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class SecretsManagerConfigException(Exception):
|
|
30
|
+
"""
|
|
31
|
+
Invalid config that does not allow us to create
|
|
32
|
+
the SecretsManagerFactory
|
|
33
|
+
"""
|
|
34
|
+
|
|
22
35
|
|
|
23
36
|
class ExternalSecretsManager(SecretsManager, ABC):
|
|
24
37
|
"""
|
|
25
38
|
Abstract class for third party secrets' manager implementations
|
|
26
39
|
"""
|
|
27
40
|
|
|
28
|
-
def __init__(
|
|
29
|
-
self
|
|
41
|
+
def __init__(
|
|
42
|
+
self, provider: SecretsManagerProvider, loader: SecretsManagerClientLoader
|
|
43
|
+
):
|
|
44
|
+
self.provider = provider
|
|
45
|
+
self.loader = loader
|
|
46
|
+
|
|
47
|
+
self.credentials = self.load_credentials()
|
|
48
|
+
|
|
49
|
+
@abstractmethod
|
|
50
|
+
def load_credentials(self) -> Any:
|
|
51
|
+
"""Load the provider credentials based on the loader type"""
|