The most simple example possible will try 10 times sleeping for 6 seconds:
>>> from teuthology.contexutil import safe_while
- >>> with safe_while() as bomb:
- ... while 1:
- ... bomb()
+ >>> with safe_while() as proceed:
+ ... while proceed():
... # repetitive code here
+ ... print "hello world"
...
Traceback (most recent call last):
...
raise MaxWhileTries(error_msg)
else:
log.warning(error_msg)
+ return False
self.sleeper(self.sleep_current)
self.sleep_current += self.increment
+ return True
def __enter__(self):
return self
Wait until a Ceph cluster is healthy. Give up after 15min.
"""
testdir = get_testdir(ctx)
- with safe_while(tries=(900 / 6), action="wait_until_healthy") as timeout:
- while True: # finite
- timeout()
+ with safe_while(tries=(900 / 6), action="wait_until_healthy") as proceed:
+ while proceed():
r = remote.run(
args=[
'adjust-ulimits',
from pytest import raises
from teuthology import contextutil
+from logging import ERROR
class TestSafeWhile(object):
def setup(self):
+ contextutil.log.setLevel(ERROR)
self.fake_sleep = lambda s: True
self.s_while = contextutil.safe_while
def test_6_5_10_deal(self):
with raises(contextutil.MaxWhileTries):
- with self.s_while(_sleeper=self.fake_sleep) as bomb:
- while 1:
- bomb()
+ with self.s_while(_sleeper=self.fake_sleep) as proceed:
+ while proceed():
+ pass
def test_6_0_1_deal(self):
with raises(contextutil.MaxWhileTries) as error:
with self.s_while(
tries=1,
_sleeper=self.fake_sleep
- ) as bomb:
- while 1:
- bomb()
+ ) as proceed:
+ while proceed():
+ pass
msg = error.value[0]
assert 'waiting for 6 seconds' in msg
with self.s_while(
sleep=1,
_sleeper=self.fake_sleep
- ) as bomb:
- while 1:
- bomb()
+ ) as proceed:
+ while proceed():
+ pass
msg = error.value[0]
assert 'waiting for 10 seconds' in msg
with self.s_while(
increment=1,
_sleeper=self.fake_sleep
- ) as bomb:
- while 1:
- bomb()
+ ) as proceed:
+ while proceed():
+ pass
msg = error.value[0]
assert 'waiting for 105 seconds' in msg
with self.s_while(
action='doing the thing',
_sleeper=self.fake_sleep
- ) as bomb:
- while 1:
- bomb()
+ ) as proceed:
+ while proceed():
+ pass
msg = error.value[0]
assert "'doing the thing'" in msg
+
+ def test_no_raise(self):
+ with self.s_while(_raise=False, _sleeper=self.fake_sleep) as proceed:
+ while proceed():
+ pass
+
+ assert True