]>
git.proxmox.com Git - ceph.git/blob - ceph/qa/tasks/mgr/dashboard/test_ganesha.py
1 # -*- coding: utf-8 -*-
2 # pylint: disable=too-many-public-methods
4 from __future__
import absolute_import
7 from .helper
import DashboardTestCase
10 class GaneshaTest(DashboardTestCase
):
12 AUTH_ROLES
= ['pool-manager', 'ganesha-manager']
15 def create_pool(cls
, name
, pg_num
, pool_type
, application
='rbd'):
19 'pool_type': pool_type
,
20 'application_metadata': [application
]
22 if pool_type
== 'erasure':
23 data
['flags'] = ['ec_overwrites']
24 cls
._task
_post
("/api/pool", data
)
28 super(GaneshaTest
, cls
).setUpClass()
29 cls
.create_pool('ganesha', 2**2, 'replicated')
30 cls
._rados
_cmd
(['-p', 'ganesha', '-N', 'ganesha1', 'create', 'conf-node1'])
31 cls
._rados
_cmd
(['-p', 'ganesha', '-N', 'ganesha1', 'create', 'conf-node2'])
32 cls
._rados
_cmd
(['-p', 'ganesha', '-N', 'ganesha1', 'create', 'conf-node3'])
33 cls
._rados
_cmd
(['-p', 'ganesha', '-N', 'ganesha2', 'create', 'conf-node1'])
34 cls
._rados
_cmd
(['-p', 'ganesha', '-N', 'ganesha2', 'create', 'conf-node2'])
35 cls
._rados
_cmd
(['-p', 'ganesha', '-N', 'ganesha2', 'create', 'conf-node3'])
36 cls
._ceph
_cmd
(['dashboard', 'set-ganesha-clusters-rados-pool-namespace', 'cluster1:ganesha/ganesha1,cluster2:ganesha/ganesha2'])
39 cls
._radosgw
_admin
_cmd
([
40 'user', 'create', '--uid', 'admin', '--display-name', 'admin',
41 '--system', '--access-key', 'admin', '--secret', 'admin'
43 cls
._ceph
_cmd
(['dashboard', 'set-rgw-api-secret-key', 'admin'])
44 cls
._ceph
_cmd
(['dashboard', 'set-rgw-api-access-key', 'admin'])
47 def tearDownClass(cls
):
48 super(GaneshaTest
, cls
).tearDownClass()
49 cls
._radosgw
_admin
_cmd
(['user', 'rm', '--uid', 'admin', '--purge-data'])
50 cls
._ceph
_cmd
(['osd', 'pool', 'delete', 'ganesha', 'ganesha', '--yes-i-really-really-mean-it'])
52 @DashboardTestCase.RunAs('test', 'test', [{'rbd-image': ['create', 'update', 'delete']}])
53 def test_read_access_permissions(self
):
54 self
._get
('/api/nfs-ganesha/export')
55 self
.assertStatus(403)
57 def test_list_daemons(self
):
58 daemons
= self
._get
("/api/nfs-ganesha/daemon")
59 self
.assertEqual(len(daemons
), 6)
60 daemons
= [(d
['daemon_id'], d
['cluster_id']) for d
in daemons
]
61 self
.assertIn(('node1', 'cluster1'), daemons
)
62 self
.assertIn(('node2', 'cluster1'), daemons
)
63 self
.assertIn(('node3', 'cluster1'), daemons
)
64 self
.assertIn(('node1', 'cluster2'), daemons
)
65 self
.assertIn(('node2', 'cluster2'), daemons
)
66 self
.assertIn(('node3', 'cluster2'), daemons
)
69 def create_export(cls
, path
, cluster_id
, daemons
, fsal
, sec_label_xattr
=None):
71 fsal
= {"name": "CEPH", "user_id":"admin", "fs_name": None, "sec_label_xattr": sec_label_xattr
}
72 pseudo
= "/cephfs{}".format(path
)
74 fsal
= {"name": "RGW", "rgw_user_id": "admin"}
75 pseudo
= "/rgw/{}".format(path
if path
[0] != '/' else "")
79 "cluster_id": cluster_id
,
80 "daemons": ["node1", "node3"],
84 "squash": "no_root_squash",
85 "security_label": sec_label_xattr
is not None,
87 "transports": ["TCP"],
89 "addresses":["10.0.0.0/8"],
94 return cls
._task
_post
('/api/nfs-ganesha/export', ex_json
)
97 super(GaneshaTest
, self
).tearDown()
98 exports
= self
._get
("/api/nfs-ganesha/export")
99 if self
._resp
.status_code
!= 200:
101 self
.assertIsInstance(exports
, list)
103 self
._task
_delete
("/api/nfs-ganesha/export/{}/{}"
104 .format(exp
['cluster_id'], exp
['export_id']))
106 def test_create_export(self
):
107 exports
= self
._get
("/api/nfs-ganesha/export")
108 self
.assertEqual(len(exports
), 0)
110 data
= self
.create_export("/foo", 'cluster1', ['node1', 'node2'], 'CEPH', "security.selinux")
112 exports
= self
._get
("/api/nfs-ganesha/export")
113 self
.assertEqual(len(exports
), 1)
114 self
.assertDictEqual(exports
[0], data
)
117 def test_update_export(self
):
118 export
= self
.test_create_export()
119 export
['access_type'] = 'RO'
120 export
['daemons'] = ['node1', 'node3']
121 export
['security_label'] = True
122 data
= self
._task
_put
('/api/nfs-ganesha/export/{}/{}'
123 .format(export
['cluster_id'], export
['export_id']),
125 exports
= self
._get
("/api/nfs-ganesha/export")
126 self
.assertEqual(len(exports
), 1)
127 self
.assertDictEqual(exports
[0], data
)
128 self
.assertEqual(exports
[0]['daemons'], ['node1', 'node3'])
129 self
.assertEqual(exports
[0]['security_label'], True)
131 def test_delete_export(self
):
132 export
= self
.test_create_export()
133 self
._task
_delete
("/api/nfs-ganesha/export/{}/{}"
134 .format(export
['cluster_id'], export
['export_id']))
135 self
.assertStatus(204)
137 def test_get_export(self
):
138 exports
= self
._get
("/api/nfs-ganesha/export")
139 self
.assertEqual(len(exports
), 0)
141 data1
= self
.create_export("/foo", 'cluster2', ['node1', 'node2'], 'CEPH')
142 data2
= self
.create_export("mybucket", 'cluster2', ['node2', 'node3'], 'RGW')
144 export1
= self
._get
("/api/nfs-ganesha/export/cluster2/1")
145 self
.assertDictEqual(export1
, data1
)
147 export2
= self
._get
("/api/nfs-ganesha/export/cluster2/2")
148 self
.assertDictEqual(export2
, data2
)
150 def test_invalid_status(self
):
151 self
._ceph
_cmd
(['dashboard', 'set-ganesha-clusters-rados-pool-namespace', ''])
153 data
= self
._get
('/api/nfs-ganesha/status')
154 self
.assertStatus(200)
155 self
.assertIn('available', data
)
156 self
.assertIn('message', data
)
157 self
.assertFalse(data
['available'])
158 self
.assertIn('Ganesha config location is not configured. Please set the GANESHA_RADOS_POOL_NAMESPACE setting.',
161 self
._ceph
_cmd
(['dashboard', 'set-ganesha-clusters-rados-pool-namespace', 'cluster1:ganesha/ganesha1,cluster2:ganesha/ganesha2'])
163 def test_valid_status(self
):
164 data
= self
._get
('/api/nfs-ganesha/status')
165 self
.assertStatus(200)
166 self
.assertIn('available', data
)
167 self
.assertIn('message', data
)
168 self
.assertTrue(data
['available'])