]> git.proxmox.com Git - ceph.git/blob - ceph/qa/tasks/mgr/dashboard/test_crush_rule.py
import quincy beta 17.1.0
[ceph.git] / ceph / qa / tasks / mgr / dashboard / test_crush_rule.py
1 # -*- coding: utf-8 -*-
2
3 from __future__ import absolute_import
4
5 from .helper import DashboardTestCase, JList, JObj
6
7
8 class CrushRuleTest(DashboardTestCase):
9
10 AUTH_ROLES = ['pool-manager']
11
12 rule_schema = JObj(sub_elems={
13 'rule_id': int,
14 'rule_name': str,
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
24 rule = self._get('/api/crush_rule/{}'.format(name), version='2.0')
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):
34 self._get('/api/crush_rule', version='2.0')
35 self.assertStatus(403)
36
37 @DashboardTestCase.RunAs('test', 'test', ['read-only'])
38 def test_write_access_permissions(self):
39 self._get('/api/crush_rule', version='2.0')
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):
54 self._get('/api/crush_rule', version='2.0')
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({
81 'names': JList(str),
82 'nodes': JList(JObj({}, allow_unknown=True)),
83 'roots': JList(int)
84 }))