mirror of
				https://github.com/open-metadata/OpenMetadata.git
				synced 2025-10-31 02:29:03 +00:00 
			
		
		
		
	tableau-test-connection-added (#4673)
* tableau-test-connection-added * tableau-test-connection-fixed * test-connection-optimised * test-connection-optimised
This commit is contained in:
		
							parent
							
								
									c0fa190c82
								
							
						
					
					
						commit
						4aa5fbce04
					
				| @ -73,5 +73,5 @@ | ||||
|     } | ||||
|   }, | ||||
|   "additionalProperties": false, | ||||
|   "required": ["hostPort", "apiVersion", "siteName", "env"] | ||||
|   "required": ["apiVersion", "siteName", "env"] | ||||
| } | ||||
|  | ||||
| @ -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) | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
| @ -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}." | ||||
|         ) | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 codingwithabhi
						codingwithabhi