metabase-test-connection-completed (#4671)

* metabase-test-connection-completed

* debug-traceback-added
This commit is contained in:
codingwithabhi 2022-05-04 16:26:33 +05:30 committed by GitHub
parent 1e8682e1f1
commit 6cff9620b2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 62 additions and 12 deletions

View File

@ -10,7 +10,6 @@
# limitations under the License. # limitations under the License.
"""Metabase source module""" """Metabase source module"""
import json
import traceback import traceback
import uuid import uuid
from typing import Iterable from typing import Iterable
@ -28,6 +27,9 @@ from metadata.generated.schema.entity.services.connections.metadata.openMetadata
OpenMetadataConnection, OpenMetadataConnection,
) )
from metadata.generated.schema.entity.services.dashboardService import DashboardService from metadata.generated.schema.entity.services.dashboardService import DashboardService
from metadata.generated.schema.metadataIngestion.dashboardServiceMetadataPipeline import (
DashboardServiceMetadataPipeline,
)
from metadata.generated.schema.metadataIngestion.workflow import ( from metadata.generated.schema.metadataIngestion.workflow import (
Source as WorkflowSource, Source as WorkflowSource,
) )
@ -38,6 +40,7 @@ from metadata.ingestion.api.source import InvalidSourceException, Source, Source
from metadata.ingestion.models.table_metadata import Chart, Dashboard from metadata.ingestion.models.table_metadata import Chart, Dashboard
from metadata.ingestion.ometa.ometa_api import OpenMetadata from metadata.ingestion.ometa.ometa_api import OpenMetadata
from metadata.ingestion.source.sql_source import SQLSourceStatus from metadata.ingestion.source.sql_source import SQLSourceStatus
from metadata.utils.connections import get_connection, test_connection
from metadata.utils.filters import filter_by_chart, filter_by_dashboard from metadata.utils.filters import filter_by_chart, filter_by_dashboard
from metadata.utils.logger import ingestion_logger from metadata.utils.logger import ingestion_logger
@ -74,7 +77,9 @@ class MetabaseSource(Source[Entity]):
super().__init__() super().__init__()
self.config = config self.config = config
self.service_connection = self.config.serviceConnection.__root__.config self.service_connection = self.config.serviceConnection.__root__.config
self.source_config = self.config.sourceConfig.config self.source_config: DashboardServiceMetadataPipeline = (
self.config.sourceConfig.config
)
self.metadata_config = metadata_config self.metadata_config = metadata_config
self.metadata = OpenMetadata(metadata_config) self.metadata = OpenMetadata(metadata_config)
@ -82,16 +87,9 @@ class MetabaseSource(Source[Entity]):
params = dict() params = dict()
params["username"] = self.service_connection.username params["username"] = self.service_connection.username
params["password"] = self.service_connection.password.get_secret_value() params["password"] = self.service_connection.password.get_secret_value()
try:
resp = requests.post( self.connection = get_connection(self.service_connection)
self.service_connection.hostPort + "/api/session/", self.metabase_session = self.connection.client["metabase_session"]
data=json.dumps(params),
headers=HEADERS,
)
except Exception as err:
raise ConnectionError() from err
session_id = resp.json()["id"]
self.metabase_session = {"X-Metabase-Session": session_id}
self.dashboard_service = self.metadata.get_service_or_create( self.dashboard_service = self.metadata.get_service_or_create(
entity=DashboardService, config=config entity=DashboardService, config=config

View File

@ -40,3 +40,9 @@ class DeltaLakeClient:
class KafkaClient: class KafkaClient:
def __init__(self, client) -> None: def __init__(self, client) -> None:
self.client = client self.client = client
@dataclass
class MetabaseClient:
def __init__(self, client) -> None:
self.client = client

View File

@ -12,10 +12,13 @@
""" """
Build and document all supported Engines Build and document all supported Engines
""" """
import json
import logging import logging
import traceback
from functools import singledispatch from functools import singledispatch
from typing import Union from typing import Union
import requests
from sqlalchemy import create_engine from sqlalchemy import create_engine
from sqlalchemy.engine.base import Engine from sqlalchemy.engine.base import Engine
from sqlalchemy.exc import OperationalError from sqlalchemy.exc import OperationalError
@ -25,6 +28,9 @@ from sqlalchemy.orm.session import Session
from metadata.generated.schema.entity.services.connections.connectionBasicType import ( from metadata.generated.schema.entity.services.connections.connectionBasicType import (
ConnectionOptions, ConnectionOptions,
) )
from metadata.generated.schema.entity.services.connections.dashboard.metabaseConnection import (
MetabaseConnection,
)
from metadata.generated.schema.entity.services.connections.database.bigQueryConnection import ( from metadata.generated.schema.entity.services.connections.database.bigQueryConnection import (
BigQueryConnection, BigQueryConnection,
) )
@ -51,6 +57,7 @@ from metadata.utils.connection_clients import (
DynamoClient, DynamoClient,
GlueClient, GlueClient,
KafkaClient, KafkaClient,
MetabaseClient,
SalesforceClient, SalesforceClient,
) )
from metadata.utils.credentials import set_google_credentials from metadata.utils.credentials import set_google_credentials
@ -323,3 +330,42 @@ def _(connection: DeltaLakeClient) -> None:
raise SourceConnectionException( raise SourceConnectionException(
f"Unknown error connecting with {connection} - {err}." f"Unknown error connecting with {connection} - {err}."
) )
@get_connection.register
def _(connection: MetabaseConnection, verbose: bool = False):
try:
params = dict()
params["username"] = connection.username
params["password"] = connection.password.get_secret_value()
HEADERS = {"Content-Type": "application/json", "Accept": "*/*"}
resp = requests.post(
connection.hostPort + "/api/session/",
data=json.dumps(params),
headers=HEADERS,
)
session_id = resp.json()["id"]
metabase_session = {"X-Metabase-Session": session_id}
conn = {"connection": connection, "metabase_session": metabase_session}
return MetabaseClient(conn)
except Exception as err:
logger.error(f"Failed to connect with error : {err}")
logger.debug(traceback.format_exc())
@test_connection.register
def _(connection: MetabaseClient) -> None:
try:
requests.get(
connection.client["connection"].hostPort + "/api/dashboard",
headers=connection.client["metabase_session"],
)
except Exception as err:
raise SourceConnectionException(
f"Unknown error connecting with {connection} - {err}."
)