]>
Commit | Line | Data |
---|---|---|
9f95a23c TL |
1 | # -*- coding: utf-8 -*- |
2 | ||
3 | from __future__ import absolute_import | |
4 | ||
f67539c2 | 5 | from .helper import DashboardTestCase, JList, JObj |
9f95a23c TL |
6 | |
7 | ||
8 | class CrushRuleTest(DashboardTestCase): | |
9 | ||
10 | AUTH_ROLES = ['pool-manager'] | |
11 | ||
12 | rule_schema = JObj(sub_elems={ | |
9f95a23c | 13 | 'rule_id': int, |
f67539c2 | 14 | 'rule_name': str, |
9f95a23c TL |
15 | 'steps': JList(JObj({}, allow_unknown=True)) |
16 | }, allow_unknown=True) | |
17 | ||
18 | def create_and_delete_rule(self, data): | |
19 | name = data['name'] | |
20 | # Creates rule | |
21 | self._post('/api/crush_rule', data) | |
22 | self.assertStatus(201) | |
23 | # Makes sure rule exists | |
20effc67 | 24 | rule = self._get('/api/crush_rule/{}'.format(name), version='2.0') |
9f95a23c TL |
25 | self.assertStatus(200) |
26 | self.assertSchemaBody(self.rule_schema) | |
27 | self.assertEqual(rule['rule_name'], name) | |
28 | # Deletes rule | |
29 | self._delete('/api/crush_rule/{}'.format(name)) | |
30 | self.assertStatus(204) | |
31 | ||
32 | @DashboardTestCase.RunAs('test', 'test', ['rgw-manager']) | |
33 | def test_read_access_permissions(self): | |
20effc67 | 34 | self._get('/api/crush_rule', version='2.0') |
9f95a23c TL |
35 | self.assertStatus(403) |
36 | ||
37 | @DashboardTestCase.RunAs('test', 'test', ['read-only']) | |
38 | def test_write_access_permissions(self): | |
20effc67 | 39 | self._get('/api/crush_rule', version='2.0') |
9f95a23c TL |
40 | self.assertStatus(200) |
41 | data = {'name': 'some_rule', 'root': 'default', 'failure_domain': 'osd'} | |
42 | self._post('/api/crush_rule', data) | |
43 | self.assertStatus(403) | |
44 | self._delete('/api/crush_rule/default') | |
45 | self.assertStatus(403) | |
46 | ||
47 | @classmethod | |
48 | def tearDownClass(cls): | |
49 | super(CrushRuleTest, cls).tearDownClass() | |
50 | cls._ceph_cmd(['osd', 'crush', 'rule', 'rm', 'some_rule']) | |
51 | cls._ceph_cmd(['osd', 'crush', 'rule', 'rm', 'another_rule']) | |
52 | ||
53 | def test_list(self): | |
20effc67 | 54 | self._get('/api/crush_rule', version='2.0') |
9f95a23c TL |
55 | self.assertStatus(200) |
56 | self.assertSchemaBody(JList(self.rule_schema)) | |
57 | ||
58 | def test_create(self): | |
59 | self.create_and_delete_rule({ | |
60 | 'name': 'some_rule', | |
61 | 'root': 'default', | |
62 | 'failure_domain': 'osd' | |
63 | }) | |
64 | ||
65 | @DashboardTestCase.RunAs('test', 'test', ['pool-manager', 'cluster-manager']) | |
66 | def test_create_with_ssd(self): | |
67 | data = self._get('/api/osd/0') | |
68 | self.assertStatus(200) | |
69 | device_class = data['osd_metadata']['default_device_class'] | |
70 | self.create_and_delete_rule({ | |
71 | 'name': 'another_rule', | |
72 | 'root': 'default', | |
73 | 'failure_domain': 'osd', | |
74 | 'device_class': device_class | |
75 | }) | |
76 | ||
77 | def test_crush_rule_info(self): | |
78 | self._get('/ui-api/crush_rule/info') | |
79 | self.assertStatus(200) | |
80 | self.assertSchemaBody(JObj({ | |
f67539c2 | 81 | 'names': JList(str), |
b3b6e05e TL |
82 | 'nodes': JList(JObj({}, allow_unknown=True)), |
83 | 'roots': JList(int) | |
9f95a23c | 84 | })) |