@@ -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+
4974class 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