tableau-test-connection-added (#4673)

* tableau-test-connection-added

* tableau-test-connection-fixed

* test-connection-optimised

* test-connection-optimised
This commit is contained in:
codingwithabhi 2022-05-05 10:17:08 +05:30 committed by GitHub
parent c0fa190c82
commit 4aa5fbce04
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 70 additions and 44 deletions

View File

@ -73,5 +73,5 @@
}
},
"additionalProperties": false,
"required": ["hostPort", "apiVersion", "siteName", "env"]
"required": ["apiVersion", "siteName", "env"]
}

View File

@ -11,7 +11,6 @@
"""
Tableau source module
"""
import traceback
import uuid
from typing import Iterable, List
@ -37,6 +36,9 @@ from metadata.generated.schema.entity.services.connections.metadata.openMetadata
OpenMetadataConnection,
)
from metadata.generated.schema.entity.services.dashboardService import DashboardService
from metadata.generated.schema.metadataIngestion.dashboardServiceMetadataPipeline import (
DashboardServiceMetadataPipeline,
)
from metadata.generated.schema.metadataIngestion.workflow import (
Source as WorkflowSource,
)
@ -46,6 +48,7 @@ from metadata.ingestion.api.common import Entity
from metadata.ingestion.api.source import InvalidSourceException, Source, SourceStatus
from metadata.ingestion.models.table_metadata import Chart, Dashboard, DashboardOwner
from metadata.ingestion.ometa.ometa_api import OpenMetadata
from metadata.utils.connections import get_connection, test_connection
from metadata.utils.filters import filter_by_chart, filter_by_dashboard
from metadata.utils.logger import ingestion_logger
@ -82,8 +85,12 @@ class TableauSource(Source[Entity]):
self.metadata_config = metadata_config
self.metadata = OpenMetadata(metadata_config)
self.connection_config = self.config.serviceConnection.__root__.config
self.source_config = self.config.sourceConfig.config
self.client = self.tableau_client()
self.source_config: DashboardServiceMetadataPipeline = (
self.config.sourceConfig.config
)
self.connection = get_connection(self.connection_config)
self.client = self.connection.client
self.service = self.metadata.get_service_or_create(
entity=DashboardService, config=config
)
@ -92,46 +99,6 @@ class TableauSource(Source[Entity]):
self.dashboards = get_workbooks_dataframe(self.client).to_dict()
self.all_dashboard_details = get_views_dataframe(self.client).to_dict()
def tableau_client(self):
"""Tableau client method
Returns:
"""
tableau_server_config = {
f"{self.connection_config.env}": {
"server": self.connection_config.hostPort,
"api_version": self.connection_config.apiVersion,
"site_name": self.connection_config.siteName,
"site_url": self.connection_config.siteName,
}
}
if self.connection_config.username and self.connection_config.password:
tableau_server_config[self.connection_config.env][
"username"
] = self.connection_config.username
tableau_server_config[self.connection_config.env][
"password"
] = self.connection_config.password.get_secret_value()
elif (
self.connection_config.personalAccessTokenName
and self.connection_config.personalAccessTokenSecret
):
tableau_server_config[self.connection_config.env][
"personal_access_token_name"
] = self.connection_config.personalAccessTokenName
tableau_server_config[self.connection_config.env][
"personal_access_token_secret"
] = self.connection_config.personalAccessTokenSecret
try:
conn = TableauServerConnection(
config_json=tableau_server_config,
env=self.connection_config.env,
)
conn.sign_in().json()
return conn
except Exception as err: # pylint: disable=broad-except
logger.error("%s: %s", repr(err), err)
@classmethod
def create(cls, config_dict: dict, metadata_config: OpenMetadataConnection):
config: WorkflowSource = WorkflowSource.parse_obj(config_dict)

View File

@ -64,3 +64,9 @@ class RedashClient:
class SupersetClient:
def __init__(self, client) -> None:
self.client = client
@dataclass
class TableauClient:
def __init__(self, client) -> None:
self.client = client

View File

@ -37,6 +37,9 @@ from metadata.generated.schema.entity.services.connections.dashboard.redashConne
from metadata.generated.schema.entity.services.connections.dashboard.supersetConnection import (
SupersetConnection,
)
from metadata.generated.schema.entity.services.connections.dashboard.tableauConnection import (
TableauConnection,
)
from metadata.generated.schema.entity.services.connections.database.bigQueryConnection import (
BigQueryConnection,
)
@ -67,6 +70,7 @@ from metadata.utils.connection_clients import (
RedashClient,
SalesforceClient,
SupersetClient,
TableauClient,
)
from metadata.utils.credentials import set_google_credentials
from metadata.utils.source_connections import get_connection_args, get_connection_url
@ -420,3 +424,52 @@ def _(connection: SupersetClient) -> None:
raise SourceConnectionException(
f"Unknown error connecting with {connection} - {err}."
)
@get_connection.register
def _(connection: TableauConnection, verbose: bool = False):
from tableau_api_lib import TableauServerConnection
tableau_server_config = {
f"{connection.env}": {
"server": connection.hostPort,
"api_version": connection.apiVersion,
"site_name": connection.siteName,
"site_url": connection.siteName,
}
}
if connection.username and connection.password:
tableau_server_config[connection.env]["username"] = connection.username
tableau_server_config[connection.env][
"password"
] = connection.password.get_secret_value()
elif connection.personalAccessTokenName and connection.personalAccessTokenSecret:
tableau_server_config[connection.env][
"personal_access_token_name"
] = connection.personalAccessTokenName
tableau_server_config[connection.env][
"personal_access_token_secret"
] = connection.personalAccessTokenSecret
try:
conn = TableauServerConnection(
config_json=tableau_server_config,
env=connection.env,
)
conn.sign_in().json()
return TableauClient(conn)
except Exception as err: # pylint: disable=broad-except
logger.error("%s: %s", repr(err), err)
@test_connection.register
def _(connection: TableauClient) -> None:
from tableau_api_lib.utils.querying import get_workbooks_dataframe
try:
connection.client.server_info()
except Exception as err:
raise SourceConnectionException(
f"Unknown error connecting with {connection} - {err}."
)