From 465a3adc6c31fd9b8359920ab47adf8e1f45d5f1 Mon Sep 17 00:00:00 2001 From: Venky Shankar Date: Wed, 24 Jul 2019 07:00:16 -0400 Subject: [PATCH] test: extend scrub control test to validate mds task status Signed-off-by: Venky Shankar --- qa/tasks/ceph_manager.py | 18 ++++++++++++++++++ qa/tasks/cephfs/filesystem.py | 3 +++ qa/tasks/cephfs/test_scrub_checks.py | 23 +++++++++++++++++++++++ 3 files changed, 44 insertions(+) diff --git a/qa/tasks/ceph_manager.py b/qa/tasks/ceph_manager.py index 4d9ac33a902..db191fb4cab 100644 --- a/qa/tasks/ceph_manager.py +++ b/qa/tasks/ceph_manager.py @@ -2695,6 +2695,24 @@ class CephManager: remote.run(args=['sudo', 'install', '-d', '-m0777', '--', '/var/run/ceph', ], ) + def get_service_task_status(self, service, status_key): + """ + Return daemon task status for a given ceph service. + + :param service: ceph service (mds, osd, etc...) + :param status_key: matching task status key + """ + task_status = {} + status = self.raw_cluster_status() + try: + for k,v in status['servicemap']['services'][service]['daemons'].items(): + ts = dict(v).get('task_status', None) + if ts: + task_status[k] = ts[status_key] + except KeyError: # catches missing service and status key + return {} + self.log(task_status) + return task_status def utility_task(name): """ diff --git a/qa/tasks/cephfs/filesystem.py b/qa/tasks/cephfs/filesystem.py index 3f028dfb7a1..8d72ba380d7 100644 --- a/qa/tasks/cephfs/filesystem.py +++ b/qa/tasks/cephfs/filesystem.py @@ -430,6 +430,9 @@ class Filesystem(MDSCluster): if not hasattr(self._ctx, "filesystem"): self._ctx.filesystem = self + def get_task_status(self, status_key): + return self.mon_manager.get_service_task_status("mds", status_key) + def getinfo(self, refresh = False): status = self.status() if self.id is not None: diff --git a/qa/tasks/cephfs/test_scrub_checks.py b/qa/tasks/cephfs/test_scrub_checks.py index 4fae23deee7..d6947805347 100644 --- a/qa/tasks/cephfs/test_scrub_checks.py +++ b/qa/tasks/cephfs/test_scrub_checks.py @@ -30,6 +30,9 @@ class TestScrubControls(CephFSTestCase): self.assertEqual(res['return_code'], expected) def _get_scrub_status(self): return self.fs.rank_tell(["scrub", "status"]) + def _check_task_status(self, expected_status): + task_status = self.fs.get_task_status("scrub status") + self.assertTrue(task_status['0'].startswith(expected_status)) def test_scrub_abort(self): test_dir = "scrub_control_test_path" @@ -50,6 +53,10 @@ class TestScrubControls(CephFSTestCase): out_json = self._get_scrub_status() self.assertTrue("no active" in out_json['status']) + # sleep enough to fetch updated task status + time.sleep(10) + self._check_task_status("idle") + def test_scrub_pause_and_resume(self): test_dir = "scrub_control_test_path" abs_test_path = "/{0}".format(test_dir) @@ -69,6 +76,10 @@ class TestScrubControls(CephFSTestCase): out_json = self._get_scrub_status() self.assertTrue("PAUSED" in out_json['status']) + # sleep enough to fetch updated task status + time.sleep(10) + self._check_task_status("paused") + # resume and verify self._resume_scrub(0) out_json = self._get_scrub_status() @@ -93,17 +104,29 @@ class TestScrubControls(CephFSTestCase): out_json = self._get_scrub_status() self.assertTrue("PAUSED" in out_json['status']) + # sleep enough to fetch updated task status + time.sleep(10) + self._check_task_status("paused") + # abort and verify self._abort_scrub(0) out_json = self._get_scrub_status() self.assertTrue("PAUSED" in out_json['status']) self.assertTrue("0 inodes" in out_json['status']) + # sleep enough to fetch updated task status + time.sleep(10) + self._check_task_status("paused") + # resume and verify self._resume_scrub(0) out_json = self._get_scrub_status() self.assertTrue("no active" in out_json['status']) + # sleep enough to fetch updated task status + time.sleep(10) + self._check_task_status("idle") + class TestScrubChecks(CephFSTestCase): """ Run flush and scrub commands on the specified files in the filesystem. This -- 2.39.5