2 from datetime import datetime
3 from sqlalchemy.orm import sessionmaker, scoped_session
4 from sqlalchemy import Column, Integer, String, \
5 DateTime, ForeignKey, BigInteger
6 from sqlalchemy import PrimaryKeyConstraint
7 from sqlalchemy.ext.declarative import declarative_base
8 from sqlalchemy.ext.declarative import declared_attr
10 Base = declarative_base()
11 Session = scoped_session(sessionmaker())
13 class cluster_info(Base):
14 __tablename__ = 'cluster_info'
16 index = Column(Integer, primary_key=True)
17 uuid = Column(String(36), unique=True)
18 organization = Column(String(64))
19 contact_email = Column(String(32))
20 cluster_name = Column(String(32))
21 cluster_creation_date = Column(DateTime)
22 description = Column(String(32))
23 num_versions = Column(Integer)
25 class version_info(Base):
26 __tablename__ = 'version_info'
28 index = Column(Integer, primary_key=True)
29 cluster_id = Column(ForeignKey('cluster_info.index'))
30 version_number = Column(Integer)
31 version_date = Column(DateTime)
33 class components_info(Base):
34 __tablename__ = 'components_info'
36 index = Column(Integer, primary_key=True)
37 vid = Column(ForeignKey('version_info.index'))
38 num_data_bytes = Column(BigInteger)
39 num_bytes_total = Column(BigInteger)
40 num_osds = Column(Integer)
41 num_objects = Column(Integer)
42 num_pgs = Column(Integer)
43 num_pools = Column(Integer)
44 num_mdss = Column(Integer)
45 num_mons = Column(Integer)
47 class crush_types(Base):
48 __tablename__ = 'crush_types'
50 index = Column(Integer, primary_key=True)
51 vid = Column(ForeignKey('version_info.index'))
52 crush_type = Column(String(16))
53 crush_count = Column(Integer)
55 class pools_info(Base):
56 __tablename__ = 'pools_info'
58 index = Column(Integer, primary_key=True)
59 vid = Column(ForeignKey('version_info.index'))
60 pool_id = Column(Integer)
61 pool_type = Column(Integer)
62 pool_rep_size = Column(Integer)
65 __tablename__ = 'os_info'
67 index = Column(Integer, primary_key=True)
68 vid = Column(ForeignKey('version_info.index'))
69 os = Column(String(16))
70 count = Column(Integer)
72 class kernel_versions(Base):
73 __tablename__ = 'kernel_versions'
75 index = Column(Integer, primary_key=True)
76 vid = Column(ForeignKey('version_info.index'))
77 version = Column(String(16))
78 count = Column(Integer)
80 class kernel_types(Base):
81 __tablename__ = 'kernel_types'
83 index = Column(Integer, primary_key=True)
84 vid = Column(ForeignKey('version_info.index'))
85 type = Column(String(64))
86 count = Column(Integer)
89 __tablename__ = 'distros'
91 index = Column(Integer, primary_key=True)
92 vid = Column(ForeignKey('version_info.index'))
93 distro = Column(String(64))
94 count = Column(Integer)
97 __tablename__ = 'cpus'
99 index = Column(Integer, primary_key=True)
100 vid = Column(ForeignKey('version_info.index'))
101 cpu = Column(String(16))
102 count = Column(Integer)
104 class cpu_archs(Base):
105 __tablename__ = 'cpu_archs'
107 index = Column(Integer, primary_key=True)
108 vid = Column(ForeignKey('version_info.index'))
109 arch = Column(String(16))
110 count = Column(Integer)
112 class ceph_versions(Base):
113 __tablename__ = 'ceph_versions'
115 index = Column(Integer, primary_key=True)
116 vid = Column(ForeignKey('version_info.index'))
117 version = Column(String(16))
118 count = Column(Integer)
120 class sysinfo(object):
121 def __init__(self, vindex):
122 self.os = Session.query(os_info).filter_by(vid=vindex).all()
123 self.kern_vers = Session.query(kernel_versions).filter_by(vid=vindex).all()
124 self.kern_types = Session.query(kernel_types).filter_by(vid=vindex).all()
125 self.distros = Session.query(distros).filter_by(vid=vindex).all()
126 self.cpus = Session.query(cpus).filter_by(vid=vindex).all()
127 self.cpu_archs = Session.query(cpu_archs).filter_by(vid=vindex).all()
128 self.ceph_vers = Session.query(ceph_versions).filter_by(vid=vindex).all()
131 def __init__(self, uuid, version_number):
132 self.ci = Session.query(cluster_info).filter_by(uuid=uuid).first()
133 if self.ci is not None:
134 self.vi = Session.query(version_info).filter_by(cluster_id=self.ci.index, version_number=version_number).first()
136 if self.ci is not None and self.vi is not None:
137 self.comps = Session.query(components_info).filter_by(vid=self.vi.index).first()
138 self.crush = Session.query(crush_types).filter_by(vid=self.vi.index).all()
139 self.pools = Session.query(pools_info).filter_by(vid=self.vi.index).all()
140 self.sysinfo = sysinfo(self.vi.index)
142 def put_new_version(data):
143 info = json.loads(data)
144 def add_cluster_info():
145 ci = Session.query(cluster_info).filter_by(uuid=info['uuid']).first()
147 dt = datetime.strptime(info['cluster_creation_date'], "%Y-%m-%d %H:%M:%S.%f")
148 ci = cluster_info(uuid=info['uuid'],
149 organization=info['ownership']['organization'],
150 contact_email=info['ownership']['email'],
151 cluster_name=info['ownership']['name'],
152 description=info['ownership']['description'],
153 cluster_creation_date=dt,
162 def add_version_info(ci):
163 vi = version_info(cluster_id=ci.index,
164 version_number=ci.num_versions,
165 version_date=datetime.now())
169 def add_components_info(vi):
170 comps_count= info['components_count']
171 comps_info = components_info(vid=vi.index,
172 num_data_bytes=comps_count['num_data_bytes'],
173 num_bytes_total=comps_count['num_bytes_total'],
174 num_osds=comps_count['num_osds'],
175 num_objects=comps_count['num_objects'],
176 num_pgs=comps_count['num_pgs'],
177 num_pools=comps_count['num_pools'],
178 num_mdss=comps_count['num_mdss'],
179 num_mons=comps_count['num_mons'])
180 Session.add(comps_info)
182 def add_crush_types(vi):
183 for c in info['crush_types']:
184 Session.add(crush_types(vid=vi.index,
185 crush_type=c['type'],
186 crush_count=c['count']))
188 def add_pools_info(vi):
189 pools = info['pool_metadata']
191 Session.add(pools_info(vid=vi.index,
194 pool_rep_size=p['size']))
196 def add_sys_info(vi):
202 Session.add(os_info(vid=vi.index,
205 elif k == 'kernel_versions':
207 Session.add(kernel_versions(vid=vi.index,
208 version=k['version'],
210 elif k == 'kernel_types':
212 Session.add(kernel_types(vid=vi.index,
217 Session.add(distros(vid=vi.index,
222 Session.add(cpus(vid=vi.index,
225 elif k == 'cpu_archs':
227 Session.add(cpu_archs(vid=vi.index,
230 elif k == 'ceph_versions':
232 Session.add(ceph_versions(vid=vi.index,
233 version=c['version'],
236 ci = add_cluster_info()
238 vi = Session.query(version_info).filter_by(cluster_id=ci.index,
239 version_number=ci.num_versions).first()
240 add_components_info(vi)
245 def delete_uuid(uuid):
246 ci = Session.query(cluster_info).filter_by(uuid=uuid).first()
248 return {'status':400, 'msg':'No information for this UUID'}
250 for v in Session.query(version_info).filter_by(cluster_id=ci.index).all():
251 Session.query(components_info).filter_by(vid=v.index).delete()
252 Session.query(crush_types).filter_by(vid=v.index).delete()
253 Session.query(pools_info).filter_by(vid=v.index).delete()
254 Session.query(os_info).filter_by(vid=v.index).delete()
255 Session.query(kernel_versions).filter_by(vid=v.index).delete()
256 Session.query(kernel_types).filter_by(vid=v.index).delete()
257 Session.query(distros).filter_by(vid=v.index).delete()
258 Session.query(cpus).filter_by(vid=v.index).delete()
259 Session.query(cpu_archs).filter_by(vid=v.index).delete()
260 Session.query(ceph_versions).filter_by(vid=v.index).delete()
270 return Session.query(cluster_info).all()
272 def get_versions(uuid):
273 ci = Session.query(cluster_info).filter_by(uuid=uuid).first()
277 return Session.query(version_info).filter_by(cluster_id=ci.index).all()
279 def get_brag(uuid, version_id):
280 b = brag(uuid, version_id)
281 if b.ci is None or b.vi is None: