summaryrefslogtreecommitdiffstats
path: root/qa/tasks/cephadm_cases
diff options
context:
space:
mode:
Diffstat (limited to 'qa/tasks/cephadm_cases')
-rw-r--r--qa/tasks/cephadm_cases/__init__.py0
-rw-r--r--qa/tasks/cephadm_cases/test_cli.py73
-rw-r--r--qa/tasks/cephadm_cases/test_cli_mon.py71
3 files changed, 144 insertions, 0 deletions
diff --git a/qa/tasks/cephadm_cases/__init__.py b/qa/tasks/cephadm_cases/__init__.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/qa/tasks/cephadm_cases/__init__.py
diff --git a/qa/tasks/cephadm_cases/test_cli.py b/qa/tasks/cephadm_cases/test_cli.py
new file mode 100644
index 000000000..ca40a8cdb
--- /dev/null
+++ b/qa/tasks/cephadm_cases/test_cli.py
@@ -0,0 +1,73 @@
+import json
+import logging
+import time
+
+from tasks.mgr.mgr_test_case import MgrTestCase
+from teuthology.contextutil import safe_while
+
+log = logging.getLogger(__name__)
+
+
+class TestCephadmCLI(MgrTestCase):
+ def _cmd(self, *args) -> str:
+ assert self.mgr_cluster is not None
+ return self.mgr_cluster.mon_manager.raw_cluster_cmd(*args)
+
+ def _orch_cmd(self, *args) -> str:
+ return self._cmd("orch", *args)
+
+ def setUp(self):
+ super(TestCephadmCLI, self).setUp()
+
+ def test_yaml(self):
+ """
+ to prevent oddities like
+
+ >>> import yaml
+ ... from collections import OrderedDict
+ ... assert yaml.dump(OrderedDict()) == '!!python/object/apply:collections.OrderedDict\\n- []\\n'
+ """
+ out = self._orch_cmd('device', 'ls', '--format', 'yaml')
+ self.assertNotIn('!!python', out)
+
+ out = self._orch_cmd('host', 'ls', '--format', 'yaml')
+ self.assertNotIn('!!python', out)
+
+ out = self._orch_cmd('ls', '--format', 'yaml')
+ self.assertNotIn('!!python', out)
+
+ out = self._orch_cmd('ps', '--format', 'yaml')
+ self.assertNotIn('!!python', out)
+
+ out = self._orch_cmd('status', '--format', 'yaml')
+ self.assertNotIn('!!python', out)
+
+ def test_pause(self):
+ self._orch_cmd('pause')
+ self.wait_for_health('CEPHADM_PAUSED', 60)
+ self._orch_cmd('resume')
+ self.wait_for_health_clear(60)
+
+ def test_daemon_restart(self):
+ self._orch_cmd('daemon', 'stop', 'osd.0')
+ self.wait_for_health('OSD_DOWN', 60)
+ with safe_while(sleep=2, tries=30) as proceed:
+ while proceed():
+ j = json.loads(self._orch_cmd('ps', '--format', 'json'))
+ d = {d['daemon_name']: d for d in j}
+ if d['osd.0']['status_desc'] != 'running':
+ break
+ time.sleep(5)
+ self._orch_cmd('daemon', 'start', 'osd.0')
+ self.wait_for_health_clear(120)
+ self._orch_cmd('daemon', 'restart', 'osd.0')
+
+ def test_device_ls_wide(self):
+ self._orch_cmd('device', 'ls', '--wide')
+
+ def test_cephfs_mirror(self):
+ self._orch_cmd('apply', 'cephfs-mirror')
+ self.wait_until_true(lambda: 'cephfs-mirror' in self._orch_cmd('ps'), 60)
+ self.wait_for_health_clear(60)
+ self._orch_cmd('rm', 'cephfs-mirror')
+ self.wait_until_true(lambda: 'cephfs-mirror' not in self._orch_cmd('ps'), 60)
diff --git a/qa/tasks/cephadm_cases/test_cli_mon.py b/qa/tasks/cephadm_cases/test_cli_mon.py
new file mode 100644
index 000000000..72aee094e
--- /dev/null
+++ b/qa/tasks/cephadm_cases/test_cli_mon.py
@@ -0,0 +1,71 @@
+import json
+import logging
+
+from tasks.mgr.mgr_test_case import MgrTestCase
+
+log = logging.getLogger(__name__)
+
+
+class TestCephadmCLI(MgrTestCase):
+
+ APPLY_MON_PERIOD = 60
+
+ def _cmd(self, *args) -> str:
+ assert self.mgr_cluster is not None
+ return self.mgr_cluster.mon_manager.raw_cluster_cmd(*args)
+
+ def _orch_cmd(self, *args) -> str:
+ return self._cmd("orch", *args)
+
+ def setUp(self):
+ super(TestCephadmCLI, self).setUp()
+
+ def _create_and_write_pool(self, pool_name):
+ # Create new pool and write to it, simulating a small workload.
+ self.mgr_cluster.mon_manager.create_pool(pool_name)
+ args = [
+ "rados", "-p", pool_name, "bench", "30", "write", "-t", "16"]
+ self.mgr_cluster.admin_remote.run(args=args, wait=True)
+
+ def _get_quorum_size(self) -> int:
+ # Evaluate if the quorum size of the cluster is correct.
+ # log the quorum_status before reducing the monitors
+ retstr = self._cmd('quorum_status')
+ log.info("test_apply_mon._check_quorum_size: %s" % json.dumps(retstr, indent=2))
+ quorum_size = len(json.loads(retstr)['quorum']) # get quorum size
+ return quorum_size
+
+ def _check_no_crashes(self):
+ # Evaluate if there are no crashes
+ # log the crash
+ retstr = self.mgr_cluster.mon_manager.raw_cluster_cmd(
+ 'crash', 'ls',
+ )
+ log.info("test_apply_mon._check_no_crashes: %s" % retstr)
+ self.assertEqual(0, len(retstr)) # check if there are no crashes
+
+ def test_apply_mon_three(self):
+ # Evaluating the process of reducing the number of
+ # monitors from 5 to 3 and increasing the number of
+ # monitors from 3 to 5, using the `ceph orch apply mon <num>` command.
+
+ self.wait_until_equal(lambda : self._get_quorum_size(), 5,
+ timeout=self.APPLY_MON_PERIOD, period=10)
+
+ self._orch_cmd('apply', 'mon', '3') # reduce the monitors from 5 -> 3
+
+ self._create_and_write_pool('test_pool1')
+
+ self.wait_until_equal(lambda : self._get_quorum_size(), 3,
+ timeout=self.APPLY_MON_PERIOD, period=10)
+
+ self._check_no_crashes()
+
+ self._orch_cmd('apply', 'mon', '5') # increase the monitors from 3 -> 5
+
+ self._create_and_write_pool('test_pool2')
+
+ self.wait_until_equal(lambda : self._get_quorum_size(), 5,
+ timeout=self.APPLY_MON_PERIOD, period=10)
+
+ self._check_no_crashes() \ No newline at end of file