From e429afda53e31f478fd89b6e143543daf4dfba88 Mon Sep 17 00:00:00 2001 From: Ricardo Dias Date: Fri, 11 Jan 2019 16:49:46 +0000 Subject: [PATCH] qa/tasks/mgr/dashboard: NFS Ganesha tests Signed-off-by: Ricardo Dias --- qa/tasks/mgr/dashboard/helper.py | 6 + qa/tasks/mgr/dashboard/test_ganesha.py | 146 +++++++++++++++++++++++++ 2 files changed, 152 insertions(+) create mode 100644 qa/tasks/mgr/dashboard/test_ganesha.py diff --git a/qa/tasks/mgr/dashboard/helper.py b/qa/tasks/mgr/dashboard/helper.py index 31fe13e742d66..56fef68355020 100644 --- a/qa/tasks/mgr/dashboard/helper.py +++ b/qa/tasks/mgr/dashboard/helper.py @@ -390,6 +390,12 @@ class DashboardTestCase(MgrTestCase): args.extend(cmd) cls.mgr_cluster.admin_remote.run(args=args) + @classmethod + def _rados_cmd(cls, cmd): + args = ['rados'] + args.extend(cmd) + cls.mgr_cluster.admin_remote.run(args=args) + @classmethod def mons(cls): out = cls.ceph_cluster.mon_manager.raw_cluster_cmd('mon_status') diff --git a/qa/tasks/mgr/dashboard/test_ganesha.py b/qa/tasks/mgr/dashboard/test_ganesha.py new file mode 100644 index 0000000000000..5b00f4e70d488 --- /dev/null +++ b/qa/tasks/mgr/dashboard/test_ganesha.py @@ -0,0 +1,146 @@ +# -*- coding: utf-8 -*- +# pylint: disable=too-many-public-methods + +from __future__ import absolute_import + +import time + +from .helper import DashboardTestCase, JObj, JLeaf, JList + + +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', 3, '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(['dashboard', 'set-rgw-api-secret-key', 'admin']) + cls._ceph_cmd(['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): + if fsal == 'CEPH': + fsal = {"name": "CEPH", "user_id":"admin", "fs_name": None} + 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", + "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') + + 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'] + 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']) + + 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) -- 2.39.5