blob: 0d0c8c3ab21aea20c8b678a6abf5cad0ce9776aa (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
"""Helper object to encapsulate waiting for timeouts.
Provide a Waiter class which encapsulates the operation
of doing an action in a loop until a timeout values elapses.
It aims to avoid having to write boilerplate code comparing times.
"""
import time
class Waiter(object):
"""A wait-retry loop as iterable.
This object abstracts away the wait logic allowing functions
to write the retry logic in a for-loop.
"""
def __init__(self, timeout=60, interval=1):
self.timeout = timeout
self.interval = interval
self.expired = False
self._attempt = 0
self._start = None
def __iter__(self):
return self
def next(self):
if self._start is None:
self._start = time.time()
if time.time() - self._start > self.timeout:
self.expired = True
raise StopIteration()
if self._attempt != 0:
time.sleep(self.interval)
self._attempt += 1
return self
# NOTE(vponomar): py3 uses "__next__" method instead of "next" one.
__next__ = next
|