Skip to content

Commit 7938e40

Browse files
authored
Merge pull request #29 from rubenvp8510/inherit_metrics_base
Inherit metrics client from base client
2 parents 0d06801 + 25f4118 commit 7938e40

2 files changed

Lines changed: 96 additions & 209 deletions

File tree

hawkular/client.py

Lines changed: 90 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,31 @@ def default(self, obj):
4646
return json.JSONEncoder.default(self, obj)
4747

4848

49+
class HawkularMetricsError(HTTPError):
50+
pass
51+
52+
53+
class HawkularMetricsConnectionError(URLError):
54+
pass
55+
56+
57+
class HawkularMetricsStatusError(ValueError):
58+
pass
59+
60+
61+
class HawkularHTTPErrorProcessor(HTTPErrorProcessor):
62+
"""
63+
Hawkular-Metrics uses http codes 201, 204
64+
"""
65+
66+
def http_response(self, request, response):
67+
if response.code in [200, 201, 204]:
68+
return response
69+
return HTTPErrorProcessor.http_response(self, request, response)
70+
71+
https_response = http_response
72+
73+
4974
class ApiOject:
5075

5176
defaults = dict()
@@ -108,7 +133,6 @@ class HawkularBaseClient:
108133
Creates new client for Hawkular-Metrics. As tenant_id, give intended tenant_id, even if it's not
109134
created yet. To change the instance's tenant_id, use tenant(tenant_id) method
110135
"""
111-
112136
def __init__(self,
113137
tenant_id,
114138
host='localhost',
@@ -119,7 +143,9 @@ def __init__(self,
119143
context=None,
120144
token=None,
121145
username=None,
122-
password=None):
146+
password=None,
147+
auto_set_legacy_api=True,
148+
authtoken=None):
123149
"""
124150
A new instance of HawkularMetricsClient is created with the following defaults:
125151
@@ -143,6 +169,8 @@ def __init__(self,
143169
self.token = token
144170
self.username = username
145171
self.password = password
172+
self.legacy_api = False
173+
self.authtoken = authtoken
146174

147175
opener = build_opener(HawkularHTTPErrorProcessor())
148176
install_opener(opener)
@@ -156,6 +184,12 @@ def __init__(self,
156184
self.path = path
157185
self.path = self.path.strip('/')
158186

187+
# Call the server status endpoint to get the version number,
188+
# Use the return sematic version to set the value of legacy_api
189+
if auto_set_legacy_api:
190+
major, minor, patch = self.query_semantic_version()
191+
self.legacy_api = (major == 0 and minor < 16)
192+
159193
def _get_base_url(self):
160194
return "{0}://{1}:{2}/{3}/".format(self.scheme, self.host, str(self.port), self.path)
161195

@@ -179,6 +213,9 @@ def _http(self, url, method, data=None, decoder=None, parse_json=True):
179213
req.add_header('Authorization',
180214
'Basic {0}'.format(b64))
181215

216+
if self.authtoken is not None:
217+
req.add_header('Hawkular-Admin-Token', self.authtoken)
218+
182219
if not isinstance(data, str):
183220
data = json.dumps(data, indent=2)
184221

@@ -213,11 +250,11 @@ def _http(self, url, method, data=None, decoder=None, parse_json=True):
213250
def _put(self, url, data, parse_json=True):
214251
return self._http(url, 'PUT', data, parse_json=parse_json)
215252

216-
def _delete(self, url):
217-
return self._http(url, 'DELETE', parse_json=False)
253+
def _delete(self, url, parse_json=False):
254+
return self._http(url, 'DELETE', parse_json=parse_json)
218255

219-
def _post(self, url, data):
220-
return self._http(url, 'POST', data)
256+
def _post(self, url, data, parse_json=True):
257+
return self._http(url, 'POST', data, parse_json=parse_json)
221258

222259
def _get(self, url, **url_params):
223260
params = urlencode(url_params)
@@ -245,9 +282,52 @@ def _service_url(self, path, params=None):
245282
def _serialize_object(o):
246283
return json.dumps(o, cls=ApiJsonEncoder)
247284

248-
@staticmethod
249-
def _handle_error(e):
250-
raise e
285+
def _handle_error(self, e):
286+
if isinstance(e, HTTPError):
287+
# Cast to HawkularMetricsError
288+
ee = HawkularMetricsError(e.url, e.code, e.msg, e.hdrs, e.fp)
289+
err_json = e.read()
290+
291+
try:
292+
err_d = json.loads(err_json)
293+
ee.msg = err_d['errorMsg']
294+
except:
295+
# Keep the original payload, couldn't parse it
296+
ee.msg = err_json
297+
raise ee
298+
299+
elif isinstance(e, URLError):
300+
# Cast to HawkularMetricsConnectionError
301+
ee = HawkularMetricsConnectionError()
302+
ee.msg = "Error, could not send event(s) to the Hawkular Metrics: " + str(e.reason)
303+
raise ee
304+
elif isinstance(e, KeyError):
305+
# Cast to HawkularMetricsStatusError
306+
ee = HawkularMetricsStatusError
307+
ee.msg = "Error, unable to get implementation version for metrics: " + str(e.reason)
308+
raise ee
309+
elif isinstance(e, ValueError):
310+
# Cast to HawkularMetricsStatusError
311+
ee = HawkularMetricsStatusError
312+
ee.msg = "Error, unable to determine implementation version for metrics: " + str(e.reason)
313+
raise ee
314+
else:
315+
raise e
316+
"""
317+
General information related queries
318+
"""
319+
def query_semantic_version(self):
320+
status_hash = self.query_status()
321+
try:
322+
version = status_hash['Implementation-Version']
323+
major, minor, patch = map(int, version.split('.')[:3])
324+
except Exception as e:
325+
self._handle_error(e)
326+
return major, minor, patch
251327

252-
def status(self):
328+
def query_status(self):
253329
return self._get(self._get_status_url())
330+
331+
@staticmethod
332+
def quote(value,safe=''):
333+
return quote(value, safe)

0 commit comments

Comments
 (0)