db.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  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. if isinstance(build_result, list):
  30. build_result = '\n'.join(build_result)
  31. elif not isinstance(build_result, str):
  32. build_result = str(build_result)
  33. with open('{2}/{0}.{1}.error.log'.format(repo.name, version[1], self.errorlogs), 'w') as f:
  34. f.write(build_result)
  35. ins = summary_item.insert().values(
  36. repo_name=repo.name,
  37. exception=str(exc) if exc else None,
  38. commit_id=version[1],
  39. image_id=img_id,
  40. source_desc=version[0],
  41. tag=', '.join(repo.get_associated_tags(version)),
  42. summary_id=self.summary_id
  43. )
  44. c.execute(ins)
  45. class DbManager(object):
  46. def __init__(self, db='/opt/stackbrew/data.db', debug=False):
  47. self._engine = sql.create_engine('sqlite:///' + db, echo=debug)
  48. def generate_tables(self):
  49. metadata.create_all(self._engine)
  50. def insert_summary(self, s):
  51. c = self._engine.connect()
  52. summary_id = None
  53. with c.begin():
  54. ins = summary.insert().values(
  55. result=not s.exit_code(),
  56. build_date=str(datetime.datetime.now()))
  57. r = c.execute(ins)
  58. summary_id = r.inserted_primary_key[0]
  59. for item in s.items():
  60. ins = summary_item.insert().values(
  61. repo_name=item.repository,
  62. exception=item.exc,
  63. commit_id=item.commit_id,
  64. image_id=item.image_id,
  65. source_desc=item.source,
  66. tag=item.tag,
  67. summary_id=summary_id
  68. )
  69. c.execute(ins)
  70. return summary_id
  71. def new_summary(self, errorlogs=None):
  72. c = self._engine.connect()
  73. ins = summary.insert().values(
  74. result=True, build_date=str(datetime.datetime.now())
  75. )
  76. r = c.execute(ins)
  77. summary_id = r.inserted_primary_key[0]
  78. return SummaryV2(self._engine, summary_id, errorlogs)
  79. def latest_status(self):
  80. c = self._engine.connect()
  81. s = sql.select([summary]).order_by(summary.c.id.desc()).limit(1)
  82. res = c.execute(s)
  83. row = res.fetchone()
  84. if row is not None:
  85. return dict(row)
  86. return None
  87. def get_summary(self, id):
  88. c = self._engine.connect()
  89. s = sql.select([summary_item]).where(summary_item.c.summary_id == id)
  90. res = c.execute(s)
  91. return [dict(row) for row in res]
  92. def get_latest_successful(self, repo, tag=None):
  93. c = self._engine.connect()
  94. tag = tag or 'latest'
  95. s = sql.select([summary_item]).where(
  96. summary_item.c.repo_name == repo
  97. ).where(
  98. summary_item.c.tag == tag
  99. ).where(
  100. summary_item.c.image_id is not None
  101. ).order_by(
  102. summary_item.c.summary_id.desc()
  103. ).limit(1)
  104. res = c.execute(s)
  105. row = res.fetchone()
  106. if row is not None:
  107. return dict(row)
  108. return None