Skip to content

Commit 60be38e

Browse files
authored
Merge pull request ceph#58995 from rhcs-dashboard/fix-66844-main
qa/mgr/dashboard: fix test race condition Reviewed-by: Nizamudeen A <[email protected]>
2 parents 44747ff + 6c7253b commit 60be38e

File tree

2 files changed

+41
-13
lines changed

2 files changed

+41
-13
lines changed

qa/tasks/mgr/dashboard/helper.py

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
import string
1010
import time
1111
from collections import namedtuple
12-
from typing import List
12+
from functools import wraps
13+
from typing import List, Optional, Tuple, Type, Union
1314

1415
import requests
1516
from tasks.mgr.mgr_test_case import MgrTestCase
@@ -343,16 +344,16 @@ def _get(cls, url, params=None, version=DEFAULT_API_VERSION, set_cookies=False,
343344

344345
@classmethod
345346
def _view_cache_get(cls, url, retries=5):
346-
retry = True
347-
while retry and retries > 0:
348-
retry = False
347+
_retry = True
348+
while _retry and retries > 0:
349+
_retry = False
349350
res = cls._get(url, version=DEFAULT_API_VERSION)
350351
if isinstance(res, dict):
351352
res = [res]
352353
for view in res:
353354
assert 'value' in view
354355
if not view['value']:
355-
retry = True
356+
_retry = True
356357
retries -= 1
357358
if retries == 0:
358359
raise Exception("{} view cache exceeded number of retries={}"
@@ -722,3 +723,25 @@ def _validate_json(val, schema, path=[]):
722723
return _validate_json(val, JLeaf(schema), path)
723724

724725
assert False, str(path)
726+
727+
728+
def retry(
729+
on_exception: Union[Type[Exception], Tuple[Type[Exception], ...]],
730+
tries=3,
731+
delay=0,
732+
logger: Optional[logging.Logger] = None,
733+
):
734+
def decorator(func):
735+
@wraps(func)
736+
def wrapper(*args, **kwargs):
737+
for i in range(tries):
738+
try:
739+
return func(*args, **kwargs)
740+
except on_exception as e:
741+
err = e
742+
if logger:
743+
logger.warn(f"Retried #{i+1}/{tries}: '{func.__name__}' raised '{e}'")
744+
time.sleep(delay)
745+
raise err
746+
return wrapper
747+
return decorator

qa/tasks/mgr/dashboard/test_osd.py

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import json
66

77
from .helper import (DashboardTestCase, JAny, JLeaf, JList, JObj, JTuple,
8-
devices_schema)
8+
devices_schema, log, retry)
99

1010

1111
class OsdTest(DashboardTestCase):
@@ -283,13 +283,18 @@ def test_get_indiv_flag(self):
283283
if osd['osd'] == osd_initial['osd']:
284284
self.assertGreater(len(osd['flags']), len(osd_initial['flags']))
285285

286-
self._ceph_cmd(['osd', 'unset-group', 'noout,noin', 'osd.0', 'osd.1', 'osd.2'])
287-
flags_removed = self._get('/api/osd/flags/individual')
288-
self.assertStatus(200)
289-
for osd in flags_removed:
290-
if osd['osd'] in [0, 1, 2]:
291-
self.assertNotIn('noout', osd['flags'])
292-
self.assertNotIn('noin', osd['flags'])
286+
ret = self._ceph_cmd_result(['osd', 'unset-group', 'noout,noin', 'osd.0', 'osd.1', 'osd.2'])
287+
self.assertEqual(ret, 0)
288+
289+
@retry(on_exception=AssertionError, tries=2, delay=0.5, logger=log)
290+
def check_osd_flags():
291+
flags_removed = self._get('/api/osd/flags/individual')
292+
self.assertStatus(200)
293+
for osd in flags_removed:
294+
if osd['osd'] in [0, 1, 2]:
295+
self.assertNotIn('noout', osd['flags'])
296+
self.assertNotIn('noin', osd['flags'])
297+
check_osd_flags()
293298

294299
def test_add_indiv_flag(self):
295300
flags_update = {'noup': None, 'nodown': None, 'noin': None, 'noout': True}

0 commit comments

Comments
 (0)