From 3cdca8cf68f6663beddb3685c785d7c3c818dafd Mon Sep 17 00:00:00 2001 From: Jac Fitzgerald Date: Mon, 12 Dec 2022 15:06:00 -0800 Subject: [PATCH 1/5] catch all exceptions from ServerInfoEndpoint --- tableauserverclient/models/server_info_item.py | 4 ++++ .../server/endpoint/server_info_endpoint.py | 5 ++++- tableauserverclient/server/server.py | 8 ++++++-- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/tableauserverclient/models/server_info_item.py b/tableauserverclient/models/server_info_item.py index bcc1ce738..42f32c594 100644 --- a/tableauserverclient/models/server_info_item.py +++ b/tableauserverclient/models/server_info_item.py @@ -40,6 +40,10 @@ def from_response(cls, resp, ns): except xml.etree.ElementTree.ParseError as error: print("Unexpected response for ServerInfo: {}".format(resp)) return cls("Unknown", "Unknown", "Unknown") + except Exception as e: + warnings.warn("Unexpected response for ServerInfo: {}".format(resp)) + return cls("Unknown", "Unknown", "Unknown") + product_version_tag = parsed_response.find(".//t:productVersion", namespaces=ns) rest_api_version_tag = parsed_response.find(".//t:restApiVersion", namespaces=ns) diff --git a/tableauserverclient/server/endpoint/server_info_endpoint.py b/tableauserverclient/server/endpoint/server_info_endpoint.py index d9611736a..2158a6e08 100644 --- a/tableauserverclient/server/endpoint/server_info_endpoint.py +++ b/tableauserverclient/server/endpoint/server_info_endpoint.py @@ -41,5 +41,8 @@ def get(self): raise EndpointUnavailableError(e) raise e - self._info = ServerInfoItem.from_response(server_response.content, self.parent_srv.namespace) + try: + self._info = ServerInfoItem.from_response(server_response.content, self.parent_srv.namespace) + except Exception as e: + logging.getLogger(self.__class__.__name__).debug(server_response.content) return self._info diff --git a/tableauserverclient/server/server.py b/tableauserverclient/server/server.py index 11d9f5b6d..8d00ed9fd 100644 --- a/tableauserverclient/server/server.py +++ b/tableauserverclient/server/server.py @@ -147,8 +147,8 @@ def _set_auth(self, site_id, user_id, auth_token): self._auth_token = auth_token def _get_legacy_version(self): - dest = Endpoint(self) - response = dest._make_request(method=self.session.get, url=self.server_address + "/auth?format=xml") + # the serverInfo call was introduced in 2.4, earlier than that we have this different call + response = self._session.get(self.server_address + "/auth?format=xml") try: info_xml = fromstring(response.content) except ParseError as parseError: @@ -163,7 +163,11 @@ def _determine_highest_version(self): try: old_version = self.version version = self.server_info.get().rest_api_version + except ServerInfoEndpointNotFoundError as e: + self.logger.info("Could not get version info from server: {}{}".format(e.__class__, e)) + version = self._get_legacy_version() except EndpointUnavailableError as e: + self.logger.info("Could not get version info from server: {}{}".format(e.__class__, e)) version = self._get_legacy_version() except Exception as e: self.logger.info("Could not get version info from server: {}{}".format(e.__class__, e)) From 60b09f9f068fd8d9d0e719d512cd251d50276a1d Mon Sep 17 00:00:00 2001 From: Jac Fitzgerald Date: Wed, 15 Feb 2023 17:17:47 -0800 Subject: [PATCH 2/5] fix logger in server.py remove use of warnings add check before making http request --- tableauserverclient/server/server.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tableauserverclient/server/server.py b/tableauserverclient/server/server.py index 8d00ed9fd..86454d35c 100644 --- a/tableauserverclient/server/server.py +++ b/tableauserverclient/server/server.py @@ -97,6 +97,8 @@ def __init__(self, server_address, use_server_version=False, http_options=None, self.logger = logging.getLogger("TSC.server") + self.logger = logging.getLogger("TSC.server") + self._session = self._session_factory() self._http_options = dict() # must set this before making a server call if http_options: From a846113e97213db27f256e1e8c13fd07327cb130 Mon Sep 17 00:00:00 2001 From: Jac Fitzgerald Date: Mon, 6 Mar 2023 14:58:23 -0800 Subject: [PATCH 3/5] fix test for old version --- tableauserverclient/server/server.py | 2 +- test/test_server_info.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/tableauserverclient/server/server.py b/tableauserverclient/server/server.py index 86454d35c..509ec28c1 100644 --- a/tableauserverclient/server/server.py +++ b/tableauserverclient/server/server.py @@ -158,7 +158,7 @@ def _get_legacy_version(self): self.logger.info("Could not read server version info. The server may not be running or configured.") return self.version prod_version = info_xml.find(".//product_version").text - version = _PRODUCT_TO_REST_VERSION.get(prod_version, default_server_version) # 2.4 + version = _PRODUCT_TO_REST_VERSION.get(prod_version, minimum_supported_server_version) return version def _determine_highest_version(self): diff --git a/test/test_server_info.py b/test/test_server_info.py index 9b9c7b7dc..1cf190ecd 100644 --- a/test/test_server_info.py +++ b/test/test_server_info.py @@ -42,7 +42,8 @@ def test_server_info_use_highest_version_downgrades(self): m.get(self.server.server_address + "/api/2.4/serverInfo", text=si_response_xml, status_code=404) m.get(self.server.server_address + "/auth?format=xml", text=auth_response_xml) self.server.use_server_version() - self.assertEqual(self.server.version, "2.4") + # does server-version[9.2] lookup in PRODUCT_TO_REST_VERSION + self.assertEqual(self.server.version, "2.2") def test_server_info_use_highest_version_upgrades(self): with open(SERVER_INFO_GET_XML, "rb") as f: From 2a1d67509a2567612bb09fca2d2ed19f80854b66 Mon Sep 17 00:00:00 2001 From: Jac Fitzgerald Date: Mon, 6 Mar 2023 15:02:04 -0800 Subject: [PATCH 4/5] use logger --- tableauserverclient/models/server_info_item.py | 10 +++++++--- tableauserverclient/server/server.py | 2 -- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/tableauserverclient/models/server_info_item.py b/tableauserverclient/models/server_info_item.py index 42f32c594..5f9395880 100644 --- a/tableauserverclient/models/server_info_item.py +++ b/tableauserverclient/models/server_info_item.py @@ -1,3 +1,4 @@ +import logging import warnings import xml @@ -35,13 +36,16 @@ def rest_api_version(self): @classmethod def from_response(cls, resp, ns): + logger = logging.getLogger("TSC.ServerInfo") try: parsed_response = fromstring(resp) except xml.etree.ElementTree.ParseError as error: - print("Unexpected response for ServerInfo: {}".format(resp)) + logger.info("Unexpected response for ServerInfo: {}".format(resp)) + logger.info(error) return cls("Unknown", "Unknown", "Unknown") - except Exception as e: - warnings.warn("Unexpected response for ServerInfo: {}".format(resp)) + except Exception as error: + logger.info("Unexpected response for ServerInfo: {}".format(resp)) + logger.info(error) return cls("Unknown", "Unknown", "Unknown") product_version_tag = parsed_response.find(".//t:productVersion", namespaces=ns) diff --git a/tableauserverclient/server/server.py b/tableauserverclient/server/server.py index 509ec28c1..18437fdfe 100644 --- a/tableauserverclient/server/server.py +++ b/tableauserverclient/server/server.py @@ -97,8 +97,6 @@ def __init__(self, server_address, use_server_version=False, http_options=None, self.logger = logging.getLogger("TSC.server") - self.logger = logging.getLogger("TSC.server") - self._session = self._session_factory() self._http_options = dict() # must set this before making a server call if http_options: From bc7482855084362dbb1766d6190df65faa2bc3eb Mon Sep 17 00:00:00 2001 From: Jac Fitzgerald Date: Tue, 7 Mar 2023 15:30:32 -0800 Subject: [PATCH 5/5] fix log format, add exception to log --- tableauserverclient/server/endpoint/server_info_endpoint.py | 1 + tableauserverclient/server/server.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/tableauserverclient/server/endpoint/server_info_endpoint.py b/tableauserverclient/server/endpoint/server_info_endpoint.py index 2158a6e08..b396a1f87 100644 --- a/tableauserverclient/server/endpoint/server_info_endpoint.py +++ b/tableauserverclient/server/endpoint/server_info_endpoint.py @@ -44,5 +44,6 @@ def get(self): try: self._info = ServerInfoItem.from_response(server_response.content, self.parent_srv.namespace) except Exception as e: + logging.getLogger(self.__class__.__name__).debug(e) logging.getLogger(self.__class__.__name__).debug(server_response.content) return self._info diff --git a/tableauserverclient/server/server.py b/tableauserverclient/server/server.py index 18437fdfe..5e8468c4e 100644 --- a/tableauserverclient/server/server.py +++ b/tableauserverclient/server/server.py @@ -172,7 +172,7 @@ def _determine_highest_version(self): except Exception as e: self.logger.info("Could not get version info from server: {}{}".format(e.__class__, e)) version = None - self.logger.info(version, old_version) + self.logger.info("versions: {}, {}".format(version, old_version)) return version or old_version def use_server_version(self):