openmetadata-ingestion 1.9.13.0__py3-none-any.whl ā 1.9.14.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/clients/aws_client.py +4 -0
- metadata/examples/workflows/kinesisfirehose.yaml +99 -0
- 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/addTagToAssetsRequest.py +1 -1
- metadata/generated/schema/api/analytics/__init__.py +1 -1
- metadata/generated/schema/api/analytics/createWebAnalyticEvent.py +1 -1
- metadata/generated/schema/api/automations/__init__.py +1 -1
- metadata/generated/schema/api/automations/createWorkflow.py +1 -1
- metadata/generated/schema/api/bulkAssets.py +1 -1
- metadata/generated/schema/api/classification/__init__.py +1 -1
- metadata/generated/schema/api/classification/createClassification.py +1 -1
- metadata/generated/schema/api/classification/createTag.py +1 -1
- metadata/generated/schema/api/classification/loadTags.py +1 -1
- metadata/generated/schema/api/createBot.py +1 -1
- metadata/generated/schema/api/createEventPublisherJob.py +1 -1
- metadata/generated/schema/api/createType.py +1 -1
- metadata/generated/schema/api/data/__init__.py +1 -1
- metadata/generated/schema/api/data/createAPICollection.py +1 -1
- metadata/generated/schema/api/data/createAPIEndpoint.py +1 -1
- metadata/generated/schema/api/data/createChart.py +1 -1
- metadata/generated/schema/api/data/createContainer.py +1 -1
- metadata/generated/schema/api/data/createCustomProperty.py +1 -1
- metadata/generated/schema/api/data/createDashboard.py +1 -1
- metadata/generated/schema/api/data/createDashboardDataModel.py +1 -1
- metadata/generated/schema/api/data/createDataContract.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/createDirectory.py +1 -1
- metadata/generated/schema/api/data/createEntityProfile.py +1 -1
- metadata/generated/schema/api/data/createFile.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/createMetric.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/createQueryCostRecord.py +1 -1
- metadata/generated/schema/api/data/createSearchIndex.py +1 -1
- metadata/generated/schema/api/data/createSpreadsheet.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/createWorksheet.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/data/updateColumn.py +1 -1
- metadata/generated/schema/api/dataInsight/__init__.py +1 -1
- metadata/generated/schema/api/dataInsight/createDataInsightChart.py +1 -1
- metadata/generated/schema/api/dataInsight/custom/__init__.py +1 -1
- metadata/generated/schema/api/dataInsight/custom/createDataInsightCustomChart.py +1 -1
- metadata/generated/schema/api/dataInsight/kpi/__init__.py +1 -1
- metadata/generated/schema/api/dataInsight/kpi/createKpiRequest.py +1 -1
- metadata/generated/schema/api/docStore/__init__.py +1 -1
- metadata/generated/schema/api/docStore/createDocument.py +1 -1
- metadata/generated/schema/api/domains/__init__.py +1 -1
- metadata/generated/schema/api/domains/createDataProduct.py +1 -1
- metadata/generated/schema/api/domains/createDomain.py +1 -1
- metadata/generated/schema/api/entityRelationship/__init__.py +1 -1
- metadata/generated/schema/api/entityRelationship/entityRelationshipDirection.py +1 -1
- metadata/generated/schema/api/entityRelationship/esEntityRelationshipData.py +1 -1
- metadata/generated/schema/api/entityRelationship/relationshipRef.py +1 -1
- metadata/generated/schema/api/entityRelationship/searchEntityRelationshipRequest.py +1 -1
- metadata/generated/schema/api/entityRelationship/searchEntityRelationshipResult.py +1 -1
- metadata/generated/schema/api/entityRelationship/searchSchemaEntityRelationshipResult.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/governance/__init__.py +1 -1
- metadata/generated/schema/api/governance/createWorkflowDefinition.py +1 -1
- metadata/generated/schema/api/governance/createWorkflowInstanceState.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/lineage/esLineageData.py +1 -1
- metadata/generated/schema/api/lineage/lineageDirection.py +1 -1
- metadata/generated/schema/api/lineage/nodeInformation.py +1 -1
- metadata/generated/schema/api/lineage/searchLineageRequest.py +1 -1
- metadata/generated/schema/api/lineage/searchLineageResult.py +1 -1
- metadata/generated/schema/api/mcp/__init__.py +1 -1
- metadata/generated/schema/api/mcp/mcpSearchResponse.py +1 -1
- metadata/generated/schema/api/mcp/mcpToolDefinition.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/scim/__init__.py +1 -1
- metadata/generated/schema/api/scim/scimGroup.py +1 -1
- metadata/generated/schema/api/scim/scimPatchOp.py +1 -1
- metadata/generated/schema/api/scim/scimUser.py +1 -1
- metadata/generated/schema/api/search/__init__.py +1 -1
- metadata/generated/schema/api/search/previewSearchRequest.py +1 -1
- metadata/generated/schema/api/services/__init__.py +1 -1
- metadata/generated/schema/api/services/createApiService.py +1 -1
- metadata/generated/schema/api/services/createDashboardService.py +1 -1
- metadata/generated/schema/api/services/createDatabaseService.py +1 -1
- metadata/generated/schema/api/services/createDriveService.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/createSecurityService.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/createTestCaseResult.py +1 -1
- metadata/generated/schema/api/tests/createTestDefinition.py +1 -1
- metadata/generated/schema/api/tests/createTestSuite.py +1 -1
- metadata/generated/schema/api/tests/moveGlossaryTermRequest.py +1 -1
- metadata/generated/schema/api/validateGlossaryTagsRequest.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/supportToken.py +1 -1
- metadata/generated/schema/auth/tokenRefreshRequest.py +1 -1
- metadata/generated/schema/configuration/__init__.py +1 -1
- metadata/generated/schema/configuration/aiPlatformConfiguration.py +1 -1
- metadata/generated/schema/configuration/appsPrivateConfiguration.py +1 -1
- metadata/generated/schema/configuration/assetCertificationSettings.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/cacheConfiguration.py +1 -1
- metadata/generated/schema/configuration/changeEventConfiguration.py +1 -1
- metadata/generated/schema/configuration/dataQualityConfiguration.py +1 -1
- metadata/generated/schema/configuration/elasticSearchConfiguration.py +1 -1
- metadata/generated/schema/configuration/entityRulesSettings.py +1 -1
- metadata/generated/schema/configuration/eventHandlerConfiguration.py +1 -1
- metadata/generated/schema/configuration/fernetConfiguration.py +1 -1
- metadata/generated/schema/configuration/jwtTokenConfiguration.py +1 -1
- metadata/generated/schema/configuration/kafkaEventConfiguration.py +1 -1
- metadata/generated/schema/configuration/ldapConfiguration.py +1 -1
- metadata/generated/schema/configuration/ldapTrustStoreConfig/__init__.py +1 -1
- metadata/generated/schema/configuration/ldapTrustStoreConfig/customTrustManagerConfig.py +1 -1
- metadata/generated/schema/configuration/ldapTrustStoreConfig/hostNameConfig.py +1 -1
- metadata/generated/schema/configuration/ldapTrustStoreConfig/jvmDefaultConfig.py +1 -1
- metadata/generated/schema/configuration/ldapTrustStoreConfig/trustAllConfig.py +1 -1
- metadata/generated/schema/configuration/ldapTrustStoreConfig/truststoreConfig.py +1 -1
- metadata/generated/schema/configuration/limitsConfiguration.py +1 -1
- metadata/generated/schema/configuration/lineageSettings.py +1 -1
- metadata/generated/schema/configuration/loginConfiguration.py +1 -1
- metadata/generated/schema/configuration/logoConfiguration.py +1 -1
- metadata/generated/schema/configuration/openMetadataBaseUrlConfiguration.py +1 -1
- metadata/generated/schema/configuration/opertionalConfiguration.py +1 -1
- metadata/generated/schema/configuration/opsConfig.py +1 -1
- metadata/generated/schema/configuration/pipelineServiceClientConfiguration.py +1 -1
- metadata/generated/schema/configuration/profilerConfiguration.py +1 -1
- metadata/generated/schema/configuration/searchSettings.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/configuration/themeConfiguration.py +1 -1
- metadata/generated/schema/configuration/uiThemePreference.py +1 -1
- metadata/generated/schema/configuration/workflowSettings.py +1 -1
- metadata/generated/schema/dataInsight/__init__.py +1 -1
- metadata/generated/schema/dataInsight/custom/__init__.py +1 -1
- metadata/generated/schema/dataInsight/custom/dataInsightCustomChart.py +1 -1
- metadata/generated/schema/dataInsight/custom/dataInsightCustomChartResult.py +1 -1
- metadata/generated/schema/dataInsight/custom/dataInsightCustomChartResultList.py +1 -1
- metadata/generated/schema/dataInsight/custom/formulaHolder.py +1 -1
- metadata/generated/schema/dataInsight/custom/lineChart.py +1 -1
- metadata/generated/schema/dataInsight/custom/summaryCard.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/unusedAssets.py +1 -1
- metadata/generated/schema/email/__init__.py +1 -1
- metadata/generated/schema/email/emailRequest.py +1 -1
- metadata/generated/schema/email/emailTemplate.py +1 -1
- metadata/generated/schema/email/emailTemplatePlaceholder.py +1 -1
- metadata/generated/schema/email/smtpSettings.py +1 -1
- metadata/generated/schema/email/templateValidationReponse.py +1 -1
- metadata/generated/schema/entity/__init__.py +1 -1
- metadata/generated/schema/entity/applications/__init__.py +1 -1
- metadata/generated/schema/entity/applications/app.py +1 -1
- metadata/generated/schema/entity/applications/appExtension.py +1 -1
- metadata/generated/schema/entity/applications/appRunRecord.py +1 -1
- metadata/generated/schema/entity/applications/configuration/__init__.py +1 -1
- metadata/generated/schema/entity/applications/configuration/applicationConfig.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/__init__.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/automator/__init__.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/automator/addCustomProperties.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/automator/addDataProductAction.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/automator/addDescriptionAction.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/automator/addDomainAction.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/automator/addOwnerAction.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/automator/addTagsAction.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/automator/addTermsAction.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/automator/addTestCaseAction.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/automator/addTierAction.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/automator/lineagePropagationAction.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/automator/mlTaggingAction.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/automator/propagationStopConfig.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/automator/removeCustomPropertiesAction.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/automator/removeDataProductAction.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/automator/removeDescriptionAction.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/automator/removeDomainAction.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/automator/removeOwnerAction.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/automator/removeTagsAction.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/automator/removeTermsAction.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/automator/removeTestCaseAction.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/automator/removeTierAction.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/automatorAppConfig.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/collateAIAppConfig.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/metadataExporterAppConfig.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/metadataExporterConnectors/__init__.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/metadataExporterConnectors/bigQueryConnection.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/metadataExporterConnectors/databricksConnection.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/metadataExporterConnectors/redshiftConnection.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/metadataExporterConnectors/snowflakeConnection.py +1 -1
- metadata/generated/schema/entity/applications/configuration/external/slackAppTokenConfiguration.py +1 -1
- metadata/generated/schema/entity/applications/configuration/internal/__init__.py +1 -1
- metadata/generated/schema/entity/applications/configuration/internal/autoPilotAppConfig.py +1 -1
- metadata/generated/schema/entity/applications/configuration/internal/collateAIQualityAgentAppConfig.py +1 -1
- metadata/generated/schema/entity/applications/configuration/internal/collateAITierAgentAppConfig.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/dataRetentionConfiguration.py +1 -1
- metadata/generated/schema/entity/applications/configuration/internal/helloPipelinesConfiguration.py +1 -1
- metadata/generated/schema/entity/applications/configuration/internal/searchIndexingAppConfig.py +1 -1
- metadata/generated/schema/entity/applications/configuration/private/__init__.py +1 -1
- metadata/generated/schema/entity/applications/configuration/private/external/__init__.py +1 -1
- metadata/generated/schema/entity/applications/configuration/private/external/collateAIAppPrivateConfig.py +1 -1
- metadata/generated/schema/entity/applications/configuration/private/internal/__init__.py +1 -1
- metadata/generated/schema/entity/applications/configuration/private/internal/collateAITierAgentAppPrivateConfig.py +1 -1
- metadata/generated/schema/entity/applications/configuration/private/limits.py +1 -1
- metadata/generated/schema/entity/applications/createAppRequest.py +1 -1
- metadata/generated/schema/entity/applications/jobStatus.py +1 -1
- metadata/generated/schema/entity/applications/liveExecutionContext.py +1 -1
- metadata/generated/schema/entity/applications/marketplace/__init__.py +1 -1
- metadata/generated/schema/entity/applications/marketplace/appMarketPlaceDefinition.py +1 -1
- metadata/generated/schema/entity/applications/marketplace/createAppMarketPlaceDefinitionReq.py +1 -1
- metadata/generated/schema/entity/applications/scheduledExecutionContext.py +1 -1
- metadata/generated/schema/entity/automations/__init__.py +1 -1
- metadata/generated/schema/entity/automations/testServiceConnection.py +1 -1
- metadata/generated/schema/entity/automations/workflow.py +1 -1
- metadata/generated/schema/entity/bot.py +1 -1
- metadata/generated/schema/entity/classification/__init__.py +1 -1
- metadata/generated/schema/entity/classification/classification.py +1 -1
- metadata/generated/schema/entity/classification/tag.py +1 -1
- metadata/generated/schema/entity/data/__init__.py +1 -1
- metadata/generated/schema/entity/data/apiCollection.py +1 -1
- metadata/generated/schema/entity/data/apiEndpoint.py +1 -1
- metadata/generated/schema/entity/data/chart.py +1 -1
- metadata/generated/schema/entity/data/container.py +1 -1
- metadata/generated/schema/entity/data/dashboard.py +1 -1
- metadata/generated/schema/entity/data/dashboardDataModel.py +1 -1
- metadata/generated/schema/entity/data/dataContract.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/directory.py +1 -1
- metadata/generated/schema/entity/data/file.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/metric.py +1 -1
- metadata/generated/schema/entity/data/mlmodel.py +1 -1
- metadata/generated/schema/entity/data/pipeline.py +1 -1
- metadata/generated/schema/entity/data/query.py +1 -1
- metadata/generated/schema/entity/data/queryCostRecord.py +1 -1
- metadata/generated/schema/entity/data/queryCostSearchResult.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/spreadsheet.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/data/worksheet.py +1 -1
- metadata/generated/schema/entity/datacontract/__init__.py +1 -1
- metadata/generated/schema/entity/datacontract/dataContractResult.py +1 -1
- metadata/generated/schema/entity/datacontract/qualityValidation.py +1 -1
- metadata/generated/schema/entity/datacontract/schemaValidation.py +1 -1
- metadata/generated/schema/entity/datacontract/semanticsValidation.py +1 -1
- metadata/generated/schema/entity/datacontract/slaValidation.py +1 -1
- metadata/generated/schema/entity/docStore/__init__.py +1 -1
- metadata/generated/schema/entity/docStore/document.py +1 -1
- metadata/generated/schema/entity/domains/__init__.py +1 -1
- metadata/generated/schema/entity/domains/dataProduct.py +1 -1
- metadata/generated/schema/entity/domains/domain.py +1 -1
- metadata/generated/schema/entity/events/__init__.py +1 -1
- metadata/generated/schema/entity/events/webhook.py +1 -1
- metadata/generated/schema/entity/feed/__init__.py +1 -1
- metadata/generated/schema/entity/feed/assets.py +1 -1
- metadata/generated/schema/entity/feed/customProperty.py +1 -1
- metadata/generated/schema/entity/feed/description.py +1 -1
- metadata/generated/schema/entity/feed/domain.py +1 -1
- metadata/generated/schema/entity/feed/entityInfo.py +1 -1
- metadata/generated/schema/entity/feed/owner.py +1 -1
- metadata/generated/schema/entity/feed/suggestion.py +1 -1
- metadata/generated/schema/entity/feed/tag.py +1 -1
- metadata/generated/schema/entity/feed/testCaseResult.py +1 -1
- metadata/generated/schema/entity/feed/thread.py +1 -1
- metadata/generated/schema/entity/policies/__init__.py +1 -1
- metadata/generated/schema/entity/policies/accessControl/__init__.py +1 -1
- metadata/generated/schema/entity/policies/accessControl/resourceDescriptor.py +1 -1
- metadata/generated/schema/entity/policies/accessControl/resourcePermission.py +1 -1
- metadata/generated/schema/entity/policies/accessControl/rule.py +1 -1
- metadata/generated/schema/entity/policies/filters.py +1 -1
- metadata/generated/schema/entity/policies/policy.py +1 -1
- metadata/generated/schema/entity/services/__init__.py +1 -1
- metadata/generated/schema/entity/services/apiService.py +1 -1
- metadata/generated/schema/entity/services/connections/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/api/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/api/restConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/common/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/common/sslCertPaths.py +1 -1
- metadata/generated/schema/entity/services/connections/common/sslCertValues.py +1 -1
- metadata/generated/schema/entity/services/connections/common/sslConfig.py +1 -1
- metadata/generated/schema/entity/services/connections/connectionBasicType.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/customDashboardConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/domoDashboardConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/grafanaConnection.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/microStrategyConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/modeConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/powerBIConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/powerBIReportServerConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/powerbi/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/powerbi/azureConfig.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/powerbi/bucketDetails.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/powerbi/gcsConfig.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/powerbi/s3Config.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/qlikCloudConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/qlikSenseConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/quickSightConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/redashConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/dashboard/sigmaConnection.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/dashboard/thoughtSpotConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/database/athenaConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/azureSQLConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/bigQueryConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/bigTableConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/cassandra/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/database/cassandra/cloudConfig.py +1 -1
- metadata/generated/schema/entity/services/connections/database/cassandraConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/clickhouseConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/cockroachConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/common/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/database/common/azureConfig.py +1 -1
- metadata/generated/schema/entity/services/connections/database/common/basicAuth.py +1 -1
- metadata/generated/schema/entity/services/connections/database/common/iamAuthConfig.py +1 -1
- metadata/generated/schema/entity/services/connections/database/common/jwtAuth.py +1 -1
- metadata/generated/schema/entity/services/connections/database/common/noConfigAuthenticationTypes.py +1 -1
- metadata/generated/schema/entity/services/connections/database/couchbaseConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/customDatabaseConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/databricksConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/datalake/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/database/datalake/azureConfig.py +1 -1
- metadata/generated/schema/entity/services/connections/database/datalake/gcsConfig.py +1 -1
- metadata/generated/schema/entity/services/connections/database/datalake/s3Config.py +1 -1
- metadata/generated/schema/entity/services/connections/database/datalakeConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/db2Connection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/deltaLakeConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/deltalake/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/database/deltalake/metastoreConfig.py +1 -1
- metadata/generated/schema/entity/services/connections/database/deltalake/storageConfig.py +1 -1
- metadata/generated/schema/entity/services/connections/database/domoDatabaseConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/dorisConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/druidConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/dynamoDBConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/epicConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/exasolConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/glueConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/greenplumConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/hiveConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/iceberg/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/database/iceberg/dynamoDbCatalogConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/iceberg/glueCatalogConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/iceberg/hiveCatalogConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/iceberg/icebergCatalog.py +1 -1
- metadata/generated/schema/entity/services/connections/database/iceberg/icebergFileSystem.py +1 -1
- metadata/generated/schema/entity/services/connections/database/iceberg/restCatalogConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/icebergConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/impalaConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/mariaDBConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/mongoDBConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/mssqlConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/mysqlConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/oracleConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/pinotDBConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/postgresConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/prestoConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/redshiftConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/salesforceConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/sapErpConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/sapHana/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/database/sapHana/sapHanaHDBConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/sapHana/sapHanaSQLConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/sapHanaConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/sasConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/serviceNowConnection.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/ssasConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/synapseConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/database/teradataConnection.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/drive/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/drive/customDriveConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/drive/googleDriveConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/drive/sharePointConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/messaging/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/messaging/customMessagingConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/messaging/kafkaConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/messaging/kinesisConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/messaging/pulsarConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/messaging/redpandaConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/messaging/saslMechanismType.py +1 -1
- metadata/generated/schema/entity/services/connections/metadata/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/metadata/alationConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/metadata/alationSinkConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/metadata/amundsenConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/metadata/atlasConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/metadata/metadataESConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/metadata/openMetadataConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/mlmodel/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/mlmodel/customMlModelConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/mlmodel/mlflowConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/mlmodel/sageMakerConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/mlmodel/sklearnConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/mlmodel/vertexaiConnection.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/datafactoryConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/pipeline/dbtCloudConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/pipeline/domoPipelineConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/pipeline/fivetranConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/pipeline/flinkConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/pipeline/gluePipelineConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/pipeline/kafkaConnectConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/pipeline/kinesisFirehoseConnection.py +58 -0
- metadata/generated/schema/entity/services/connections/pipeline/matillion/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/pipeline/matillion/matillionETL.py +1 -1
- metadata/generated/schema/entity/services/connections/pipeline/matillionConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/pipeline/nifi/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/pipeline/nifi/basicAuth.py +1 -1
- metadata/generated/schema/entity/services/connections/pipeline/nifi/clientCertificateAuth.py +1 -1
- metadata/generated/schema/entity/services/connections/pipeline/nifiConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/pipeline/openLineageConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/pipeline/sparkConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/pipeline/splineConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/pipeline/ssisConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/pipeline/stitchConnection.py +1 -1
- metadata/generated/schema/entity/services/connections/pipeline/wherescapeConnection.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/security/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/security/ranger/__init__.py +1 -1
- metadata/generated/schema/entity/services/connections/security/ranger/basicAuth.py +1 -1
- metadata/generated/schema/entity/services/connections/security/rangerConnection.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 +1 -1
- metadata/generated/schema/entity/services/driveService.py +1 -1
- metadata/generated/schema/entity/services/ingestionPipelines/__init__.py +1 -1
- metadata/generated/schema/entity/services/ingestionPipelines/ingestionPipeline.py +1 -1
- metadata/generated/schema/entity/services/ingestionPipelines/pipelineServiceClientResponse.py +1 -1
- metadata/generated/schema/entity/services/ingestionPipelines/reverseIngestionResponse.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 +4 -1
- metadata/generated/schema/entity/services/searchService.py +1 -1
- metadata/generated/schema/entity/services/securityService.py +1 -1
- metadata/generated/schema/entity/services/serviceType.py +1 -1
- metadata/generated/schema/entity/services/storageService.py +1 -1
- metadata/generated/schema/entity/teams/__init__.py +1 -1
- metadata/generated/schema/entity/teams/persona.py +1 -1
- metadata/generated/schema/entity/teams/role.py +1 -1
- metadata/generated/schema/entity/teams/team.py +1 -1
- metadata/generated/schema/entity/teams/teamHierarchy.py +1 -1
- metadata/generated/schema/entity/teams/user.py +1 -1
- metadata/generated/schema/entity/type.py +1 -1
- metadata/generated/schema/entity/utils/__init__.py +1 -1
- metadata/generated/schema/entity/utils/entitiesCount.py +1 -1
- metadata/generated/schema/entity/utils/servicesCount.py +1 -1
- metadata/generated/schema/entity/utils/supersetApiConnection.py +1 -1
- metadata/generated/schema/events/__init__.py +1 -1
- metadata/generated/schema/events/alertMetrics.py +1 -1
- metadata/generated/schema/events/api/__init__.py +1 -1
- metadata/generated/schema/events/api/createEventSubscription.py +1 -1
- metadata/generated/schema/events/api/eventSubscriptionDiagnosticInfo.py +1 -1
- metadata/generated/schema/events/api/eventsRecord.py +1 -1
- metadata/generated/schema/events/api/testEventSubscriptionDestination.py +1 -1
- metadata/generated/schema/events/api/typedEvent.py +1 -1
- metadata/generated/schema/events/emailAlertConfig.py +1 -1
- metadata/generated/schema/events/eventFilterRule.py +1 -1
- metadata/generated/schema/events/eventSubscription.py +1 -1
- metadata/generated/schema/events/eventSubscriptionOffset.py +1 -1
- metadata/generated/schema/events/failedEvent.py +1 -1
- metadata/generated/schema/events/failedEventResponse.py +1 -1
- metadata/generated/schema/events/filterResourceDescriptor.py +1 -1
- metadata/generated/schema/events/statusContext.py +1 -1
- metadata/generated/schema/events/subscriptionResourceDescriptor.py +1 -1
- metadata/generated/schema/events/subscriptionStatus.py +1 -1
- metadata/generated/schema/events/testDestinationStatus.py +1 -1
- metadata/generated/schema/governance/workflows/__init__.py +1 -1
- metadata/generated/schema/governance/workflows/elements/__init__.py +1 -1
- metadata/generated/schema/governance/workflows/elements/edge.py +1 -1
- metadata/generated/schema/governance/workflows/elements/nodeSubType.py +1 -1
- metadata/generated/schema/governance/workflows/elements/nodeType.py +1 -1
- metadata/generated/schema/governance/workflows/elements/nodes/__init__.py +1 -1
- metadata/generated/schema/governance/workflows/elements/nodes/automatedTask/__init__.py +1 -1
- metadata/generated/schema/governance/workflows/elements/nodes/automatedTask/checkEntityAttributesTask.py +1 -1
- metadata/generated/schema/governance/workflows/elements/nodes/automatedTask/createAndRunIngestionPipelineTask.py +1 -1
- metadata/generated/schema/governance/workflows/elements/nodes/automatedTask/runAppTask.py +1 -1
- metadata/generated/schema/governance/workflows/elements/nodes/automatedTask/setEntityCertificationTask.py +1 -1
- metadata/generated/schema/governance/workflows/elements/nodes/automatedTask/setGlossaryTermStatusTask.py +1 -1
- metadata/generated/schema/governance/workflows/elements/nodes/endEvent/__init__.py +1 -1
- metadata/generated/schema/governance/workflows/elements/nodes/endEvent/endEvent.py +1 -1
- metadata/generated/schema/governance/workflows/elements/nodes/gateway/__init__.py +1 -1
- metadata/generated/schema/governance/workflows/elements/nodes/gateway/parallelGateway.py +1 -1
- metadata/generated/schema/governance/workflows/elements/nodes/startEvent/__init__.py +1 -1
- metadata/generated/schema/governance/workflows/elements/nodes/startEvent/startEvent.py +1 -1
- metadata/generated/schema/governance/workflows/elements/nodes/userTask/__init__.py +1 -1
- metadata/generated/schema/governance/workflows/elements/nodes/userTask/userApprovalTask.py +1 -1
- metadata/generated/schema/governance/workflows/elements/triggers/__init__.py +1 -1
- metadata/generated/schema/governance/workflows/elements/triggers/eventBasedEntityTrigger.py +1 -1
- metadata/generated/schema/governance/workflows/elements/triggers/noOpTrigger.py +1 -1
- metadata/generated/schema/governance/workflows/elements/triggers/periodicBatchEntityTrigger.py +1 -1
- metadata/generated/schema/governance/workflows/workflowDefinition.py +1 -1
- metadata/generated/schema/governance/workflows/workflowInstance.py +1 -1
- metadata/generated/schema/governance/workflows/workflowInstanceState.py +1 -1
- metadata/generated/schema/jobs/__init__.py +1 -1
- metadata/generated/schema/jobs/backgroundJob.py +1 -1
- metadata/generated/schema/jobs/enumCleanupArgs.py +1 -1
- metadata/generated/schema/metadataIngestion/__init__.py +1 -1
- metadata/generated/schema/metadataIngestion/apiServiceMetadataPipeline.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/databaseServiceAutoClassificationPipeline.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/driveServiceMetadataPipeline.py +1 -1
- metadata/generated/schema/metadataIngestion/engine/__init__.py +1 -1
- metadata/generated/schema/metadataIngestion/engine/nativeEngineConfig.py +1 -1
- metadata/generated/schema/metadataIngestion/engine/sparkEngineConfig.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/reverseIngestionPipeline.py +1 -1
- metadata/generated/schema/metadataIngestion/reverseingestionconfig/__init__.py +1 -1
- metadata/generated/schema/metadataIngestion/reverseingestionconfig/descriptionConfig.py +1 -1
- metadata/generated/schema/metadataIngestion/reverseingestionconfig/ownerConfig.py +1 -1
- metadata/generated/schema/metadataIngestion/reverseingestionconfig/tagsConfig.py +1 -1
- metadata/generated/schema/metadataIngestion/searchServiceMetadataPipeline.py +1 -1
- metadata/generated/schema/metadataIngestion/securityServiceMetadataPipeline.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/scim/__init__.py +1 -1
- metadata/generated/schema/scim/scimConfiguration.py +1 -1
- metadata/generated/schema/search/__init__.py +1 -1
- metadata/generated/schema/search/aggregationRequest.py +1 -1
- metadata/generated/schema/search/searchRequest.py +1 -1
- metadata/generated/schema/security/__init__.py +1 -1
- metadata/generated/schema/security/client/__init__.py +1 -1
- metadata/generated/schema/security/client/auth0SSOClientConfig.py +1 -1
- metadata/generated/schema/security/client/azureSSOClientConfig.py +1 -1
- metadata/generated/schema/security/client/customOidcSSOClientConfig.py +1 -1
- metadata/generated/schema/security/client/googleSSOClientConfig.py +1 -1
- metadata/generated/schema/security/client/oidcClientConfig.py +1 -1
- metadata/generated/schema/security/client/oktaSSOClientConfig.py +1 -1
- metadata/generated/schema/security/client/openMetadataJWTClientConfig.py +1 -1
- metadata/generated/schema/security/client/samlSSOClientConfig.py +1 -1
- metadata/generated/schema/security/credentials/__init__.py +1 -1
- metadata/generated/schema/security/credentials/accessTokenAuth.py +1 -1
- metadata/generated/schema/security/credentials/apiAccessTokenAuth.py +1 -1
- metadata/generated/schema/security/credentials/awsCredentials.py +1 -1
- metadata/generated/schema/security/credentials/azureCredentials.py +1 -1
- metadata/generated/schema/security/credentials/basicAuth.py +1 -1
- metadata/generated/schema/security/credentials/bitbucketCredentials.py +1 -1
- metadata/generated/schema/security/credentials/gcpCredentials.py +1 -1
- metadata/generated/schema/security/credentials/gcpExternalAccount.py +1 -1
- metadata/generated/schema/security/credentials/gcpValues.py +1 -1
- metadata/generated/schema/security/credentials/gitCredentials.py +1 -1
- metadata/generated/schema/security/credentials/githubCredentials.py +1 -1
- metadata/generated/schema/security/credentials/gitlabCredentials.py +1 -1
- metadata/generated/schema/security/credentials/kubernetesCredentials.py +1 -1
- metadata/generated/schema/security/sasl/__init__.py +1 -1
- metadata/generated/schema/security/sasl/saslClientConfig.py +1 -1
- metadata/generated/schema/security/secrets/__init__.py +1 -1
- metadata/generated/schema/security/secrets/secretsManagerClientLoader.py +1 -1
- metadata/generated/schema/security/secrets/secretsManagerConfiguration.py +1 -1
- metadata/generated/schema/security/secrets/secretsManagerProvider.py +1 -1
- metadata/generated/schema/security/securityConfiguration.py +1 -1
- metadata/generated/schema/security/ssl/__init__.py +1 -1
- metadata/generated/schema/security/ssl/validateSSLClientConfig.py +1 -1
- metadata/generated/schema/security/ssl/verifySSLConfig.py +1 -1
- metadata/generated/schema/settings/__init__.py +1 -1
- metadata/generated/schema/settings/settings.py +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/limitsResponse.py +1 -1
- metadata/generated/schema/system/ui/__init__.py +1 -1
- metadata/generated/schema/system/ui/knowledgePanel.py +1 -1
- metadata/generated/schema/system/ui/navigationItem.py +1 -1
- metadata/generated/schema/system/ui/page.py +1 -1
- metadata/generated/schema/system/ui/tab.py +1 -1
- metadata/generated/schema/system/ui/uiCustomization.py +1 -1
- metadata/generated/schema/system/validationResponse.py +1 -1
- metadata/generated/schema/tests/__init__.py +1 -1
- metadata/generated/schema/tests/assigned.py +1 -1
- metadata/generated/schema/tests/basic.py +1 -1
- metadata/generated/schema/tests/customMetric.py +1 -1
- metadata/generated/schema/tests/dataQualityReport.py +1 -1
- metadata/generated/schema/tests/resolved.py +1 -1
- metadata/generated/schema/tests/testCase.py +1 -1
- metadata/generated/schema/tests/testCaseResolutionStatus.py +1 -1
- metadata/generated/schema/tests/testDefinition.py +1 -1
- metadata/generated/schema/tests/testSuite.py +1 -1
- metadata/generated/schema/type/__init__.py +1 -1
- metadata/generated/schema/type/apiSchema.py +1 -1
- metadata/generated/schema/type/assetCertification.py +1 -1
- metadata/generated/schema/type/auditLog.py +1 -1
- metadata/generated/schema/type/basic.py +1 -1
- metadata/generated/schema/type/bulkOperationResult.py +1 -1
- metadata/generated/schema/type/changeEvent.py +1 -1
- metadata/generated/schema/type/changeEventType.py +1 -1
- metadata/generated/schema/type/changeSummaryMap.py +1 -1
- metadata/generated/schema/type/collectionDescriptor.py +1 -1
- metadata/generated/schema/type/contractExecutionStatus.py +1 -1
- metadata/generated/schema/type/csvDocumentation.py +1 -1
- metadata/generated/schema/type/csvErrorType.py +1 -1
- metadata/generated/schema/type/csvFile.py +1 -1
- metadata/generated/schema/type/csvImportResult.py +1 -1
- metadata/generated/schema/type/customProperties/__init__.py +1 -1
- metadata/generated/schema/type/customProperties/complexTypes.py +1 -1
- metadata/generated/schema/type/customProperties/enumConfig.py +1 -1
- metadata/generated/schema/type/customProperties/tableConfig.py +1 -1
- metadata/generated/schema/type/customProperty.py +1 -1
- metadata/generated/schema/type/dailyCount.py +1 -1
- metadata/generated/schema/type/databaseConnectionConfig.py +1 -1
- metadata/generated/schema/type/entityHierarchy.py +1 -1
- metadata/generated/schema/type/entityHistory.py +1 -1
- metadata/generated/schema/type/entityLineage.py +1 -1
- metadata/generated/schema/type/entityProfile.py +1 -1
- metadata/generated/schema/type/entityReference.py +1 -1
- metadata/generated/schema/type/entityReferenceList.py +1 -1
- metadata/generated/schema/type/entityRelationship/__init__.py +1 -1
- metadata/generated/schema/type/entityRelationship/nodeInformation.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/layerPaging.py +1 -1
- metadata/generated/schema/type/lifeCycle.py +1 -1
- metadata/generated/schema/type/paging.py +1 -1
- metadata/generated/schema/type/personaPreferences.py +1 -1
- metadata/generated/schema/type/profile.py +1 -1
- metadata/generated/schema/type/queryParserData.py +1 -1
- metadata/generated/schema/type/reaction.py +1 -1
- metadata/generated/schema/type/schedule.py +1 -1
- metadata/generated/schema/type/schema.py +1 -1
- metadata/generated/schema/type/tableQuery.py +1 -1
- metadata/generated/schema/type/tableUsageCount.py +1 -1
- metadata/generated/schema/type/tagLabel.py +1 -1
- metadata/generated/schema/type/usageDetails.py +1 -1
- metadata/generated/schema/type/usageRequest.py +1 -1
- metadata/generated/schema/type/votes.py +1 -1
- metadata/ingestion/ometa/mixins/es_mixin.py +5 -1
- metadata/ingestion/source/database/databricks/client.py +120 -0
- metadata/ingestion/source/database/unitycatalog/lineage.py +3 -2
- metadata/ingestion/source/pipeline/databrickspipeline/connection.py +1 -0
- metadata/ingestion/source/pipeline/databrickspipeline/kafka_parser.py +347 -0
- metadata/ingestion/source/pipeline/databrickspipeline/metadata.py +720 -36
- metadata/ingestion/source/pipeline/databrickspipeline/models.py +19 -3
- metadata/ingestion/source/pipeline/kafkaconnect/client.py +62 -18
- metadata/ingestion/source/pipeline/kafkaconnect/metadata.py +1175 -101
- metadata/ingestion/source/pipeline/kafkaconnect/models.py +3 -0
- metadata/utils/fqn.py +59 -2
- {openmetadata_ingestion-1.9.13.0.dist-info ā openmetadata_ingestion-1.9.14.0.dist-info}/METADATA +547 -547
- {openmetadata_ingestion-1.9.13.0.dist-info ā openmetadata_ingestion-1.9.14.0.dist-info}/RECORD +789 -786
- {openmetadata_ingestion-1.9.13.0.dist-info ā openmetadata_ingestion-1.9.14.0.dist-info}/LICENSE +0 -0
- {openmetadata_ingestion-1.9.13.0.dist-info ā openmetadata_ingestion-1.9.14.0.dist-info}/WHEEL +0 -0
- {openmetadata_ingestion-1.9.13.0.dist-info ā openmetadata_ingestion-1.9.14.0.dist-info}/entry_points.txt +0 -0
- {openmetadata_ingestion-1.9.13.0.dist-info ā openmetadata_ingestion-1.9.14.0.dist-info}/top_level.txt +0 -0
|
@@ -28,6 +28,7 @@ from metadata.generated.schema.entity.data.pipeline import (
|
|
|
28
28
|
TaskStatus,
|
|
29
29
|
)
|
|
30
30
|
from metadata.generated.schema.entity.data.table import Table
|
|
31
|
+
from metadata.generated.schema.entity.data.topic import Topic
|
|
31
32
|
from metadata.generated.schema.entity.services.connections.pipeline.databricksPipelineConnection import (
|
|
32
33
|
DatabricksPipelineConnection,
|
|
33
34
|
)
|
|
@@ -56,6 +57,10 @@ from metadata.ingestion.api.steps import InvalidSourceException
|
|
|
56
57
|
from metadata.ingestion.lineage.sql_lineage import get_column_fqn
|
|
57
58
|
from metadata.ingestion.models.pipeline_status import OMetaPipelineStatus
|
|
58
59
|
from metadata.ingestion.ometa.ometa_api import OpenMetadata
|
|
60
|
+
from metadata.ingestion.source.pipeline.databrickspipeline.kafka_parser import (
|
|
61
|
+
extract_dlt_table_names,
|
|
62
|
+
extract_kafka_sources,
|
|
63
|
+
)
|
|
59
64
|
from metadata.ingestion.source.pipeline.databrickspipeline.models import (
|
|
60
65
|
DataBrickPipelineDetails,
|
|
61
66
|
DBRun,
|
|
@@ -86,6 +91,12 @@ class DatabrickspipelineSource(PipelineServiceSource):
|
|
|
86
91
|
Pipeline metadata from Databricks Jobs API
|
|
87
92
|
"""
|
|
88
93
|
|
|
94
|
+
def __init__(self, config, metadata):
|
|
95
|
+
super().__init__(config, metadata)
|
|
96
|
+
# Cache for Databricks services to avoid repeated API calls
|
|
97
|
+
self._databricks_services_cached = False
|
|
98
|
+
self._databricks_services: List[str] = []
|
|
99
|
+
|
|
89
100
|
@classmethod
|
|
90
101
|
def create(
|
|
91
102
|
cls, config_dict, metadata: OpenMetadata, pipeline_name: Optional[str] = None
|
|
@@ -105,14 +116,30 @@ class DatabrickspipelineSource(PipelineServiceSource):
|
|
|
105
116
|
yield DataBrickPipelineDetails(**workflow)
|
|
106
117
|
except Exception as exc:
|
|
107
118
|
logger.debug(traceback.format_exc())
|
|
108
|
-
logger.error(f"Failed to get
|
|
119
|
+
logger.error(f"Failed to get jobs list due to : {exc}")
|
|
120
|
+
|
|
121
|
+
# Fetch DLT pipelines directly (new)
|
|
122
|
+
try:
|
|
123
|
+
for pipeline in self.client.list_pipelines() or []:
|
|
124
|
+
try:
|
|
125
|
+
yield DataBrickPipelineDetails(**pipeline)
|
|
126
|
+
except Exception as exc:
|
|
127
|
+
logger.debug(f"Error creating DLT pipeline details: {exc}")
|
|
128
|
+
logger.debug(traceback.format_exc())
|
|
129
|
+
continue
|
|
130
|
+
except Exception as exc:
|
|
131
|
+
logger.debug(traceback.format_exc())
|
|
132
|
+
logger.warning(f"Failed to get DLT pipelines list due to : {exc}")
|
|
133
|
+
|
|
109
134
|
return None
|
|
110
135
|
|
|
111
136
|
def get_pipeline_name(
|
|
112
137
|
self, pipeline_details: DataBrickPipelineDetails
|
|
113
138
|
) -> Optional[str]:
|
|
114
139
|
try:
|
|
115
|
-
|
|
140
|
+
if pipeline_details.pipeline_id:
|
|
141
|
+
return pipeline_details.name
|
|
142
|
+
return pipeline_details.settings.name if pipeline_details.settings else None
|
|
116
143
|
except Exception as exc:
|
|
117
144
|
logger.debug(traceback.format_exc())
|
|
118
145
|
logger.error(f"Failed to get pipeline name due to : {exc}")
|
|
@@ -124,17 +151,35 @@ class DatabrickspipelineSource(PipelineServiceSource):
|
|
|
124
151
|
) -> Iterable[Either[CreatePipelineRequest]]:
|
|
125
152
|
"""Method to Get Pipeline Entity"""
|
|
126
153
|
try:
|
|
127
|
-
|
|
154
|
+
if pipeline_details.pipeline_id:
|
|
155
|
+
description = None
|
|
156
|
+
display_name = pipeline_details.name
|
|
157
|
+
entity_name = str(pipeline_details.pipeline_id)
|
|
158
|
+
schedule_interval = None
|
|
159
|
+
else:
|
|
160
|
+
description = (
|
|
161
|
+
pipeline_details.settings.description
|
|
162
|
+
if pipeline_details.settings
|
|
163
|
+
else None
|
|
164
|
+
)
|
|
165
|
+
display_name = (
|
|
166
|
+
pipeline_details.settings.name
|
|
167
|
+
if pipeline_details.settings
|
|
168
|
+
else None
|
|
169
|
+
)
|
|
170
|
+
entity_name = str(pipeline_details.job_id)
|
|
171
|
+
schedule_interval = (
|
|
172
|
+
str(pipeline_details.settings.schedule.cron)
|
|
173
|
+
if pipeline_details.settings and pipeline_details.settings.schedule
|
|
174
|
+
else None
|
|
175
|
+
)
|
|
176
|
+
|
|
128
177
|
pipeline_request = CreatePipelineRequest(
|
|
129
|
-
name=EntityName(
|
|
130
|
-
displayName=
|
|
178
|
+
name=EntityName(entity_name),
|
|
179
|
+
displayName=display_name,
|
|
131
180
|
description=Markdown(description) if description else None,
|
|
132
181
|
tasks=self.get_tasks(pipeline_details),
|
|
133
|
-
scheduleInterval=
|
|
134
|
-
str(pipeline_details.settings.schedule.cron)
|
|
135
|
-
if pipeline_details.settings.schedule
|
|
136
|
-
else None
|
|
137
|
-
),
|
|
182
|
+
scheduleInterval=schedule_interval,
|
|
138
183
|
service=FullyQualifiedEntityName(self.context.get().pipeline_service),
|
|
139
184
|
)
|
|
140
185
|
yield Either(right=pipeline_request)
|
|
@@ -170,31 +215,25 @@ class DatabrickspipelineSource(PipelineServiceSource):
|
|
|
170
215
|
|
|
171
216
|
def get_tasks(self, pipeline_details: DataBrickPipelineDetails) -> List[Task]:
|
|
172
217
|
try:
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
downstreamTasks=[
|
|
190
|
-
depend_task.name
|
|
191
|
-
for depend_task in task.depends_on or []
|
|
192
|
-
],
|
|
193
|
-
)
|
|
194
|
-
for task in run.tasks or []
|
|
195
|
-
]
|
|
218
|
+
if not pipeline_details.settings or not pipeline_details.settings.tasks:
|
|
219
|
+
return None
|
|
220
|
+
|
|
221
|
+
job_url = f"https://{self.service_connection.hostPort}/#job/{pipeline_details.job_id}"
|
|
222
|
+
|
|
223
|
+
return [
|
|
224
|
+
Task(
|
|
225
|
+
name=str(task.name),
|
|
226
|
+
taskType=pipeline_details.settings.task_type,
|
|
227
|
+
sourceUrl=SourceUrl(job_url),
|
|
228
|
+
description=(
|
|
229
|
+
Markdown(task.description) if task.description else None
|
|
230
|
+
),
|
|
231
|
+
downstreamTasks=[
|
|
232
|
+
depend_task.name for depend_task in task.depends_on or []
|
|
233
|
+
],
|
|
196
234
|
)
|
|
197
|
-
|
|
235
|
+
for task in pipeline_details.settings.tasks
|
|
236
|
+
]
|
|
198
237
|
except Exception as exc:
|
|
199
238
|
logger.debug(traceback.format_exc())
|
|
200
239
|
logger.warning(f"Failed to get tasks list due to : {exc}")
|
|
@@ -204,6 +243,9 @@ class DatabrickspipelineSource(PipelineServiceSource):
|
|
|
204
243
|
self, pipeline_details: DataBrickPipelineDetails
|
|
205
244
|
) -> Iterable[OMetaPipelineStatus]:
|
|
206
245
|
try:
|
|
246
|
+
if not pipeline_details.job_id:
|
|
247
|
+
return
|
|
248
|
+
|
|
207
249
|
for run in self.client.get_job_runs(job_id=pipeline_details.job_id) or []:
|
|
208
250
|
run = DBRun(**run)
|
|
209
251
|
task_status = [
|
|
@@ -241,7 +283,7 @@ class DatabrickspipelineSource(PipelineServiceSource):
|
|
|
241
283
|
except Exception as exc:
|
|
242
284
|
yield Either(
|
|
243
285
|
left=StackTraceError(
|
|
244
|
-
name=pipeline_details.
|
|
286
|
+
name=pipeline_details.id,
|
|
245
287
|
error=f"Failed to yield pipeline status: {exc}",
|
|
246
288
|
stackTrace=traceback.format_exc(),
|
|
247
289
|
)
|
|
@@ -300,6 +342,641 @@ class DatabrickspipelineSource(PipelineServiceSource):
|
|
|
300
342
|
)
|
|
301
343
|
return processed_column_lineage or []
|
|
302
344
|
|
|
345
|
+
def _get_databricks_services(self) -> List[str]:
|
|
346
|
+
"""
|
|
347
|
+
Get list of all Databricks/Unity Catalog database service names from OpenMetadata
|
|
348
|
+
|
|
349
|
+
Caches the result to avoid repeated API calls during lineage extraction.
|
|
350
|
+
Returns list of service names that are of type Databricks or UnityCatalog.
|
|
351
|
+
"""
|
|
352
|
+
# Return cached services if already fetched
|
|
353
|
+
if self._databricks_services_cached:
|
|
354
|
+
logger.debug(
|
|
355
|
+
f"Using cached Databricks services: {self._databricks_services}"
|
|
356
|
+
)
|
|
357
|
+
return self._databricks_services
|
|
358
|
+
|
|
359
|
+
try:
|
|
360
|
+
from metadata.generated.schema.entity.services.databaseService import (
|
|
361
|
+
DatabaseService,
|
|
362
|
+
)
|
|
363
|
+
|
|
364
|
+
logger.info("Fetching Databricks/Unity Catalog database services...")
|
|
365
|
+
|
|
366
|
+
# List all database services
|
|
367
|
+
services = self.metadata.list_all_entities(
|
|
368
|
+
entity=DatabaseService, fields=["serviceType"]
|
|
369
|
+
)
|
|
370
|
+
|
|
371
|
+
databricks_services = []
|
|
372
|
+
for service in services or []:
|
|
373
|
+
try:
|
|
374
|
+
service_type = (
|
|
375
|
+
service.serviceType.value
|
|
376
|
+
if hasattr(service, "serviceType")
|
|
377
|
+
else None
|
|
378
|
+
)
|
|
379
|
+
service_name = (
|
|
380
|
+
service.name.root
|
|
381
|
+
if hasattr(service.name, "root")
|
|
382
|
+
else service.name
|
|
383
|
+
)
|
|
384
|
+
|
|
385
|
+
logger.debug(f" Service: {service_name}, Type: {service_type}")
|
|
386
|
+
|
|
387
|
+
# Check if it's a Databricks or Unity Catalog service
|
|
388
|
+
if service_type and service_type.lower() in [
|
|
389
|
+
"databricks",
|
|
390
|
+
"unitycatalog",
|
|
391
|
+
]:
|
|
392
|
+
databricks_services.append(service_name)
|
|
393
|
+
logger.debug(
|
|
394
|
+
f" ā Databricks/Unity Catalog service: {service_name}"
|
|
395
|
+
)
|
|
396
|
+
|
|
397
|
+
except Exception as exc:
|
|
398
|
+
logger.debug(f" Error processing service: {exc}")
|
|
399
|
+
continue
|
|
400
|
+
|
|
401
|
+
# Cache the results
|
|
402
|
+
self._databricks_services = databricks_services
|
|
403
|
+
self._databricks_services_cached = True
|
|
404
|
+
|
|
405
|
+
logger.info(
|
|
406
|
+
f"Found {len(databricks_services)} Databricks/Unity Catalog service(s): {databricks_services}"
|
|
407
|
+
)
|
|
408
|
+
return databricks_services
|
|
409
|
+
|
|
410
|
+
except Exception as exc:
|
|
411
|
+
logger.warning(f"Error fetching Databricks services: {exc}")
|
|
412
|
+
logger.debug(traceback.format_exc())
|
|
413
|
+
# Cache empty list to avoid repeated failures
|
|
414
|
+
self._databricks_services = []
|
|
415
|
+
self._databricks_services_cached = True
|
|
416
|
+
return []
|
|
417
|
+
|
|
418
|
+
def _find_dlt_table(
|
|
419
|
+
self, table_name: str, catalog: Optional[str], schema: Optional[str]
|
|
420
|
+
) -> Optional[Table]:
|
|
421
|
+
"""
|
|
422
|
+
Find DLT table in OpenMetadata by iterating through Databricks services
|
|
423
|
+
|
|
424
|
+
DLT pipelines only write to Databricks/Unity Catalog Delta tables.
|
|
425
|
+
Uses catalog.schema.table_name from DLT spec to build FQN for each Databricks service.
|
|
426
|
+
|
|
427
|
+
Args:
|
|
428
|
+
table_name: Table name extracted from notebook code
|
|
429
|
+
catalog: Catalog name from DLT pipeline spec (database in OpenMetadata)
|
|
430
|
+
schema: Schema name from DLT pipeline spec
|
|
431
|
+
|
|
432
|
+
Returns:
|
|
433
|
+
Table entity if found, None otherwise
|
|
434
|
+
"""
|
|
435
|
+
try:
|
|
436
|
+
logger.debug(
|
|
437
|
+
f"Searching for DLT table: catalog={catalog}, schema={schema}, table={table_name}"
|
|
438
|
+
)
|
|
439
|
+
|
|
440
|
+
# Get all Databricks/Unity Catalog services (uses cache)
|
|
441
|
+
databricks_services = self._get_databricks_services()
|
|
442
|
+
|
|
443
|
+
if not databricks_services:
|
|
444
|
+
logger.warning(
|
|
445
|
+
"No Databricks/Unity Catalog services found in OpenMetadata"
|
|
446
|
+
)
|
|
447
|
+
# Fall back to configured dbServiceNames if available
|
|
448
|
+
databricks_services = self.get_db_service_names() or []
|
|
449
|
+
if databricks_services:
|
|
450
|
+
logger.info(
|
|
451
|
+
f"Using configured database services: {databricks_services}"
|
|
452
|
+
)
|
|
453
|
+
|
|
454
|
+
if not databricks_services:
|
|
455
|
+
return None
|
|
456
|
+
|
|
457
|
+
logger.debug(f"Trying {len(databricks_services)} Databricks service(s)")
|
|
458
|
+
|
|
459
|
+
# Try each Databricks service with exact case
|
|
460
|
+
for service_name in databricks_services:
|
|
461
|
+
try:
|
|
462
|
+
# Build FQN: service.catalog.schema.table
|
|
463
|
+
table_fqn = fqn.build(
|
|
464
|
+
metadata=self.metadata,
|
|
465
|
+
entity_type=Table,
|
|
466
|
+
service_name=service_name,
|
|
467
|
+
database_name=catalog,
|
|
468
|
+
schema_name=schema,
|
|
469
|
+
table_name=table_name,
|
|
470
|
+
)
|
|
471
|
+
|
|
472
|
+
logger.debug(f" Trying FQN: {table_fqn}")
|
|
473
|
+
|
|
474
|
+
# Try to get table
|
|
475
|
+
table = self.metadata.get_by_name(entity=Table, fqn=table_fqn)
|
|
476
|
+
if table:
|
|
477
|
+
logger.info(f"Found DLT table with FQN: {table_fqn}")
|
|
478
|
+
return table
|
|
479
|
+
|
|
480
|
+
except Exception as exc:
|
|
481
|
+
logger.debug(f" Error checking service {service_name}: {exc}")
|
|
482
|
+
continue
|
|
483
|
+
|
|
484
|
+
# If no exact match found, try case-insensitive (Unity Catalog lowercases table names)
|
|
485
|
+
logger.debug("Exact match not found, trying lowercase variants...")
|
|
486
|
+
for service_name in databricks_services:
|
|
487
|
+
try:
|
|
488
|
+
table_fqn = fqn.build(
|
|
489
|
+
metadata=self.metadata,
|
|
490
|
+
entity_type=Table,
|
|
491
|
+
service_name=service_name,
|
|
492
|
+
database_name=catalog.lower() if catalog else None,
|
|
493
|
+
schema_name=schema.lower() if schema else None,
|
|
494
|
+
table_name=table_name.lower(),
|
|
495
|
+
)
|
|
496
|
+
|
|
497
|
+
logger.debug(f" Trying lowercase FQN: {table_fqn}")
|
|
498
|
+
|
|
499
|
+
table = self.metadata.get_by_name(entity=Table, fqn=table_fqn)
|
|
500
|
+
if table:
|
|
501
|
+
logger.info(
|
|
502
|
+
f"Found DLT table with FQN (lowercase): {table_fqn}"
|
|
503
|
+
)
|
|
504
|
+
return table
|
|
505
|
+
|
|
506
|
+
except Exception as exc:
|
|
507
|
+
logger.debug(
|
|
508
|
+
f" Error checking service {service_name} (lowercase): {exc}"
|
|
509
|
+
)
|
|
510
|
+
continue
|
|
511
|
+
|
|
512
|
+
except Exception as exc:
|
|
513
|
+
logger.debug(f"Could not find DLT table {table_name}: {exc}")
|
|
514
|
+
logger.debug(traceback.format_exc())
|
|
515
|
+
|
|
516
|
+
logger.warning(
|
|
517
|
+
f"DLT table not found: {catalog}.{schema}.{table_name}. "
|
|
518
|
+
f"Ensure the table is ingested from a Databricks/Unity Catalog database service."
|
|
519
|
+
)
|
|
520
|
+
return None
|
|
521
|
+
|
|
522
|
+
def _find_kafka_topic(self, topic_name: str) -> Optional[Topic]:
|
|
523
|
+
"""
|
|
524
|
+
Find Kafka topic in OpenMetadata using Elasticsearch search
|
|
525
|
+
|
|
526
|
+
Handles topic names with dots (e.g., "dev.ern.cashout.moneyRequest_v1")
|
|
527
|
+
by searching with wildcard pattern: *.topic_name
|
|
528
|
+
|
|
529
|
+
Topic FQN format: MessagingServiceName.TopicName
|
|
530
|
+
When TopicName has dots, it's quoted: MessagingServiceName."dev.ern.topic"
|
|
531
|
+
"""
|
|
532
|
+
try:
|
|
533
|
+
logger.debug(
|
|
534
|
+
f"Searching for topic {topic_name} across all messaging services"
|
|
535
|
+
)
|
|
536
|
+
|
|
537
|
+
# Use ES search with wildcard pattern to find topic regardless of service
|
|
538
|
+
# Pattern: *.topic_name or *."topic.with.dots"
|
|
539
|
+
from metadata.utils.elasticsearch import ES_INDEX_MAP
|
|
540
|
+
|
|
541
|
+
# Quote the topic name if it contains dots
|
|
542
|
+
search_topic_name = f'"{topic_name}"' if "." in topic_name else topic_name
|
|
543
|
+
search_pattern = f"*.{search_topic_name}"
|
|
544
|
+
|
|
545
|
+
logger.debug(f"Using search pattern: {search_pattern}")
|
|
546
|
+
|
|
547
|
+
# Search using ES field query for FQN pattern matching
|
|
548
|
+
query_string = f"/search/fieldQuery?fieldName=fullyQualifiedName&fieldValue={search_pattern}&from=0&size=10&index={ES_INDEX_MAP['Topic']}&deleted=false"
|
|
549
|
+
|
|
550
|
+
try:
|
|
551
|
+
response = self.metadata.client.get(query_string)
|
|
552
|
+
if response and response.get("hits", {}).get("hits"):
|
|
553
|
+
# Get the first matching topic
|
|
554
|
+
hit = response["hits"]["hits"][0]
|
|
555
|
+
topic_fqn = hit["_source"]["fullyQualifiedName"]
|
|
556
|
+
|
|
557
|
+
# Fetch full topic entity
|
|
558
|
+
topic = self.metadata.get_by_name(entity=Topic, fqn=topic_fqn)
|
|
559
|
+
if topic:
|
|
560
|
+
logger.info(f"Found topic {topic_name} with FQN: {topic_fqn}")
|
|
561
|
+
return topic
|
|
562
|
+
except Exception as search_exc:
|
|
563
|
+
logger.debug(f"ES search error: {search_exc}")
|
|
564
|
+
logger.debug(traceback.format_exc())
|
|
565
|
+
|
|
566
|
+
except Exception as exc:
|
|
567
|
+
logger.debug(f"Could not find topic {topic_name}: {exc}")
|
|
568
|
+
logger.debug(traceback.format_exc())
|
|
569
|
+
|
|
570
|
+
logger.warning(
|
|
571
|
+
f"Topic {topic_name} not found in OpenMetadata. "
|
|
572
|
+
f"Ensure the topic is ingested from a messaging service."
|
|
573
|
+
)
|
|
574
|
+
return None
|
|
575
|
+
|
|
576
|
+
def _yield_kafka_lineage(
|
|
577
|
+
self, pipeline_details: DataBrickPipelineDetails, pipeline_entity: Pipeline
|
|
578
|
+
) -> Iterable[Either[AddLineageRequest]]:
|
|
579
|
+
"""
|
|
580
|
+
Extract and yield Kafka topic lineage from DLT pipeline source code
|
|
581
|
+
Only processes DLT pipelines (with pipeline_id), not regular jobs
|
|
582
|
+
Creates lineage: Kafka topic -> DLT table (with pipeline in lineageDetails)
|
|
583
|
+
"""
|
|
584
|
+
try:
|
|
585
|
+
logger.info("=" * 80)
|
|
586
|
+
logger.info(f"KAFKA LINEAGE EXTRACTION STARTED")
|
|
587
|
+
logger.info(
|
|
588
|
+
f"Pipeline: {pipeline_details.name if hasattr(pipeline_details, 'name') else 'N/A'}"
|
|
589
|
+
)
|
|
590
|
+
logger.info(f"Job ID: {pipeline_details.job_id}")
|
|
591
|
+
logger.info(f"Pipeline ID: {pipeline_details.pipeline_id}")
|
|
592
|
+
logger.info("=" * 80)
|
|
593
|
+
|
|
594
|
+
# Only process DLT pipelines - check for pipeline_id
|
|
595
|
+
# For pure DLT pipelines, pipeline_id is set directly
|
|
596
|
+
pipeline_id = pipeline_details.pipeline_id
|
|
597
|
+
|
|
598
|
+
# For jobs with DLT pipeline tasks, check settings
|
|
599
|
+
if not pipeline_id and pipeline_details.settings:
|
|
600
|
+
try:
|
|
601
|
+
tasks = pipeline_details.settings.tasks
|
|
602
|
+
logger.debug(
|
|
603
|
+
f"Checking for DLT pipeline in job {pipeline_details.job_id}: "
|
|
604
|
+
f"{len(tasks) if tasks else 0} tasks found"
|
|
605
|
+
)
|
|
606
|
+
|
|
607
|
+
if tasks:
|
|
608
|
+
for task in tasks:
|
|
609
|
+
logger.debug(
|
|
610
|
+
f"Task: {task.name}, has pipeline_task: {task.pipeline_task is not None}"
|
|
611
|
+
)
|
|
612
|
+
# Check for direct DLT pipeline task
|
|
613
|
+
if task.pipeline_task and task.pipeline_task.pipeline_id:
|
|
614
|
+
pipeline_id = task.pipeline_task.pipeline_id
|
|
615
|
+
logger.info(
|
|
616
|
+
f"ā Found DLT pipeline_id from job task: {pipeline_id} for job {pipeline_details.job_id}"
|
|
617
|
+
)
|
|
618
|
+
break
|
|
619
|
+
except Exception as exc:
|
|
620
|
+
logger.debug(f"Error checking for pipeline tasks: {exc}")
|
|
621
|
+
logger.debug(traceback.format_exc())
|
|
622
|
+
|
|
623
|
+
# Only process if we have a DLT pipeline_id
|
|
624
|
+
if not pipeline_id:
|
|
625
|
+
logger.info(
|
|
626
|
+
f"ā No DLT pipeline_id found - skipping Kafka lineage extraction"
|
|
627
|
+
)
|
|
628
|
+
logger.info(f" Job ID: {pipeline_details.job_id}")
|
|
629
|
+
logger.info(f" Pipeline ID: {pipeline_details.pipeline_id}")
|
|
630
|
+
logger.info("=" * 80)
|
|
631
|
+
return
|
|
632
|
+
|
|
633
|
+
logger.info(f"ā Processing Kafka lineage for DLT pipeline: {pipeline_id}")
|
|
634
|
+
|
|
635
|
+
# Get pipeline configuration and extract target catalog/schema
|
|
636
|
+
target_catalog = None
|
|
637
|
+
target_schema = None
|
|
638
|
+
notebook_paths = []
|
|
639
|
+
try:
|
|
640
|
+
logger.info(f"ā³ Fetching pipeline configuration for {pipeline_id}...")
|
|
641
|
+
pipeline_config = self.client.get_pipeline_details(pipeline_id)
|
|
642
|
+
if not pipeline_config:
|
|
643
|
+
logger.warning(
|
|
644
|
+
f"ā Could not fetch pipeline config for {pipeline_id}"
|
|
645
|
+
)
|
|
646
|
+
logger.info("=" * 80)
|
|
647
|
+
return
|
|
648
|
+
|
|
649
|
+
logger.debug(f"ā Pipeline config fetched successfully")
|
|
650
|
+
logger.debug(f" Config keys: {list(pipeline_config.keys())}")
|
|
651
|
+
|
|
652
|
+
# Extract spec for detailed configuration
|
|
653
|
+
spec = pipeline_config.get("spec", {})
|
|
654
|
+
logger.info(f"ā Pipeline spec extracted")
|
|
655
|
+
logger.info(f" Spec keys: {list(spec.keys()) if spec else 'None'}")
|
|
656
|
+
|
|
657
|
+
# Extract target catalog and schema for DLT tables
|
|
658
|
+
target_catalog = spec.get("catalog") if spec else None
|
|
659
|
+
# Schema can be in 'target' or 'schema' field
|
|
660
|
+
target_schema = (
|
|
661
|
+
spec.get("target") or spec.get("schema") if spec else None
|
|
662
|
+
)
|
|
663
|
+
logger.info(f"ā DLT Target Location:")
|
|
664
|
+
logger.info(f" Catalog: {target_catalog or 'NOT SET'}")
|
|
665
|
+
logger.info(f" Schema: {target_schema or 'NOT SET'}")
|
|
666
|
+
|
|
667
|
+
# Extract notebook/file paths from libraries in spec
|
|
668
|
+
notebook_paths = []
|
|
669
|
+
if spec and "libraries" in spec:
|
|
670
|
+
libraries = spec["libraries"]
|
|
671
|
+
logger.info(
|
|
672
|
+
f"ā³ Extracting notebook paths from {len(libraries)} libraries..."
|
|
673
|
+
)
|
|
674
|
+
for idx, lib in enumerate(libraries):
|
|
675
|
+
logger.debug(f" Library {idx + 1}: {lib}")
|
|
676
|
+
# Library can be dict or have different structures
|
|
677
|
+
if isinstance(lib, dict):
|
|
678
|
+
# Check for notebook path
|
|
679
|
+
if "notebook" in lib and lib["notebook"]:
|
|
680
|
+
notebook = lib["notebook"]
|
|
681
|
+
if isinstance(notebook, dict):
|
|
682
|
+
path = notebook.get("path")
|
|
683
|
+
else:
|
|
684
|
+
path = notebook
|
|
685
|
+
if path:
|
|
686
|
+
notebook_paths.append(path)
|
|
687
|
+
logger.info(f" ā Found notebook: {path}")
|
|
688
|
+
# Check for glob pattern
|
|
689
|
+
elif "glob" in lib and lib["glob"]:
|
|
690
|
+
glob_pattern = lib["glob"]
|
|
691
|
+
if isinstance(glob_pattern, dict):
|
|
692
|
+
include_pattern = glob_pattern.get("include")
|
|
693
|
+
if include_pattern:
|
|
694
|
+
# Convert glob pattern to directory path
|
|
695
|
+
# e.g., "/path/**" -> "/path/"
|
|
696
|
+
base_path = include_pattern.replace(
|
|
697
|
+
"/**", "/"
|
|
698
|
+
).replace("**", "")
|
|
699
|
+
notebook_paths.append(base_path)
|
|
700
|
+
logger.info(
|
|
701
|
+
f" ā Found glob pattern, using base path: {base_path}"
|
|
702
|
+
)
|
|
703
|
+
|
|
704
|
+
# Also check for source path in spec configuration
|
|
705
|
+
if not notebook_paths and spec:
|
|
706
|
+
source_path = None
|
|
707
|
+
|
|
708
|
+
# Check spec.configuration for source path
|
|
709
|
+
if "configuration" in spec:
|
|
710
|
+
config = spec["configuration"]
|
|
711
|
+
source_path = config.get("source_path") or config.get("source")
|
|
712
|
+
|
|
713
|
+
# Check development settings
|
|
714
|
+
if not source_path and "development" in spec:
|
|
715
|
+
source_path = spec["development"].get("source_path")
|
|
716
|
+
|
|
717
|
+
if source_path:
|
|
718
|
+
logger.info(
|
|
719
|
+
f" ā Found source_path in pipeline spec: {source_path}"
|
|
720
|
+
)
|
|
721
|
+
notebook_paths.append(source_path)
|
|
722
|
+
|
|
723
|
+
logger.info(f"ā Total notebook paths found: {len(notebook_paths)}")
|
|
724
|
+
for idx, path in enumerate(notebook_paths):
|
|
725
|
+
logger.info(f" {idx + 1}. {path}")
|
|
726
|
+
except Exception as exc:
|
|
727
|
+
logger.error(
|
|
728
|
+
f"ā Failed to fetch pipeline config for {pipeline_id}: {exc}"
|
|
729
|
+
)
|
|
730
|
+
logger.debug(traceback.format_exc())
|
|
731
|
+
logger.info("=" * 80)
|
|
732
|
+
return
|
|
733
|
+
|
|
734
|
+
if not notebook_paths:
|
|
735
|
+
logger.warning(f"ā No notebook paths found for pipeline {pipeline_id}")
|
|
736
|
+
logger.info(
|
|
737
|
+
" Cannot extract Kafka lineage without notebook source code"
|
|
738
|
+
)
|
|
739
|
+
logger.info("=" * 80)
|
|
740
|
+
return
|
|
741
|
+
|
|
742
|
+
# Expand directories to individual notebook files
|
|
743
|
+
logger.info(f"ā³ Expanding directory paths to individual notebooks...")
|
|
744
|
+
expanded_paths = []
|
|
745
|
+
for path in notebook_paths:
|
|
746
|
+
# If path ends with /, it's a directory - list all notebooks in it
|
|
747
|
+
if path.endswith("/"):
|
|
748
|
+
try:
|
|
749
|
+
logger.debug(f" Listing directory: {path}")
|
|
750
|
+
# List workspace directory to get all notebooks
|
|
751
|
+
objects = self.client.list_workspace_objects(path)
|
|
752
|
+
if objects:
|
|
753
|
+
for obj in objects:
|
|
754
|
+
obj_type = obj.get("object_type")
|
|
755
|
+
if obj_type in ("NOTEBOOK", "FILE"):
|
|
756
|
+
notebook_path = obj.get("path")
|
|
757
|
+
if notebook_path:
|
|
758
|
+
expanded_paths.append(notebook_path)
|
|
759
|
+
logger.info(
|
|
760
|
+
f" ā Found {obj_type.lower()}: {notebook_path}"
|
|
761
|
+
)
|
|
762
|
+
if not expanded_paths:
|
|
763
|
+
logger.debug(f" ā No notebooks found in directory {path}")
|
|
764
|
+
except Exception as exc:
|
|
765
|
+
logger.warning(f" ā Could not list directory {path}: {exc}")
|
|
766
|
+
logger.debug(traceback.format_exc())
|
|
767
|
+
else:
|
|
768
|
+
expanded_paths.append(path)
|
|
769
|
+
logger.debug(f" Direct path: {path}")
|
|
770
|
+
|
|
771
|
+
logger.info(f"ā Total notebooks to process: {len(expanded_paths)}")
|
|
772
|
+
|
|
773
|
+
# Process each notebook to extract Kafka sources and DLT tables
|
|
774
|
+
logger.info("-" * 80)
|
|
775
|
+
logger.info(f"PROCESSING NOTEBOOKS FOR KAFKA LINEAGE")
|
|
776
|
+
logger.info("-" * 80)
|
|
777
|
+
|
|
778
|
+
for idx, lib_path in enumerate(expanded_paths, 1):
|
|
779
|
+
try:
|
|
780
|
+
logger.info(f"\nš Notebook {idx}/{len(expanded_paths)}: {lib_path}")
|
|
781
|
+
logger.info(f"ā³ Exporting notebook source code...")
|
|
782
|
+
|
|
783
|
+
source_code = self.client.export_notebook_source(lib_path)
|
|
784
|
+
if not source_code:
|
|
785
|
+
logger.warning(f"ā Could not export source for {lib_path}")
|
|
786
|
+
continue
|
|
787
|
+
|
|
788
|
+
logger.info(
|
|
789
|
+
f"ā Source code exported ({len(source_code)} characters)"
|
|
790
|
+
)
|
|
791
|
+
|
|
792
|
+
# Log full source code for debugging
|
|
793
|
+
logger.debug(f" ===== FULL NOTEBOOK SOURCE CODE =====")
|
|
794
|
+
for i, line in enumerate(source_code.split("\n"), 1):
|
|
795
|
+
logger.debug(f" {i:3d}: {line}")
|
|
796
|
+
logger.debug(f" ===== END OF SOURCE CODE =====")
|
|
797
|
+
|
|
798
|
+
# Extract Kafka topics
|
|
799
|
+
logger.info(f"ā³ Parsing Kafka sources from notebook...")
|
|
800
|
+
logger.debug(f" Looking for patterns:")
|
|
801
|
+
logger.debug(
|
|
802
|
+
f" - Kafka: .format('kafka')...option('subscribe', 'topic')"
|
|
803
|
+
)
|
|
804
|
+
logger.debug(f" - DLT: @dlt.table(name='table_name')")
|
|
805
|
+
kafka_sources = extract_kafka_sources(source_code)
|
|
806
|
+
if kafka_sources:
|
|
807
|
+
topics_found = [t for ks in kafka_sources for t in ks.topics]
|
|
808
|
+
logger.info(
|
|
809
|
+
f"ā Found {len(kafka_sources)} Kafka source(s) with {len(topics_found)} topic(s):"
|
|
810
|
+
)
|
|
811
|
+
for ks_idx, ks in enumerate(kafka_sources, 1):
|
|
812
|
+
logger.info(f" Kafka Source {ks_idx}:")
|
|
813
|
+
logger.info(f" Topics: {ks.topics}")
|
|
814
|
+
logger.info(
|
|
815
|
+
f" Bootstrap Servers: {ks.bootstrap_servers or 'NOT SET'}"
|
|
816
|
+
)
|
|
817
|
+
logger.info(
|
|
818
|
+
f" Group ID Prefix: {ks.group_id_prefix or 'NOT SET'}"
|
|
819
|
+
)
|
|
820
|
+
else:
|
|
821
|
+
logger.info(f"ā No Kafka sources found in notebook")
|
|
822
|
+
|
|
823
|
+
# Extract DLT table names
|
|
824
|
+
logger.info(f"ā³ Parsing DLT table names from notebook...")
|
|
825
|
+
dlt_table_names = extract_dlt_table_names(source_code)
|
|
826
|
+
if dlt_table_names:
|
|
827
|
+
logger.info(
|
|
828
|
+
f"ā Found {len(dlt_table_names)} DLT table(s): {dlt_table_names}"
|
|
829
|
+
)
|
|
830
|
+
else:
|
|
831
|
+
logger.info(f"ā No DLT tables found in notebook")
|
|
832
|
+
|
|
833
|
+
if not dlt_table_names or not kafka_sources:
|
|
834
|
+
logger.warning(
|
|
835
|
+
f"ā Skipping lineage for this notebook - need both Kafka sources AND DLT tables"
|
|
836
|
+
)
|
|
837
|
+
logger.info(
|
|
838
|
+
f" Kafka sources: {len(kafka_sources) if kafka_sources else 0}"
|
|
839
|
+
)
|
|
840
|
+
logger.info(
|
|
841
|
+
f" DLT tables: {len(dlt_table_names) if dlt_table_names else 0}"
|
|
842
|
+
)
|
|
843
|
+
continue
|
|
844
|
+
|
|
845
|
+
logger.info(
|
|
846
|
+
f"ā Notebook has both Kafka sources and DLT tables - creating lineage..."
|
|
847
|
+
)
|
|
848
|
+
|
|
849
|
+
# Create lineage for each Kafka topic -> DLT table
|
|
850
|
+
logger.info(f"\nā³ Creating lineage edges...")
|
|
851
|
+
lineage_created = 0
|
|
852
|
+
|
|
853
|
+
for kafka_config in kafka_sources:
|
|
854
|
+
for topic_name in kafka_config.topics:
|
|
855
|
+
try:
|
|
856
|
+
logger.info(f"\n š Processing topic: {topic_name}")
|
|
857
|
+
|
|
858
|
+
# Use smart discovery to find topic
|
|
859
|
+
logger.info(
|
|
860
|
+
f" ā³ Searching for topic in OpenMetadata..."
|
|
861
|
+
)
|
|
862
|
+
kafka_topic = self._find_kafka_topic(topic_name)
|
|
863
|
+
|
|
864
|
+
if not kafka_topic:
|
|
865
|
+
logger.warning(
|
|
866
|
+
f" ā Kafka topic '{topic_name}' not found in OpenMetadata"
|
|
867
|
+
)
|
|
868
|
+
logger.info(
|
|
869
|
+
f" š” Make sure the topic is ingested from a messaging service"
|
|
870
|
+
)
|
|
871
|
+
continue
|
|
872
|
+
|
|
873
|
+
logger.info(
|
|
874
|
+
f" ā Topic found: {kafka_topic.fullyQualifiedName.root if hasattr(kafka_topic.fullyQualifiedName, 'root') else kafka_topic.fullyQualifiedName}"
|
|
875
|
+
)
|
|
876
|
+
|
|
877
|
+
# Create lineage to each DLT table in this notebook
|
|
878
|
+
for table_name in dlt_table_names:
|
|
879
|
+
logger.info(
|
|
880
|
+
f" š Processing target table: {table_name}"
|
|
881
|
+
)
|
|
882
|
+
logger.info(
|
|
883
|
+
f" ā³ Searching in Databricks/Unity Catalog services..."
|
|
884
|
+
)
|
|
885
|
+
|
|
886
|
+
# Use cached Databricks service lookup
|
|
887
|
+
target_table_entity = self._find_dlt_table(
|
|
888
|
+
table_name=table_name,
|
|
889
|
+
catalog=target_catalog,
|
|
890
|
+
schema=target_schema,
|
|
891
|
+
)
|
|
892
|
+
|
|
893
|
+
if target_table_entity:
|
|
894
|
+
table_fqn = (
|
|
895
|
+
target_table_entity.fullyQualifiedName.root
|
|
896
|
+
if hasattr(
|
|
897
|
+
target_table_entity.fullyQualifiedName,
|
|
898
|
+
"root",
|
|
899
|
+
)
|
|
900
|
+
else target_table_entity.fullyQualifiedName
|
|
901
|
+
)
|
|
902
|
+
logger.info(
|
|
903
|
+
f" ā Target table found: {table_fqn}"
|
|
904
|
+
)
|
|
905
|
+
logger.info(
|
|
906
|
+
f" ā
Creating lineage: {topic_name} -> {table_fqn}"
|
|
907
|
+
)
|
|
908
|
+
logger.info(f" Pipeline: {pipeline_id}")
|
|
909
|
+
|
|
910
|
+
yield Either(
|
|
911
|
+
right=AddLineageRequest(
|
|
912
|
+
edge=EntitiesEdge(
|
|
913
|
+
fromEntity=EntityReference(
|
|
914
|
+
id=kafka_topic.id,
|
|
915
|
+
type="topic",
|
|
916
|
+
),
|
|
917
|
+
toEntity=EntityReference(
|
|
918
|
+
id=target_table_entity.id.root
|
|
919
|
+
if hasattr(
|
|
920
|
+
target_table_entity.id,
|
|
921
|
+
"root",
|
|
922
|
+
)
|
|
923
|
+
else target_table_entity.id,
|
|
924
|
+
type="table",
|
|
925
|
+
),
|
|
926
|
+
lineageDetails=LineageDetails(
|
|
927
|
+
pipeline=EntityReference(
|
|
928
|
+
id=pipeline_entity.id.root,
|
|
929
|
+
type="pipeline",
|
|
930
|
+
),
|
|
931
|
+
source=LineageSource.PipelineLineage,
|
|
932
|
+
),
|
|
933
|
+
)
|
|
934
|
+
)
|
|
935
|
+
)
|
|
936
|
+
lineage_created += 1
|
|
937
|
+
else:
|
|
938
|
+
logger.warning(
|
|
939
|
+
f" ā Target table '{table_name}' not found in OpenMetadata"
|
|
940
|
+
)
|
|
941
|
+
logger.info(
|
|
942
|
+
f" š” Expected location: {target_catalog}.{target_schema}.{table_name}"
|
|
943
|
+
)
|
|
944
|
+
logger.info(
|
|
945
|
+
f" š” Make sure the table is ingested from a Databricks/Unity Catalog database service"
|
|
946
|
+
)
|
|
947
|
+
|
|
948
|
+
except Exception as exc:
|
|
949
|
+
logger.error(
|
|
950
|
+
f" ā Failed to process topic {topic_name}: {exc}"
|
|
951
|
+
)
|
|
952
|
+
logger.debug(traceback.format_exc())
|
|
953
|
+
continue
|
|
954
|
+
|
|
955
|
+
logger.info(
|
|
956
|
+
f"\nā Lineage edges created for this notebook: {lineage_created}"
|
|
957
|
+
)
|
|
958
|
+
except Exception as exc:
|
|
959
|
+
logger.error(f"ā Failed to process notebook {lib_path}: {exc}")
|
|
960
|
+
logger.debug(traceback.format_exc())
|
|
961
|
+
logger.info(f" Continuing with next notebook...")
|
|
962
|
+
continue
|
|
963
|
+
|
|
964
|
+
logger.info("\n" + "=" * 80)
|
|
965
|
+
logger.info(f"KAFKA LINEAGE EXTRACTION COMPLETED")
|
|
966
|
+
logger.info(
|
|
967
|
+
f"Pipeline: {pipeline_details.name if hasattr(pipeline_details, 'name') else 'N/A'}"
|
|
968
|
+
)
|
|
969
|
+
logger.info("=" * 80)
|
|
970
|
+
|
|
971
|
+
except Exception as exc:
|
|
972
|
+
logger.error(f"ā Unexpected error in Kafka lineage extraction: {exc}")
|
|
973
|
+
logger.error(f" Job ID: {pipeline_details.job_id}")
|
|
974
|
+
logger.error(
|
|
975
|
+
f" Pipeline ID: {pipeline_details.pipeline_id if hasattr(pipeline_details, 'pipeline_id') else 'N/A'}"
|
|
976
|
+
)
|
|
977
|
+
logger.debug(traceback.format_exc())
|
|
978
|
+
logger.info("=" * 80)
|
|
979
|
+
|
|
303
980
|
def yield_pipeline_lineage_details(
|
|
304
981
|
self, pipeline_details: DataBrickPipelineDetails
|
|
305
982
|
) -> Iterable[Either[AddLineageRequest]]:
|
|
@@ -315,6 +992,13 @@ class DatabrickspipelineSource(PipelineServiceSource):
|
|
|
315
992
|
entity=Pipeline, fqn=pipeline_fqn
|
|
316
993
|
)
|
|
317
994
|
|
|
995
|
+
# Extract Kafka topic lineage from source code
|
|
996
|
+
# Works automatically - no configuration required!
|
|
997
|
+
yield from self._yield_kafka_lineage(pipeline_details, pipeline_entity)
|
|
998
|
+
|
|
999
|
+
if not pipeline_details.job_id:
|
|
1000
|
+
return
|
|
1001
|
+
|
|
318
1002
|
table_lineage_list = self.client.get_table_lineage(
|
|
319
1003
|
job_id=pipeline_details.job_id
|
|
320
1004
|
)
|
|
@@ -409,7 +1093,7 @@ class DatabrickspipelineSource(PipelineServiceSource):
|
|
|
409
1093
|
except Exception as exc:
|
|
410
1094
|
yield Either(
|
|
411
1095
|
left=StackTraceError(
|
|
412
|
-
name=pipeline_details.
|
|
1096
|
+
name=pipeline_details.id,
|
|
413
1097
|
error=f"Wild error ingesting pipeline lineage {pipeline_details} - {exc}",
|
|
414
1098
|
stackTrace=traceback.format_exc(),
|
|
415
1099
|
)
|