forked from tableau/server-client-python
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver_info_endpoint.py
More file actions
109 lines (90 loc) · 3.71 KB
/
server_info_endpoint.py
File metadata and controls
109 lines (90 loc) · 3.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import logging
from typing import Literal, Union, TYPE_CHECKING
from .endpoint import Endpoint, api
from .exceptions import ServerResponseError
from ..exceptions import (
ServerInfoEndpointNotFoundError,
EndpointUnavailableError,
)
from tableauserverclient.models import ServerInfoItem
if TYPE_CHECKING:
from tableauserverclient.server import Server
Products = Literal["TableauServer", "TableauOnline"]
class ServerInfo(Endpoint):
def __init__(self, server):
self.parent_srv: "Server" = server
self._info = None
@property
def serverInfo(self):
if not self._info:
self.get()
return self._info
def __repr__(self):
return f"<Endpoint {self.serverInfo}>"
@property
def baseurl(self) -> str:
return f"{self.parent_srv.baseurl}/serverInfo"
@api(version="2.4")
def get(self) -> Union[ServerInfoItem, None]:
"""
Retrieve the build and version information for the server.
This method makes an unauthenticated call, so no sign in or
authentication token is required.
Returns
-------
:class:`~tableauserverclient.models.ServerInfoItem`
Raises
------
:class:`~tableauserverclient.exceptions.ServerInfoEndpointNotFoundError`
Raised when the server info endpoint is not found.
:class:`~tableauserverclient.exceptions.EndpointUnavailableError`
Raised when the server info endpoint is not available.
Examples
--------
>>> import tableauserverclient as TSC
>>> # create a instance of server
>>> server = TSC.Server('https://MY-SERVER')
>>> # set the version number > 2.3
>>> # the server_info.get() method works in 2.4 and later
>>> server.version = '2.5'
>>> s_info = server.server_info.get()
>>> print("\nServer info:")
>>> print("\tProduct version: {0}".format(s_info.product_version))
>>> print("\tREST API version: {0}".format(s_info.rest_api_version))
>>> print("\tBuild number: {0}".format(s_info.build_number))
"""
try:
server_response = self.get_unauthenticated_request(self.baseurl)
except ServerResponseError as e:
if e.code == "404003":
raise ServerInfoEndpointNotFoundError(e)
if e.code == "404001":
raise EndpointUnavailableError(e)
raise e
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
def _get_product_info(self) -> Products:
"""
Retrieve the server product information to determine if the server is
Tableau Server or Tableau Online.
"""
method = "getServerSettingsUnauthenticated"
response = self.parent_srv.session.post(
f"{self.parent_srv.server_address}/vizportal/api/web/v1/{method}",
headers={"Content-Type": "application/json"},
verify=self.parent_srv.http_options.get("verify", True),
json={"method": method, "params": {}},
)
if not response.ok:
return "TableauServer"
else:
try:
return response.json().get("result", {}).get("product", "TableauServer")
except Exception as e:
logging.getLogger(self.__class__.__name__).debug(e)
logging.getLogger(self.__class__.__name__).debug("Failed to parse product info response.")
return "TableauServer"