]> git.proxmox.com Git - ceph.git/blob - ceph/src/pybind/mgr/dashboard/rbd_iscsi.py
6f5e75ed1804a80110069a99d077a05ffc9bdcc7
[ceph.git] / ceph / src / pybind / mgr / dashboard / rbd_iscsi.py
1
2 import rados
3 import rbd
4 from remote_view_cache import RemoteViewCache
5
6 SERVICE_TYPE = 'tcmu-runner'
7
8 class DaemonsAndImages(RemoteViewCache):
9 def _get(self):
10 daemons = {}
11 images = {}
12 for server in self._module.list_servers():
13 for service in server['services']:
14 if service['type'] == SERVICE_TYPE:
15 metadata = self._module.get_metadata(SERVICE_TYPE,
16 service['id'])
17 status = self._module.get_daemon_status(SERVICE_TYPE,
18 service['id'])
19
20 daemon = daemons.get(server['hostname'], None)
21 if daemon is None:
22 daemon = {
23 'server_hostname': server['hostname'],
24 'version': metadata['ceph_version'],
25 'optimized_paths': 0,
26 'non_optimized_paths': 0
27 }
28 daemons[server['hostname']] = daemon
29
30 service_id = service['id']
31 device_id = service_id.split(':')[-1]
32 image = images.get(device_id)
33 if image is None:
34 image = {
35 'device_id': device_id,
36 'pool_name': metadata['pool_name'],
37 'name': metadata['image_name'],
38 'id': metadata.get('image_id', None),
39 'optimized_paths': [],
40 'non_optimized_paths': []
41 }
42 images[device_id] = image
43 if status.get('lock_owner', 'false') == 'true':
44 daemon['optimized_paths'] += 1
45 image['optimized_paths'].append(server['hostname'])
46
47 perf_key_prefix = "librbd-{id}-{pool}-{name}.".format(
48 id=metadata.get('image_id', ''),
49 pool=metadata['pool_name'],
50 name=metadata['image_name'])
51 perf_key = "{}lock_acquired_time".format(perf_key_prefix)
52 lock_acquired_time = (self._module.get_counter(
53 'tcmu-runner', service_id, perf_key)[perf_key] or
54 [[0,0]])[-1][1] / 1000000000
55 if lock_acquired_time > image.get('optimized_since', None):
56 image['optimized_since'] = lock_acquired_time
57 image['stats'] = {}
58 image['stats_history'] = {}
59 for s in ['rd', 'wr', 'rd_bytes', 'wr_bytes']:
60 perf_key = "{}{}".format(perf_key_prefix, s)
61 image['stats'][s] = self._module.get_rate(
62 'tcmu-runner', service_id, perf_key)
63 image['stats_history'][s] = self._module.get_counter(
64 'tcmu-runner', service_id, perf_key)[perf_key]
65 else:
66 daemon['non_optimized_paths'] += 1
67 image['non_optimized_paths'].append(server['hostname'])
68
69 return {
70 'daemons': [daemons[k] for k in sorted(daemons, key=daemons.get)],
71 'images': [images[k] for k in sorted(images, key=images.get)]
72 }
73
74 class Controller:
75 def __init__(self, module_inst):
76 self.content_data = DaemonsAndImages(module_inst)