mirror of
https://github.com/ceph/ceph
synced 2025-01-22 19:15:41 +00:00
6644a00a2c
Fixes: https://tracker.ceph.com/issues/52017 Signed-off-by: Avan Thakkar <athakkar@redhat.com>
159 lines
6.0 KiB
Python
159 lines
6.0 KiB
Python
# -*- coding: utf-8 -*-
|
|
from __future__ import absolute_import
|
|
|
|
from .helper import DashboardTestCase, JList, JObj, devices_schema
|
|
|
|
|
|
class HostControllerTest(DashboardTestCase):
|
|
|
|
AUTH_ROLES = ['read-only']
|
|
|
|
URL_HOST = '/api/host'
|
|
URL_UI_HOST = '/ui-api/host'
|
|
|
|
ORCHESTRATOR = True
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
super(HostControllerTest, cls).setUpClass()
|
|
|
|
@classmethod
|
|
def tearDownClass(cls):
|
|
cmd = ['test_orchestrator', 'load_data', '-i', '-']
|
|
cls.mgr_cluster.mon_manager.raw_cluster_cmd_result(*cmd, stdin='{}')
|
|
|
|
@property
|
|
def test_data_inventory(self):
|
|
return self.ORCHESTRATOR_TEST_DATA['inventory']
|
|
|
|
@property
|
|
def test_data_daemons(self):
|
|
return self.ORCHESTRATOR_TEST_DATA['daemons']
|
|
|
|
@DashboardTestCase.RunAs('test', 'test', ['block-manager'])
|
|
def test_access_permissions(self):
|
|
self._get(self.URL_HOST, version='1.1')
|
|
self.assertStatus(403)
|
|
|
|
def test_host_list(self):
|
|
data = self._get(self.URL_HOST, version='1.1')
|
|
self.assertStatus(200)
|
|
|
|
orch_hostnames = {inventory_node['name'] for inventory_node in
|
|
self.ORCHESTRATOR_TEST_DATA['inventory']}
|
|
|
|
for server in data:
|
|
self.assertIn('services', server)
|
|
self.assertIn('hostname', server)
|
|
self.assertIn('ceph_version', server)
|
|
self.assertIsNotNone(server['hostname'])
|
|
self.assertIsNotNone(server['ceph_version'])
|
|
for service in server['services']:
|
|
self.assertIn('type', service)
|
|
self.assertIn('id', service)
|
|
self.assertIsNotNone(service['type'])
|
|
self.assertIsNotNone(service['id'])
|
|
|
|
self.assertIn('sources', server)
|
|
in_ceph, in_orchestrator = server['sources']['ceph'], server['sources']['orchestrator']
|
|
if in_ceph:
|
|
self.assertGreaterEqual(len(server['services']), 1)
|
|
if not in_orchestrator:
|
|
self.assertNotIn(server['hostname'], orch_hostnames)
|
|
if in_orchestrator:
|
|
self.assertEqual(len(server['services']), 0)
|
|
self.assertIn(server['hostname'], orch_hostnames)
|
|
|
|
def test_host_list_with_sources(self):
|
|
data = self._get('{}?sources=orchestrator'.format(self.URL_HOST), version='1.1')
|
|
self.assertStatus(200)
|
|
test_hostnames = {inventory_node['name'] for inventory_node in
|
|
self.ORCHESTRATOR_TEST_DATA['inventory']}
|
|
resp_hostnames = {host['hostname'] for host in data}
|
|
self.assertEqual(test_hostnames, resp_hostnames)
|
|
|
|
data = self._get('{}?sources=ceph'.format(self.URL_HOST), version='1.1')
|
|
self.assertStatus(200)
|
|
test_hostnames = {inventory_node['name'] for inventory_node in
|
|
self.ORCHESTRATOR_TEST_DATA['inventory']}
|
|
resp_hostnames = {host['hostname'] for host in data}
|
|
self.assertEqual(len(test_hostnames.intersection(resp_hostnames)), 0)
|
|
|
|
def test_host_devices(self):
|
|
hosts = self._get('{}'.format(self.URL_HOST), version='1.1')
|
|
hosts = [host['hostname'] for host in hosts if host['hostname'] != '']
|
|
assert hosts[0]
|
|
data = self._get('{}/devices'.format('{}/{}'.format(self.URL_HOST, hosts[0])))
|
|
self.assertStatus(200)
|
|
self.assertSchema(data, devices_schema)
|
|
|
|
def test_host_daemons(self):
|
|
hosts = self._get('{}'.format(self.URL_HOST), version='1.1')
|
|
hosts = [host['hostname'] for host in hosts if host['hostname'] != '']
|
|
assert hosts[0]
|
|
data = self._get('{}/daemons'.format('{}/{}'.format(self.URL_HOST, hosts[0])))
|
|
self.assertStatus(200)
|
|
self.assertSchema(data, JList(JObj({
|
|
'hostname': str,
|
|
'daemon_id': str,
|
|
'daemon_type': str
|
|
})))
|
|
|
|
def test_host_smart(self):
|
|
hosts = self._get('{}'.format(self.URL_HOST), version='1.1')
|
|
hosts = [host['hostname'] for host in hosts if host['hostname'] != '']
|
|
assert hosts[0]
|
|
self._get('{}/smart'.format('{}/{}'.format(self.URL_HOST, hosts[0])))
|
|
self.assertStatus(200)
|
|
|
|
def _validate_inventory(self, data, resp_data):
|
|
self.assertEqual(data['name'], resp_data['name'])
|
|
self.assertEqual(len(data['devices']), len(resp_data['devices']))
|
|
|
|
if not data['devices']:
|
|
return
|
|
test_devices = sorted(data['devices'], key=lambda d: d['path'])
|
|
resp_devices = sorted(resp_data['devices'], key=lambda d: d['path'])
|
|
|
|
for test, resp in zip(test_devices, resp_devices):
|
|
self._validate_device(test, resp)
|
|
|
|
def _validate_device(self, data, resp_data):
|
|
for key, value in data.items():
|
|
self.assertEqual(value, resp_data[key])
|
|
|
|
def test_inventory_get(self):
|
|
# get a inventory
|
|
node = self.test_data_inventory[0]
|
|
resp = self._get('{}/{}/inventory'.format(self.URL_HOST, node['name']))
|
|
self.assertStatus(200)
|
|
self._validate_inventory(node, resp)
|
|
|
|
def test_inventory_list(self):
|
|
# get all inventory
|
|
data = self._get('{}/inventory'.format(self.URL_UI_HOST))
|
|
self.assertStatus(200)
|
|
|
|
def sorting_key(node):
|
|
return node['name']
|
|
|
|
test_inventory = sorted(self.test_data_inventory, key=sorting_key)
|
|
resp_inventory = sorted(data, key=sorting_key)
|
|
self.assertEqual(len(test_inventory), len(resp_inventory))
|
|
for test, resp in zip(test_inventory, resp_inventory):
|
|
self._validate_inventory(test, resp)
|
|
|
|
|
|
class HostControllerNoOrchestratorTest(DashboardTestCase):
|
|
def test_host_create(self):
|
|
self._post('/api/host?hostname=foo', {'status': ''}, version='0.1')
|
|
self.assertStatus(503)
|
|
self.assertError(code='orchestrator_status_unavailable',
|
|
component='orchestrator')
|
|
|
|
def test_host_delete(self):
|
|
self._delete('/api/host/bar')
|
|
self.assertStatus(503)
|
|
self.assertError(code='orchestrator_status_unavailable',
|
|
component='orchestrator')
|