11import logging
2- import time
32from typing import (
43 TYPE_CHECKING ,
54 Dict ,
1514from jenkinsapi .custom_exceptions import JenkinsAPIException
1615from jenkinsapi .jenkinsbase import JenkinsBase
1716from jenkinsapi .utils .requester import Requester
17+ from jenkinsapi .utils .retry import Retry , SimpleRetry
1818
1919if TYPE_CHECKING :
2020 from jenkinsapi .jenkins import Jenkins
@@ -226,67 +226,59 @@ def try_reserve(
226226 def wait_reserve (
227227 self ,
228228 selector : "ResourceSelector" ,
229- sleep_period : float = DEFAULT_WAIT_SLEEP_PERIOD ,
230- timeout : float = DEFAULT_WAIT_TIMEOUT_PERIOD ,
229+ retry : Optional [Retry ] = None ,
231230 ) -> str :
232231 """
233232 Reserve a resource that matches the given condition
234233
235234 :return: the name of the reserved resource
236235 :raise TimeoutError: if no resource could be reserved
237236 """
238- start_time = time .time ()
237+ if retry is None :
238+ retry = SimpleRetry (
239+ sleep_period = self .DEFAULT_WAIT_SLEEP_PERIOD ,
240+ timeout = self .DEFAULT_WAIT_TIMEOUT_PERIOD ,
241+ )
242+ retry .begin ()
239243 while True :
240244 result = self .try_reserve (selector )
241245 if result is not None :
242246 return result
243- if time .time () - start_time > timeout :
244- raise TimeoutError ("Timed out waiting for resource" )
245- logger .info (
246- "No free resources matching %r, sleep %.3f seconds" ,
247- selector ,
248- sleep_period ,
249- )
247+ retry .check ()
248+ logger .info ("No free resources matching %r, retry" , selector )
250249 self .poll ()
251- time .sleep (sleep_period )
252250
253251 def reservation_by_label (
254252 self ,
255253 label : str ,
256- sleep_period : float = DEFAULT_WAIT_SLEEP_PERIOD ,
257- timeout : float = DEFAULT_WAIT_TIMEOUT_PERIOD ,
254+ retry : Optional [Retry ] = None ,
258255 ) -> "LockedResourceReservation" :
259256 return LockedResourceReservation (
260257 self ,
261258 ResourceLabelSelector (label ),
262- sleep_period = sleep_period ,
263- timeout = timeout ,
259+ retry = retry ,
264260 )
265261
266262 def reservation_by_name (
267263 self ,
268264 name : str ,
269- sleep_period : float = DEFAULT_WAIT_SLEEP_PERIOD ,
270- timeout : float = DEFAULT_WAIT_TIMEOUT_PERIOD ,
265+ retry : Optional [Retry ] = None ,
271266 ) -> "LockedResourceReservation" :
272267 return LockedResourceReservation (
273268 self ,
274269 ResourceNameSelector (name ),
275- sleep_period = sleep_period ,
276- timeout = timeout ,
270+ retry = retry ,
277271 )
278272
279273 def reservation_by_name_list (
280274 self ,
281275 name_list : List [str ],
282- sleep_period : float = DEFAULT_WAIT_SLEEP_PERIOD ,
283- timeout : float = DEFAULT_WAIT_TIMEOUT_PERIOD ,
276+ retry : Optional [Retry ] = None ,
284277 ) -> "LockedResourceReservation" :
285278 return LockedResourceReservation (
286279 self ,
287280 ResourceNameListSelector (name_list ),
288- sleep_period = sleep_period ,
289- timeout = timeout ,
281+ retry = retry ,
290282 )
291283
292284
@@ -363,13 +355,11 @@ def __init__(
363355 self ,
364356 api : LockableResources ,
365357 selector : ResourceSelector ,
366- sleep_period : float = LockableResources .DEFAULT_WAIT_SLEEP_PERIOD ,
367- timeout : float = LockableResources .DEFAULT_WAIT_TIMEOUT_PERIOD ,
358+ retry : Optional [Retry ] = None ,
368359 ):
369360 self .api = api
370361 self .selector = selector
371- self .sleep_period = sleep_period
372- self .timeout = timeout
362+ self .retry = retry
373363
374364 @property
375365 def locked_resource_name (self ) -> str :
@@ -387,7 +377,7 @@ def __enter__(self) -> "LockedResourceReservation":
387377 if self ._locked_resource_name is not None :
388378 raise RuntimeError ("Lock already acquired" )
389379 self ._locked_resource_name = self .api .wait_reserve (
390- self .selector , sleep_period = self .sleep_period , timeout = self . timeout
380+ self .selector , retry = self .retry
391381 )
392382 self .locked = True
393383 return self
0 commit comments