summaryrefslogtreecommitdiffstats
path: root/openshift-storage-libs/openshiftstoragelibs/waiter.py
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