From 03ba3ceb5d2dbb947de287e036e6651e55293a57 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 14 Oct 2021 13:21:40 -0400 Subject: [PATCH] mgr/nfs: add some test coverage for cluster info, cluster config Signed-off-by: Sage Weil --- src/pybind/mgr/nfs/tests/test_nfs.py | 72 ++++++++++++++++++++++++++-- src/pybind/mgr/tests/__init__.py | 7 ++- 2 files changed, 75 insertions(+), 4 deletions(-) diff --git a/src/pybind/mgr/nfs/tests/test_nfs.py b/src/pybind/mgr/nfs/tests/test_nfs.py index 04394fedf7bbe..479e3c81366b2 100644 --- a/src/pybind/mgr/nfs/tests/test_nfs.py +++ b/src/pybind/mgr/nfs/tests/test_nfs.py @@ -8,10 +8,13 @@ from unittest import mock from unittest.mock import MagicMock from mgr_module import NFS_POOL_NAME +from rados import ObjectNotFound + from ceph.deployment.service_spec import NFSServiceSpec from nfs import Module from nfs.export import ExportMgr from nfs.export_utils import GaneshaConfParser, Export, RawBlock +from nfs.cluster import NFSCluster from orchestrator import ServiceDescription, DaemonDescription, OrchResult @@ -123,6 +126,8 @@ EXPORT { return self.temp_store[self.temp_store_namespace][key].stat() def _ioctl_read_mock(self, key: str, size: Optional[Any] = None) -> bytes: + if key not in self.temp_store[self.temp_store_namespace]: + raise ObjectNotFound return self.temp_store[self.temp_store_namespace][key].read(size) def _ioctx_set_namespace_mock(self, namespace: str) -> None: @@ -153,6 +158,10 @@ EXPORT { ServiceDescription(spec=NFSServiceSpec(service_id=self.cluster_id)) ] if enable else [] + orch_nfs_daemons = [ + DaemonDescription('nfs', 'foo.mydaemon', 'myhostname') + ] if enable else [] + def mock_exec(cls, args): u = { "user_id": "abc", @@ -196,11 +205,23 @@ EXPORT { return 0, json.dumps([u]), '' return 0, json.dumps(u), '' - with mock.patch('nfs.module.Module.describe_service') as describe_service, \ + def mock_describe_service(cls, *args, **kwargs): + if kwargs['service_type'] == 'nfs': + return OrchResult(orch_nfs_services) + return OrchResult([]) + + def mock_list_daemons(cls, *args, **kwargs): + if kwargs['daemon_type'] == 'nfs': + return OrchResult(orch_nfs_daemons) + return OrchResult([]) + + with mock.patch('nfs.module.Module.describe_service', mock_describe_service) as describe_service, \ + mock.patch('nfs.module.Module.list_daemons', mock_list_daemons) as list_daemons, \ mock.patch('nfs.module.Module.rados') as rados, \ mock.patch('nfs.export.available_clusters', return_value=[self.cluster_id]), \ mock.patch('nfs.export.restart_nfs_service'), \ + mock.patch('nfs.cluster.restart_nfs_service'), \ mock.patch('nfs.export.ExportMgr._exec', mock_exec), \ mock.patch('nfs.export.check_fs', return_value=True), \ mock.patch('nfs.export_utils.check_fs', return_value=True), \ @@ -210,8 +231,6 @@ EXPORT { rados.open_ioctx.return_value.__enter__.return_value = self.io_mock rados.open_ioctx.return_value.__exit__ = mock.Mock(return_value=None) - describe_service.return_value = OrchResult(orch_nfs_services) - self._reset_temp_store() yield @@ -855,3 +874,50 @@ NFS_CORE_PARAM { assert export.clients[0].access_type == 'rw' assert export.clients[0].addresses == ["192.168.1.0/8"] assert export.cluster_id == self.cluster_id + + def _do_test_cluster_ls(self): + nfs_mod = Module('nfs', '', '') + cluster = NFSCluster(nfs_mod) + + rc, out, err = cluster.list_nfs_cluster() + assert rc == 0 + assert out == self.cluster_id + + def test_cluster_ls(self): + self._do_mock_test(self._do_test_cluster_ls) + + def _do_test_cluster_info(self): + nfs_mod = Module('nfs', '', '') + cluster = NFSCluster(nfs_mod) + + rc, out, err = cluster.show_nfs_cluster_info(self.cluster_id) + assert rc == 0 + assert json.loads(out) == {"foo": {"virtual_ip": None, "backend": []}} + + def test_cluster_info(self): + self._do_mock_test(self._do_test_cluster_info) + + def _do_test_cluster_config(self): + nfs_mod = Module('nfs', '', '') + cluster = NFSCluster(nfs_mod) + + rc, out, err = cluster.get_nfs_cluster_config(self.cluster_id) + assert rc == 0 + assert out == "" + + rc, out, err = cluster.set_nfs_cluster_config(self.cluster_id, '# foo\n') + assert rc == 0 + + rc, out, err = cluster.get_nfs_cluster_config(self.cluster_id) + assert rc == 0 + assert out == "# foo\n" + + rc, out, err = cluster.reset_nfs_cluster_config(self.cluster_id) + assert rc == 0 + + rc, out, err = cluster.get_nfs_cluster_config(self.cluster_id) + assert rc == 0 + assert out == "" + + def test_cluster_config(self): + self._do_mock_test(self._do_test_cluster_config) diff --git a/src/pybind/mgr/tests/__init__.py b/src/pybind/mgr/tests/__init__.py index 16286dd2e76aa..68b61e7ec5233 100644 --- a/src/pybind/mgr/tests/__init__.py +++ b/src/pybind/mgr/tests/__init__.py @@ -212,9 +212,14 @@ if 'UNITTEST' in os.environ: return msg return '[errno {0}] {1}'.format(self.errno, msg) + class MockObjectNotFound(Exception): + pass sys.modules.update({ - 'rados': mock.MagicMock(Error=MockRadosError, OSError=MockRadosError), + 'rados': mock.MagicMock( + Error=MockRadosError, + OSError=MockRadosError, + ObjectNotFound=MockObjectNotFound), 'rbd': mock.Mock(), 'cephfs': mock.Mock(), }) -- 2.39.5