]> git.proxmox.com Git - ceph.git/blob - ceph/qa/tasks/mgr/dashboard/test_ganesha.py
update sources to ceph Nautilus 14.2.1
[ceph.git] / ceph / qa / tasks / mgr / dashboard / test_ganesha.py
1 # -*- coding: utf-8 -*-
2 # pylint: disable=too-many-public-methods
3
4 from __future__ import absolute_import
5
6 import time
7
8 from .helper import DashboardTestCase, JObj, JLeaf, JList
9
10
11 class GaneshaTest(DashboardTestCase):
12 CEPHFS = True
13 AUTH_ROLES = ['pool-manager', 'ganesha-manager']
14
15 @classmethod
16 def create_pool(cls, name, pg_num, pool_type, application='rbd'):
17 data = {
18 'pool': name,
19 'pg_num': pg_num,
20 'pool_type': pool_type,
21 'application_metadata': [application]
22 }
23 if pool_type == 'erasure':
24 data['flags'] = ['ec_overwrites']
25 cls._task_post("/api/pool", data)
26
27 @classmethod
28 def setUpClass(cls):
29 super(GaneshaTest, cls).setUpClass()
30 cls.create_pool('ganesha', 3, 'replicated')
31 cls._rados_cmd(['-p', 'ganesha', '-N', 'ganesha1', 'create', 'conf-node1'])
32 cls._rados_cmd(['-p', 'ganesha', '-N', 'ganesha1', 'create', 'conf-node2'])
33 cls._rados_cmd(['-p', 'ganesha', '-N', 'ganesha1', 'create', 'conf-node3'])
34 cls._rados_cmd(['-p', 'ganesha', '-N', 'ganesha2', 'create', 'conf-node1'])
35 cls._rados_cmd(['-p', 'ganesha', '-N', 'ganesha2', 'create', 'conf-node2'])
36 cls._rados_cmd(['-p', 'ganesha', '-N', 'ganesha2', 'create', 'conf-node3'])
37 cls._ceph_cmd(['dashboard', 'set-ganesha-clusters-rados-pool-namespace', 'cluster1:ganesha/ganesha1,cluster2:ganesha/ganesha2'])
38
39 # RGW setup
40 cls._radosgw_admin_cmd([
41 'user', 'create', '--uid', 'admin', '--display-name', 'admin',
42 '--system', '--access-key', 'admin', '--secret', 'admin'
43 ])
44 cls._ceph_cmd(['dashboard', 'set-rgw-api-secret-key', 'admin'])
45 cls._ceph_cmd(['dashboard', 'set-rgw-api-access-key', 'admin'])
46
47 @classmethod
48 def tearDownClass(cls):
49 super(GaneshaTest, cls).tearDownClass()
50 cls._radosgw_admin_cmd(['user', 'rm', '--uid', 'admin', '--purge-data'])
51 cls._ceph_cmd(['osd', 'pool', 'delete', 'ganesha', 'ganesha', '--yes-i-really-really-mean-it'])
52
53 @DashboardTestCase.RunAs('test', 'test', [{'rbd-image': ['create', 'update', 'delete']}])
54 def test_read_access_permissions(self):
55 self._get('/api/nfs-ganesha/export')
56 self.assertStatus(403)
57
58 def test_list_daemons(self):
59 daemons = self._get("/api/nfs-ganesha/daemon")
60 self.assertEqual(len(daemons), 6)
61 daemons = [(d['daemon_id'], d['cluster_id']) for d in daemons]
62 self.assertIn(('node1', 'cluster1'), daemons)
63 self.assertIn(('node2', 'cluster1'), daemons)
64 self.assertIn(('node3', 'cluster1'), daemons)
65 self.assertIn(('node1', 'cluster2'), daemons)
66 self.assertIn(('node2', 'cluster2'), daemons)
67 self.assertIn(('node3', 'cluster2'), daemons)
68
69 @classmethod
70 def create_export(cls, path, cluster_id, daemons, fsal, sec_label_xattr=None):
71 if fsal == 'CEPH':
72 fsal = {"name": "CEPH", "user_id":"admin", "fs_name": None, "sec_label_xattr": sec_label_xattr}
73 pseudo = "/cephfs{}".format(path)
74 else:
75 fsal = {"name": "RGW", "rgw_user_id": "admin"}
76 pseudo = "/rgw/{}".format(path if path[0] != '/' else "")
77 ex_json = {
78 "path": path,
79 "fsal": fsal,
80 "cluster_id": cluster_id,
81 "daemons": ["node1", "node3"],
82 "pseudo": pseudo,
83 "tag": None,
84 "access_type": "RW",
85 "squash": "no_root_squash",
86 "security_label": sec_label_xattr is not None,
87 "protocols": [4],
88 "transports": ["TCP"],
89 "clients": [{
90 "addresses":["10.0.0.0/8"],
91 "access_type": "RO",
92 "squash": "root"
93 }]
94 }
95 return cls._task_post('/api/nfs-ganesha/export', ex_json)
96
97 def tearDown(self):
98 super(GaneshaTest, self).tearDown()
99 exports = self._get("/api/nfs-ganesha/export")
100 if self._resp.status_code != 200:
101 return
102 self.assertIsInstance(exports, list)
103 for exp in exports:
104 self._task_delete("/api/nfs-ganesha/export/{}/{}"
105 .format(exp['cluster_id'], exp['export_id']))
106
107 def test_create_export(self):
108 exports = self._get("/api/nfs-ganesha/export")
109 self.assertEqual(len(exports), 0)
110
111 data = self.create_export("/foo", 'cluster1', ['node1', 'node2'], 'CEPH', "security.selinux")
112
113 exports = self._get("/api/nfs-ganesha/export")
114 self.assertEqual(len(exports), 1)
115 self.assertDictEqual(exports[0], data)
116 return data
117
118 def test_update_export(self):
119 export = self.test_create_export()
120 export['access_type'] = 'RO'
121 export['daemons'] = ['node1', 'node3']
122 export['security_label'] = True
123 data = self._task_put('/api/nfs-ganesha/export/{}/{}'
124 .format(export['cluster_id'], export['export_id']),
125 export)
126 exports = self._get("/api/nfs-ganesha/export")
127 self.assertEqual(len(exports), 1)
128 self.assertDictEqual(exports[0], data)
129 self.assertEqual(exports[0]['daemons'], ['node1', 'node3'])
130 self.assertEqual(exports[0]['security_label'], True)
131
132 def test_delete_export(self):
133 export = self.test_create_export()
134 self._task_delete("/api/nfs-ganesha/export/{}/{}"
135 .format(export['cluster_id'], export['export_id']))
136 self.assertStatus(204)
137
138 def test_get_export(self):
139 exports = self._get("/api/nfs-ganesha/export")
140 self.assertEqual(len(exports), 0)
141
142 data1 = self.create_export("/foo", 'cluster2', ['node1', 'node2'], 'CEPH')
143 data2 = self.create_export("mybucket", 'cluster2', ['node2', 'node3'], 'RGW')
144
145 export1 = self._get("/api/nfs-ganesha/export/cluster2/1")
146 self.assertDictEqual(export1, data1)
147
148 export2 = self._get("/api/nfs-ganesha/export/cluster2/2")
149 self.assertDictEqual(export2, data2)
150
151 def test_invalid_status(self):
152 self._ceph_cmd(['dashboard', 'set-ganesha-clusters-rados-pool-namespace', ''])
153
154 data = self._get('/api/nfs-ganesha/status')
155 self.assertStatus(200)
156 self.assertIn('available', data)
157 self.assertIn('message', data)
158 self.assertFalse(data['available'])
159 self.assertIn('Ganesha config location is not configured. Please set the GANESHA_RADOS_POOL_NAMESPACE setting.',
160 data['message'])
161
162 self._ceph_cmd(['dashboard', 'set-ganesha-clusters-rados-pool-namespace', 'cluster1:ganesha/ganesha1,cluster2:ganesha/ganesha2'])
163
164 def test_valid_status(self):
165 data = self._get('/api/nfs-ganesha/status')
166 self.assertStatus(200)
167 self.assertIn('available', data)
168 self.assertIn('message', data)
169 self.assertTrue(data['available'])