]> git.proxmox.com Git - ceph.git/blame - ceph/qa/tasks/mgr/dashboard/test_orchestrator.py
import 15.2.4
[ceph.git] / ceph / qa / tasks / mgr / dashboard / test_orchestrator.py
CommitLineData
9f95a23c
TL
1# -*- coding: utf-8 -*-
2from __future__ import absolute_import
3import json
4
e306af50 5from tasks.mgr.dashboard.helper import DashboardTestCase
9f95a23c
TL
6
7
8test_data = {
9 'inventory': [
10 {
11 'name': 'test-host0',
12 'addr': '1.2.3.4',
13 'devices': [
14 {
15 'path': '/dev/sda',
16 }
17 ]
18 },
19 {
20 'name': 'test-host1',
21 'addr': '1.2.3.5',
22 'devices': [
23 {
24 'path': '/dev/sdb',
25 }
26 ]
27 }
28 ],
29 'daemons': [
30 {
31 'nodename': 'test-host0',
32 'daemon_type': 'mon',
33 'daemon_id': 'a'
34 },
35 {
36 'nodename': 'test-host0',
37 'daemon_type': 'mgr',
38 'daemon_id': 'x'
39 },
40 {
41 'nodename': 'test-host0',
42 'daemon_type': 'osd',
43 'daemon_id': '0'
44 },
45 {
46 'nodename': 'test-host1',
47 'daemon_type': 'osd',
48 'daemon_id': '1'
49 }
50 ]
51}
52
53
54class OrchestratorControllerTest(DashboardTestCase):
55
56 AUTH_ROLES = ['cluster-manager']
57
58 URL_STATUS = '/api/orchestrator/status'
59 URL_INVENTORY = '/api/orchestrator/inventory'
60 URL_OSD = '/api/orchestrator/osd'
61
62
63 @property
64 def test_data_inventory(self):
65 return test_data['inventory']
66
67 @property
68 def test_data_daemons(self):
69 return test_data['daemons']
70
71 @classmethod
72 def setUpClass(cls):
73 super(OrchestratorControllerTest, cls).setUpClass()
74 cls._load_module('test_orchestrator')
75 cmd = ['orch', 'set', 'backend', 'test_orchestrator']
76 cls.mgr_cluster.mon_manager.raw_cluster_cmd(*cmd)
77
78 cmd = ['test_orchestrator', 'load_data', '-i', '-']
79 cls.mgr_cluster.mon_manager.raw_cluster_cmd_result(*cmd, stdin=json.dumps(test_data))
80
81 @classmethod
82 def tearDownClass(cls):
83 cmd = ['test_orchestrator', 'load_data', '-i', '-']
84 cls.mgr_cluster.mon_manager.raw_cluster_cmd_result(*cmd, stdin='{}')
85
86 def _validate_inventory(self, data, resp_data):
87 self.assertEqual(data['name'], resp_data['name'])
88 self.assertEqual(len(data['devices']), len(resp_data['devices']))
89
90 if not data['devices']:
91 return
92 test_devices = sorted(data['devices'], key=lambda d: d['path'])
93 resp_devices = sorted(resp_data['devices'], key=lambda d: d['path'])
94
95 for test, resp in zip(test_devices, resp_devices):
96 self._validate_device(test, resp)
97
98 def _validate_device(self, data, resp_data):
99 for key, value in data.items():
100 self.assertEqual(value, resp_data[key])
101
102 def _validate_daemon(self, data, resp_data):
103 for key, value in data.items():
104 self.assertEqual(value, resp_data[key])
105
106 @DashboardTestCase.RunAs('test', 'test', ['block-manager'])
107 def test_access_permissions(self):
108 self._get(self.URL_STATUS)
109 self.assertStatus(200)
110 self._get(self.URL_INVENTORY)
111 self.assertStatus(403)
112
113 def test_status_get(self):
114 data = self._get(self.URL_STATUS)
115 self.assertTrue(data['available'])
116
117 def test_inventory_list(self):
118 # get all inventory
119 data = self._get(self.URL_INVENTORY)
120 self.assertStatus(200)
121
122 sorting_key = lambda node: node['name']
123 test_inventory = sorted(self.test_data_inventory, key=sorting_key)
124 resp_inventory = sorted(data, key=sorting_key)
125 self.assertEqual(len(test_inventory), len(resp_inventory))
126 for test, resp in zip(test_inventory, resp_inventory):
127 self._validate_inventory(test, resp)
128
129 # get inventory by hostname
130 node = self.test_data_inventory[-1]
131 data = self._get('{}?hostname={}'.format(self.URL_INVENTORY, node['name']))
132 self.assertStatus(200)
133 self.assertEqual(len(data), 1)
134 self._validate_inventory(node, data[0])