diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-27 18:24:20 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-27 18:24:20 +0000 |
commit | 483eb2f56657e8e7f419ab1a4fab8dce9ade8609 (patch) | |
tree | e5d88d25d870d5dedacb6bbdbe2a966086a0a5cf /qa/tasks/mgr/dashboard/test_ganesha.py | |
parent | Initial commit. (diff) | |
download | ceph-483eb2f56657e8e7f419ab1a4fab8dce9ade8609.tar.xz ceph-483eb2f56657e8e7f419ab1a4fab8dce9ade8609.zip |
Adding upstream version 14.2.21.upstream/14.2.21upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'qa/tasks/mgr/dashboard/test_ganesha.py')
-rw-r--r-- | qa/tasks/mgr/dashboard/test_ganesha.py | 168 |
1 files changed, 168 insertions, 0 deletions
diff --git a/qa/tasks/mgr/dashboard/test_ganesha.py b/qa/tasks/mgr/dashboard/test_ganesha.py new file mode 100644 index 00000000..b90bb4af --- /dev/null +++ b/qa/tasks/mgr/dashboard/test_ganesha.py @@ -0,0 +1,168 @@ +# -*- coding: utf-8 -*- +# pylint: disable=too-many-public-methods + +from __future__ import absolute_import + + +from .helper import DashboardTestCase + + +class GaneshaTest(DashboardTestCase): + CEPHFS = True + AUTH_ROLES = ['pool-manager', 'ganesha-manager'] + + @classmethod + def create_pool(cls, name, pg_num, pool_type, application='rbd'): + data = { + 'pool': name, + 'pg_num': pg_num, + 'pool_type': pool_type, + 'application_metadata': [application] + } + if pool_type == 'erasure': + data['flags'] = ['ec_overwrites'] + cls._task_post("/api/pool", data) + + @classmethod + def setUpClass(cls): + super(GaneshaTest, cls).setUpClass() + cls.create_pool('ganesha', 2**2, 'replicated') + cls._rados_cmd(['-p', 'ganesha', '-N', 'ganesha1', 'create', 'conf-node1']) + cls._rados_cmd(['-p', 'ganesha', '-N', 'ganesha1', 'create', 'conf-node2']) + cls._rados_cmd(['-p', 'ganesha', '-N', 'ganesha1', 'create', 'conf-node3']) + cls._rados_cmd(['-p', 'ganesha', '-N', 'ganesha2', 'create', 'conf-node1']) + cls._rados_cmd(['-p', 'ganesha', '-N', 'ganesha2', 'create', 'conf-node2']) + cls._rados_cmd(['-p', 'ganesha', '-N', 'ganesha2', 'create', 'conf-node3']) + cls._ceph_cmd(['dashboard', 'set-ganesha-clusters-rados-pool-namespace', 'cluster1:ganesha/ganesha1,cluster2:ganesha/ganesha2']) + + # RGW setup + cls._radosgw_admin_cmd([ + 'user', 'create', '--uid', 'admin', '--display-name', 'admin', + '--system', '--access-key', 'admin', '--secret', 'admin' + ]) + cls._ceph_cmd_with_secret(['dashboard', 'set-rgw-api-secret-key'], 'admin') + cls._ceph_cmd_with_secret(['dashboard', 'set-rgw-api-access-key'], 'admin') + + @classmethod + def tearDownClass(cls): + super(GaneshaTest, cls).tearDownClass() + cls._radosgw_admin_cmd(['user', 'rm', '--uid', 'admin', '--purge-data']) + cls._ceph_cmd(['osd', 'pool', 'delete', 'ganesha', 'ganesha', '--yes-i-really-really-mean-it']) + + @DashboardTestCase.RunAs('test', 'test', [{'rbd-image': ['create', 'update', 'delete']}]) + def test_read_access_permissions(self): + self._get('/api/nfs-ganesha/export') + self.assertStatus(403) + + def test_list_daemons(self): + daemons = self._get("/api/nfs-ganesha/daemon") + self.assertEqual(len(daemons), 6) + daemons = [(d['daemon_id'], d['cluster_id']) for d in daemons] + self.assertIn(('node1', 'cluster1'), daemons) + self.assertIn(('node2', 'cluster1'), daemons) + self.assertIn(('node3', 'cluster1'), daemons) + self.assertIn(('node1', 'cluster2'), daemons) + self.assertIn(('node2', 'cluster2'), daemons) + self.assertIn(('node3', 'cluster2'), daemons) + + @classmethod + def create_export(cls, path, cluster_id, daemons, fsal, sec_label_xattr=None): + if fsal == 'CEPH': + fsal = {"name": "CEPH", "user_id":"admin", "fs_name": None, "sec_label_xattr": sec_label_xattr} + pseudo = "/cephfs{}".format(path) + else: + fsal = {"name": "RGW", "rgw_user_id": "admin"} + pseudo = "/rgw/{}".format(path if path[0] != '/' else "") + ex_json = { + "path": path, + "fsal": fsal, + "cluster_id": cluster_id, + "daemons": ["node1", "node3"], + "pseudo": pseudo, + "tag": None, + "access_type": "RW", + "squash": "no_root_squash", + "security_label": sec_label_xattr is not None, + "protocols": [4], + "transports": ["TCP"], + "clients": [{ + "addresses":["10.0.0.0/8"], + "access_type": "RO", + "squash": "root" + }] + } + return cls._task_post('/api/nfs-ganesha/export', ex_json) + + def tearDown(self): + super(GaneshaTest, self).tearDown() + exports = self._get("/api/nfs-ganesha/export") + if self._resp.status_code != 200: + return + self.assertIsInstance(exports, list) + for exp in exports: + self._task_delete("/api/nfs-ganesha/export/{}/{}" + .format(exp['cluster_id'], exp['export_id'])) + + def test_create_export(self): + exports = self._get("/api/nfs-ganesha/export") + self.assertEqual(len(exports), 0) + + data = self.create_export("/foo", 'cluster1', ['node1', 'node2'], 'CEPH', "security.selinux") + + exports = self._get("/api/nfs-ganesha/export") + self.assertEqual(len(exports), 1) + self.assertDictEqual(exports[0], data) + return data + + def test_update_export(self): + export = self.test_create_export() + export['access_type'] = 'RO' + export['daemons'] = ['node1', 'node3'] + export['security_label'] = True + data = self._task_put('/api/nfs-ganesha/export/{}/{}' + .format(export['cluster_id'], export['export_id']), + export) + exports = self._get("/api/nfs-ganesha/export") + self.assertEqual(len(exports), 1) + self.assertDictEqual(exports[0], data) + self.assertEqual(exports[0]['daemons'], ['node1', 'node3']) + self.assertEqual(exports[0]['security_label'], True) + + def test_delete_export(self): + export = self.test_create_export() + self._task_delete("/api/nfs-ganesha/export/{}/{}" + .format(export['cluster_id'], export['export_id'])) + self.assertStatus(204) + + def test_get_export(self): + exports = self._get("/api/nfs-ganesha/export") + self.assertEqual(len(exports), 0) + + data1 = self.create_export("/foo", 'cluster2', ['node1', 'node2'], 'CEPH') + data2 = self.create_export("mybucket", 'cluster2', ['node2', 'node3'], 'RGW') + + export1 = self._get("/api/nfs-ganesha/export/cluster2/1") + self.assertDictEqual(export1, data1) + + export2 = self._get("/api/nfs-ganesha/export/cluster2/2") + self.assertDictEqual(export2, data2) + + def test_invalid_status(self): + self._ceph_cmd(['dashboard', 'set-ganesha-clusters-rados-pool-namespace', '']) + + data = self._get('/api/nfs-ganesha/status') + self.assertStatus(200) + self.assertIn('available', data) + self.assertIn('message', data) + self.assertFalse(data['available']) + self.assertIn('Ganesha config location is not configured. Please set the GANESHA_RADOS_POOL_NAMESPACE setting.', + data['message']) + + self._ceph_cmd(['dashboard', 'set-ganesha-clusters-rados-pool-namespace', 'cluster1:ganesha/ganesha1,cluster2:ganesha/ganesha2']) + + def test_valid_status(self): + data = self._get('/api/nfs-ganesha/status') + self.assertStatus(200) + self.assertIn('available', data) + self.assertIn('message', data) + self.assertTrue(data['available']) |