1717import logging
1818
1919import requests
20- from requests .adapters import HTTPAdapter
20+ from requests .adapters import HTTPAdapter , Retry
2121
2222from ._local import set_current
2323from .core .log_manager import LogManager
@@ -96,10 +96,15 @@ def __init__(self,
9696 self .step_reporter = StepReporter (self )
9797 self ._item_stack = []
9898 if retries :
99+ retry_strategy = Retry (
100+ total = retries ,
101+ backoff_factor = 0.1 ,
102+ status_forcelist = [429 , 500 , 502 , 503 , 504 ]
103+ )
99104 self .session .mount ('https://' , HTTPAdapter (
100- max_retries = retries , pool_maxsize = max_pool_size ))
105+ max_retries = retry_strategy , pool_maxsize = max_pool_size ))
101106 self .session .mount ('http://' , HTTPAdapter (
102- max_retries = retries , pool_maxsize = max_pool_size ))
107+ max_retries = retry_strategy , pool_maxsize = max_pool_size ))
103108 self .session .headers ['Authorization' ] = 'bearer {0}' .format (self .token )
104109
105110 self ._log_manager = LogManager (
@@ -119,6 +124,9 @@ def finish_launch(self,
119124 CANCELLED
120125 :param attributes: Launch attributes
121126 """
127+ if self .launch_id is NOT_FOUND or not self .launch_id :
128+ logger .warning ("Attempt to finish non-existent launch" )
129+ return
122130 url = uri_join (self .base_url_v2 , 'launch' , self .launch_id , 'finish' )
123131 request_payload = LaunchFinishRequest (
124132 end_time ,
@@ -127,7 +135,10 @@ def finish_launch(self,
127135 description = kwargs .get ('description' )
128136 ).payload
129137 response = HttpRequest (self .session .put , url = url , json = request_payload ,
130- verify_ssl = self .verify_ssl ).make ()
138+ verify_ssl = self .verify_ssl ,
139+ name = 'Finish Launch' ).make ()
140+ if not response :
141+ return
131142 logger .debug ('finish_launch - ID: %s' , self .launch_id )
132143 logger .debug ('response message: %s' , response .message )
133144 return response .message
@@ -156,9 +167,9 @@ def finish_test_item(self,
156167 :param retry: Used to report retry of the test. Allowable values:
157168 "True" or "False"
158169 """
159- if item_id is NOT_FOUND :
160- logger .warning ("Uttempt to finish non-existent item" )
161- return None
170+ if item_id is NOT_FOUND or not item_id :
171+ logger .warning ("Attempt to finish non-existent item" )
172+ return
162173 url = uri_join (self .base_url_v2 , 'item' , item_id )
163174 request_payload = ItemFinishRequest (
164175 end_time ,
@@ -172,7 +183,10 @@ def finish_test_item(self,
172183 ).payload
173184 response = HttpRequest (self .session .put , url = url , json = request_payload ,
174185 verify_ssl = self .verify_ssl ).make ()
175- self ._item_stack .pop ()
186+ if not response :
187+ return
188+ # noinspection PyUnresolvedReferences
189+ self ._item_stack .pop () if len (self ._item_stack ) > 0 else None
176190 logger .debug ('finish_test_item - ID: %s' , item_id )
177191 logger .debug ('response message: %s' , response .message )
178192 return response .message
@@ -186,7 +200,7 @@ def get_item_id_by_uuid(self, uuid):
186200 url = uri_join (self .base_url_v1 , 'item' , 'uuid' , uuid )
187201 response = HttpRequest (self .session .get , url = url ,
188202 verify_ssl = self .verify_ssl ).make ()
189- return response .id
203+ return response .id if response else None
190204
191205 def get_launch_info (self ):
192206 """Get the current launch information.
@@ -199,6 +213,8 @@ def get_launch_info(self):
199213 logger .debug ('get_launch_info - ID: %s' , self .launch_id )
200214 response = HttpRequest (self .session .get , url = url ,
201215 verify_ssl = self .verify_ssl ).make ()
216+ if not response :
217+ return
202218 if response .is_success :
203219 launch_info = response .json
204220 logger .debug (
@@ -214,14 +230,17 @@ def get_launch_ui_id(self):
214230
215231 :return: UI ID of the given launch. None if UI ID has not been found.
216232 """
217- return self .get_launch_info ().get ('id' )
233+ launch_info = self .get_launch_info ()
234+ return launch_info .get ('id' ) if launch_info else None
218235
219236 def get_launch_ui_url (self ):
220237 """Get UI URL of the current launch.
221238
222239 :return: launch URL or all launches URL.
223240 """
224- ui_id = self .get_launch_ui_id () or ''
241+ ui_id = self .get_launch_ui_id ()
242+ if not ui_id :
243+ return
225244 path = 'ui/#{0}/launches/all/{1}' .format (self .project , ui_id )
226245 url = uri_join (self .endpoint , path )
227246 logger .debug ('get_launch_ui_url - ID: %s' , self .launch_id )
@@ -235,7 +254,7 @@ def get_project_settings(self):
235254 url = uri_join (self .base_url_v1 , 'settings' )
236255 response = HttpRequest (self .session .get , url = url , json = {},
237256 verify_ssl = self .verify_ssl ).make ()
238- return response .json
257+ return response .json if response else None
239258
240259 def log (self , time , message , level = None , attachment = None , item_id = None ):
241260 """Send log message to the Report Portal.
@@ -287,6 +306,8 @@ def start_launch(self,
287306 url = url ,
288307 json = request_payload ,
289308 verify_ssl = self .verify_ssl ).make ()
309+ if not response :
310+ return
290311 self ._log_manager .launch_id = self .launch_id = response .id
291312 logger .debug ('start_launch - ID: %s' , self .launch_id )
292313 return self .launch_id
@@ -324,6 +345,10 @@ def start_test_item(self,
324345 values: "True" or "False"
325346 :param test_case_id: A unique ID of the current step
326347 """
348+ if parent_item_id is NOT_FOUND :
349+ logger .warning ("Attempt to start item for non-existent parent "
350+ "item" )
351+ return
327352 if parent_item_id :
328353 url = uri_join (self .base_url_v2 , 'item' , parent_item_id )
329354 else :
@@ -346,9 +371,12 @@ def start_test_item(self,
346371 url = url ,
347372 json = request_payload ,
348373 verify_ssl = self .verify_ssl ).make ()
374+ if not response :
375+ return
349376 item_id = response .id
350377 if item_id is not NOT_FOUND :
351378 logger .debug ('start_test_item - ID: %s' , item_id )
379+ # noinspection PyUnresolvedReferences
352380 self ._item_stack .append (item_id )
353381 else :
354382 logger .warning ('start_test_item - invalid response: %s' ,
@@ -375,9 +403,12 @@ def update_test_item(self, item_uuid, attributes=None, description=None):
375403 url = uri_join (self .base_url_v1 , 'item' , item_id , 'update' )
376404 response = HttpRequest (self .session .put , url = url , json = data ,
377405 verify_ssl = self .verify_ssl ).make ()
406+ if not response :
407+ return
378408 logger .debug ('update_test_item - Item: %s' , item_id )
379409 return response .message
380410
381411 def current_item (self ):
382412 """Retrieve the last item reported by the client."""
413+ # noinspection PyUnresolvedReferences
383414 return self ._item_stack [- 1 ] if len (self ._item_stack ) > 0 else None
0 commit comments