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