]>
Commit | Line | Data |
---|---|---|
9f95a23c TL |
1 | # -*- coding: utf-8 -*- |
2 | from __future__ import absolute_import | |
3 | import json | |
4 | ||
e306af50 | 5 | from tasks.mgr.dashboard.helper import DashboardTestCase |
9f95a23c TL |
6 | |
7 | ||
8 | test_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 | ||
54 | class 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]) |