db.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. import datetime
  2. import sqlalchemy as sql
  3. metadata = sql.MetaData()
  4. summary = sql.Table(
  5. 'summary', metadata,
  6. sql.Column('id', sql.Integer, primary_key=True),
  7. sql.Column('result', sql.Boolean),
  8. sql.Column('build_date', sql.String)
  9. )
  10. summary_item = sql.Table(
  11. 'summary_item', metadata,
  12. sql.Column('id', sql.Integer, primary_key=True),
  13. sql.Column('repo_name', sql.String),
  14. sql.Column('exception', sql.String),
  15. sql.Column('commit_id', sql.String),
  16. sql.Column('image_id', sql.String),
  17. sql.Column('source_desc', sql.String),
  18. sql.Column('tag', sql.String),
  19. sql.Column('summary_id', None, sql.ForeignKey('summary.id'))
  20. )
  21. class SummaryV2(object):
  22. def __init__(self, engine, summary_id, errorlogs=None):
  23. self.summary_id = summary_id
  24. self._engine = engine
  25. self.errorlogs = errorlogs
  26. def handle_build_result(self, exc, repo, version, img_id, build_result):
  27. c = self._engine.connect()
  28. if exc and self.errorlogs:
  29. with open('{2}/{0}.{1}.error.log'.format(repo.name, version[1], self.errorlogs), 'w') as f:
  30. f.write(build_result)
  31. ins = summary_item.insert().values(
  32. repo_name=repo.name,
  33. exception=str(exc),
  34. commit_id=version[1],
  35. image_id=img_id,
  36. source_desc=version[0],
  37. tag=', '.join(repo.get_associated_tags(version)),
  38. summary_id=self.summary_id
  39. )
  40. c.execute(ins)
  41. class DbManager(object):
  42. def __init__(self, db='/opt/stackbrew/data.db', debug=False):
  43. self._engine = sql.create_engine('sqlite:///' + db, echo=debug)
  44. def generate_tables(self):
  45. metadata.create_all(self._engine)
  46. def insert_summary(self, s):
  47. c = self._engine.connect()
  48. summary_id = None
  49. with c.begin():
  50. ins = summary.insert().values(
  51. result=not s.exit_code(),
  52. build_date=str(datetime.datetime.now()))
  53. r = c.execute(ins)
  54. summary_id = r.inserted_primary_key[0]
  55. for item in s.items():
  56. ins = summary_item.insert().values(
  57. repo_name=item.repository,
  58. exception=item.exc,
  59. commit_id=item.commit_id,
  60. image_id=item.image_id,
  61. source_desc=item.source,
  62. tag=item.tag,
  63. summary_id=summary_id
  64. )
  65. c.execute(ins)
  66. return summary_id
  67. def new_summary(self, errorlogs=None):
  68. c = self._engine.connect()
  69. ins = summary.insert().values(
  70. result=True, build_date=str(datetime.datetime.now())
  71. )
  72. r = c.execute(ins)
  73. summary_id = r.inserted_primary_key[0]
  74. return SummaryV2(self._engine, summary_id, errorlogs)
  75. def latest_status(self):
  76. c = self._engine.connect()
  77. s = sql.select([summary]).order_by(summary.c.id.desc()).limit(1)
  78. res = c.execute(s)
  79. row = res.fetchone()
  80. if row is not None:
  81. return dict(row)
  82. return None
  83. def get_summary(self, id):
  84. c = self._engine.connect()
  85. s = sql.select([summary_item]).where(summary_item.c.summary_id == id)
  86. res = c.execute(s)
  87. return [dict(row) for row in res]
  88. def get_latest_successful(self, repo, tag=None):
  89. c = self._engine.connect()
  90. tag = tag or 'latest'
  91. s = sql.select([summary_item]).where(
  92. summary_item.c.repo_name == repo
  93. ).where(
  94. summary_item.c.tag == tag
  95. ).where(
  96. summary_item.c.image_id is not None
  97. ).order_by(
  98. summary_item.c.summary_id.desc()
  99. ).limit(1)
  100. res = c.execute(s)
  101. row = res.fetchone()
  102. if row is not None:
  103. return dict(row)
  104. return None