"num_mons": 1
},
"crush_types": [
- "osd",
- "host",
- "chassis",
- "rack",
- "row",
- "pdu",
- "pod",
- "room",
- "datacenter",
- "region",
- "root"
+ {
+ "type": "osd"
+ "count": 2,
+ },
+ {
+ "type": "rack"
+ "count": 1,
+ },
+ {
+ "type": "host"
+ "count": 1,
+ },
+ {
+ "type": "root"
+ "count": 1,
+ }
],
"ownership": {
"organization": "eNovance",
import sys
import ast
import requests
+from collections import Counter
CLUSTER_UUID_NAME='cluster-uuid'
CLUSTER_OWNERSHIP_NAME='cluster-ownership'
if crush_dump['types'] is None:
raise RuntimeError("\'types\' item missing in \'ceph osd crush dump\'")
- crush_types = []
+ crush_types = {}
for t in crush_dump['types']:
- crush_types.append(t['name'])
+ crush_types[t['type_id']] = t['name']
+
+ buckets = {}
+ items_list = []
+ for bucket in crush_dump['buckets']:
+ buckets[bucket['id']] = bucket['type_id']
+ for item in bucket['items']:
+ items_list.append(item['id'])
+
+ crush_map = []
+ counter = Counter(items_list)
+ append = lambda t,c: crush_map.append({'type':t, 'count':c})
+ for id,count in counter.items():
+ if id in buckets:
+ append(crush_types[buckets[id]],
+ count)
+ del buckets[id]
+ else:
+ append(crush_types[id], count)
+
+ #the root item
+ for id,type_id in buckets.items():
+ append(crush_types[type_id], 1)
- return crush_types
+ return crush_map
def get_pool_metadata():
(rc, o, e) = run_command(['ceph', 'osd', 'dump'])
num_mons=comps.num_mons
)
+@jsonify.register(db.crush_types)
+def jsonify_crush_types(crush):
+ return dict(type=crush.crush_type,
+ count=crush.crush_count)
+
@jsonify.register(db.pools_info)
def jsonify_pools_info(pool):
return dict(size=pool.pool_rep_size,
'email':b.ci.contact_email,
'name':b.ci.cluster_name
}
- crush_types=b.comps.crush_types.split(',')
return dict(uuid=b.ci.uuid,
cluster_creation_date=str(b.ci.cluster_creation_date),
components_count=b.comps,
- crush_types=crush_types,
+ crush_types=b.crush,
ownership=ownership,
pool_metadata=b.pools,
sysinfo=b.osds
num_pools = Column(Integer)
num_mdss = Column(Integer)
num_mons = Column(Integer)
- crush_types = Column(String(256))
+
+class crush_types(Base):
+ __tablename__ = 'crush_types'
+
+ index = Column(Integer, primary_key=True)
+ vid = Column(ForeignKey('version_info.index'))
+ crush_type = Column(String(16))
+ crush_count = Column(Integer)
class pools_info(Base):
__tablename__ = 'pools_info'
if self.ci is not None and self.vi is not None:
self.comps = Session.query(components_info).filter_by(vid=self.vi.index).first()
+ self.crush = Session.query(crush_types).filter_by(vid=self.vi.index).all()
self.pools = Session.query(pools_info).filter_by(vid=self.vi.index).all()
self.osds = Session.query(osds_info).filter_by(vid=self.vi.index).all()
num_pgs=comps_count['num_pgs'],
num_pools=comps_count['num_pools'],
num_mdss=comps_count['num_mdss'],
- num_mons=comps_count['num_mons'],
- crush_types=','.join(info['crush_types']))
+ num_mons=comps_count['num_mons'])
Session.add(comps_info)
+ def add_crush_types(vi):
+ for c in info['crush_types']:
+ Session.add(crush_types(vid=vi.index,
+ crush_type=c['type'],
+ crush_count=c['count']))
+
def add_pools_info(vi):
pools = info['pool_metadata']
for p in pools:
vi = Session.query(version_info).filter_by(cluster_id=ci.index,
version_number=ci.num_versions).first()
add_components_info(vi)
+ add_crush_types(vi)
add_pools_info(vi)
add_osds_info(vi)
for v in Session.query(version_info).filter_by(cluster_id=ci.index).all():
Session.query(components_info).filter_by(vid=v.index).delete()
+ Session.query(crush_types).filter_by(vid=v.index).delete()
Session.query(pools_info).filter_by(vid=v.index).delete()
Session.query(osds_info).filter_by(vid=v.index).delete()
Session.flush()