initial code repo
[stor4nfv.git] / src / ceph / src / brag / server / ceph_brag / model / db.py
diff --git a/src/ceph/src/brag/server/ceph_brag/model/db.py b/src/ceph/src/brag/server/ceph_brag/model/db.py
new file mode 100644 (file)
index 0000000..9fc7df9
--- /dev/null
@@ -0,0 +1,284 @@
+import json
+from datetime import datetime
+from sqlalchemy.orm import sessionmaker, scoped_session
+from sqlalchemy import Column, Integer, String, \
+     DateTime, ForeignKey, BigInteger
+from sqlalchemy import PrimaryKeyConstraint
+from sqlalchemy.ext.declarative import declarative_base
+from sqlalchemy.ext.declarative import declared_attr
+
+Base = declarative_base()
+Session = scoped_session(sessionmaker())
+
+class cluster_info(Base):
+  __tablename__ = 'cluster_info'
+
+  index = Column(Integer, primary_key=True)
+  uuid = Column(String(36), unique=True)
+  organization = Column(String(64))
+  contact_email = Column(String(32))
+  cluster_name = Column(String(32))
+  cluster_creation_date = Column(DateTime)
+  description = Column(String(32))
+  num_versions = Column(Integer)
+
+class version_info(Base):
+  __tablename__ = 'version_info'
+
+  index = Column(Integer, primary_key=True)
+  cluster_id = Column(ForeignKey('cluster_info.index'))
+  version_number = Column(Integer)
+  version_date = Column(DateTime)
+
+class components_info(Base):
+  __tablename__ = 'components_info'
+
+  index = Column(Integer, primary_key=True)
+  vid = Column(ForeignKey('version_info.index'))
+  num_data_bytes = Column(BigInteger)
+  num_bytes_total = Column(BigInteger)
+  num_osds = Column(Integer)
+  num_objects = Column(Integer)
+  num_pgs = Column(Integer)
+  num_pools = Column(Integer)
+  num_mdss = Column(Integer)
+  num_mons = Column(Integer)
+
+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'
+
+  index = Column(Integer, primary_key=True)
+  vid = Column(ForeignKey('version_info.index'))
+  pool_id = Column(Integer)
+  pool_type = Column(Integer)
+  pool_rep_size = Column(Integer)
+
+class os_info(Base):
+  __tablename__ = 'os_info'
+
+  index = Column(Integer, primary_key=True)
+  vid = Column(ForeignKey('version_info.index'))
+  os = Column(String(16))
+  count = Column(Integer)
+
+class kernel_versions(Base):
+  __tablename__ = 'kernel_versions'
+
+  index = Column(Integer, primary_key=True)
+  vid = Column(ForeignKey('version_info.index'))
+  version = Column(String(16))
+  count = Column(Integer)
+
+class kernel_types(Base):
+  __tablename__ = 'kernel_types'
+
+  index = Column(Integer, primary_key=True)
+  vid = Column(ForeignKey('version_info.index'))
+  type = Column(String(64))
+  count = Column(Integer)
+
+class distros(Base):
+  __tablename__ = 'distros'
+
+  index = Column(Integer, primary_key=True)
+  vid = Column(ForeignKey('version_info.index'))
+  distro = Column(String(64))
+  count = Column(Integer)
+
+class cpus(Base):
+  __tablename__ = 'cpus'
+
+  index = Column(Integer, primary_key=True)
+  vid = Column(ForeignKey('version_info.index'))
+  cpu = Column(String(16))
+  count = Column(Integer)
+
+class cpu_archs(Base):
+  __tablename__ = 'cpu_archs'
+
+  index = Column(Integer, primary_key=True)
+  vid = Column(ForeignKey('version_info.index'))
+  arch = Column(String(16))
+  count = Column(Integer)
+
+class ceph_versions(Base):
+  __tablename__ = 'ceph_versions'
+
+  index = Column(Integer, primary_key=True)
+  vid = Column(ForeignKey('version_info.index'))
+  version = Column(String(16))
+  count = Column(Integer)
+
+class sysinfo(object):
+  def __init__(self, vindex):
+    self.os = Session.query(os_info).filter_by(vid=vindex).all()
+    self.kern_vers = Session.query(kernel_versions).filter_by(vid=vindex).all()
+    self.kern_types = Session.query(kernel_types).filter_by(vid=vindex).all()
+    self.distros = Session.query(distros).filter_by(vid=vindex).all()
+    self.cpus = Session.query(cpus).filter_by(vid=vindex).all()
+    self.cpu_archs = Session.query(cpu_archs).filter_by(vid=vindex).all()
+    self.ceph_vers = Session.query(ceph_versions).filter_by(vid=vindex).all()
+
+class brag(object):
+  def __init__(self, uuid, version_number):
+    self.ci = Session.query(cluster_info).filter_by(uuid=uuid).first()
+    if self.ci is not None:
+      self.vi = Session.query(version_info).filter_by(cluster_id=self.ci.index, version_number=version_number).first()
+
+    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.sysinfo = sysinfo(self.vi.index)
+
+def put_new_version(data):
+  info = json.loads(data)
+  def add_cluster_info():
+    ci = Session.query(cluster_info).filter_by(uuid=info['uuid']).first()
+    if ci is None:
+      dt = datetime.strptime(info['cluster_creation_date'], "%Y-%m-%d %H:%M:%S.%f")
+      ci = cluster_info(uuid=info['uuid'],
+                        organization=info['ownership']['organization'],
+                        contact_email=info['ownership']['email'],
+                        cluster_name=info['ownership']['name'],
+                        description=info['ownership']['description'],
+                        cluster_creation_date=dt,
+                        num_versions=1)
+      Session.add(ci)
+      Session.commit()
+    else:
+      ci.num_versions += 1
+
+    return ci
+
+  def add_version_info(ci):
+    vi = version_info(cluster_id=ci.index,
+                      version_number=ci.num_versions,
+                      version_date=datetime.now())
+    Session.add(vi)
+    return vi
+
+  def add_components_info(vi):
+    comps_count= info['components_count']
+    comps_info = components_info(vid=vi.index,
+                         num_data_bytes=comps_count['num_data_bytes'],
+                         num_bytes_total=comps_count['num_bytes_total'],
+                         num_osds=comps_count['num_osds'],
+                         num_objects=comps_count['num_objects'],
+                         num_pgs=comps_count['num_pgs'],
+                         num_pools=comps_count['num_pools'],
+                         num_mdss=comps_count['num_mdss'],
+                         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:
+      Session.add(pools_info(vid=vi.index,
+                             pool_id=p['id'],
+                             pool_type=p['type'],
+                             pool_rep_size=p['size']))
+
+  def add_sys_info(vi):
+    si = info['sysinfo']
+    while si:
+      k,v = si.popitem()
+      if k == 'os_info':
+        for o in v:
+          Session.add(os_info(vid=vi.index,
+                              os=o['os'],
+                              count=o['count']))
+      elif k == 'kernel_versions':
+        for k in v:
+          Session.add(kernel_versions(vid=vi.index,
+                                      version=k['version'],
+                                      count=k['count']))
+      elif k == 'kernel_types':
+        for k in v:
+          Session.add(kernel_types(vid=vi.index,
+                                   type=k['type'],
+                                   count=k['count']))
+      elif k == 'distros':
+        for d in v:
+          Session.add(distros(vid=vi.index,
+                              distro=d['distro'],
+                              count=d['count']))
+      elif k == 'cpus':
+        for c in v:
+          Session.add(cpus(vid=vi.index,
+                           cpu=c['cpu'],
+                           count=c['count']))
+      elif k == 'cpu_archs':
+        for c in v:
+          Session.add(cpu_archs(vid=vi.index,
+                                arch=c['arch'],
+                                count=c['count']))
+      elif k == 'ceph_versions':
+        for c in v:
+          Session.add(ceph_versions(vid=vi.index,
+                                    version=c['version'],
+                                    count=c['count']))
+
+  ci = add_cluster_info()
+  add_version_info(ci)
+  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_sys_info(vi)
+
+def delete_uuid(uuid):
+  ci = Session.query(cluster_info).filter_by(uuid=uuid).first()
+  if ci is None:
+    return {'status':400, 'msg':'No information for this UUID'}
+
+  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(os_info).filter_by(vid=v.index).delete()
+    Session.query(kernel_versions).filter_by(vid=v.index).delete()
+    Session.query(kernel_types).filter_by(vid=v.index).delete()
+    Session.query(distros).filter_by(vid=v.index).delete()
+    Session.query(cpus).filter_by(vid=v.index).delete()
+    Session.query(cpu_archs).filter_by(vid=v.index).delete()
+    Session.query(ceph_versions).filter_by(vid=v.index).delete()
+
+    Session.flush()
+    Session.delete(v)
+    Session.flush()
+
+  Session.delete(ci)
+  return None
+
+def get_uuids():
+  return Session.query(cluster_info).all()
+
+def get_versions(uuid):
+  ci = Session.query(cluster_info).filter_by(uuid=uuid).first()
+  if ci is None:
+    return None
+
+  return Session.query(version_info).filter_by(cluster_id=ci.index).all()
+
+def get_brag(uuid, version_id):
+  b = brag(uuid, version_id)
+  if b.ci is None or b.vi is None:
+    return None
+
+  return b