From 2f3a50e95f1cb30210e837c2ffcbb588b3560a95 Mon Sep 17 00:00:00 2001 From: Pere Miquel Brull Date: Mon, 21 Aug 2023 11:35:36 +0200 Subject: [PATCH] Fix #8885 - Misleading 404 logs & suffix cleanup (#12916) * Fix #8885 - Misleading 404 debug logs * Clean get_suffix complexity * Prepare airflow config * Add bootstrap comment * Revert "Add bootstrap comment" This reverts commit cc053513df6e25bcc5e742786adb91339461fdd2. * Revert "Prepare airflow config" This reverts commit f57645fe953e17d6153652daa1f42c14b97c942d. * add removed method * Add icons for docs * Add missing routes --- .../src/metadata/ingestion/ometa/ometa_api.py | 339 ++---------------- .../src/metadata/ingestion/ometa/routes.py | 207 +++++++++++ .../integration/ometa/test_ometa_table_api.py | 4 + ingestion/tests/unit/test_ometa_endpoints.py | 14 - .../workflows/ingestion/common.py | 33 +- .../v1.1.1/connectors/dashboard/index.md | 1 + .../connectors/database/deltalake/index.md | 2 +- .../connectors/database/deltalake/yaml.md | 4 +- .../v1.1.1/connectors/database/index.md | 1 + .../connectors/database/deltalake/index.md | 2 +- .../connectors/database/deltalake/yaml.md | 2 +- .../images/connectors/mongodb.png | Bin 0 -> 3698 bytes .../images/connectors/qliksense.png | Bin 0 -> 76981 bytes .../images/connectors/saphana.png | Bin 0 -> 6467 bytes 14 files changed, 273 insertions(+), 336 deletions(-) create mode 100644 ingestion/src/metadata/ingestion/ometa/routes.py create mode 100644 openmetadata-docs/images/connectors/mongodb.png create mode 100644 openmetadata-docs/images/connectors/qliksense.png create mode 100644 openmetadata-docs/images/connectors/saphana.png diff --git a/ingestion/src/metadata/ingestion/ometa/ometa_api.py b/ingestion/src/metadata/ingestion/ometa/ometa_api.py index 4468b94a220..d614629fce2 100644 --- a/ingestion/src/metadata/ingestion/ometa/ometa_api.py +++ b/ingestion/src/metadata/ingestion/ometa/ometa_api.py @@ -17,65 +17,12 @@ working with OpenMetadata entities. import traceback from typing import Dict, Generic, Iterable, List, Optional, Type, TypeVar, Union -try: - from typing import get_args -except ImportError: - from typing_compat import get_args - from pydantic import BaseModel from requests.utils import quote -from metadata.generated.schema.analytics.webAnalyticEventData import ( - WebAnalyticEventData, -) -from metadata.generated.schema.api.lineage.addLineage import AddLineageRequest -from metadata.generated.schema.dataInsight.dataInsightChart import DataInsightChart -from metadata.generated.schema.dataInsight.kpi.kpi import Kpi -from metadata.generated.schema.entity.automations.workflow import Workflow -from metadata.generated.schema.entity.classification.classification import ( - Classification, -) -from metadata.generated.schema.entity.classification.tag import Tag -from metadata.generated.schema.entity.data.chart import Chart -from metadata.generated.schema.entity.data.container import Container -from metadata.generated.schema.entity.data.dashboard import Dashboard -from metadata.generated.schema.entity.data.dashboardDataModel import DashboardDataModel -from metadata.generated.schema.entity.data.database import Database -from metadata.generated.schema.entity.data.databaseSchema import DatabaseSchema -from metadata.generated.schema.entity.data.glossary import Glossary -from metadata.generated.schema.entity.data.glossaryTerm import GlossaryTerm -from metadata.generated.schema.entity.data.metrics import Metrics -from metadata.generated.schema.entity.data.mlmodel import MlModel -from metadata.generated.schema.entity.data.pipeline import Pipeline -from metadata.generated.schema.entity.data.query import Query -from metadata.generated.schema.entity.data.report import Report -from metadata.generated.schema.entity.data.searchIndex import SearchIndex -from metadata.generated.schema.entity.data.table import Table -from metadata.generated.schema.entity.data.topic import Topic -from metadata.generated.schema.entity.policies.policy import Policy from metadata.generated.schema.entity.services.connections.metadata.openMetadataConnection import ( OpenMetadataConnection, ) -from metadata.generated.schema.entity.services.connections.testConnectionDefinition import ( - TestConnectionDefinition, -) -from metadata.generated.schema.entity.services.dashboardService import DashboardService -from metadata.generated.schema.entity.services.databaseService import DatabaseService -from metadata.generated.schema.entity.services.ingestionPipelines.ingestionPipeline import ( - IngestionPipeline, -) -from metadata.generated.schema.entity.services.messagingService import MessagingService -from metadata.generated.schema.entity.services.metadataService import MetadataService -from metadata.generated.schema.entity.services.mlmodelService import MlModelService -from metadata.generated.schema.entity.services.pipelineService import PipelineService -from metadata.generated.schema.entity.services.searchService import SearchService -from metadata.generated.schema.entity.services.storageService import StorageService -from metadata.generated.schema.entity.teams.role import Role -from metadata.generated.schema.entity.teams.team import Team -from metadata.generated.schema.entity.teams.user import AuthenticationMechanism, User -from metadata.generated.schema.tests.testCase import TestCase -from metadata.generated.schema.tests.testDefinition import TestDefinition -from metadata.generated.schema.tests.testSuite import TestSuite from metadata.generated.schema.type import basic from metadata.generated.schema.type.basic import FullyQualifiedEntityName from metadata.generated.schema.type.entityHistory import EntityVersionHistory @@ -108,6 +55,7 @@ from metadata.ingestion.ometa.provider_registry import ( InvalidAuthProviderException, auth_provider_registry, ) +from metadata.ingestion.ometa.routes import ROUTES from metadata.ingestion.ometa.utils import get_entity_type, model_str from metadata.utils.logger import ometa_logger from metadata.utils.secrets.secrets_manager_factory import SecretsManagerFactory @@ -227,262 +175,20 @@ class OpenMetadata( if self.config.enableVersionValidation: self.validate_versions() - def get_suffix(self, entity: Type[T]) -> str: # pylint: disable=R0911,R0912 + @staticmethod + def get_suffix(entity: Type[T]) -> str: """ Given an entity Type from the generated sources, return the endpoint to run requests. - - Might be interesting to follow a more strict - and type-checked approach - - Disabled pylint R0911: too-many-return-statements - Disabled pylint R0912: too-many-branches """ - # Entity Schemas - if issubclass( - entity, get_args(Union[MlModel, self.get_create_entity_type(MlModel)]) - ): - return "/mlmodels" + route = ROUTES.get(entity.__name__) + if route is None: + raise MissingEntityTypeException( + f"Missing {entity} type when generating suffixes" + ) - if issubclass( - entity, get_args(Union[Chart, self.get_create_entity_type(Chart)]) - ): - return "/charts" - - if issubclass( - entity, - get_args( - Union[ - DashboardDataModel, self.get_create_entity_type(DashboardDataModel) - ] - ), - ): - return "/dashboard/datamodels" - - if issubclass( - entity, get_args(Union[Dashboard, self.get_create_entity_type(Dashboard)]) - ): - return "/dashboards" - - if issubclass( - entity, get_args(Union[Database, self.get_create_entity_type(Database)]) - ): - return "/databases" - - if issubclass( - entity, - get_args( - Union[DatabaseSchema, self.get_create_entity_type(DatabaseSchema)] - ), - ): - return "/databaseSchemas" - - if issubclass( - entity, get_args(Union[Pipeline, self.get_create_entity_type(Pipeline)]) - ): - return "/pipelines" - - if issubclass( - entity, get_args(Union[Policy, self.get_create_entity_type(Policy)]) - ): - return "/policies" - - if issubclass( - entity, get_args(Union[Table, self.get_create_entity_type(Table)]) - ): - return "/tables" - - if issubclass( - entity, get_args(Union[Topic, self.get_create_entity_type(Topic)]) - ): - return "/topics" - - if issubclass(entity, Metrics): - return "/metrics" - - if issubclass(entity, AddLineageRequest): - return "/lineage" - - if issubclass(entity, Report): - return "/reports" - - if issubclass(entity, AuthenticationMechanism): - return "/users/auth-mechanism" - - if issubclass( - entity, - get_args( - Union[ - Tag, - self.get_create_entity_type(Tag), - ] - ), - ): - return "/tags" - - if issubclass( - entity, - get_args( - Union[ - Classification, - self.get_create_entity_type(Classification), - ] - ), - ): - return "/classifications" - - if issubclass( - entity, get_args(Union[Glossary, self.get_create_entity_type(Glossary)]) - ): - return "/glossaries" - - if issubclass( - entity, - get_args(Union[GlossaryTerm, self.get_create_entity_type(GlossaryTerm)]), - ): - return "/glossaryTerms" - - if issubclass(entity, get_args(Union[Role, self.get_create_entity_type(Role)])): - return "/roles" - - if issubclass( - entity, get_args(Union[Query, self.get_create_entity_type(Query)]) - ): - return "/queries" - - if issubclass(entity, get_args(Union[Team, self.get_create_entity_type(Team)])): - return "/teams" - - if issubclass(entity, get_args(Union[User, self.get_create_entity_type(User)])): - return "/users" - - if issubclass( - entity, get_args(Union[Container, self.get_create_entity_type(Container)]) - ): - return "/containers" - - if issubclass( - entity, - get_args(Union[SearchIndex, self.get_create_entity_type(SearchIndex)]), - ): - return "/searchIndexes" - - if issubclass( - entity, get_args(Union[Workflow, self.get_create_entity_type(Workflow)]) - ): - return "/automations/workflows" - - # Services Schemas - if issubclass( - entity, - get_args( - Union[DatabaseService, self.get_create_entity_type(DatabaseService)] - ), - ): - return "/services/databaseServices" - - if issubclass( - entity, - get_args( - Union[DashboardService, self.get_create_entity_type(DashboardService)] - ), - ): - return "/services/dashboardServices" - - if issubclass( - entity, - get_args( - Union[MessagingService, self.get_create_entity_type(MessagingService)] - ), - ): - return "/services/messagingServices" - - if issubclass( - entity, - get_args( - Union[PipelineService, self.get_create_entity_type(PipelineService)] - ), - ): - return "/services/pipelineServices" - - if issubclass( - entity, - get_args( - Union[StorageService, self.get_create_entity_type(StorageService)] - ), - ): - return "/services/storageServices" - - if issubclass( - entity, - get_args( - Union[MlModelService, self.get_create_entity_type(MlModelService)] - ), - ): - return "/services/mlmodelServices" - - if issubclass( - entity, - get_args( - Union[MetadataService, self.get_create_entity_type(MetadataService)] - ), - ): - return "/services/metadataServices" - - if issubclass( - entity, - get_args(Union[SearchService, self.get_create_entity_type(SearchService)]), - ): - return "/services/searchServices" - - if issubclass( - entity, - IngestionPipeline, - ): - return "/services/ingestionPipelines" - - if issubclass( - entity, - TestConnectionDefinition, - ): - return "/services/testConnectionDefinitions" - - if issubclass( - entity, - get_args( - Union[TestDefinition, self.get_create_entity_type(TestDefinition)] - ), - ): - return "/dataQuality/testDefinitions" - - if issubclass( - entity, - get_args(Union[TestSuite, self.get_create_entity_type(TestSuite)]), - ): - return "/dataQuality/testSuites" - - if issubclass( - entity, - get_args(Union[TestCase, self.get_create_entity_type(TestCase)]), - ): - return "/dataQuality/testCases" - - if issubclass(entity, WebAnalyticEventData): - return "/analytics/web/events/collect" - - if issubclass(entity, DataInsightChart): - return "/analytics/dataInsights/charts" - - if issubclass( - entity, - Kpi, - ): - return "/kpi" - - raise MissingEntityTypeException( - f"Missing {entity} type when generating suffixes" - ) + return route def get_module_path(self, entity: Type[T]) -> str: """ @@ -499,7 +205,6 @@ class OpenMetadata( def get_create_entity_type(self, entity: Type[T]) -> Type[C]: """ imports and returns the Create Type from an Entity Type T. - We are following the expected path structure to import on-the-fly the necessary class and pass it to the consumer """ @@ -591,6 +296,7 @@ class OpenMetadata( entity: Type[T], fqn: Union[str, FullyQualifiedEntityName], fields: Optional[List[str]] = None, + nullable: bool = True, ) -> Optional[T]: """ Return entity by name or None @@ -600,6 +306,7 @@ class OpenMetadata( entity=entity, path=f"name/{quote(model_str(fqn), safe='')}", fields=fields, + nullable=nullable, ) def get_by_id( @@ -607,14 +314,24 @@ class OpenMetadata( entity: Type[T], entity_id: Union[str, basic.Uuid], fields: Optional[List[str]] = None, + nullable: bool = True, ) -> Optional[T]: """ Return entity by ID or None """ - return self._get(entity=entity, path=model_str(entity_id), fields=fields) + return self._get( + entity=entity, + path=model_str(entity_id), + fields=fields, + nullable=nullable, + ) def _get( - self, entity: Type[T], path: str, fields: Optional[List[str]] = None + self, + entity: Type[T], + path: str, + fields: Optional[List[str]] = None, + nullable: bool = True, ) -> Optional[T]: """ Generic GET operation for an entity @@ -631,6 +348,12 @@ class OpenMetadata( ) return entity(**resp) except APIError as err: + # We can expect some GET calls to return us a None and manage it in following steps. + # No need to pollute the logs in these cases. + if err.code == 404 and nullable: + return None + + # Any other API errors will be passed to the client logger.debug(traceback.format_exc()) logger.debug( "GET %s for %s. Error %s - %s", @@ -639,7 +362,7 @@ class OpenMetadata( err.status_code, err, ) - return None + raise err def get_entity_reference( self, entity: Type[T], fqn: str @@ -667,7 +390,7 @@ class OpenMetadata( self, entity: Type[T], fields: Optional[List[str]] = None, - after: str = None, + after: Optional[str] = None, limit: int = 100, params: Optional[Dict[str, str]] = None, ) -> EntityList[T]: diff --git a/ingestion/src/metadata/ingestion/ometa/routes.py b/ingestion/src/metadata/ingestion/ometa/routes.py new file mode 100644 index 00000000000..b57b8321491 --- /dev/null +++ b/ingestion/src/metadata/ingestion/ometa/routes.py @@ -0,0 +1,207 @@ +# Copyright 2021 Collate +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +OMeta API endpoints +""" +from metadata.generated.schema.analytics.webAnalyticEventData import ( + WebAnalyticEventData, +) +from metadata.generated.schema.api.automations.createWorkflow import ( + CreateWorkflowRequest, +) +from metadata.generated.schema.api.classification.createClassification import ( + CreateClassificationRequest, +) +from metadata.generated.schema.api.classification.createTag import CreateTagRequest +from metadata.generated.schema.api.data.createChart import CreateChartRequest +from metadata.generated.schema.api.data.createContainer import CreateContainerRequest +from metadata.generated.schema.api.data.createDashboard import CreateDashboardRequest +from metadata.generated.schema.api.data.createDashboardDataModel import ( + CreateDashboardDataModelRequest, +) +from metadata.generated.schema.api.data.createDatabase import CreateDatabaseRequest +from metadata.generated.schema.api.data.createDatabaseSchema import ( + CreateDatabaseSchemaRequest, +) +from metadata.generated.schema.api.data.createGlossary import CreateGlossaryRequest +from metadata.generated.schema.api.data.createGlossaryTerm import ( + CreateGlossaryTermRequest, +) +from metadata.generated.schema.api.data.createMlModel import CreateMlModelRequest +from metadata.generated.schema.api.data.createPipeline import CreatePipelineRequest +from metadata.generated.schema.api.data.createQuery import CreateQueryRequest +from metadata.generated.schema.api.data.createSearchIndex import ( + CreateSearchIndexRequest, +) +from metadata.generated.schema.api.data.createTable import CreateTableRequest +from metadata.generated.schema.api.data.createTopic import CreateTopicRequest +from metadata.generated.schema.api.lineage.addLineage import AddLineageRequest +from metadata.generated.schema.api.policies.createPolicy import CreatePolicyRequest +from metadata.generated.schema.api.services.createDashboardService import ( + CreateDashboardServiceRequest, +) +from metadata.generated.schema.api.services.createDatabaseService import ( + CreateDatabaseServiceRequest, +) +from metadata.generated.schema.api.services.createMessagingService import ( + CreateMessagingServiceRequest, +) +from metadata.generated.schema.api.services.createMetadataService import ( + CreateMetadataServiceRequest, +) +from metadata.generated.schema.api.services.createMlModelService import ( + CreateMlModelServiceRequest, +) +from metadata.generated.schema.api.services.createPipelineService import ( + CreatePipelineServiceRequest, +) +from metadata.generated.schema.api.services.createSearchService import ( + CreateSearchServiceRequest, +) +from metadata.generated.schema.api.services.createStorageService import ( + CreateStorageServiceRequest, +) +from metadata.generated.schema.api.teams.createRole import CreateRoleRequest +from metadata.generated.schema.api.teams.createTeam import CreateTeamRequest +from metadata.generated.schema.api.teams.createUser import CreateUserRequest +from metadata.generated.schema.api.tests.createTestCase import CreateTestCaseRequest +from metadata.generated.schema.api.tests.createTestDefinition import ( + CreateTestDefinitionRequest, +) +from metadata.generated.schema.api.tests.createTestSuite import CreateTestSuiteRequest +from metadata.generated.schema.dataInsight.dataInsightChart import DataInsightChart +from metadata.generated.schema.dataInsight.kpi.kpi import Kpi +from metadata.generated.schema.entity.automations.workflow import Workflow +from metadata.generated.schema.entity.classification.classification import ( + Classification, +) +from metadata.generated.schema.entity.classification.tag import Tag +from metadata.generated.schema.entity.data.chart import Chart +from metadata.generated.schema.entity.data.container import Container +from metadata.generated.schema.entity.data.dashboard import Dashboard +from metadata.generated.schema.entity.data.dashboardDataModel import DashboardDataModel +from metadata.generated.schema.entity.data.database import Database +from metadata.generated.schema.entity.data.databaseSchema import DatabaseSchema +from metadata.generated.schema.entity.data.glossary import Glossary +from metadata.generated.schema.entity.data.glossaryTerm import GlossaryTerm +from metadata.generated.schema.entity.data.metrics import Metrics +from metadata.generated.schema.entity.data.mlmodel import MlModel +from metadata.generated.schema.entity.data.pipeline import Pipeline +from metadata.generated.schema.entity.data.query import Query +from metadata.generated.schema.entity.data.report import Report +from metadata.generated.schema.entity.data.searchIndex import SearchIndex +from metadata.generated.schema.entity.data.table import Table +from metadata.generated.schema.entity.data.topic import Topic +from metadata.generated.schema.entity.policies.policy import Policy +from metadata.generated.schema.entity.services.connections.testConnectionDefinition import ( + TestConnectionDefinition, +) +from metadata.generated.schema.entity.services.dashboardService import DashboardService +from metadata.generated.schema.entity.services.databaseService import DatabaseService +from metadata.generated.schema.entity.services.ingestionPipelines.ingestionPipeline import ( + IngestionPipeline, +) +from metadata.generated.schema.entity.services.messagingService import MessagingService +from metadata.generated.schema.entity.services.metadataService import MetadataService +from metadata.generated.schema.entity.services.mlmodelService import MlModelService +from metadata.generated.schema.entity.services.pipelineService import PipelineService +from metadata.generated.schema.entity.services.searchService import SearchService +from metadata.generated.schema.entity.services.storageService import StorageService +from metadata.generated.schema.entity.teams.role import Role +from metadata.generated.schema.entity.teams.team import Team +from metadata.generated.schema.entity.teams.user import AuthenticationMechanism, User +from metadata.generated.schema.tests.testCase import TestCase +from metadata.generated.schema.tests.testDefinition import TestDefinition +from metadata.generated.schema.tests.testSuite import TestSuite + +ROUTES = { + MlModel.__name__: "/mlmodels", + CreateMlModelRequest.__name__: "/mlmodels", + Chart.__name__: "/charts", + CreateChartRequest.__name__: "/charts", + DashboardDataModel.__name__: "/dashboard/datamodels", + CreateDashboardDataModelRequest.__name__: "/dashboard/datamodels", + Dashboard.__name__: "/dashboards", + CreateDashboardRequest.__name__: "/dashboards", + Database.__name__: "/databases", + CreateDatabaseRequest.__name__: "/databases", + DatabaseSchema.__name__: "/databaseSchemas", + CreateDatabaseSchemaRequest.__name__: "/databaseSchemas", + Pipeline.__name__: "/pipelines", + CreatePipelineRequest.__name__: "/pipelines", + Table.__name__: "/tables", + CreateTableRequest.__name__: "/tables", + Topic.__name__: "/topics", + CreateTopicRequest.__name__: "/topics", + Metrics.__name__: "/metrics", + AddLineageRequest.__name__: "/lineage", + Report.__name__: "/reports", + Query.__name__: "/queries", + CreateQueryRequest.__name__: "/queries", + Container.__name__: "/containers", + CreateContainerRequest.__name__: "/containers", + SearchIndex.__name__: "/searchIndexes", + CreateSearchIndexRequest.__name__: "/searchIndexes", + # Classifications + Tag.__name__: "/tags", + CreateTagRequest.__name__: "/tags", + Classification.__name__: "/classifications", + CreateClassificationRequest.__name__: "/classifications", + # Glossaries + Glossary.__name__: "/glossaries", + CreateGlossaryRequest.__name__: "/glossaries", + GlossaryTerm.__name__: "/glossaryTerms", + CreateGlossaryTermRequest.__name__: "/glossaryTerms", + # Users + Team.__name__: "/teams", + CreateTeamRequest.__name__: "/teams", + User.__name__: "/users", + CreateUserRequest.__name__: "/users", + AuthenticationMechanism.__name__: "/users/auth-mechanism", + # Roles + Role.__name__: "/roles", + CreateRoleRequest.__name__: "/roles", + Policy.__name__: "/policies", + CreatePolicyRequest.__name__: "/policies", + # Automations + Workflow.__name__: "/automations/workflows", + CreateWorkflowRequest.__name__: "/automations/workflows", + # Services + DatabaseService.__name__: "/services/databaseServices", + CreateDatabaseServiceRequest.__name__: "/services/databaseServices", + DashboardService.__name__: "/services/dashboardServices", + CreateDashboardServiceRequest.__name__: "/services/dashboardServices", + MessagingService.__name__: "/services/messagingServices", + CreateMessagingServiceRequest.__name__: "/services/messagingServices", + PipelineService.__name__: "/services/pipelineServices", + CreatePipelineServiceRequest.__name__: "/services/pipelineServices", + StorageService.__name__: "/services/storageServices", + CreateStorageServiceRequest.__name__: "/services/storageServices", + MlModelService.__name__: "/services/mlmodelServices", + CreateMlModelServiceRequest.__name__: "/services/mlmodelServices", + MetadataService.__name__: "/services/metadataServices", + CreateMetadataServiceRequest.__name__: "/services/metadataServices", + SearchService.__name__: "/services/searchServices", + CreateSearchServiceRequest.__name__: "/services/searchServices", + IngestionPipeline.__name__: "/services/ingestionPipelines", + TestConnectionDefinition.__name__: "/services/testConnectionDefinitions", + # Data Quality + TestDefinition.__name__: "/dataQuality/testDefinitions", + CreateTestDefinitionRequest.__name__: "/dataQuality/testDefinitions", + TestSuite.__name__: "/dataQuality/testSuites", + CreateTestSuiteRequest.__name__: "/dataQuality/testSuites", + TestCase.__name__: "/dataQuality/testCases", + CreateTestCaseRequest.__name__: "/dataQuality/testCases", + # Analytics + WebAnalyticEventData.__name__: "/analytics/web/events/collect", + DataInsightChart.__name__: "/analytics/dataInsights/charts", + Kpi.__name__: "/kpi", +} diff --git a/ingestion/tests/integration/ometa/test_ometa_table_api.py b/ingestion/tests/integration/ometa/test_ometa_table_api.py index 35a0a11d982..0439ddd31a1 100644 --- a/ingestion/tests/integration/ometa/test_ometa_table_api.py +++ b/ingestion/tests/integration/ometa/test_ometa_table_api.py @@ -210,6 +210,10 @@ class OMetaTableTest(TestCase): ) self.assertEqual(res.name, self.entity.name) + # Now check that we get a None if the table does not exist + nullable_res = self.metadata.get_by_name(entity=Table, fqn="something.made.up") + self.assertIsNone(nullable_res) + def test_get_id(self): """ We can fetch a Table by ID and get it back as Entity diff --git a/ingestion/tests/unit/test_ometa_endpoints.py b/ingestion/tests/unit/test_ometa_endpoints.py index 836e457adcf..b3cc71b2af1 100644 --- a/ingestion/tests/unit/test_ometa_endpoints.py +++ b/ingestion/tests/unit/test_ometa_endpoints.py @@ -105,20 +105,6 @@ class OMetaEndpointTest(TestCase): """ self.assertEqual(self.metadata.get_suffix(User), "/users") - def test_get_create_entity_type(self): - """ - Validate the mapping from Entity to CreateEntity - """ - - create = self.metadata.get_create_entity_type(Topic) - assert issubclass(create, CreateTopicRequest) - - create = self.metadata.get_create_entity_type(DatabaseService) - assert issubclass(create, CreateDatabaseServiceRequest) - - create = self.metadata.get_create_entity_type(User) - assert issubclass(create, CreateUserRequest) - def test_get_entity_from_create(self): """ Validate the mapping from CreateEntity to Entity diff --git a/openmetadata-airflow-apis/openmetadata_managed_apis/workflows/ingestion/common.py b/openmetadata-airflow-apis/openmetadata_managed_apis/workflows/ingestion/common.py index 27a927a188f..82c256bd90e 100644 --- a/openmetadata-airflow-apis/openmetadata_managed_apis/workflows/ingestion/common.py +++ b/openmetadata-airflow-apis/openmetadata_managed_apis/workflows/ingestion/common.py @@ -109,6 +109,9 @@ def build_source(ingestion_pipeline: IngestionPipeline) -> WorkflowSource: try: metadata = OpenMetadata(config=ingestion_pipeline.openMetadataServerConnection) + + # check we can access OM server + metadata.health_check() except Exception as exc: raise ClientInitializationError( f"Failed to initialize the OpenMetadata client due to: {exc}." @@ -122,8 +125,6 @@ def build_source(ingestion_pipeline: IngestionPipeline) -> WorkflowSource: entity_class = None try: if service_type == "testSuite": - # check we can access OM server - metadata.health_check() return WorkflowSource( type=service_type, serviceName=ingestion_pipeline.service.name, @@ -134,37 +135,51 @@ def build_source(ingestion_pipeline: IngestionPipeline) -> WorkflowSource: if service_type == "databaseService": entity_class = DatabaseService service: DatabaseService = metadata.get_by_name( - entity=entity_class, fqn=ingestion_pipeline.service.name + entity=entity_class, + fqn=ingestion_pipeline.service.name, + nullable=False, ) elif service_type == "pipelineService": entity_class = PipelineService service: PipelineService = metadata.get_by_name( - entity=entity_class, fqn=ingestion_pipeline.service.name + entity=entity_class, + fqn=ingestion_pipeline.service.name, + nullable=False, ) elif service_type == "dashboardService": entity_class = DashboardService service: DashboardService = metadata.get_by_name( - entity=entity_class, fqn=ingestion_pipeline.service.name + entity=entity_class, + fqn=ingestion_pipeline.service.name, + nullable=False, ) elif service_type == "messagingService": entity_class = MessagingService service: MessagingService = metadata.get_by_name( - entity=entity_class, fqn=ingestion_pipeline.service.name + entity=entity_class, + fqn=ingestion_pipeline.service.name, + nullable=False, ) elif service_type == "mlmodelService": entity_class = MlModelService service: MlModelService = metadata.get_by_name( - entity=entity_class, fqn=ingestion_pipeline.service.name + entity=entity_class, + fqn=ingestion_pipeline.service.name, + nullable=False, ) elif service_type == "metadataService": entity_class = MetadataService service: MetadataService = metadata.get_by_name( - entity=entity_class, fqn=ingestion_pipeline.service.name + entity=entity_class, + fqn=ingestion_pipeline.service.name, + nullable=False, ) elif service_type == "storageService": entity_class = StorageService service: StorageService = metadata.get_by_name( - entity=entity_class, fqn=ingestion_pipeline.service.name + entity=entity_class, + fqn=ingestion_pipeline.service.name, + nullable=False, ) else: raise InvalidServiceException(f"Invalid Service Type: {service_type}") diff --git a/openmetadata-docs/content/v1.1.1/connectors/dashboard/index.md b/openmetadata-docs/content/v1.1.1/connectors/dashboard/index.md index 4f78309d328..c8e02cac30c 100644 --- a/openmetadata-docs/content/v1.1.1/connectors/dashboard/index.md +++ b/openmetadata-docs/content/v1.1.1/connectors/dashboard/index.md @@ -12,6 +12,7 @@ This is the supported list of connectors for Dashboard Services: - [Metabase](/connectors/dashboard/metabase) - [Mode](/connectors/dashboard/mode) - [PowerBI](/connectors/dashboard/powerbi) +- [Qliksense](/connectors/dashboard/qliksense) - [QuickSight](/connectors/dashboard/quicksight) - [Redash](/connectors/dashboard/redash) - [Superset](/connectors/dashboard/superset) diff --git a/openmetadata-docs/content/v1.1.1/connectors/database/deltalake/index.md b/openmetadata-docs/content/v1.1.1/connectors/database/deltalake/index.md index 6c2e55c6802..1d13e771d8d 100644 --- a/openmetadata-docs/content/v1.1.1/connectors/database/deltalake/index.md +++ b/openmetadata-docs/content/v1.1.1/connectors/database/deltalake/index.md @@ -15,7 +15,7 @@ slug: /connectors/database/deltalake | Data Profiler | {% icon iconName="cross" /%} | | Data Quality | {% icon iconName="cross" /%} | | Lineage | Partially via Views | -| DBT | {% icon iconName="cross" /%} | +| DBT | {% icon iconName="check" /%} | | Supported Versions | -- | | Feature | Status | diff --git a/openmetadata-docs/content/v1.1.1/connectors/database/deltalake/yaml.md b/openmetadata-docs/content/v1.1.1/connectors/database/deltalake/yaml.md index 2f73a9b7c46..e42d2787909 100644 --- a/openmetadata-docs/content/v1.1.1/connectors/database/deltalake/yaml.md +++ b/openmetadata-docs/content/v1.1.1/connectors/database/deltalake/yaml.md @@ -15,7 +15,7 @@ slug: /connectors/database/deltalake/yaml | Data Profiler | {% icon iconName="cross" /%} | | Data Quality | {% icon iconName="cross" /%} | | Lineage | Partially via Views | -| DBT | {% icon iconName="cross" /%} | +| DBT | {% icon iconName="check" /%} | | Supported Versions | -- | | Feature | Status | @@ -144,7 +144,7 @@ The `sourceConfig` is defined [here](https://github.com/open-metadata/OpenMetada **includeViews**: true or false, to ingest views definitions. -**databaseFilterPattern**, **schemaFilterPattern**, **tableFilterPattern**: Note that the filter supports regex as include or exclude. You can find examples [here](/connectors/ingestion/workflows/metadata/filter-patterns/database) +**databaseFilterPattern**, **schemaFilterPattern**, **tableFilternPattern**: Note that the filter supports regex as include or exclude. You can find examples [here](/connectors/ingestion/workflows/metadata/filter-patterns/database) {% /codeInfo %} diff --git a/openmetadata-docs/content/v1.1.1/connectors/database/index.md b/openmetadata-docs/content/v1.1.1/connectors/database/index.md index a8456aba099..0599b0dbed9 100644 --- a/openmetadata-docs/content/v1.1.1/connectors/database/index.md +++ b/openmetadata-docs/content/v1.1.1/connectors/database/index.md @@ -27,6 +27,7 @@ This is the supported list of connectors for Database Services: - [Postgres](/connectors/database/postgres) - [Presto](/connectors/database/presto) - [Redshift](/connectors/database/redshift) +- [Sap Hana](/connectors/database/saphana) - [Salesforce](/connectors/database/salesforce) - [SingleStore](/connectors/database/singlestore) - [Snowflake](/connectors/database/snowflake) diff --git a/openmetadata-docs/content/v1.2.0-SNAPSHOT/connectors/database/deltalake/index.md b/openmetadata-docs/content/v1.2.0-SNAPSHOT/connectors/database/deltalake/index.md index 5ed7c8d91cc..13fadaed015 100644 --- a/openmetadata-docs/content/v1.2.0-SNAPSHOT/connectors/database/deltalake/index.md +++ b/openmetadata-docs/content/v1.2.0-SNAPSHOT/connectors/database/deltalake/index.md @@ -15,7 +15,7 @@ slug: /connectors/database/deltalake | Data Profiler | {% icon iconName="cross" /%} | | Data Quality | {% icon iconName="cross" /%} | | Lineage | Partially via Views | -| DBT | {% icon iconName="cross" /%} | +| DBT | {% icon iconName="check" /%} | | Supported Versions | -- | | Feature | Status | diff --git a/openmetadata-docs/content/v1.2.0-SNAPSHOT/connectors/database/deltalake/yaml.md b/openmetadata-docs/content/v1.2.0-SNAPSHOT/connectors/database/deltalake/yaml.md index b98cfb01096..3c28dbc247d 100644 --- a/openmetadata-docs/content/v1.2.0-SNAPSHOT/connectors/database/deltalake/yaml.md +++ b/openmetadata-docs/content/v1.2.0-SNAPSHOT/connectors/database/deltalake/yaml.md @@ -15,7 +15,7 @@ slug: /connectors/database/deltalake/yaml | Data Profiler | {% icon iconName="cross" /%} | | Data Quality | {% icon iconName="cross" /%} | | Lineage | Partially via Views | -| DBT | {% icon iconName="cross" /%} | +| DBT | {% icon iconName="check" /%} | | Supported Versions | -- | | Feature | Status | diff --git a/openmetadata-docs/images/connectors/mongodb.png b/openmetadata-docs/images/connectors/mongodb.png new file mode 100644 index 0000000000000000000000000000000000000000..99bf30d394c40f2552100e5db9c01308305188b4 GIT binary patch literal 3698 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 literal 0 HcmV?d00001 diff --git a/openmetadata-docs/images/connectors/qliksense.png b/openmetadata-docs/images/connectors/qliksense.png new file mode 100644 index 0000000000000000000000000000000000000000..6327edc3466b0c4ce4d37b061b635c58c2dacb99 GIT binary patch literal 76981 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 HjZTo4i22y+v8 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 literal 0 HcmV?d00001 diff --git a/openmetadata-docs/images/connectors/saphana.png b/openmetadata-docs/images/connectors/saphana.png new file mode 100644 index 0000000000000000000000000000000000000000..88076387631be408facb7c13862fdd5bbc41cf34 GIT binary patch literal 6467 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 KyJb4?kpBV2Ysq2& literal 0 HcmV?d00001