8000 Implement get server info (#84) · Souravsp/server-client-python@a6975db · GitHub
[go: up one dir, main page]

Skip to content

Commit a6975db

Browse files
author
Russell Hay
authored
Implement get server info (tableau#84)
* Implement get server info * reverting a change that should not have made it into the previous commit
1 parent 1cbc230 commit a6975db

File tree

8 files changed

+101
-1
lines changed

tableauserverclient/models/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from .pagination_item import PaginationItem
88
from .project_item import ProjectItem
99
from .schedule_item import ScheduleItem
10+
from .server_info_item import ServerInfoItem
1011
from .site_item import SiteItem
1112
from .tableau_auth import TableauAuth
1213
from .user_item import UserItem
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import xml.etree.ElementTree as ET
2+
from .. import NAMESPACE
3+
4+
5+
class ServerInfoItem(object):
6+
def __init__(self, product_version, build_number, rest_api_version):
7+
self._product_version = product_version
8+
self._build_number = build_number
9+
self._rest_api_version = rest_api_version
10+
11+
@property
12+
def product_version(self):
13+
return self._product_version
14+
15+
@property
16+
def build_number(self):
17+
return self._build_number
18+
19+
@property
20+
def rest_api_version(self):
21+
return self._rest_api_version
22+
23+
@classmethod
24+
def from_response(cls, resp):
25+
parsed_response = ET.fromstring(resp)
26+
product_version_tag = parsed_response.find('.//t:productVersion', namespaces=NAMESPACE)
27+
rest_api_version_tag = parsed_response.find('.//t:restApiVersion', namespaces=NAMESPACE)
28+
29+
build_number = product_version_tag.get('build', None)
30+
product_version = product_version_tag.text
31+
rest_api_version = rest_api_version_tag.text
32+
33+
return cls(product_version, build_number, rest_api_version)

tableauserverclient/server/endpoint/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from .groups_endpoint import Groups
66
from .projects_endpoint import Projects
77
from .schedules_endpoint import Schedules
8+
from .server_info_endpoint import ServerInfo
89
from .sites_endpoint import Sites
910
from .users_endpoint import Users
1011
from .views_endpoint import Views

tableauserverclient/server/endpoint/endpoint.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from .exceptions import ServerResponseError
22
import logging
33

4+
45
logger = logging.getLogger('tableau.endpoint')
56

67
Success_codes = [200, 201, 204]
@@ -15,6 +16,16 @@ def _check_status(server_response):
1516
if server_response.status_code not in Success_codes:
1617
raise ServerResponseError.from_response(server_response.content)
1718

19+
def get_unauthenticated_request(self, url, request_object=None):
20+
if request_object is not None:
21+
url = request_object.apply_query_params(url)
22+
server_response = self.parent_srv.session.get(url, **self.parent_srv.http_options)
23+
self._check_status(server_response)
24+
if server_response.encoding:
25+
logger.debug(u'Server response from {0}:\n\t{1}'.format(
26+
url, server_response.content.decode(server_response.encoding)))
27+
return server_response
28+
1829
def get_request(self, url, request_object=None):
1930
if request_object is not None:
2031
url = request_object.apply_query_params(url)
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
from .endpoint import Endpoint
2+
from ...models import ServerInfoItem
3+
import logging
4+
5+
logger = logging.getLogger('tableau.endpoint.server_info')
6+
7+
8+
class ServerInfo(Endpoint):
9+
def __init__(self, parent_srv):
10+
super(Endpoint, self).__init__()
11+
self.parent_srv = parent_srv
12+
13+
@property
14+
def baseurl(self):
15+
return F438 "{0}/serverInfo".format(self.parent_srv.baseurl)
16+
17+
def get(self):
18+
""" Retrieve the server info for the server. This is an unauthenticated call """
19+
server_response = self.get_unauthenticated_request(self.baseurl)
20+
server_info = ServerInfoItem.from_response(server_response.content)
21+
return server_info

tableauserverclient/server/server.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from .exceptions import NotSignedInError
2-
from .endpoint import Sites, Views, Users, Groups, Workbooks, Datasources, Projects, Auth, Schedules
2+
from .endpoint import Sites, Views, Users, Groups, Workbooks, Datasources, Projects, Auth, Schedules, ServerInfo
33
import requests
44

55

@@ -27,6 +27,7 @@ def __init__(self, server_address):
2727
self.datasources = Datasources(self)
2828
self.projects = Projects(self)
2929
self.schedules = Schedules(self)
30+
self.server_info = ServerInfo(self)
3031

3132
def add_http_options(self, options_dict):
3233
self._http_options.update(options_dict)

test/assets/server_info_get.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<tsResponse xmlns="http://tableau.com/api" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://tableau.com/api http://tableau.com/api/ts-api-2.4.xsd">
2+
<serverInfo>
3+
<productVersion build="10100.16.1024.2100">10.1.0</productVersion>
4+
<restApiVersion>2.4</restApiVersion>
5+
</serverInfo>
6+
</tsResponse>

test/test_server_info.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import unittest
2+
import os.path
3+
import requests_mock
4+
import tableauserverclient as TSC
5+
6+
TEST_ASSET_DIR = os.path.join(os.path.dirname(__file__), 'assets')
7+
8+
SERVER_INFO_GET_XML = os.path.join(TEST_ASSET_DIR, 'server_info_get.xml')
9+
10+
11+
class ServerInfoTests(unittest.TestCase):
12+
def setUp(self):
13+
self.server = TSC.Server('http://test')
14+
self.server.version = '2.4'
15+
self.baseurl = self.server.server_info.baseurl
16+
17+
def test_server_info_get(self):
18+
with open(SERVER_INFO_GET_XML, 'rb') as f:
19+
response_xml = f.read().decode('utf-8')
20+
with requests_mock.mock() as m:
21+
m.get(self.baseurl, text=response_xml)
22+
actual = self.server.server_info.get()
23+
24+
self.assertEqual('10.1.0', actual.product_version)
25+
self.assertEqual('10100.16.1024.2100', actual.build_number)
26+
self.assertEqual('2.4', actual.rest_api_version)

0 commit comments

Comments
 (0)
0